Kenmegne
7 days ago b3d0580439b9a00c7eb918085de1694151066004
rename packages
412 files added
31904 ■■■■■ changed files
fdx_convert/app.properties 1 ●●●● patch | view | raw | blame | history
fdx_convert/documentation_convertisseur.rar patch | view | raw | blame | history
fdx_convert/fdx-convert-client.iml 12 ●●●●● patch | view | raw | blame | history
fdx_convert/fdx-convert.log 401 ●●●●● patch | view | raw | blame | history
fdx_convert/hibernate.cfg.xml 35 ●●●●● patch | view | raw | blame | history
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide installation Fdx-Convert v.1.0.2.docx patch | view | raw | blame | history
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide installation Fdx-Generator v.1.0.2.docx patch | view | raw | blame | history
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide utilisation Fdx-Convert v.1.0.2.docx patch | view | raw | blame | history
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide utilisation Fdx-Generator v.1.0.2.docx patch | view | raw | blame | history
fdx_convert/nb-configuration.xml 18 ●●●●● patch | view | raw | blame | history
fdx_convert/pom.xml 195 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/App.java 95 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/Test.java 262 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/AproposEditDialogController.java 82 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConfigEditDialogController.java 63 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConversionModelEditDialogController.java 235 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConversionModelListDialogController.java 112 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/DataFileToJsonEditDialogController.java 176 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/DecryptageAESEditDialogController.java 135 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/FileToValidateEditDialogController.java 447 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ImportTypeFichierEditDialogController.java 79 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/JournalEditDialogController.java 69 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/JournalListDialogController.java 113 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/MainController.java 432 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/MetaAlphaNumeriqueFieldEditDialogController.java 94 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ModeleJsonEditDialogController.java 325 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ModeleJsonListeDialogController.java 60 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/StructureChampJsonEditDialogController.java 244 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/SubObjectEditDialogController.java 240 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TacheEditDialogController.java 360 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TacheListeDialogController.java 89 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TxtFileToValidateEditDialogController.java 175 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TypeFichierEditDialogController.java 90 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TypeFichierListDialogController.java 97 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ValidateurEditDialogController.java 202 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ConversionModelAdvancedSearchController.java 76 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ConversionModelSearchController.java 91 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/JournalAdvancedSearchFormController.java 59 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/JournalSearchFormController.java 95 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ParametreAutoAdvancedSearchFormController.java 40 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ParametreAutoSearchFormController.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TacheSearchFormController.java 81 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TruncatedElementAdvancedSearchFormController.java 34 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TruncatedElementSearchFormController.java 86 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TypeFichierAdvancedSearchFormController.java 38 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TypeFichierSearchFormController.java 31 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ValidateurSearchFormController.java 99 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/AlphaNumeriqueFieldTable.java 67 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ConversionModelTable.java 141 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/JournalTable.java 61 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/MetaAlphaNumeriqueFieldTable.java 40 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/MetaAlphaNumeriqueTable.java 75 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ModeleJsonTable.java 25 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/StructureChampJsonTable.java 54 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/SubObjectTable.java 26 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TacheTable.java 71 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TruncatedElementTable.java 76 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TypeFichierTable.java 53 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ValidateurTable.java 53 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/converter/DataTypeConverter.java 36 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/AbstractDAO.java 295 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/AlphaNumeriqueFieldDAO.java 42 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ConversionModelDAO.java 33 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/HibernateUtil.java 48 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/JsonStructureDAO.java 43 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/MetaAlphaNumeriqueFieldDAO.java 31 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ModeleJsonDAO.java 32 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TacheDAO.java 43 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TypeFichierDAO.java 104 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TypeFichierJsonDAO.java 40 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ValidateurDAO.java 101 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/DataType.java 38 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/JournalStatut.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/StatutConverter.java 38 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/AttributeFormatException.java 23 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/ConfigException.java 24 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/ValidatorException.java 26 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/AproposEditFormController.java 48 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ConfigEditFormController.java 51 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ConversionModelEditFormController.java 218 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/DataFileToJsonFormController.java 136 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/DecryptageAESEditFormController.java 76 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/FileToValidateEditFormController.java 305 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ImportTypeFichierEditFormController.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/JournalEditFormController.java 80 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/MetaAlphaNumeriqueFieldEditFormController.java 95 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ModeleJsonEditFormController.java 254 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/StructureChampJsonEditFormController.java 88 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/SubObjectEditFormController.java 206 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TacheEditFormController.java 411 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TruncatedElementEditFormController.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TxtFileToValidateEditFormController.java 83 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TypeFichierEditFormController.java 43 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ValidateurEditFormController.java 147 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ValidateurListFormController.java 237 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/AlphaNumeriqueField.java 102 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Configuration.java 55 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/ConversionModel.java 90 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Journal.java 58 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/JsonStructure.java 82 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/MetaAlphaNumeriqueField.java 66 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/ModeleJson.java 84 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/StructureChampJson.java 96 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/SubObject.java 81 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Tache.java 130 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TruncatedElement.java 84 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TypeFichier.java 94 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TypeFichierJson.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Validateur.java 69 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigConstraint.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigValidator.java 28 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigurationConversionDelimiterConstraint.java 30 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigurationConversionDelimiterValidator.java 31 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DataTypeConstraint.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DataTypeValidator.java 26 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DecryptageAESConstraint.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DecryptageAESValidator.java 24 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DelimiterConstraint.java 22 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DelimiterValidator.java 23 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ErrorDirConstraint.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ErrorDirValidator.java 34 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/FileToValidateDelimiterConstraint.java 30 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/FileToValidateDelimiterValidator.java 30 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/KeyToDecryptConstraint.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/KeyToDecryptValidator.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/SChedulerValidator.java 16 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/SchedulerConstraint.java 22 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Assertion.java 63 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Entity.java 62 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/EntityList.java 29 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/ParamValue.java 49 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/PredicateConfig.java 62 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/TypeFichierJsonsList.java 35 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Validation.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ColumnDefinition.java 28 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DataFileToJson.java 45 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DataToImport.java 37 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/Decryptage.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DecryptageAES.java 36 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/Delimiteur.java 28 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/FileToValidate.java 58 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/FileToValidateDescription.java 33 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ImportFile.java 43 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ResultFileParsing.java 21 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/TxtFileToValidate.java 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/AlphaNumeriqueFieldService.java 53 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ConfigurationService.java 63 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ConversionModelService.java 96 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/DecryptageAESService.java 50 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ImportFileService.java 88 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/JournalService.java 97 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/JsonStructureService.java 95 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/MetaAlphaNumeriqueFieldService.java 52 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ModeleJsonService.java 96 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/StructureChampJsonService.java 51 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/SubObjectService.java 51 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheJob.java 281 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheJobService.java 91 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheService.java 156 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TruncatedElementService.java 98 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TypeFichierJsonService.java 92 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TypeFichierService.java 108 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ValidateurService.java 152 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/pojo/PaginationElts.java 49 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/service/util/SchedulerUtil.java 298 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/Count.java 158 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ExportToJson.java 242 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ImportData.java 1138 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/JsonDataTypeUtil.java 102 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ParserUtils.java 246 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/TypeFichierJsonConverter.java 83 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/TypeFichierJsonMarshaller.java 81 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/Utilities.java 61 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ValidateurParser.java 289 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/util/XmlUtils.java 34 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureFormViewModel.java 115 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureTableViewModel.java 171 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureViewModel.java 177 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/JsonStructureFormController.java 133 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/JsonStructureTableViewController.java 167 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/DefaultNestedJsonStructure.java 57 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/JsonStructureController.java 277 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/NestedJsonStructure.java 26 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/NestedJsonStructureFromJsonStructure.java 57 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/app.properties 1 ●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/LICENSE.txt 202 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Black.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-BlackItalic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Bold.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-BoldItalic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Italic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Light.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-LightItalic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Medium.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-MediumItalic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Regular.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-Thin.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/fonts/Roboto-ThinItalic.ttf patch | view | raw | blame | history
fdx_convert/src/main/resources/images/143-01.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/143-02.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/143-03.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/143-04.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/143-05.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Accueil.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Accuueil_agent.jpg patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Apropos.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Barre_outils_hover-01.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Barre_outils_hover-02.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Export.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Fichier.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Logo_FDX_Convert.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Recherche.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Reset.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/Search.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/add-disabled.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/add-new.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/add-subtype.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/add.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/agrandir.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/app_icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/custom_app_icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/custom_close_icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/delete-disabled.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/delete-new.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/delete-subtype.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/edit-disabled.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/edit-new.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/edit.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/error-icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/exporter.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/fermer.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/fichiers_generesx.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/icone_ins.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/intervalle_affichage.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/max-icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/max_icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/min-icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/motif-title-bar.jpg patch | view | raw | blame | history
fdx_convert/src/main/resources/images/next-img.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/oeil.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/previous-img.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/print-disabled.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/print-new.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/print.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/reduire.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/success-icon.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/table-plus.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/tache.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/tache_hover.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/trash.png patch | view | raw | blame | history
fdx_convert/src/main/resources/images/update-subtype.png patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/abstracts/AbstractEditDialog.fxml 125 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/abstracts/AbstractMainDialog.fxml 250 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/main.fxml 145 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ConversionModelAdvancedSearchForm.fxml 44 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ConversionModelSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/JournalAdvancedSearchForm.fxml 101 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/JournalSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TacheSearchForm.fxml 27 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TruncatedElementAdvancedSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TruncatedElementSearchForm.fxml 33 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TypeFichierAdvancedSearchForm.fxml 35 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TypeFichierSearchForm.fxml 22 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ValidateurSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/About.fxml 117 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/AlphaNumeriqueFieldEditForm.fxml 35 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ConfigEditForm.fxml 59 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ConversionModelEditForm.fxml 152 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/DataFileToJsonEditForm.fxml 77 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/DecryptageAESEditForm.fxml 79 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/FileToValidateEditForm.fxml 132 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ImportRawCsvDataEditForm.fxml 88 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ImportTypeFichierEditForm.fxml 57 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/JournalEditForm.fxml 77 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ModeleJsonEditForm.fxml 128 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/StructureChampJsonEditForm.fxml 71 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/SubObjectEditForm.fxml 95 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/TacheEditForm.fxml 273 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/TruncatedElementEditForm.fxml 82 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/TxtFileToValidateEditForm.fxml 48 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/TypeFichierEditForm.fxml 54 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ValidateurEditForm.fxml 99 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/forms/ValidateurListForm.fxml 274 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/views/JsonStructureFormView.fxml 147 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/views/JsonStructureTableView.fxml 248 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/importation/validation/data/client/views/jsonstructure/JsonStructureView.fxml 121 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/log4j.properties 11 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/predicatelogic-engine.xml 1701 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/CustomFormComponents.css 225 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/FormComponents1.css 367 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/app-theme.css 34 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/custom-main-style.css 426 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/custom-title-bar.css 47 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/main_screen.css 246 ●●●●● patch | view | raw | blame | history
fdx_convert/src/main/resources/styles/style.css 15 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/.netbeans_automatic_build patch | view | raw | blame | history
fdx_convert/target/classes/app.properties 1 ●●●● patch | view | raw | blame | history
fdx_convert/target/classes/fonts/LICENSE.txt 202 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Black.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-BlackItalic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Bold.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-BoldItalic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Italic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Light.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-LightItalic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Medium.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-MediumItalic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Regular.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-Thin.ttf patch | view | raw | blame | history
fdx_convert/target/classes/fonts/Roboto-ThinItalic.ttf patch | view | raw | blame | history
fdx_convert/target/classes/images/143-01.png patch | view | raw | blame | history
fdx_convert/target/classes/images/143-02.png patch | view | raw | blame | history
fdx_convert/target/classes/images/143-03.png patch | view | raw | blame | history
fdx_convert/target/classes/images/143-04.png patch | view | raw | blame | history
fdx_convert/target/classes/images/143-05.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Accueil.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Accuueil_agent.jpg patch | view | raw | blame | history
fdx_convert/target/classes/images/Apropos.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Barre_outils_hover-01.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Barre_outils_hover-02.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Export.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Fichier.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Logo_FDX_Convert.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Recherche.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Reset.png patch | view | raw | blame | history
fdx_convert/target/classes/images/Search.png patch | view | raw | blame | history
fdx_convert/target/classes/images/add-disabled.png patch | view | raw | blame | history
fdx_convert/target/classes/images/add-new.png patch | view | raw | blame | history
fdx_convert/target/classes/images/add-subtype.png patch | view | raw | blame | history
fdx_convert/target/classes/images/add.png patch | view | raw | blame | history
fdx_convert/target/classes/images/agrandir.png patch | view | raw | blame | history
fdx_convert/target/classes/images/app_icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/custom_app_icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/custom_close_icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/delete-disabled.png patch | view | raw | blame | history
fdx_convert/target/classes/images/delete-new.png patch | view | raw | blame | history
fdx_convert/target/classes/images/delete-subtype.png patch | view | raw | blame | history
fdx_convert/target/classes/images/edit-disabled.png patch | view | raw | blame | history
fdx_convert/target/classes/images/edit-new.png patch | view | raw | blame | history
fdx_convert/target/classes/images/edit.png patch | view | raw | blame | history
fdx_convert/target/classes/images/error-icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/exporter.png patch | view | raw | blame | history
fdx_convert/target/classes/images/fermer.png patch | view | raw | blame | history
fdx_convert/target/classes/images/fichiers_generesx.png patch | view | raw | blame | history
fdx_convert/target/classes/images/icone_ins.png patch | view | raw | blame | history
fdx_convert/target/classes/images/intervalle_affichage.png patch | view | raw | blame | history
fdx_convert/target/classes/images/max-icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/max_icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/min-icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/motif-title-bar.jpg patch | view | raw | blame | history
fdx_convert/target/classes/images/next-img.png patch | view | raw | blame | history
fdx_convert/target/classes/images/oeil.png patch | view | raw | blame | history
fdx_convert/target/classes/images/previous-img.png patch | view | raw | blame | history
fdx_convert/target/classes/images/print-disabled.png patch | view | raw | blame | history
fdx_convert/target/classes/images/print-new.png patch | view | raw | blame | history
fdx_convert/target/classes/images/print.png patch | view | raw | blame | history
fdx_convert/target/classes/images/reduire.png patch | view | raw | blame | history
fdx_convert/target/classes/images/success-icon.png patch | view | raw | blame | history
fdx_convert/target/classes/images/table-plus.png patch | view | raw | blame | history
fdx_convert/target/classes/images/tache.png patch | view | raw | blame | history
fdx_convert/target/classes/images/tache_hover.png patch | view | raw | blame | history
fdx_convert/target/classes/images/trash.png patch | view | raw | blame | history
fdx_convert/target/classes/images/update-subtype.png patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/abstracts/AbstractEditDialog.fxml 125 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/abstracts/AbstractMainDialog.fxml 250 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/main.fxml 145 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/ConversionModelAdvancedSearchForm.fxml 44 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/ConversionModelSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/JournalAdvancedSearchForm.fxml 101 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/JournalSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/TacheSearchForm.fxml 27 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/TruncatedElementAdvancedSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/TruncatedElementSearchForm.fxml 33 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/TypeFichierAdvancedSearchForm.fxml 35 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/TypeFichierSearchForm.fxml 22 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/controller/search/ValidateurSearchForm.fxml 29 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/About.fxml 117 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/AlphaNumeriqueFieldEditForm.fxml 35 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ConfigEditForm.fxml 59 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ConversionModelEditForm.fxml 152 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/DataFileToJsonEditForm.fxml 77 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/DecryptageAESEditForm.fxml 79 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/FileToValidateEditForm.fxml 132 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ImportRawCsvDataEditForm.fxml 88 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ImportTypeFichierEditForm.fxml 57 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/JournalEditForm.fxml 77 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ModeleJsonEditForm.fxml 128 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/StructureChampJsonEditForm.fxml 71 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/SubObjectEditForm.fxml 95 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/TacheEditForm.fxml 273 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/TruncatedElementEditForm.fxml 82 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/TxtFileToValidateEditForm.fxml 48 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/TypeFichierEditForm.fxml 54 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ValidateurEditForm.fxml 99 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/forms/ValidateurListForm.fxml 274 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/views/JsonStructureFormView.fxml 147 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/views/JsonStructureTableView.fxml 248 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/importation/validation/data/client/views/jsonstructure/JsonStructureView.fxml 121 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/log4j.properties 11 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/predicatelogic-engine.xml 1701 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/CustomFormComponents.css 225 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/FormComponents1.css 367 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/app-theme.css 34 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/custom-main-style.css 426 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/custom-title-bar.css 47 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/main_screen.css 246 ●●●●● patch | view | raw | blame | history
fdx_convert/target/classes/styles/style.css 15 ●●●●● patch | view | raw | blame | history
fdx_convert/target/maven-archiver/pom.properties 5 ●●●●● patch | view | raw | blame | history
fdx_convert/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 209 ●●●●● patch | view | raw | blame | history
fdx_convert/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 173 ●●●●● patch | view | raw | blame | history
fdx_convert/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst patch | view | raw | blame | history
fdx_convert/target/test-classes/.netbeans_automatic_build patch | view | raw | blame | history
fdx_convert/app.properties
New file
@@ -0,0 +1 @@
nbThreads = 2
fdx_convert/documentation_convertisseur.rar
Binary files differ
fdx_convert/fdx-convert-client.iml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
  <component name="FacetManager">
    <facet type="hibernate" name="Hibernate">
      <configuration>
        <datasource-map />
        <naming-strategy-map />
        <deploymentDescriptor name="hibernate.cfg.xml" url="file://$MODULE_DIR$/hibernate.cfg.xml" />
      </configuration>
    </facet>
  </component>
</module>
fdx_convert/fdx-convert.log
New file
@@ -0,0 +1,401 @@
2024-10-21 14:22:45 ERROR TxtFileToJsonEditDialogController:113 - java.lang.StringIndexOutOfBoundsException: String index out of range: 1
2024-10-21 14:23:25 ERROR TxtFileToJsonEditDialogController:113 - java.lang.StringIndexOutOfBoundsException: String index out of range: 1
2024-10-21 15:26:46 ERROR TxtFileToJsonEditDialogController:113 - java.lang.StringIndexOutOfBoundsException: String index out of range: 1
2024-11-22 16:12:20 ERROR FileToValidateEditDialogController:267 - Validation réussie. Fichier correcte
2024-11-22 16:17:19 ERROR FileToValidateEditDialogController:267 - Validation réussie. Fichier correcte
2024-11-22 16:19:44 ERROR FileToValidateEditDialogController:267 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur CAADES2024112216194407.txt.err pour en savoir plus
2024-11-22 16:27:18 ERROR FileToValidateEditDialogController:267 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur CAADES2024112216271752.txt.err pour en savoir plus
2024-11-22 16:28:34 ERROR FileToValidateEditDialogController:267 - Validation réussie. Fichier correcte
2024-12-02 14:33:02 ERROR FileToValidateEditDialogController:267 - Validation réussie. Fichier correcte
2024-12-02 14:44:29 ERROR DataFileToJsonEditDialogController:111 - java.lang.NullPointerException
2024-12-02 14:45:16 ERROR DataFileToJsonEditDialogController:111 - java.lang.Exception: Existence des lignes mal formattées
2024-12-04 10:19:21 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 108
2024-12-04 10:21:36 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 108
2024-12-04 12:41:32 ERROR DataFileToJsonEditDialogController:111 - java.lang.NullPointerException
2024-12-05 14:09:04 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 134
2024-12-05 14:09:42 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 134
2024-12-05 14:11:13 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 266
2024-12-05 14:15:41 ERROR DataFileToJsonEditDialogController:111 - java.lang.Exception: Existence des lignes mal formattées
2024-12-05 14:27:01 ERROR DataFileToJsonEditDialogController:111 - java.lang.NullPointerException
2024-12-05 16:12:39 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 108
2024-12-10 15:45:21 ERROR DataFileToJsonEditDialogController:111 - java.lang.NullPointerException
2025-02-26 14:29:07 ERROR FileToValidateEditDialogController:267 - Validation réussie. Fichier correcte
2025-04-16 14:45:15 ERROR FileToValidateEditDialogController:464 - java.lang.UnsupportedOperationException
2025-04-16 14:48:06 WARN  FileToValidateEditDialogController:458 - Validation impossible. Le type fichier DGBACT n'a pas de structure JSON enregistré
2025-04-16 14:50:23 ERROR FileToValidateEditDialogController:464 - java.lang.UnsupportedOperationException
2025-04-16 14:54:14 ERROR FileToValidateEditDialogController:467 - java.util.ConcurrentModificationException
2025-04-16 15:02:52 ERROR FileToValidateEditDialogController:427 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis ouvrir le fichier d'erreur DGBACT2025041615022555_JSON.txt.err pour en savoir plus
2025-04-17 13:55:41 ERROR FileToValidateEditDialogController:453 - java.nio.file.NoSuchFileException: C:\Users\ASUS\Documents\ERROR\DGBACT.json
2025-07-16 10:19:17 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 214
2025-07-16 10:24:59 ERROR DataFileToJsonEditDialogController:111 - java.lang.StringIndexOutOfBoundsException: String index out of range: 205
2025-10-31 15:20:44 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025103115164632.txt.err pour en savoir plus
2025-10-31 17:20:59 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025103117103935.txt.err pour en savoir plus
2025-10-31 17:44:07 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025103117335642.txt.err pour en savoir plus
2025-11-01 10:40:29 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110110300413.txt.err pour en savoir plus
2025-11-01 11:20:03 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110111102316.txt.err pour en savoir plus
2025-11-03 10:21:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110310120831.txt.err pour en savoir plus
2025-11-03 10:41:18 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110310314019.txt.err pour en savoir plus
2025-11-03 11:01:20 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110310520509.txt.err pour en savoir plus
2025-11-03 11:27:41 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110311162834.txt.err pour en savoir plus
2025-11-03 11:52:25 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110311421354.txt.err pour en savoir plus
2025-11-03 12:18:58 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110312092237.txt.err pour en savoir plus
2025-11-03 12:39:43 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-03 12:43:17 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-03 13:02:15 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110312534342.txt.err pour en savoir plus
2025-11-03 13:25:20 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110313164155.txt.err pour en savoir plus
2025-11-03 13:38:53 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110313303649.txt.err pour en savoir plus
2025-11-03 14:31:27 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110314230804.txt.err pour en savoir plus
2025-11-03 14:56:45 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110314482634.txt.err pour en savoir plus
2025-11-03 15:24:43 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110315152931.txt.err pour en savoir plus
2025-11-03 15:48:17 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110315395645.txt.err pour en savoir plus
2025-11-03 16:09:45 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110316012635.txt.err pour en savoir plus
2025-11-03 16:27:59 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110316275914.txt.err pour en savoir plus
2025-11-03 16:36:34 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110316363435.txt.err pour en savoir plus
2025-11-03 16:48:42 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110316484232.txt.err pour en savoir plus
2025-11-03 17:10:06 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110317100604.txt.err pour en savoir plus
2025-11-03 17:13:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110317135407.txt.err pour en savoir plus
2025-11-03 17:17:36 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110317173538.txt.err pour en savoir plus
2025-11-03 17:24:58 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110317245800.txt.err pour en savoir plus
2025-11-03 17:29:40 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110317294023.txt.err pour en savoir plus
2025-11-04 09:58:28 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110409560940.txt.err pour en savoir plus
2025-11-04 10:10:19 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110410073202.txt.err pour en savoir plus
2025-11-04 10:15:47 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110410133006.txt.err pour en savoir plus
2025-11-04 10:34:59 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110410330425.txt.err pour en savoir plus
2025-11-04 10:52:44 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110410505020.txt.err pour en savoir plus
2025-11-04 10:56:46 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 11:15:34 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRE202025110411102131.txt.err pour en savoir plus
2025-11-04 11:28:33 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 11:48:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110411485552.txt.err pour en savoir plus
2025-11-04 12:10:14 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 12:22:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110412113416.txt.err pour en savoir plus
2025-11-04 12:29:03 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 12:40:32 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110412355819.txt.err pour en savoir plus
2025-11-04 12:53:56 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110412492445.txt.err pour en savoir plus
2025-11-04 13:02:34 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110413003046.txt.err pour en savoir plus
2025-11-04 13:26:22 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110413215046.txt.err pour en savoir plus
2025-11-04 13:37:26 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 13:39:55 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 13:42:06 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110413420620.txt.err pour en savoir plus
2025-11-04 13:46:47 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110413464757.txt.err pour en savoir plus
2025-11-04 13:54:39 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110413543804.txt.err pour en savoir plus
2025-11-04 14:06:40 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414063942.txt.err pour en savoir plus
2025-11-04 14:15:51 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414155039.txt.err pour en savoir plus
2025-11-04 14:21:18 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414211725.txt.err pour en savoir plus
2025-11-04 14:29:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414295421.txt.err pour en savoir plus
2025-11-04 14:33:09 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414330837.txt.err pour en savoir plus
2025-11-04 14:39:52 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414395156.txt.err pour en savoir plus
2025-11-04 14:43:37 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414433627.txt.err pour en savoir plus
2025-11-04 14:47:51 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110414475104.txt.err pour en savoir plus
2025-11-04 15:19:59 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110415195820.txt.err pour en savoir plus
2025-11-04 15:29:40 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 15:44:57 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110415350806.txt.err pour en savoir plus
2025-11-04 16:05:34 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 16:10:49 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110416062842.txt.err pour en savoir plus
2025-11-04 16:20:21 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110416161414.txt.err pour en savoir plus
2025-11-04 16:41:18 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025110416374405.txt.err pour en savoir plus
2025-11-04 16:42:31 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 16:59:27 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-04 17:12:31 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110417030721.txt.err pour en savoir plus
2025-11-05 10:49:31 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110510384153.txt.err pour en savoir plus
2025-11-05 11:54:31 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110511444853.txt.err pour en savoir plus
2025-11-05 13:17:10 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110513150823.txt.err pour en savoir plus
2025-11-05 13:51:33 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-05 13:54:57 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-05 13:57:00 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-05 14:16:41 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110514062942.txt.err pour en savoir plus
2025-11-05 14:43:02 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110514324126.txt.err pour en savoir plus
2025-11-05 15:36:43 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110515262636.txt.err pour en savoir plus
2025-11-05 16:02:04 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110515514534.txt.err pour en savoir plus
2025-11-05 16:20:49 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110516102502.txt.err pour en savoir plus
2025-11-05 16:44:36 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110516341122.txt.err pour en savoir plus
2025-11-05 17:15:33 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110517044209.txt.err pour en savoir plus
2025-11-06 09:37:11 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025110609351342.txt.err pour en savoir plus
2025-11-06 10:03:11 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-06 10:08:23 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-06 10:21:39 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110610111653.txt.err pour en savoir plus
2025-11-06 11:33:38 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110611231142.txt.err pour en savoir plus
2025-11-06 15:58:33 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025110615480113.txt.err pour en savoir plus
2025-11-06 16:16:23 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-11-11 10:51:32 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025111110461359.txt.err pour en savoir plus
2025-11-11 11:02:12 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025111110562956.txt.err pour en savoir plus
2025-11-11 11:19:02 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025111111072604.txt.err pour en savoir plus
2025-11-11 11:40:30 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAPU2025111111285759.txt.err pour en savoir plus
2025-11-11 12:00:00 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRENF2025111111552903.txt.err pour en savoir plus
2025-11-11 12:18:42 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202025111112122902.txt.err pour en savoir plus
2025-11-17 12:42:00 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRE202025111712420015.txt.err pour en savoir plus
2025-11-17 13:11:44 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRE202025111713114334.txt.err pour en savoir plus
2025-11-18 12:07:30 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRE202025111812072502.txt.err pour en savoir plus
2025-11-18 12:12:15 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRE202025111812121130.txt.err pour en savoir plus
2025-11-26 15:27:39 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2025-11-26 15:30:27 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2025-12-16 14:59:47 WARN  FileToValidateEditDialogController:175 - Validation impossible. Le type fichier FPRABU n'a pas de validateur enregistré
2025-12-16 15:03:06 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRABU2025121615024600.txt.err pour en savoir plus
2025-12-16 15:05:30 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRABU2025121615050942.txt.err pour en savoir plus
2025-12-16 15:09:28 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAIM2025121615092841.txt.err pour en savoir plus
2025-12-16 15:24:55 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAIM2025121615245542.txt.err pour en savoir plus
2025-12-16 15:37:46 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-12-16 15:39:46 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRABU2025121615383214.txt.err pour en savoir plus
2025-12-16 15:44:39 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-12-16 15:46:45 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-12-16 15:49:01 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121615472157.txt.err pour en savoir plus
2025-12-16 16:03:46 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121616020549.txt.err pour en savoir plus
2025-12-16 16:48:17 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRERM2025121616302414.txt.err pour en savoir plus
2025-12-16 17:15:36 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRJOP2025121617153640.txt.err pour en savoir plus
2025-12-17 14:21:28 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRJOP2025121714212728.txt.err pour en savoir plus
2025-12-17 14:41:21 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-12-17 14:46:07 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121714441620.txt.err pour en savoir plus
2025-12-17 15:08:13 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRERM2025121714510638.txt.err pour en savoir plus
2025-12-17 15:32:54 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2025-12-17 16:00:21 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121715582218.txt.err pour en savoir plus
2025-12-17 16:07:46 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121716055240.txt.err pour en savoir plus
2025-12-17 16:46:49 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRAVI2025121716450201.txt.err pour en savoir plus
2026-01-13 11:51:07 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRSMS2026011311502711.txt.err pour en savoir plus
2026-01-13 11:52:26 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-13 12:02:48 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-13 14:47:43 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2026-01-13 14:49:43 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2026-01-13 14:52:44 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2026-01-13 15:28:34 ERROR FileToValidateEditDialogController:179 - java.lang.NoClassDefFoundError: org/apache/commons/io/build/AbstractStreamBuilder
2026-01-13 16:03:40 ERROR FileToValidateEditDialogController:179 - org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
2026-01-13 16:08:44 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPR3C2026011316084224.txt.err pour en savoir plus
2026-01-13 16:10:55 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-13 16:15:32 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-21 15:02:54 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-21 15:03:50 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-21 15:04:56 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-21 15:08:24 ERROR FileToValidateEditDialogController:218 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPR3C2026012115082416.txt.err pour en savoir plus
2026-01-21 15:13:12 ERROR FileToValidateEditDialogController:218 - Validation réussie. Fichier correcte
2026-01-27 15:27:55 ERROR DataFileToJsonEditDialogController:111 - java.lang.Exception: Existence des lignes mal formattées
2026-02-02 15:46:05 ERROR FileToValidateEditDialogController:220 - Validation réussie. Fichier correcte
2026-02-03 16:01:46 ERROR DataFileToJsonEditDialogController:111 - java.lang.NumberFormatException: null
2026-02-03 16:05:26 ERROR DataFileToJsonEditDialogController:111 - java.lang.Exception: Type de données non supporté
2026-02-03 17:16:48 ERROR DataFileToJsonEditDialogController:109 - org.xml.sax.SAXParseException; systemId: file:/C:/Users/ASUS/Documents/NetBeansProjects/share_sources/importation-validation-data/; lineNumber: 1; columnNumber: 1; Contenu non autorisé dans le prologue.
2026-02-03 17:18:37 ERROR DataFileToJsonEditDialogController:109 - java.lang.NullPointerException
2026-02-03 17:21:03 ERROR DataFileToJsonEditDialogController:109 - java.lang.NullPointerException
2026-02-04 09:29:27 ERROR DataFileToJsonEditDialogController:110 - org.xml.sax.SAXParseException; systemId: file:/C:/Users/ASUS/Documents/NetBeansProjects/share_sources/importation-validation-data/; lineNumber: 1; columnNumber: 1; Contenu non autorisé dans le prologue.
2026-02-04 09:33:15 ERROR DataFileToJsonEditDialogController:110 - java.lang.NullPointerException
2026-02-04 09:38:45 ERROR DataFileToJsonEditDialogController:110 - java.lang.NullPointerException
2026-02-16 09:49:13 ERROR FileToValidateEditDialogController:220 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026021609490648.txt.err pour en savoir plus
2026-02-16 14:38:22 ERROR FileToValidateEditDialogController:220 - Validation réussie. Fichier correcte
2026-02-16 14:45:02 ERROR FileToValidateEditDialogController:220 - Validation réussie. Fichier correcte
2026-02-16 14:51:57 ERROR FileToValidateEditDialogController:220 - Validation réussie. Fichier correcte
2026-02-16 15:31:38 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ENFANTS.M102025.csv.err pour en savoir plus
2026-02-16 15:53:17 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur AGENTS.M102025 .csv.err pour en savoir plus
2026-02-16 16:09:26 ERROR FileToValidateEditDialogController:225 - Validation réussie. Fichier correcte
2026-02-16 16:17:16 ERROR FileToValidateEditDialogController:225 - Validation réussie. Fichier correcte
2026-02-16 16:27:26 ERROR FileToValidateEditDialogController:225 - Validation réussie. Fichier correcte
2026-02-16 16:45:53 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ERM.M112025.csv.err pour en savoir plus
2026-02-16 16:49:38 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur JOURNAL DES OPPOSITIONS.M112025.csv.err pour en savoir plus
2026-02-16 16:57:07 ERROR FileToValidateEditDialogController:225 - Validation réussie. Fichier correcte
2026-02-18 15:08:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 000030FPRJOP2025120110000000.csv.err pour en savoir plus
2026-02-18 15:23:02 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-02-18 15:23:37 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur SMS.M122025.csv.err pour en savoir plus
2026-02-18 16:25:52 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 000030FPRSMS2025120110000000.csv.err pour en savoir plus
2026-02-25 15:00:35 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515002256.txt.err pour en savoir plus
2026-02-25 15:11:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515110215.txt.err pour en savoir plus
2026-02-25 15:26:00 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515254846.txt.err pour en savoir plus
2026-02-25 15:33:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515335519.txt.err pour en savoir plus
2026-02-25 15:37:53 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515375355.txt.err pour en savoir plus
2026-02-25 15:45:18 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022515450944.txt.err pour en savoir plus
2026-02-25 16:22:10 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022516215709.txt.err pour en savoir plus
2026-02-25 16:38:29 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022516381637.txt.err pour en savoir plus
2026-02-25 16:42:57 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022516424314.txt.err pour en savoir plus
2026-02-25 16:46:24 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022516461046.txt.err pour en savoir plus
2026-02-25 17:07:14 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022517070029.txt.err pour en savoir plus
2026-02-25 17:11:07 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022517105357.txt.err pour en savoir plus
2026-02-25 17:23:11 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022517225827.txt.err pour en savoir plus
2026-02-25 17:32:38 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMPE2026022517322440.txt.err pour en savoir plus
2026-02-26 09:32:53 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-02-26 09:36:25 ERROR FileToValidateEditDialogController:182 - java.nio.charset.UnmappableCharacterException: Input length = 1
2026-03-06 14:33:53 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-03-24 13:36:00 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 20260324-10h50-JP2026-FDX (Test data).csv.err pour en savoir plus
2026-03-24 13:56:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:01:07 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:08:21 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:21:47 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:27:48 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:33:59 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 14:54:20 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:01:24 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:04:10 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:07:51 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:14:20 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGBACT2026032415142009.txt.err pour en savoir plus
2026-03-24 15:31:12 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:35:08 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 15:37:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 16:01:12 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 16:04:42 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 16:08:34 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 16:12:10 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJOP2026032413303030.csv.err pour en savoir plus
2026-03-24 16:40:59 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-03-25 10:30:58 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGBACT2026032510305839.txt.err pour en savoir plus
2026-03-26 10:23:02 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 000042PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-26 10:25:54 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-03-27 14:29:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 000042PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 14:31:29 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:19:18 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:20:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:33:20 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:35:40 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:41:27 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 15:57:51 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 16:26:38 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 16:38:10 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 16:48:42 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 17:03:07 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 17:15:37 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-27 17:20:55 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-30 07:42:46 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-30 07:49:25 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-03-30 08:11:07 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-04-01 10:38:17 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-04-01 11:03:55 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-04-01 11:30:31 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur PATJDP2026010304010101.csv.err pour en savoir plus
2026-04-01 11:58:20 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-04-28 15:50:36 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202026042815454610.txt.err pour en savoir plus
2026-04-28 16:29:51 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPRA202026042816242350.txt.err pour en savoir plus
2026-04-28 17:01:16 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur A20.M012026.csv.err pour en savoir plus
2026-04-28 17:19:39 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur A20.M012026.csv.err pour en savoir plus
2026-04-29 09:58:01 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-04-29 10:31:51 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur E20.M012026.csv.err pour en savoir plus
2026-04-29 10:58:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur E20.M012026.csv.err pour en savoir plus
2026-04-29 11:14:08 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ENFANTS.M012026.CSV.err pour en savoir plus
2026-04-29 11:45:41 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ENFANTS.M012026.CSV.err pour en savoir plus
2026-04-29 12:16:35 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ENFANTS1.M012026.CSV.err pour en savoir plus
2026-04-29 13:49:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur JOURNAL DES OPPOSITIONS.M012026.csv.err pour en savoir plus
2026-04-29 14:14:18 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ERM.M012026.CSV.err pour en savoir plus
2026-04-29 14:42:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ERM.M012026.CSV.err pour en savoir plus
2026-04-29 14:50:18 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur AGENTS IMPOT.M012026.csv.err pour en savoir plus
2026-04-29 15:19:21 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur AGENTS BUDGET.M012026.csv.err pour en savoir plus
2026-04-29 15:25:24 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur ASS_RET.M012026.CSV.err pour en savoir plus
2026-04-29 15:30:58 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur AVI.M012026.csv.err pour en savoir plus
2026-04-29 15:46:30 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur SMS.M012026.txt.err pour en savoir plus
2026-04-29 15:49:46 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur RIB.M012026.csv.err pour en savoir plus
2026-04-29 16:59:52 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur AGENTS.M012026.CSV.err pour en savoir plus
2026-04-29 17:05:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 2C.M012026.xlsx.err pour en savoir plus
2026-04-29 17:07:07 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-04-29 17:08:49 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur FPR3C2026042917084847.txt.err pour en savoir plus
2026-04-29 17:30:21 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-06 16:04:21 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026050616042005.txt.err pour en savoir plus
2026-05-06 16:05:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050616054240.txt.err pour en savoir plus
2026-05-06 16:26:14 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050616260155.txt.err pour en savoir plus
2026-05-06 17:07:12 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050617071113.txt.err pour en savoir plus
2026-05-07 10:08:00 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050710074655.txt.err pour en savoir plus
2026-05-07 10:11:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050710115441.txt.err pour en savoir plus
2026-05-07 10:16:01 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050710154627.txt.err pour en savoir plus
2026-05-07 10:19:11 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050710185808.txt.err pour en savoir plus
2026-05-07 10:31:20 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050710310515.txt.err pour en savoir plus
2026-05-07 10:47:36 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050710472203.txt.err pour en savoir plus
2026-05-07 11:11:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050711113848.txt.err pour en savoir plus
2026-05-07 11:20:38 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050711202411.txt.err pour en savoir plus
2026-05-07 11:34:10 ERROR FileToValidateEditDialogController:182 - java.lang.NullPointerException
2026-05-07 11:45:03 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050711424720.txt.err pour en savoir plus
2026-05-07 11:56:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050711545015.txt.err pour en savoir plus
2026-05-07 12:07:54 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050712055541.txt.err pour en savoir plus
2026-05-07 12:15:23 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050712133613.txt.err pour en savoir plus
2026-05-07 12:23:07 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026050712230715.txt.err pour en savoir plus
2026-05-07 12:28:26 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
2026-05-07 12:31:25 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026050712312446.txt.err pour en savoir plus
2026-05-07 13:48:34 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050713483418.txt.err pour en savoir plus
2026-05-07 13:51:33 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050713513342.txt.err pour en savoir plus
2026-05-07 13:54:48 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050713544754.txt.err pour en savoir plus
2026-05-07 13:59:10 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050713591036.txt.err pour en savoir plus
2026-05-07 14:03:00 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050714012635.txt.err pour en savoir plus
2026-05-07 14:30:39 ERROR FileToValidateEditDialogController:182 - org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
2026-05-07 14:31:18 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
2026-05-07 14:32:11 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
2026-05-07 14:33:50 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050714334910.txt.err pour en savoir plus
2026-05-07 14:45:41 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
2026-05-07 14:47:57 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050714475720.txt.err pour en savoir plus
2026-05-07 14:48:57 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050714485634.txt.err pour en savoir plus
2026-05-07 14:50:34 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050714503446.txt.err pour en savoir plus
2026-05-07 14:58:45 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050714584436.txt.err pour en savoir plus
2026-05-07 15:01:01 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715010045.txt.err pour en savoir plus
2026-05-07 15:05:43 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715054220.txt.err pour en savoir plus
2026-05-07 15:10:46 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715104555.txt.err pour en savoir plus
2026-05-07 15:13:47 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715134650.txt.err pour en savoir plus
2026-05-07 15:15:35 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715153437.txt.err pour en savoir plus
2026-05-07 15:18:09 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715180858.txt.err pour en savoir plus
2026-05-07 15:29:24 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715292339.txt.err pour en savoir plus
2026-05-07 15:39:10 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a BOOLEAN value from a NUMERIC cell
2026-05-07 15:40:29 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715402829.txt.err pour en savoir plus
2026-05-07 15:43:13 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715431258.txt.err pour en savoir plus
2026-05-07 15:48:59 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050715485832.txt.err pour en savoir plus
2026-05-07 16:10:16 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716101542.txt.err pour en savoir plus
2026-05-07 16:24:18 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-07 16:38:07 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716380608.txt.err pour en savoir plus
2026-05-07 16:44:55 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716445413.txt.err pour en savoir plus
2026-05-07 16:46:52 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716465249.txt.err pour en savoir plus
2026-05-07 16:52:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur Jeu de données execution des marchés.xlsx.err pour en savoir plus
2026-05-07 16:52:59 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716525942.txt.err pour en savoir plus
2026-05-07 16:55:55 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050716555434.txt.err pour en savoir plus
2026-05-07 17:06:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050717061407.txt.err pour en savoir plus
2026-05-07 17:13:43 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050717134202.txt.err pour en savoir plus
2026-05-07 17:23:22 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050717232133.txt.err pour en savoir plus
2026-05-08 09:02:22 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050809022121.txt.err pour en savoir plus
2026-05-08 09:08:23 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050809082216.txt.err pour en savoir plus
2026-05-08 09:09:35 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050809093408.txt.err pour en savoir plus
2026-05-08 09:12:24 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050809122345.txt.err pour en savoir plus
2026-05-08 09:16:19 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPEMR2026050809161854.txt.err pour en savoir plus
2026-05-08 09:23:12 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-08 09:23:56 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-08 10:04:05 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050810040522.txt.err pour en savoir plus
2026-05-08 10:35:16 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050810351509.txt.err pour en savoir plus
2026-05-08 10:36:45 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050810364457.txt.err pour en savoir plus
2026-05-08 10:38:38 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050810383745.txt.err pour en savoir plus
2026-05-08 10:40:31 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050810402930.txt.err pour en savoir plus
2026-05-08 10:47:34 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-08 10:55:30 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050810535015.txt.err pour en savoir plus
2026-05-08 11:09:05 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050811072238.txt.err pour en savoir plus
2026-05-08 11:17:37 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050811154845.txt.err pour en savoir plus
2026-05-08 11:29:00 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050811271025.txt.err pour en savoir plus
2026-05-08 11:37:18 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCP2026050811352025.txt.err pour en savoir plus
2026-05-08 12:17:58 ERROR FileToValidateEditDialogController:182 - java.lang.NullPointerException
2026-05-08 12:20:30 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050812202947.txt.err pour en savoir plus
2026-05-08 12:23:16 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2026050812231508.txt.err pour en savoir plus
2026-05-08 14:32:36 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-08 14:45:20 ERROR FileToValidateEditDialogController:182 - java.lang.NullPointerException
2026-05-08 14:58:22 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-08 15:27:23 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-11 15:13:25 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur Jeu de données marchés signés.xlsx.err pour en savoir plus
2026-05-11 15:20:21 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur Jeu de données marchés signés.xlsx.err pour en savoir plus
2026-05-11 15:24:22 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur Jeu de données marchés signés.xlsx.err pour en savoir plus
2026-05-11 15:29:19 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPMSG2025120101010101.xlsx.err pour en savoir plus
2026-05-12 14:42:37 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051214423637.txt.err pour en savoir plus
2026-05-12 15:08:52 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215085148.txt.err pour en savoir plus
2026-05-12 15:11:40 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215113919.txt.err pour en savoir plus
2026-05-12 15:22:46 ERROR FileToValidateEditDialogController:182 - java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
2026-05-12 15:25:50 ERROR FileToValidateEditDialogController:182 - java.lang.NumberFormatException: For input string: "10,000,000"
2026-05-12 15:30:29 ERROR FileToValidateEditDialogController:182 - java.lang.NumberFormatException
2026-05-12 15:33:55 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215335403.txt.err pour en savoir plus
2026-05-12 15:41:56 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215415558.txt.err pour en savoir plus
2026-05-12 15:44:39 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215443736.txt.err pour en savoir plus
2026-05-12 15:48:03 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215480154.txt.err pour en savoir plus
2026-05-12 15:51:23 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051215512225.txt.err pour en savoir plus
2026-05-12 16:00:25 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051216002337.txt.err pour en savoir plus
2026-05-12 16:08:39 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051216083828.txt.err pour en savoir plus
2026-05-12 16:14:08 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur MAPDCV2026051216140717.txt.err pour en savoir plus
2026-05-12 16:21:47 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-12 16:30:08 ERROR FileToValidateEditDialogController:223 - Validation réussie. Fichier correcte
2026-05-13 10:13:39 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGBACT2026051310133955.txt.err pour en savoir plus
2026-05-13 10:22:13 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur 000009DGBACT2026060405245800.txt.err pour en savoir plus
2026-05-13 10:24:48 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGBACT2026060405245800.txt.err pour en savoir plus
2026-06-04 12:06:15 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 12:18:59 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 12:32:05 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 12:38:42 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 12:55:59 ERROR FileToValidateEditDialogController:223 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 13:05:45 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060317263925.txt.err pour en savoir plus
2026-06-04 13:09:08 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060413090741.txt.err pour en savoir plus
2026-06-04 13:45:45 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPEH2026060413454337.txt.err pour en savoir plus
2026-06-04 13:50:34 ERROR FileToValidateEditDialogController:225 - Validation réussie. Fichier correcte
2026-06-04 13:53:54 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTRBA2026060413535403.txt.err pour en savoir plus
2026-06-04 14:22:24 ERROR FileToValidateEditDialogController:225 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTPCT2026060414222356.txt.err pour en savoir plus
2026-06-04 15:08:23 ERROR FileToValidateEditDialogController:230 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTREG2026060415072935.txt.err pour en savoir plus
2026-06-04 15:27:08 ERROR FileToValidateEditDialogController:230 - Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire C:\Users\ASUS\Documents\ERROR, puis et ouvrir le fichier d'erreur DGTREG2026060415264611.txt.err pour en savoir plus
2026-06-04 15:36:51 ERROR FileToValidateEditDialogController:230 - Validation réussie. Fichier correcte
2026-06-05 10:24:43 ERROR FileToValidateEditDialogController:228 - Validation réussie. Fichier correcte
2026-06-17 10:22:35 ERROR FileToValidateEditDialogController:228 - Validation réussie. Fichier correcte
2026-06-17 10:22:57 ERROR FileToValidateEditDialogController:228 - Validation réussie. Fichier correcte
2026-06-17 10:23:39 ERROR FileToValidateEditDialogController:228 - Validation réussie. Fichier correcte
2026-06-17 10:24:13 ERROR FileToValidateEditDialogController:228 - Validation réussie. Fichier correcte
fdx_convert/hibernate.cfg.xml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
Click nbfs://nbhost/SystemFileSystem/Templates/XML/XMLDocument.xml to edit this template
-->
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">org.h2.Driver</property>
    <property name="hibernate.connection.url">jdbc:h2:file:C:/h2/convertisseur_alpha/convertisseur</property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
    <property name="show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!--  all entities -->
    <mapping class="importation.validation.data.client.model.Tache"></mapping>
    <mapping class="importation.validation.data.client.model.TypeFichier"></mapping>
    <mapping class="importation.validation.data.client.model.Configuration"></mapping>
    <mapping class="importation.validation.data.client.model.Validateur"></mapping>
    <mapping class="importation.validation.data.client.model.Journal"></mapping>
    <mapping class="importation.validation.data.client.model.AlphaNumeriqueField"></mapping>
    <mapping class="importation.validation.data.client.model.TruncatedElement"></mapping>
    <mapping class="importation.validation.data.client.model.MetaAlphaNumeriqueField"></mapping>
    <mapping class="importation.validation.data.client.model.ConversionModel"></mapping>
    <mapping class="importation.validation.data.client.model.StructureChampJson"></mapping>
    <mapping class="importation.validation.data.client.model.ModeleJson"></mapping>
    <mapping class="importation.validation.data.client.model.SubObject"></mapping>
    <mapping class="importation.validation.data.client.model.JsonStructure"></mapping>
    <mapping class="importation.validation.data.client.model.TypeFichierJson"></mapping>
  </session-factory>
</hibernate-configuration>
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide installation Fdx-Convert v.1.0.2.docx
Binary files differ
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide installation Fdx-Generator v.1.0.2.docx
Binary files differ
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide utilisation Fdx-Convert v.1.0.2.docx
Binary files differ
fdx_convert/manuels_installation_&_utilisation_fdxconvert_&_fdxgenerator/MGTCM-MINFI-Projet Fdx - FO - Guide utilisation Fdx-Generator v.1.0.2.docx
Binary files differ
fdx_convert/nb-configuration.xml
New file
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-shared-configuration>
    <!--
This file contains additional configuration written by modules in the NetBeans IDE.
The configuration is intended to be shared among all the users of project and
therefore it is assumed to be part of version control checkout.
Without this configuration present, some functionality in the IDE may be limited or fail altogether.
-->
    <properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
        <!--
Properties that influence various parts of the IDE, especially code formatting and the like.
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
        <netbeans.hint.jdkPlatform>JDK_1.8</netbeans.hint.jdkPlatform>
    </properties>
</project-shared-configuration>
fdx_convert/pom.xml
New file
@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.megatim.importation.validation.data.client</groupId>
    <artifactId>fdx-convert-client</artifactId>
    <version>1.0</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <exec.mainClass>importation.validation.data.client.App</exec.mainClass>
    </properties>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>importation.validation.data.client.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.megatim</groupId>
            <artifactId>dynamicjsonparser</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.15.2</version>
        </dependency>
        <dependency>
            <groupId>com.megatim</groupId>
            <artifactId>fdx-datafile-converter</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
            <version>2.1.214</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.3.0.Final</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>
        <dependency>
            <groupId>com.megatimfx.common</groupId>
            <artifactId>megatimfx-common</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.megatim.typefichier.validator</groupId>
            <artifactId>typefichier-validator</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>com.megatim</groupId>
            <artifactId>module.encryption</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.megatim</groupId>
            <artifactId>module-compression</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.dhatim</groupId>
            <artifactId>fastexcel</artifactId>
            <version>0.14.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.dhatim/fastexcel-reader -->
        <dependency>
            <groupId>org.dhatim</groupId>
            <artifactId>fastexcel-reader</artifactId>
            <version>0.15.7</version>
        </dependency>
        <dependency>
            <groupId>com.megatim</groupId>
            <artifactId>customview</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>4.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers</artifactId>
            <version>2.9.0</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parser-text-module</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>
</project>
fdx_convert/src/main/java/com/megatim/fdxconvert/App.java
New file
@@ -0,0 +1,95 @@
package com.megatim.fdxconvert;
import com.megatimfx.common.abstracts.context.AbstractViewContext;
import com.megatim.fdxconvert.controller.MainController;
import com.megatim.fdxconvert.dao.HibernateUtil;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.service.TacheJobService;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
/**
 *
 * @author STEPHANIE
 */
public class App extends Application {
    public static final Map<String, Delimiteur> DELIMITEURS_COLONNE = new HashMap<>();
    public static final Map<String, Delimiteur> DELIMITEURS_LIGNE = new HashMap<>();
    public static final Map<String, Delimiteur> SEPARATEURS_DATE = new HashMap<>();
    public static final List<String> FORMATS_DATE = new ArrayList<>();
    static {
        DELIMITEURS_COLONNE.put("", new Delimiteur("", "Aucun"));
        DELIMITEURS_COLONNE.put(";", new Delimiteur(";", "Point-virgule ( ; )"));
        DELIMITEURS_COLONNE.put("|", new Delimiteur("|", "Barre verticale ( | )"));
        DELIMITEURS_COLONNE.put("\\t", new Delimiteur("\\t", "Tabulation ( \\t )"));
        DELIMITEURS_LIGNE.put("\\n", new Delimiteur("\\n", "Retour Charriot ( \\n )"));
        FORMATS_DATE.add("yyyyMMdd");
        FORMATS_DATE.add("yyyyddMM");
        FORMATS_DATE.add("MMyyyydd");
        FORMATS_DATE.add("MMddyyy");
        FORMATS_DATE.add("yyyy");
        SEPARATEURS_DATE.put("", new Delimiteur("", "Aucun"));
        SEPARATEURS_DATE.put("-", new Delimiteur("-", "Tiret ( - )"));
        SEPARATEURS_DATE.put("/", new Delimiteur("/", "Slash ( / )"));
    }
    @Override
    public void start(Stage primaryStage) throws FileNotFoundException, MalformedURLException, IOException {
        AbstractViewContext.getInstance().setAbstractEditDialogControllerURL(App.class.getResource("/importation/validation/data/client/abstracts/AbstractEditDialog.fxml"));
        AbstractViewContext.getInstance().setAbstractMainDialogControllerURL(App.class.getResource("/importation/validation/data/client/abstracts/AbstractMainDialog.fxml"));
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainController.class.getResource("main.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root, 1100, 600);
        primaryStage.setTitle("Convertisseur et validateur des données de Fdx V1.0.2 ");
        primaryStage.getIcons().add(new Image("images/icone_ins.png"));
        primaryStage.setOnCloseRequest(e -> {
            HibernateUtil.shutdown();
            System.exit(0);
        });
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            TacheJobService.getInstance().startJobs();
            launch(args);
        } catch (Exception ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/Test.java
New file
@@ -0,0 +1,262 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.dynamicjsonparser.extender.JsonDataValidator;
import com.megatim.dynamicjsonparser.pojo.JsonField;
import static com.megatim.dynamicjsonparser.utils.Utility.writeToFile;
import com.megatim.typefichier.validator.Validator;
import com.megatim.typefichier.validator.model.ConfigJsonValidator;
import com.megatim.typefichier.validator.utilities.Utilities;
import com.megatim.fdxconvert.dao.JsonStructureDAO;
import com.megatim.fdxconvert.dao.TypeFichierJsonDAO;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.model.jaxb.TypeFichierJsonsList;
import com.megatim.fdxconvert.service.JsonStructureService;
import com.megatim.fdxconvert.service.TypeFichierJsonService;
import com.megatim.fdxconvert.util.TypeFichierJsonMarshaller;
import com.megatim.fdxconvert.util.TypeFichierJsonConverter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBException;
import org.apache.poi.ss.usermodel.DateUtil;
/**
 *
 * @author STEPHANIE
 */
public class Test {
    public static void main(String[] args) throws Exception {
        Date date = DateUtil.getJavaDate(Double.parseDouble("45112   "));
        SimpleDateFormat sdf
                = new SimpleDateFormat("dd/MM/yyyy");
        System.out.println("" + sdf.format(date));
    }
    private static void unMarshall() {
        String filePath = "C:\\Users\\ASUS\\Documents\\DATAS\\Export\\typefichierJsons.xml";
        try {
            TypeFichierJsonsList typeFichierJsonsList = TypeFichierJsonMarshaller.unMarshall(filePath);
            TypeFichierJsonService service = TypeFichierJsonService.getInstance();
            for (TypeFichierJson t : typeFichierJsonsList.getTypeFichierJson()) {
                service.add(t);
            }
        } catch (JAXBException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private static void unMarshallOne(String filePath) {
        try {
            TypeFichierJson t = TypeFichierJsonMarshaller.unMarshallOne(filePath);
            TypeFichierJsonService.getInstance().add(t);
        } catch (JAXBException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private static void marshallOne(String codeTypeFichier) {
        try {
            TypeFichierJson typeFichierJson = TypeFichierJsonDAO.getByTypeFichier(codeTypeFichier);
            TypeFichierJsonMarshaller.marshall("C:\\Users\\ASUS\\Documents\\DATAS\\Export", typeFichierJson);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    private static void marshall() {
        try {
            List<TypeFichierJson> typefichierJsons = TypeFichierJsonService.getInstance().getAll();
            for (TypeFichierJson t : typefichierJsons) {
                JsonStructure jsonStructure = JsonStructureDAO.loadSubJsonStructure(t.getJsonStructure());
                t.setJsonStructure(jsonStructure);
            }
            TypeFichierJsonMarshaller.marshall(typefichierJsons, "C:\\Users\\ASUS\\Documents\\DATAS\\Export");
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    private static void validateWithValidator() {
        File file = new File("C:\\Users\\ASUS\\Documents\\DATAS\\DGBACT.json");
        String validatorPath = "C:\\Users\\ASUS\\Documents\\DATAS\\Export\\DGBACT20250417151916.xml";
        Validator validator = new Validator();
        ConfigJsonValidator configJson = new ConfigJsonValidator(
                "C:\\Users\\ASUS\\Documents\\ERROR",
                "C:\\Users\\ASUS\\Documents\\OUT",
                file
        );
        try {
            boolean result = validator.validate(validatorPath, configJson, System.getProperty("user.dir") + "\\src\\main\\java", true, true, 1);
            System.out.println("result = " + result);
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JAXBException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private static void validate() {
        try {
            final String packageName = "com.megatim.dynamicjsonparser.generated";
            File file = new File("C:\\Users\\ASUS\\Documents\\DATAS\\DGBACT.json");
            List<JsonField> fields = new TypeFichierJsonConverter(dgbact()).convert();
            JsonDataValidator jsonDataValidator = new JsonDataValidator();
            boolean result = jsonDataValidator.validateDatas(fields, System.getProperty("user.dir") + "\\src\\main\\java", packageName, file, 1);
            System.out.println("result = " + result + ", " + LocalDateTime.now());
            if (!result) {
                Path errorPath = Paths.get("C:\\Users\\ASUS\\Documents\\JSON_TEST\\DGBACT.txt.err");
                writeToFile(jsonDataValidator.getParsedData().getErrors(), errorPath);
            }
            System.out.println("NbElts = " + jsonDataValidator.getParsedData().getVirtuals().size() + ", " + LocalDateTime.now());
//            jsonDataValidator.getParsedData().getVirtuals().forEach(v -> System.out.println(v));
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
//    private static String print(List<JsonDataType> jsonDataTypes) {
//        if (jsonDataTypes != null && !jsonDataTypes.isEmpty()) {
//            jsonDataTypes.stream().forEach(j -> {
//                if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) {
//                    System.out.println(j);
//                    System.out.println("    " + print(j.getJsonDataTypes()));
//                } else {
//                    System.out.println(j);
//                }
//            });
//        }
//        return "";
//    }
    public static void save() {
        TypeFichierJson t = typeFichierJson();
        JsonStructure jsonStruct = t.getJsonStructure();
        jsonStruct.setTypeFichierJson(null);
        try {
            TypeFichierJsonService tjService = TypeFichierJsonService.getInstance();
            JsonStructureService jService = JsonStructureService.getInstance();
            JsonStructure newJsonStruct = jService.add(t.getJsonStructure());
            t.setJsonStructure(newJsonStruct);
            TypeFichierJson newEntity = tjService.add(t);
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    public static TypeFichierJson typeFichierJson() {
        TypeFichierJson typeFichierJson = new TypeFichierJson();
        typeFichierJson.setTypeFichier(typeFichier());
        JsonStructure parent = jsonStructure(null, typeFichierJson.getTypeFichier().getCode(), true, true, TypeDonnee.OBJET, 10);
        parent.setFields(jsonStructures(parent));
        parent.setTypeFichierJson(typeFichierJson);
        typeFichierJson.setJsonStructure(parent);
        return typeFichierJson;
    }
    private static TypeFichier typeFichier() {
        TypeFichier typeFichier = new TypeFichier();
        typeFichier.setCode("DGBACT");
        return typeFichier;
    }
    private static TypeFichierJson dgbact() {
        TypeFichierJson typeFichierJson = new TypeFichierJson();
        typeFichierJson.setTypeFichier(typeFichier());
        JsonStructure parent = jsonStructure(null, typeFichierJson.getTypeFichier().getCode(), true, true, TypeDonnee.OBJET, 10);
        parent.setFields(jsonStructures(parent));
        parent.setTypeFichierJson(typeFichierJson);
        typeFichierJson.setJsonStructure(parent);
        List<JsonStructure> jsonStructures = new ArrayList<>();
        jsonStructures.add(jsonStructure(parent, "EXERCICE", true, false, TypeDonnee.ALPHANUMERIQUE, 2));
        jsonStructures.add(jsonStructure(parent, "CHAPITRE", true, false, TypeDonnee.ALPHANUMERIQUE, 2));
        jsonStructures.add(jsonStructure(parent, "CODEPROGRAMME", true, false, TypeDonnee.ALPHANUMERIQUE, 3));
        jsonStructures.add(jsonStructure(parent, "CODEACTION", true, false, TypeDonnee.ALPHANUMERIQUE, 2));
        jsonStructures.add(jsonStructure(parent, "LIBELLEF", true, false, TypeDonnee.ALPHANUMERIQUE, 255));
        jsonStructures.add(jsonStructure(parent, "LIBELLEA", true, false, TypeDonnee.ALPHANUMERIQUE, 255));
        parent.setFields(jsonStructures);
        return typeFichierJson;
    }
    private static List<JsonStructure> jsonStructures(JsonStructure parent) {
        List<JsonStructure> jsonStructures = new ArrayList<>();
        jsonStructures.add(jsonStructure(parent, "numeros", true, true, TypeDonnee.NUMERIQUE, 8));
        jsonStructures.add(jsonStructure(parent, "noms", true, false, TypeDonnee.ALPHANUMERIQUE, 100));
        jsonStructures.add(jsonStructure(parent, "nbreEnfants", false, false, TypeDonnee.NUMERIQUE, 2));
        jsonStructures.add(jsonStructure(parent, "salaire", true, false, TypeDonnee.DECIMAL, 14));
        jsonStructures.add(jsonStructure(parent, "dateNaissance", true, false, "yyyyMMdd", "-", 10));
        JsonStructure jsonStructure = jsonStructure(parent, "cptBanque", true, true, TypeDonnee.OBJET, 10);
        jsonStructure.setFields(Arrays.asList(
                jsonStructure(jsonStructure, "rib", true, false, TypeDonnee.NUMERIQUE, 23),
                jsonStructure(jsonStructure, "solde", true, false, TypeDonnee.DECIMAL, 14),
                jsonStructure(jsonStructure, "dateCreation", true, false, "yyyyMMdd", "-", 10)
        ));
        jsonStructures.add(jsonStructure);
        return jsonStructures;
    }
    private static JsonStructure jsonStructure(JsonStructure parent, String name, boolean required, boolean collection, TypeDonnee typeDonnee, int taille) {
        JsonStructure jsonStructure = new JsonStructure();
        jsonStructure.setName(name);
        jsonStructure.setCollection(collection);
        jsonStructure.setTypeDonnee(typeDonnee);
        jsonStructure.setRequired(required);
        jsonStructure.setParent(parent);
        jsonStructure.setLengthh(taille);
        return jsonStructure;
    }
    private static JsonStructure jsonStructure(JsonStructure parent, String name, boolean required, boolean collection, String formatDate, String delimiteurDate, int taille) {
        JsonStructure jsonStructure = new JsonStructure();
        jsonStructure.setName(name);
        jsonStructure.setCollection(collection);
        jsonStructure.setTypeDonnee(TypeDonnee.DATE);
        jsonStructure.setRequired(required);
        jsonStructure.setFormatDate(formatDate);
        jsonStructure.setCodeDelimiteurDate(delimiteurDate);
        jsonStructure.setParent(parent);
        jsonStructure.setLengthh(taille);
        return jsonStructure;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/AproposEditDialogController.java
New file
@@ -0,0 +1,82 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.forms.AproposEditFormController;
import com.megatim.fdxconvert.forms.ImportTypeFichierEditFormController;
import com.megatim.fdxconvert.pojo.ImportFile;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.scene.layout.Pane;
/**
 *
 * @author STEPHANIE
 */
public class AproposEditDialogController extends AbstractEditDialogController<ImportFile> {
    private AproposEditFormController aproposEditFormController;
    @Override
    public String getTitle() {
        getEditButton().setText("OK");
        getCancelButton().setVisible(false);
        return "A Propos";
    }
   @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(aproposEditFormController.getClass().getResource("About.fxml"), aproposEditFormController);
    }
     @Override
    public Object getContentFormController() {
        return aproposEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        aproposEditFormController = new AproposEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        getCurrentObject();
        return super.beforeSave(event);
    }
    @Override
    public void save(ActionEvent event) {
        closeDialog(event);
    }
    @Override
    protected void afterBindCurrentObjectWithFormField(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.afterBindCurrentObjectWithFormField(bindObject, formController, typeOperation);
    }
    @Override
    protected void beforeBindCurrentObjectWithFormField(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.beforeBindCurrentObjectWithFormField(bindObject, formController, typeOperation);
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.afterBindFormFieldWithCurrentObject(bindObject, formController, typeOperation);
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.beforeBindFormFieldWithCurrentObject(bindObject, formController, typeOperation);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConfigEditDialogController.java
New file
@@ -0,0 +1,63 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.ConfirmationType;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.forms.ConfigEditFormController;
import com.megatim.fdxconvert.model.Configuration;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.scene.layout.Pane;
/**
 *
 * @author mela
 */
public class ConfigEditDialogController extends AbstractEditDialogController<Configuration> {
    private ConfigEditFormController configEditFormController;
    @Override
    public String getTitle() {
        getEditButton().setText("Configurer");
        return "Configuration des répertoires";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(configEditFormController.getClass().getResource("ConfigEditForm.fxml"), configEditFormController);
    }
     @Override
    public Object getContentFormController() {
        return configEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        configEditFormController = new ConfigEditFormController();
        super.initialize(url, rb);
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(Configuration bindObject, Object formController, TypeOperation typeOperation) {
        super.beforeBindFormFieldWithCurrentObject(bindObject, formController, typeOperation);
    }
    @Override
    public String getConfirmationMessage() {
        return "Répertoires configurés avec succès !";
    }
    @Override
    protected ConfirmationType getConfirmationType() {
        return ConfirmationType.CONFIRMATION;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConversionModelEditDialogController.java
New file
@@ -0,0 +1,235 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.ConfirmationType;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.forms.MetaAlphaNumeriqueFieldEditFormController;
import com.megatim.fdxconvert.forms.ConversionModelEditFormController;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.service.MetaAlphaNumeriqueFieldService;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.scene.layout.Pane;
/**
 *
 * @author ASUS
 */
public class ConversionModelEditDialogController extends AbstractEditDialogController<ConversionModel> {
    private ConversionModelEditFormController conversionModelEditFormController;
    private MetaAlphaNumeriqueFieldEditDialogController metaAlphaNumeriqueFieldEditDialogController;
    private Map<String, AlphaNumeriqueField> newAlphaFields = new HashMap<>();
    @Override
    public String getTitle() {
        return "Editer un modèle de conversion";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(conversionModelEditFormController.getClass().getResource("ConversionModelEditForm.fxml"), conversionModelEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return conversionModelEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        getEditButton().setText("Editer");
        conversionModelEditFormController = new ConversionModelEditFormController();
        metaAlphaNumeriqueFieldEditDialogController = new MetaAlphaNumeriqueFieldEditDialogController();
        metaAlphaNumeriqueFieldEditDialogController.setAlphaNumeriqueFieldEditFormController(new MetaAlphaNumeriqueFieldEditFormController());
        super.initialize(url, rb);
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(ConversionModel bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof ConversionModelEditFormController) {
            ConversionModelEditFormController controller = (ConversionModelEditFormController) formController;
            if (typeOperation.equals(TypeOperation.VIEW) || typeOperation.equals(TypeOperation.UPDATE)) {
                if (bindObject.getCodeDelimiteurColonne() != null) {
                    bindObject.setDelimiteurColonne(App.DELIMITEURS_COLONNE.get(bindObject.getCodeDelimiteurColonne()));
                }
                if (bindObject.getCodeDelimiteurLigne() != null) {
                    bindObject.setDelimiteurLigne(App.DELIMITEURS_LIGNE.get(bindObject.getCodeDelimiteurLigne()));
                }
            }
            if (typeOperation.equals(TypeOperation.ADD) || typeOperation.equals(TypeOperation.UPDATE)) {
                controller.getDelimiteurColonne().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getDelimiteurLigne().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getStrictValidationCheckbox().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNotEqualTo(DataType.TXT)));
                controller.getHeaderPresentCheckbox().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
            }
            switch (typeOperation) {
                case ADD:
                    controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(true);
                    break;
                case UPDATE:
                    controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(false);
                    break;
                default:
            }
        }
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(ConversionModel bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof ConversionModelEditFormController) {
            ConversionModelEditFormController controller = (ConversionModelEditFormController) formController;
            controller.getMetaAlphaNumeriqueFieldAbstractTable().setController(metaAlphaNumeriqueFieldEditDialogController);
            switch (typeOperation) {
                case ADD:
                    controller.getTypeFichierAbstractSelectItem().selectedElementProperty().addListener((observable, oldValue, newValue) -> {
                        if (newValue != null) {
                            metaAlphaNumeriqueFieldEditDialogController.getAlphaNumeriqueFieldEditFormController().setTypeFichier(newValue);
                            controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(false);
                        }
                    });
                    controller.getSaisieAlphaNumeriqueFieldChecBox().selectedProperty().addListener(listener -> {
                        if (controller.getSaisieAlphaNumeriqueFieldChecBox().isSelected()) {
                            controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(false);
                        }
                    });
                    break;
                case UPDATE:
                    metaAlphaNumeriqueFieldEditDialogController.getAlphaNumeriqueFieldEditFormController()
                            .setTypeFichier(controller.getTypeFichierAbstractSelectItem().getSelectedElement());
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setSelected(true);
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                    break;
                default:
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setSelected(true);
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                    break;
            }
        }
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        getCurrentObject().getMetaAlphaNumeriqueFields().forEach(m -> {
            newAlphaFields.put(m.getAlphaNumeriqueField().getCodeColonne(), m.getAlphaNumeriqueField());
        });
        Delimiteur delimiteurColonne = getCurrentObject().getDelimiteurColonne();
        Delimiteur delimiteurLigne = getCurrentObject().getDelimiteurLigne();
        if (delimiteurColonne != null) {
            getCurrentObject().setCodeDelimiteurColonne(delimiteurColonne.getCode());
        }
        if (delimiteurLigne != null) {
            getCurrentObject().setCodeDelimiteurLigne(delimiteurLigne.getCode());
        }
        return proceed;
    }
    @Override
    public void afterSave(ActionEvent event) {
        try {
            ConversionModel currentObject = getCurrentObject();
            Set<MetaAlphaNumeriqueField> newSetMeta = currentObject.getMetaAlphaNumeriqueFields();
            newSetMeta.forEach(m -> {
                if (!newAlphaFields.containsKey(m.getAlphaNumeriqueField().getCodeColonne())) {
                    try {
                        MetaAlphaNumeriqueFieldService.getInstance().delete(m);
                    } catch (Exception ex) {
                        Logger.getLogger(ConversionModelEditDialogController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        } catch (Exception ex) {
            Logger.getLogger(ConversionModelEditDialogController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    public String getConfirmationMessage() {
        return "La configuration a été enregistrée avec succès";
    }
    @Override
    protected ConfirmationType getConfirmationType() {
        return ConfirmationType.CONFIRMATION;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ConversionModelListDialogController.java
New file
@@ -0,0 +1,112 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.controller.search.ConversionModelAdvancedSearchController;
import com.megatim.fdxconvert.controller.search.ConversionModelSearchController;
import com.megatim.fdxconvert.controller.table.ConversionModelTable;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.service.ConversionModelService;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.Pane;
/**
 *
 * @author ASUS
 */
public class ConversionModelListDialogController extends AbstractMainDialogController<ConversionModel, ConversionModel> {
    private ConversionModelAdvancedSearchController conversionModelAdvancedSearchController;
    private ConversionModelSearchController conversionModelSearchController;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        conversionModelSearchController = new ConversionModelSearchController();
        conversionModelAdvancedSearchController = new ConversionModelAdvancedSearchController();
        super.initialize(location, resources);
    }
    @Override
    public GenericCrudService<ConversionModel> getGenericCrudService() {
        return ConversionModelService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Modèles de conversion";
    }
    @Override
    public Class<ConversionModel> getElementClazz() {
        return ConversionModel.class;
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(ConversionModelTable.typeFichierColumn(), ConversionModelTable.dataTypeColumn(),
                ConversionModelTable.delimiteurLigneColumn(), ConversionModelTable.delimiteurColonneColumn(),
                ConversionModelTable.dateCreationColumn()
        );
    }
    @Override
    public AbstractEditDialogController<ConversionModel> getAbstractEditDialogController() {
        return new ConversionModelEditDialogController();
    }
    @Override
    public List<SearchCriteria> getPermanentSearchCriterias() {
        List<SearchCriteria> liste = new ArrayList<>();
        return liste;
    }
    @Override
    public Object getAdvancedSearchFormController() {
        return conversionModelAdvancedSearchController;
    }
    @Override
    public Object getSearchFormController() {
        return conversionModelSearchController;
    }
    @Override
    public Pane getAdvancedSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(conversionModelAdvancedSearchController.getClass().getResource("ConversionModelAdvancedSearchForm.fxml"), conversionModelAdvancedSearchController);
    }
    @Override
    public Pane getSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(conversionModelSearchController.getClass().getResource("ConversionModelSearchForm.fxml"), conversionModelSearchController);
    }
    @Override
    public void resetFormFields(Object searchController, Object advancedSearchController) {
        if (advancedSearchController instanceof ConversionModelAdvancedSearchController) {
            ConversionModelAdvancedSearchController controller = (ConversionModelAdvancedSearchController) advancedSearchController;
            controller.getDelimiteurColonneComboBox().setValue(null);
            controller.getDelimiteurLigneComboBox().setValue(null);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/DataFileToJsonEditDialogController.java
New file
@@ -0,0 +1,176 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.exceptions.ConfigException;
import com.megatim.fdxconvert.exceptions.ValidatorException;
import com.megatim.fdxconvert.forms.DataFileToJsonFormController;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.pojo.ColumnDefinition;
import com.megatim.fdxconvert.pojo.DataFileToJson;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.util.ExportToJson;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import com.megatim.fdxconvert.service.ValidateurService;
import com.megatim.typefichier.validator.utilities.ParserUtils;
import com.megatim.fdxconvert.util.ValidateurParser;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author ASUS
 */
public class DataFileToJsonEditDialogController extends AbstractEditDialogController<DataFileToJson> {
    org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(DataFileToJsonEditDialogController.class);
    private DataFileToJsonFormController txtFileToJsonFormController;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        txtFileToJsonFormController = new DataFileToJsonFormController();
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        getEditButton().setText("Convertir");
        return "Conversion d'un fichier de données en JSON";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(txtFileToJsonFormController.getClass().getResource("DataFileToJsonEditForm.fxml"), txtFileToJsonFormController);
    }
    @Override
    public Object getContentFormController() {
        return txtFileToJsonFormController;
    }
    @Override
    public void afterSave(ActionEvent event) {
        List<Validateur> validateurs = ValidateurService.getInstance().getAll(Arrays.asList(validateurCriterion(getCurrentObject().getTypeFichier().getCode())));
        boolean proceed = !validateurs.isEmpty() || getCurrentObject().getValidateurPath() != null;
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                parseFile();
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog("Conversion en JSON reussie", NotificationType.SUCCESS, parentStage);
            notificationDialog.showNotification();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            if (th instanceof ConfigException || th instanceof ValidatorException) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog(th.getMessage(), NotificationType.WARNING, parentStage);
                logger.warn(th.getMessage());
                notificationDialog.showNotification();
            } else {
                logger.error(th);
                AlertMessageUtil.showAlertException(th, "Une exception s'est produite pendant la validation du fichier", "Erreur");
            }
        });
        if (proceed) {
            new Thread(task).start();
        } else {
            AlertMessageUtil.showAlertException(new Exception(""), "Validateur de " + getCurrentObject().getTypeFichier().getCode() + " introuvable", "Erreur");
        }
    }
    private SearchCriteria validateurCriterion(String codeTypeFichier) {
        SearchCriteria criterion = new SearchCriteria();
        criterion.setFieldName("codeTypeFichier");
        criterion.setFieldType(String.class);
        criterion.setFieldValue(codeTypeFichier);
        criterion.setOperateur(Operateur.EQUALS);
        return criterion;
    }
    private void parseFile() throws Exception {
        Configuration config = ConfigurationService.getInstance().getCurrentConfig();
        List<ColumnDefinition> colDefs = new ArrayList<>();
        if (getCurrentObject().getValidateurPath()!= null) {
            colDefs = ValidateurParser.retrieveFieldsFromValidator(new File(getCurrentObject().getValidateurPath()), getCurrentObject().getTypeFichier().getCode());
        } else {
            ParserUtils.getValidateurElements(getCurrentObject().getValidateurBytes());
        }
        parseFile(getCurrentObject(), config, colDefs);
    }
    private void parseFile(DataFileToJson txtFileToJson, Configuration config, List<ColumnDefinition> colDefs) throws Exception {
        String fileName = (new File(txtFileToJson.getFileToConvertPath())).getName();
        int index = fileName.lastIndexOf(".");
        fileName = fileName.substring(0, index);
        File outputFile = new File(config.getDatasDir(), fileName + ".json");
        FileToValidateDescription fileDesc = null;
        if (!txtFileToJson.getDataType().equals(DataType.TXT)) {
            fileDesc = new FileToValidateDescription(new File(txtFileToJson.getFileToConvertPath()),
                    txtFileToJson.getDelimiteurLigne().getCode(),
                    txtFileToJson.getDelimiteurColonne().getCode());
        }
        switch (txtFileToJson.getDataType()) {
            case CSV:
                ExportToJson.parseCsvFile(fileDesc, outputFile, colDefs, txtFileToJson.isHeaderPresent());
                break;
            case TXT:
                ExportToJson.parseFileByColumnLength(
                        new FileToValidateDescription(new File(txtFileToJson.getFileToConvertPath()), "", ""),
                        outputFile, colDefs);
                break;
            case XLS:
                ExportToJson.parseXlsFile(fileDesc, outputFile, colDefs, txtFileToJson.isHeaderPresent());
                break;
            case XLSX:
                ExportToJson.parseXlsxFile(fileDesc, outputFile, colDefs, txtFileToJson.isHeaderPresent());
                break;
            default:
                throw new Exception("Type de données non supporté");
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/DecryptageAESEditDialogController.java
New file
@@ -0,0 +1,135 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.module.encryption.impl.AESImpl;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.forms.DecryptageAESEditFormController;
import com.megatim.fdxconvert.pojo.DecryptageAES;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author STEPHANIE
 */
public class DecryptageAESEditDialogController extends AbstractEditDialogController<DecryptageAES> {
    private DecryptageAESEditFormController decryptageAESEditFormController;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        decryptageAESEditFormController = new DecryptageAESEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        getEditButton().setText("Décrypter");
        return "Décryptage d'un fichier";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(decryptageAESEditFormController.getClass().getResource("DecryptageAESEditForm.fxml"), decryptageAESEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return decryptageAESEditFormController;
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        boolean proceedKey = getCurrentObject().getKeyToDecrypt().equals(getCurrentObject().getKeyConfirmation());
        proceed = proceed && proceedKey;
        if (!proceedKey) {
            com.megatimfx.common.customdialogs.LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            com.megatimfx.common.dialogs.NotificationDialog notificationDialog = new com.megatimfx.common.dialogs.NotificationDialog(
                    "La clé et sa confirmation doivent avoir la même valeur",
                    com.megatimfx.common.dialogs.NotificationType.ERROR,
                    parentStage
            );
            notificationDialog.showNotification();
        }
        return proceed;
    }
    @Override
    public void afterSave(ActionEvent event) {
        DecryptageAES dec = getCurrentObject();
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                symetricDecrypt(dec);
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            if (th instanceof javax.crypto.BadPaddingException || th instanceof java.security.spec.InvalidKeySpecException
                    || th instanceof java.security.InvalidKeyException) {
                NotificationDialog notificationDialog = new NotificationDialog(
                        "Echec décryptage : La clé fournie n'est pas la bonne ",
                        NotificationType.ERROR,
                        parentStage
                );
                notificationDialog.showNotification();
            } else if (th instanceof javax.crypto.IllegalBlockSizeException) {
                NotificationDialog notificationDialog = new NotificationDialog(
                        "Echec décryptage : Ce fichier n'est pas crypté avec l'alogorithme AES ",
                        NotificationType.ERROR,
                        parentStage
                );
                notificationDialog.showNotification();
            } else {
                AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant le décryptage du fichier", "Erreur");
            }
        });
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog(
                    "Décryptage du fichier réussie",
                    NotificationType.SUCCESS,
                    parentStage
            );
            notificationDialog.showNotification();
        });
        new Thread(task).start();
    }
    private void symetricDecrypt(DecryptageAES dec) throws Exception {
        AESImpl aes = new AESImpl();
        File inputFile = new File(dec.getFilePath());
        File outputFile = new File(dec.getOutputDir(), inputFile.getName());
        aes.decryptFile(dec.getKeyToDecrypt(), dec.getKeyLength(), dec.getFilePath(), outputFile.getAbsolutePath());
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/FileToValidateEditDialogController.java
New file
@@ -0,0 +1,447 @@
package com.megatim.fdxconvert.controller;
import com.megatim.typefichier.validator.Validator;
import com.megatim.typefichier.validator.model.ConfigJsonValidator;
import com.megatim.typefichier.validator.model.ConfigStreamValidator;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.dao.TypeFichierJsonDAO;
import com.megatim.fdxconvert.dao.ValidateurDAO;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.exceptions.ConfigException;
import com.megatim.fdxconvert.exceptions.ValidatorException;
import com.megatim.fdxconvert.forms.MetaAlphaNumeriqueFieldEditFormController;
import com.megatim.fdxconvert.forms.FileToValidateEditFormController;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.pojo.FileToValidate;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.util.ImportData;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import com.megatim.fdxconvert.util.TypeFichierJsonConverter;
import com.megatim.fdxconvert.util.Utilities;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Optional;
import java.util.Random;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.apache.commons.io.IOUtils;
/**
 *
 * @author STEPHANIE
 */
public class FileToValidateEditDialogController extends AbstractEditDialogController<FileToValidate> {
    org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FileToValidateEditDialogController.class);
    private FileToValidateEditFormController fileToValidateEditFormController;
    private MetaAlphaNumeriqueFieldEditDialogController metaAlphaNumeriqueFieldEditDialogController;
    @Override
    public String getTitle() {
        getEditButton().setText("Valider");
        return "Conversion manuelle des fichiers";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(fileToValidateEditFormController.getClass().getResource("FileToValidateEditForm.fxml"), fileToValidateEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return fileToValidateEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        fileToValidateEditFormController = new FileToValidateEditFormController();
        metaAlphaNumeriqueFieldEditDialogController = new MetaAlphaNumeriqueFieldEditDialogController();
        metaAlphaNumeriqueFieldEditDialogController.setAlphaNumeriqueFieldEditFormController(new MetaAlphaNumeriqueFieldEditFormController());
        super.initialize(url, rb);
    }
    @Override
    protected void afterBindCurrentObjectWithFormField(FileToValidate bindObject, Object formController, TypeOperation typeOperation) {
        FileToValidateEditFormController controller = (FileToValidateEditFormController) formController;
        controller.getMetaAlphaNumeriqueFieldAbstractTable().setController(metaAlphaNumeriqueFieldEditDialogController);
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(FileToValidate bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof FileToValidateEditFormController) {
            FileToValidateEditFormController controller = (FileToValidateEditFormController) formController;
            controller.getMetaAlphaNumeriqueFieldAbstractTable().setController(metaAlphaNumeriqueFieldEditDialogController);
            switch (typeOperation) {
                case ADD:
                    controller.getTypeFichierAbstractSelectItem().selectedElementProperty().addListener((observable, oldValue, newValue) -> {
                        if (newValue != null) {
                            metaAlphaNumeriqueFieldEditDialogController.getAlphaNumeriqueFieldEditFormController().setTypeFichier(newValue);
                            if (controller.getDataTypeComboBox().getSelectionModel().getSelectedItem() != null && controller.getDataTypeComboBox().getSelectionModel().getSelectedItem().equals(DataType.JSON)) {
                                controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                            }
                            controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(false);
                        }
                    });
                    fileToValidateEditFormController.getSaisieAlphaNumeriqueFieldChecBox().selectedProperty().addListener(listener -> {
                        if (fileToValidateEditFormController.getSaisieAlphaNumeriqueFieldChecBox().isSelected()) {
                            fileToValidateEditFormController.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(false);
                        }
                    });
                    fileToValidateEditFormController.getStrictValidationCheckbox().selectedProperty().addListener(l -> {
                        if (fileToValidateEditFormController.getStrictValidationCheckbox().isSelected()) {
                            fileToValidateEditFormController.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(true);
                        }
                    });
                    break;
                default:
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setSelected(true);
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                    break;
            }
        }
    }
    @Override
    public void afterSave(ActionEvent event) {
        Configuration config = ConfigurationService.getInstance().getCurrentConfig();
        if (getCurrentObject().getDataType().equals(DataType.JSON)) {
            validateJsonFile(config, event);
        } else {
            Optional<Validateur> validateur = ValidateurDAO.findByCodeTypeFichier(getCurrentObject().getTypeFichier().getCode());
            if (!validateur.isPresent()) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog("Validation impossible. Le type fichier " + getCurrentObject().getTypeFichier().getCode() + " n'a pas de validateur enregistré!",
                        NotificationType.ERROR,
                        parentStage);
                notificationDialog.showNotification();
            }
            validateTexteFile(config, validateur.get(), event);
        }
    }
    private void validateTexteFile(Configuration config, Validateur validateur, ActionEvent event) {
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                if (validateur.isConvertDataBeforeValidation()) {
                    //On converti le fichier à valider en fichier
                    generateAndParseTxtFile(getCurrentObject(), config, validateur);
                }
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            if ((th instanceof ConfigException) || (th instanceof ValidatorException)) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog(th.getMessage(), NotificationType.WARNING, parentStage);
                logger.warn(th.getMessage());
                notificationDialog.showNotification();
            } else {
                logger.error(task.getException());
                AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant l'importation des données", "Erreur");
            }
        });
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            validateGeneratedFile(config, validateur, event);
        });
        new Thread(task).start();
    }
    private void validateGeneratedFile(Configuration config, Validateur validateur, ActionEvent event) {
        Task<Boolean> task = new Task<Boolean>() {
            @Override
            protected Boolean call() throws Exception {
                return validate(config, validateur);
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            boolean valid = task.getValue();
            String message;
            NotificationDialog notificationDialog;
            String errorFileName = getCurrentObject().getTxtFilePath() != null
                    ? new File(getCurrentObject().getTxtFilePath()).getName()
                    : new File(getCurrentObject().getFilePath()).getName();
            if (!valid) {
                message = "Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire " + config.getErrorDir() + ", puis et ouvrir le fichier d'erreur "
                        + errorFileName + ".err pour en savoir plus";
                notificationDialog = new NotificationDialog(message, NotificationType.ERROR, parentStage);
            } else {
                message = "Validation réussie. Fichier correcte";
                notificationDialog = new NotificationDialog(message, NotificationType.SUCCESS, parentStage);
            }
            logger.error(message);
            notificationDialog.showNotification();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            if (th instanceof ConfigException || th instanceof ValidatorException) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog(th.getMessage(), NotificationType.WARNING, parentStage);
                logger.warn(th.getMessage());
                notificationDialog.showNotification();
            } else {
                logger.error(th);
                AlertMessageUtil.showAlertException(th, "Une exception s'est produite pendant la validation du fichier", "Erreur");
            }
        });
        new Thread(task).start();
    }
    /**
     * Méthode qui appelle la méthode de validation
     *
     * @param val :
     * @param config
     * @return
     * @throws Exception
     */
    private boolean validate(Configuration config, Validateur validateur) throws Exception {
        if (config == null) {
            throw new ConfigException("Validation impossible, les répertoires ne sont pas configurés. Bien vouloir les configurer avant avant d'effectuer cette action");
        }
        File originalFile = new File(getCurrentObject().getFilePath());
        File file = validateur.isConvertDataBeforeValidation() ? new File(getCurrentObject().getTxtFilePath()) : originalFile; //Fichier à valider
        if (!file.exists()) {
            throw new FileNotFoundException("Le fichier " + file.getAbsolutePath() + " est introuvable");
        }
        byte[] targetArray = IOUtils.toByteArray(FileToValidateEditDialogController.class.getClassLoader().getResourceAsStream("predicatelogic-engine.xml"));
        ConfigStreamValidator configValidator = new ConfigStreamValidator(targetArray, validateur.getContent(), config.getErrorDir(), config.getOutputDir(), file, originalFile);
        Validator validator = new Validator();
        return validator.validate(configValidator, Boolean.TRUE, Boolean.TRUE, Utilities.getNbThreads());
    }
    /**
     * Méthode qui génère et parse fichier txt à partir d'un fichier de données
     * csv, txt, ou excel
     *
     * @param val : objet contenant
     * @param config : objet contenant l'ensemeble des repertoires nécessaire à
     * l'extraction des données
     * @return : renvoie le chemin vers le fichier crée
     * @throws Exception
     */
    private void generateAndParseTxtFile(FileToValidate fileToValidate, Configuration config, Validateur validateur) throws Exception {
        if (config == null) {
            throw new ConfigException("Validation impossible, veuillez configurer les repertoires avant d'effectuer cette action");
        }
        String fileName = fileToValidate.getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + generateTierce() + ".txt";
        File outputFile = new File(config.getDatasDir(), fileName);
        if (!outputFile.exists()) {
            //Creation du fichier
            outputFile.createNewFile();
        }
        getCurrentObject().setTxtFilePath(outputFile.getAbsolutePath());
        Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated = new HashSet<>();
        fileToValidate.getMetaAlphaNumeriqueFields().forEach(m -> {
            alphaNumeriqueToBeTruncated.add(m.getAlphaNumeriqueField());
        });
        switch (fileToValidate.getDataType()) {
            case TXT:
                FileToValidateDescription raw = new FileToValidateDescription(new File(fileToValidate.getFilePath()), fileToValidate.getDelimiteurLigne().getCode(), fileToValidate.getDelimiteurColonne().getCode());
                if (fileToValidate.isStrictValidation()) {
                    ImportData.parseFileByFieldLength(raw, validateur, outputFile, fileToValidate.isHeaderPresent());
                } else {
                    ImportData.parseFileCharacterByCharacter(raw, validateur, outputFile, fileToValidate.isHeaderPresent(), alphaNumeriqueToBeTruncated);
                }
                break;
            case CSV:
                raw = new FileToValidateDescription(new File(fileToValidate.getFilePath()), fileToValidate.getDelimiteurLigne().getCode(), fileToValidate.getDelimiteurColonne().getCode());
                ImportData.parseCsvFile(raw, validateur, outputFile, fileToValidate.isHeaderPresent(), alphaNumeriqueToBeTruncated);
                break;
            case XLS:
                ImportData.parseXlsFile(fileToValidate.getFilePath(), fileToValidate.isHeaderPresent(), outputFile, validateur, alphaNumeriqueToBeTruncated);
                break;
            case XLSX:
                ImportData.parseXlsxFile(fileToValidate.getFilePath(), fileToValidate.isHeaderPresent(), outputFile, validateur, alphaNumeriqueToBeTruncated);
                break;
            default:
                break;
        }
    }
    private String generateTierce() {
        // Instance of random class
        Random rand = new Random();
        int upperbound = 60;
        int random = rand.nextInt(upperbound);
        return String.format("%02d", random);
    }
    private boolean validateJson(FileToValidate fileToValidate, Configuration config) throws IOException {
        if (config == null) {
            throw new ConfigException("Validation impossible, les répertoires ne sont pas configurés. Bien vouloir les configurer avant avant d'effectuer cette action");
        }
        TypeFichierJson typefichierJson = TypeFichierJsonDAO.getByTypeFichier(fileToValidate.getTypeFichier().getCode());
        if (typefichierJson == null) {
            throw new ValidatorException("Validation impossible. Le type fichier " + fileToValidate.getTypeFichier().getCode() + " n'a pas de structure JSON enregistré");
        }
        Validator validator = new Validator();
        ConfigJsonValidator configJson = new ConfigJsonValidator(
                fileToValidate.getErrorFilePath(),
                config.getOutputDir(),
                new File(fileToValidate.getFilePath()),
                new TypeFichierJsonConverter(typefichierJson).convert()
        );
        return validator.validate(configJson, System.getProperty("user.dir") + "\\src\\main\\java", true, true, Utilities.getNbThreads());
    }
    private void validateJsonFile(Configuration config, ActionEvent event) {
        getCurrentObject().setErrorFilePath(Paths.get(config.getErrorDir(),
                getCurrentObject().getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
                + generateTierce() + "_JSON.txt").toString());
        Task<Boolean> task = new Task<Boolean>() {
            @Override
            protected Boolean call() throws Exception {
                return validateJson(getCurrentObject(), config);
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            boolean valid = task.getValue();
            String message;
            NotificationDialog notificationDialog;
            if (!valid) {
                message = "Echec de la validation. Le fichier contient des erreurs, veuillez consulter le répertoire " + config.getErrorDir() + ", puis ouvrir le fichier d'erreur "
                        + new File(getCurrentObject().getErrorFilePath()).getName() + ".err pour en savoir plus";
                notificationDialog = new NotificationDialog(message, NotificationType.ERROR, parentStage);
            } else {
                message = "Validation réussie. Fichier correcte";
                notificationDialog = new NotificationDialog(message, NotificationType.SUCCESS, parentStage);
            }
            logger.error(message);
            notificationDialog.showNotification();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            if (th instanceof ConfigException || th instanceof ValidatorException) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog(th.getMessage(), NotificationType.WARNING, parentStage);
                logger.warn(th.getMessage());
                notificationDialog.showNotification();
            } else {
                logger.error(th);
                AlertMessageUtil.showAlertException(th, "Une exception s'est produite pendant la validation du fichier", "Erreur");
            }
        });
        new Thread(task).start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ImportTypeFichierEditDialogController.java
New file
@@ -0,0 +1,79 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.forms.ImportTypeFichierEditFormController;
import com.megatim.fdxconvert.pojo.ImportFile;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.scene.layout.Pane;
/**
 *
 * @author STEPHANIE
 */
public class ImportTypeFichierEditDialogController extends AbstractEditDialogController<ImportFile> {
    private ImportTypeFichierEditFormController importFileEditFormController;
    @Override
    public String getTitle() {
        getEditButton().setText("Importer");
        return "Importation des type fichiers";
    }
   @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(importFileEditFormController.getClass().getResource("ImportTypeFichierEditForm.fxml"), importFileEditFormController);
    }
     @Override
    public Object getContentFormController() {
        return importFileEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        importFileEditFormController = new ImportTypeFichierEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        getCurrentObject();
        return super.beforeSave(event);
    }
    @Override
    protected void afterBindCurrentObjectWithFormField(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.afterBindCurrentObjectWithFormField(bindObject, formController, typeOperation);
    }
    @Override
    protected void beforeBindCurrentObjectWithFormField(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.beforeBindCurrentObjectWithFormField(bindObject, formController, typeOperation);
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.afterBindFormFieldWithCurrentObject(bindObject, formController, typeOperation);
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(ImportFile bindObject, Object formController, TypeOperation typeOperation) {
        super.beforeBindFormFieldWithCurrentObject(bindObject, formController, typeOperation);
    }
    @Override
    public String getConfirmationMessage() {
        return "Importation réussie !";
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/JournalEditDialogController.java
New file
@@ -0,0 +1,69 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatim.fdxconvert.forms.JournalEditFormController;
import com.megatim.fdxconvert.model.Journal;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URL;
import java.text.NumberFormat;
import java.util.ResourceBundle;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.layout.Pane;
/**
 *
 * @author ASUS
 */
public class JournalEditDialogController extends AbstractEditDialogController<Journal> {
    private JournalEditFormController journalEditFormController;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        journalEditFormController = new JournalEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Visualiser le journal des actions";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        FXMLLoader loader = new FXMLLoader(JournalEditFormController.class.getResource("JournalEditForm.fxml"));
        loader.setControllerFactory(param -> journalEditFormController);
        Parent parent = loader.load();
        return (Pane) parent;
    }
    @Override
    public Object getContentFormController() {
        return journalEditFormController;
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(Journal bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof JournalEditFormController) {
            JournalEditFormController controller = (JournalEditFormController) formController;
            if (typeOperation.equals(TypeOperation.VIEW)) {
                controller.getNombreLignesTextfield().setText(separateurMillier(bindObject.getNombreLignes()));
            }
        }
    }
    private String separateurMillier(Long value) {
        NumberFormat numberFormat = NumberFormat.getInstance(java.util.Locale.FRENCH);
        return (numberFormat.format(value));
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/JournalListDialogController.java
New file
@@ -0,0 +1,113 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.controller.search.JournalAdvancedSearchFormController;
import com.megatim.fdxconvert.controller.search.JournalSearchFormController;
import com.megatim.fdxconvert.controller.table.JournalTable;
import com.megatim.fdxconvert.model.Journal;
import com.megatim.fdxconvert.service.JournalService;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.Pane;
/**
 *
 * @author ASUS
 */
public class JournalListDialogController extends AbstractMainDialogController<Journal, Journal> {
    private JournalSearchFormController journalSearchFormController;
    private JournalAdvancedSearchFormController journalAdvancedSearchFormController;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        journalSearchFormController = new JournalSearchFormController();
        journalAdvancedSearchFormController = new JournalAdvancedSearchFormController();
        getButtonAdd().setVisible(false);
        getButtonDelete().setVisible(false);
        getButtonEdit().setVisible(false);
        getButtonPrint().setVisible(false);
        super.initialize(location, resources);
    }
    @Override
    public GenericCrudService<Journal> getGenericCrudService() {
        return JournalService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Journal des tâches exécutées";
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(
                JournalTable.dateColumn(), JournalTable.statutColumn(), JournalTable.typeFichierColumn(),
                JournalTable.sourceFileNameColumn(), JournalTable.destinationFileNameColumn()
        );
    }
    @Override
    public Class<Journal> getElementClazz() {
        return Journal.class;
    }
    @Override
    public AbstractEditDialogController<Journal> getAbstractEditDialogController() {
        return new JournalEditDialogController();
    }
    @Override
    public List<SearchCriteria> getPermanentSearchCriterias() {
        List<SearchCriteria> liste = new ArrayList<>();
        return liste;
    }
    @Override
    public Object getSearchFormController() {
        return journalSearchFormController;
    }
    @Override
    public Pane getSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(journalSearchFormController.getClass().getResource("JournalSearchForm.fxml"), journalSearchFormController);
    }
    @Override
    public Object getAdvancedSearchFormController() {
        return journalAdvancedSearchFormController;
    }
    @Override
    public Pane getAdvancedSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(journalAdvancedSearchFormController.getClass().getResource("JournalAdvancedSearchForm.fxml"), journalAdvancedSearchFormController);
    }
    @Override
    public void resetFormFields(Object searchController, Object advancedSearchController) {
        if (searchController instanceof JournalSearchFormController) {
            JournalSearchFormController controller = (JournalSearchFormController)searchController;
            controller.getTypeFichierAbstractSelectionItem().setOldElement(null);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/MainController.java
New file
@@ -0,0 +1,432 @@
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.abstracts.context.AbstractViewContext;
import com.megatimfx.common.enums.TypeOperation;
import com.megatim.fdxconvert.dao.HibernateUtil;
import com.megatim.fdxconvert.forms.ValidateurListFormController;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.pojo.DecryptageAES;
import com.megatim.fdxconvert.pojo.FileToValidate;
import com.megatim.fdxconvert.pojo.ImportFile;
import com.megatim.fdxconvert.pojo.TxtFileToValidate;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.pojo.DataFileToJson;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.service.ImportFileService;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.megatim.fdxconvert.views.JsonStructureTableViewController;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
/**
 * FXML Controller class
 *
 * @author mela
 */
public class MainController implements Initializable {
    @FXML
    private VBox mainContainer;
    @FXML
    public MenuItem configMenuItem;
    @FXML
    public MenuItem paramMenuItem;
    @FXML
    public MenuItem validationManuelMenuItem;
    private Stage parent;
    @FXML
    private Button btnImportationFormatValidation;
    @FXML
    private Button btnConvertionManuelle;
    @FXML
    private Button btnGestionTachesConvertion;
    @FXML
    public MenuItem conversionModelMenuItem;
    ConfigEditDialogController configEditDialogController;
    /**
     * Initializes the controller class.
     *
     * @param url
     * @param rb
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //On ajoute les tooltips aux boutons
        addToolTipBoutons();
    }
    /**
     * Permet d'ajouter les tooltip aux boutons
     */
    private void addToolTipBoutons() {
        //Variables
        Tooltip tooltipOperationsRecuSI = new Tooltip("Importation des formats de validation");
        Tooltip tooltipOperationsGenerees = new Tooltip("Convertion manuelle");
        Tooltip tooltipConsoleSuivieOperations = new Tooltip("Gestion des taches de convertion");
        //On set le styles
        tooltipOperationsRecuSI.setStyle("-fx-background-color: rgba(216, 215, 208, 1); -fx-text-fill: black;");
        tooltipOperationsGenerees.setStyle("-fx-background-color: rgba(216, 215, 208, 1); -fx-text-fill: black;");
        tooltipConsoleSuivieOperations.setStyle("-fx-background-color: rgba(216, 215, 208, 1); -fx-text-fill: black;");
        //On set les toolTips
        btnImportationFormatValidation.setTooltip(tooltipOperationsRecuSI);
        btnConvertionManuelle.setTooltip(tooltipOperationsGenerees);
        btnGestionTachesConvertion.setTooltip(tooltipConsoleSuivieOperations);
    }
    private void setStage(Parent root) {
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    }
    @FXML
    public void openConfigDialog(ActionEvent event) {
        Task<Configuration> task = new Task() {
            @Override
            protected Object call() throws Exception {
                return ConfigurationService.getInstance().getCurrentConfig();
            }
        };
        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
        task.setOnSucceeded(e -> {
            try {
                FXMLLoader loader = new FXMLLoader(
                        (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                        ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                        : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
                );
                configEditDialogController = new ConfigEditDialogController();
                loader.setControllerFactory(param -> configEditDialogController);
                Parent root = loader.load();
                parent = (Stage) mainContainer.getScene().getWindow();
                Configuration config = task.getValue();
                if (config == null) {
                    configEditDialogController.initData(parent, TypeOperation.ADD, new Configuration(), ConfigurationService.getInstance(), null, false);
                } else {
                    configEditDialogController.initData(parent, TypeOperation.UPDATE, config, ConfigurationService.getInstance(), null, false);
                }
                configMenuItem.setDisable(false);
                setStage(root);
            } catch (IOException ex) {
                Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
        task.setOnRunning(e -> configMenuItem.setDisable(true));
    }
    @FXML
    public void openTypeFichierDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractMainDialogControllerURL() == null)
                    ? AbstractMainDialogController.class.getResource("AbstractMainDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractMainDialogControllerURL()
            );
            loader.setControllerFactory(param -> new TypeFichierListDialogController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openTacheDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractMainDialogControllerURL() == null)
                    ? AbstractMainDialogController.class.getResource("AbstractMainDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractMainDialogControllerURL()
            );
            loader.setControllerFactory(param -> new TacheListeDialogController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openJournalDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractMainDialogControllerURL() == null)
                    ? AbstractMainDialogController.class.getResource("AbstractMainDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractMainDialogControllerURL()
            );
            loader.setControllerFactory(param -> new JournalListDialogController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openImportTypeFichierDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            ImportTypeFichierEditDialogController controller = new ImportTypeFichierEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage parentStage = (Stage) mainContainer.getScene().getWindow();
            ImportFile imp = new ImportFile();
            imp.setType(TypeFichier.class);
            controller.initData(parentStage, TypeOperation.ADD, imp, ImportFileService.getInstance(), null, false);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openAproposrDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            AproposEditDialogController controller = new AproposEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage parentStage = (Stage) mainContainer.getScene().getWindow();
            //ImportFile imp = new ImportFile();
            //imp.setType(TypeFichier.class);
            controller.initData(parentStage, TypeOperation.ADD, null, null, null, false);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openFileToValidateDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            FileToValidateEditDialogController controller = new FileToValidateEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage parentStage = (Stage) mainContainer.getScene().getWindow();
            controller.initData(parentStage, TypeOperation.ADD, new FileToValidate(), null, null, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void quit(ActionEvent event) {
        HibernateUtil.shutdown();
        System.exit(0);
    }
    @FXML
    public void openDecryptageAESSymDailog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            DecryptageAESEditDialogController controller = new DecryptageAESEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage stage = (Stage) mainContainer.getScene().getWindow();
            controller.initData(stage, TypeOperation.ADD, new DecryptageAES(), null, null, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openTxtFileToValidateDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            TxtFileToValidateEditDialogController controller = new TxtFileToValidateEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage parentStage = (Stage) mainContainer.getScene().getWindow();
            controller.initData(parentStage, TypeOperation.ADD, new TxtFileToValidate(), null, null, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openTxtFileToJsonDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            DataFileToJsonEditDialogController controller = new DataFileToJsonEditDialogController();
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Stage parentStage = (Stage) mainContainer.getScene().getWindow();
            controller.initData(parentStage, TypeOperation.ADD, new DataFileToJson(), null, null, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openValidateurDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(ValidateurListFormController.class.getResource("ValidateurListForm.fxml"));
            loader.setControllerFactory(param -> new ValidateurListFormController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openConversionModelDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractMainDialogControllerURL() == null)
                    ? AbstractMainDialogController.class.getResource("AbstractMainDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractMainDialogControllerURL()
            );
            loader.setControllerFactory(param -> new ConversionModelListDialogController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    public void openJsonToValidateDialog(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractMainDialogControllerURL() == null)
                    ? AbstractMainDialogController.class.getResource("AbstractMainDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractMainDialogControllerURL()
            );
            loader.setControllerFactory(param -> new ModeleJsonListeDialogController());
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    @FXML
    public void openJsonStructureView(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(JsonStructureTableViewController.class.getResource("JsonStructureTableView.fxml"));
            Parent root = loader.load();
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/MetaAlphaNumeriqueFieldEditDialogController.java
New file
@@ -0,0 +1,94 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.forms.MetaAlphaNumeriqueFieldEditFormController;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueFieldEditDialogController extends AbstractEditDialogController<MetaAlphaNumeriqueField> {
    private MetaAlphaNumeriqueFieldEditFormController alphaNumeriqueFieldEditFormController;
    //Map qui garde la trace des éléments déjà selectionnés
    private Map<String, AlphaNumeriqueField> toBeTruncated = new HashMap<>();
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Choisir le champ à tronquer";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(
                alphaNumeriqueFieldEditFormController.getClass().getResource("AlphaNumeriqueFieldEditForm.fxml"),
                alphaNumeriqueFieldEditFormController
        );
    }
    public MetaAlphaNumeriqueFieldEditFormController getAlphaNumeriqueFieldEditFormController() {
        return alphaNumeriqueFieldEditFormController;
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        AlphaNumeriqueField currentAlpha = getCurrentObject().getAlphaNumeriqueField();
        if (!toBeTruncated.containsKey(currentAlpha.getCodeColonne())) {
                toBeTruncated.put(currentAlpha.getCodeColonne(), currentAlpha);
            } else {
                proceed = false;
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog("La colonne "+currentAlpha.getCodeColonne()+" a déjà été ajouté à la liste "
                        , NotificationType.ERROR, parentStage);
                notificationDialog.showNotification();
            }
        return proceed;
    }
    @Override
    public Object getContentFormController() {
        return alphaNumeriqueFieldEditFormController;
    }
    public void setAlphaNumeriqueFieldEditFormController(MetaAlphaNumeriqueFieldEditFormController alphaNumeriqueFieldEditFormController) {
        this.alphaNumeriqueFieldEditFormController = alphaNumeriqueFieldEditFormController;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ModeleJsonEditDialogController.java
New file
@@ -0,0 +1,325 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.forms.ModeleJsonEditFormController;
import com.megatim.fdxconvert.forms.StructureChampJsonEditFormController;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import com.megatim.fdxconvert.service.SubObjectService;
import com.megatim.fdxconvert.util.Utilities;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author ASUS
 */
public class ModeleJsonEditDialogController extends AbstractEditDialogController<ModeleJson> {
    private ModeleJsonEditFormController modeleJsonEditFormController;
    private StructureChampJsonEditDialogController structureChampJsonEditDialogController;
    private List<StructureChampJson> structJsonToBeDeleted = new ArrayList<>();
    private final List<SubObject> subObjectToBeDeleted = new ArrayList<>();
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        modeleJsonEditFormController = new ModeleJsonEditFormController();
        structureChampJsonEditDialogController = new StructureChampJsonEditDialogController();
        structureChampJsonEditDialogController.setStructureChampJsonEditFormController(new StructureChampJsonEditFormController());
        structureChampJsonEditDialogController.setModeleJsonEditFormController(modeleJsonEditFormController);
        structureChampJsonEditDialogController.setSubObjectsList(modeleJsonEditFormController.getSubObjectListe());
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Structure d'un fichier JSON";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(
                modeleJsonEditFormController.getClass().getResource("ModeleJsonEditForm.fxml"),
                modeleJsonEditFormController
        );
    }
    @Override
    public Object getContentFormController() {
        return modeleJsonEditFormController;
    }
    @Override
    public ModeleJson refreshObjectToUpdate(ModeleJson objectToUpdate) {
        ModeleJson modeleJson = new ModeleJson();
        modeleJson.setId(objectToUpdate.getId());
        modeleJson.setObjectName(objectToUpdate.getObjectName());
        modeleJson.setTypeFichier(objectToUpdate.getTypeFichier());
        modeleJson.getListeStructureJson().addAll(objectToUpdate.getListeStructureJson());
        modeleJson.setDateCreation(objectToUpdate.getDateCreation());
        modeleJson.getSubObjects().addAll(objectToUpdate.getSubObjects());
        if (objectToUpdate.getSubObjects() != null) {
            modeleJson.getSubObjects().addAll(objectToUpdate.getSubObjects());
        }
        return modeleJson;
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(ModeleJson bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof ModeleJsonEditFormController) {
            ModeleJsonEditFormController controller = (ModeleJsonEditFormController) formController;
            controller.getSubTypeDeleteButton().setOnAction(event -> {
                removeSubObjectFromList(controller, event);
            });
            if (typeOperation.equals(TypeOperation.UPDATE) || typeOperation.equals(TypeOperation.VIEW)) {
                controller.getSubObjectListe().addAll(bindObject.getSubObjects());
            }
            if (typeOperation.equals(TypeOperation.VIEW)) {
                controller.getSubTypeAddButton().setDisable(true);
                controller.getSubTypeUpdateButton().setDisable(true);
                controller.getObjectNameTextField().setDisable(true);
            }
            if (typeOperation.equals(TypeOperation.ADD) || typeOperation.equals(TypeOperation.UPDATE)) {
                controller.getSubTypeDeleteButton().disableProperty().bind(controller.getSubObjetsTableView().getSelectionModel().selectedItemProperty().isNull());
                controller.getSubTypeUpdateButton().disableProperty().bind(controller.getSubObjetsTableView().getSelectionModel().selectedItemProperty().isNull());
            }
        }
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(ModeleJson bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof ModeleJsonEditFormController) {
            ModeleJsonEditFormController controller = (ModeleJsonEditFormController) formController;
            controller.getStructureChampAbstractTable().setController(structureChampJsonEditDialogController);
            switch (typeOperation) {
                case ADD:
                    controller.getTypeFichierAbstractSelectItem().selectedElementProperty().addListener((observable, oldValue, newValue) -> {
                        if (newValue != null) {
                            structureChampJsonEditDialogController.setTypeFichier(newValue);
                        }
                    });
                    break;
                case UPDATE:
                    structureChampJsonEditDialogController.setTypeFichier(controller.getTypeFichierAbstractSelectItem().getSelectedElement());
                    break;
            }
        }
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        ModeleJson modeleJson = getCurrentObject();
        StringBuilder message = new StringBuilder();
        if (modeleJson.getListeStructureJson().isEmpty()) {
            message.append("Bien vouloir remplir la structure des champs\n");
            proceed = false;
        }
        if (modeleJson.getTypeFichier() == null) {
            message.append("Le type du fichier est obligatoire\n");
            proceed = false;
        }
        if (modeleJson.getObjectName() == null || modeleJson.getObjectName().isEmpty()) {
            message.append("Le nom de l'objet à définir est obligatoire");
            proceed = false;
        } else {
            getCurrentObject().setObjectName(getCurrentObject().getObjectName().trim());
            StringBuilder subMessage = Utilities.validateName(getCurrentObject().getObjectName(), "Le nom de l'objet ");
            if (subMessage.length() != 0) {
                message.append(subMessage);
                proceed = false;
            }
        }
        if (!proceed) {
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog(message.toString(), NotificationType.ERROR, parentStage);
            notificationDialog.showNotification();
        } else {
            getCurrentObject().setSubObjects(new HashSet<>(modeleJsonEditFormController.getSubObjectListe()));
            getCurrentObject().getSubObjects().forEach(s -> {
                s.setModeleJson(getCurrentObject());
                s.getListeStructureJson().forEach(ss -> {
                    ss.setFieldOfSubObject(s);
                });
            });
        }
        try {
            List<SubObject> liste = new ArrayList<>();
            liste.addAll(subObjectToBeDeleted);
            for (SubObject s : liste) {
                SubObjectService.getInstance().delete(s);
                subObjectToBeDeleted.remove(s);
            }
        } catch (Exception ex) {
            proceed = false;
            AlertMessageUtil.showAlertException(ex, "Une exception s'est produite pendant la supprression", "Erreur");
        }
        return proceed;
    }
    public StructureChampJsonEditDialogController getStructureChampJsonEditDialogController() {
        return structureChampJsonEditDialogController;
    }
    private void removeSubObjectFromList(ModeleJsonEditFormController controller, Event event) {
        Object selectedItem = controller.getSubObjetsTableView().getSelectionModel().getSelectedItem();
        if (selectedItem != null) {
            SubObject subObject = (SubObject) selectedItem;
            if (!findIfSubObjectIsUsed(subObject, controller)) {
                controller.getSubObjectListe().remove(subObject);
                if (subObject.getId() != null && subObject.getId() != 0L && subObject.getId() != 0) {
                    subObjectToBeDeleted.add(subObject);
                }
            } else {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog("Echec Suppression : L'objet à supprimer est utilisé dans la déjfinition d'un objet ou d'un champ", NotificationType.ERROR, parentStage);
                notificationDialog.showNotification();
            }
        }
    }
    private boolean findIfSubObjectIsUsed(final SubObject subObject, ModeleJsonEditFormController controller) {
        boolean found;
        //Retirer le subObject concerné de la liste de recherche
        List<SubObject> subObjectsListe = controller.getSubObjectListe().stream()
                .filter(p -> {
                    if (subObject.getId() == null || subObject.getId() == 0 || subObject.getId() == 0L) {
                        return !p.getDateCreation().equals(subObject.getDateCreation());
                    } else {
                        return !p.getId().equals(subObject.getId());
                    }
                }).collect(Collectors.toList());
        List<SubObject> subObjectUsingSubObject = new ArrayList<>();
        //Vérifier un sous-objet utilise le sous-objet à supprimer
        subObjectsListe.forEach(s -> {
            List<StructureChampJson> structUsingSubObject = s.getListeStructureJson().stream().filter(p -> p.getTypeDonnee().equals(TypeDonnee.OBJET) && p.getTypeOfSubObject().getId().equals(subObject.getId()))
                    .collect(Collectors.toList());
            if (!structUsingSubObject.isEmpty()) {
                subObjectUsingSubObject.add(s);
            }
        });
        //Si aucun sous-objet n'utilise le sous-objet à supprimer
        if (subObjectUsingSubObject.isEmpty()) {
            List<StructureChampJson> structList = controller.getStructureChampAbstractTable().getElementObservableList()
                    .stream().filter(p -> p.getTypeDonnee().equals(TypeDonnee.OBJET))
                    .collect(Collectors.toList());
            if (!structList.isEmpty()) {
                List<StructureChampJson> structUsingSubObject = structList.stream()
                        .filter(p -> {
                            if (p.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                                if (subObject.getId() == null || subObject.getId() == 0 || subObject.getId() == 0L) {
                                    return !p.getDateCreation().equals(subObject.getDateCreation());
                                } else {
                                    return !p.getId().equals(subObject.getId());
                                }
                            } else {
                                return false;
                            }
                        }
                        )
                        .collect(Collectors.toList());
                found = !structUsingSubObject.isEmpty();
            } else {
                found = false;
            }
        } else {
            found = false;
        }
        return found;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ModeleJsonListeDialogController.java
New file
@@ -0,0 +1,60 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.controller.table.ModeleJsonTable;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.service.ModeleJsonService;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.scene.control.TableColumn;
/**
 *
 * @author ASUS
 */
public class ModeleJsonListeDialogController extends AbstractMainDialogController<ModeleJson, ModeleJson> {
    private ModeleJsonEditDialogController modeleJsonEditDialogController;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        modeleJsonEditDialogController = new ModeleJsonEditDialogController();
        super.initialize(location, resources);
    }
    @Override
    public GenericCrudService<ModeleJson> getGenericCrudService() {
        return ModeleJsonService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Liste des structures JSON";
    }
    @Override
    public AbstractEditDialogController<ModeleJson> getAbstractEditDialogController() {
        return modeleJsonEditDialogController;
    }
    @Override
    public Class<ModeleJson> getElementClazz() {
        return ModeleJson.class;
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(
                ModeleJsonTable.objectNameColumn()
        );
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/StructureChampJsonEditDialogController.java
New file
@@ -0,0 +1,244 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.forms.ModeleJsonEditFormController;
import com.megatim.fdxconvert.forms.StructureChampJsonEditFormController;
import com.megatim.fdxconvert.forms.SubObjectEditFormController;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.util.Utilities;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author ASUS
 */
public class StructureChampJsonEditDialogController extends AbstractEditDialogController<StructureChampJson> {
    private StructureChampJsonEditFormController structureChampJsonEditFormController;
    private SubObjectEditFormController subObjectEditFormController;
    private ObservableList<SubObject> subObjectsList;
    private ModeleJsonEditFormController modeleJsonEditFormController;
    private TypeFichier typeFichier;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        if (subObjectEditFormController != null) {
            structureChampJsonEditFormController = new StructureChampJsonEditFormController();
        }
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Edition d'un champ du fichier JSON";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(
                structureChampJsonEditFormController.getClass().getResource("StructureChampJsonEditForm.fxml"),
                structureChampJsonEditFormController
        );
    }
    @Override
    public Object getContentFormController() {
        return structureChampJsonEditFormController;
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(StructureChampJson bindObject, Object formController, TypeOperation typeOperation) {
        structureChampJsonEditFormController.getTypeObjetComboBox().setItems(subObjectsList);
    }
    public void setStructureChampJsonEditFormController(StructureChampJsonEditFormController structureChampJsonEditFormController) {
        this.structureChampJsonEditFormController = structureChampJsonEditFormController;
    }
    public void setTypeFichier(TypeFichier typeFichier) {
        this.typeFichier = typeFichier;
    }
    @Override
    public StructureChampJson refreshObjectToUpdate(StructureChampJson objectToUpdate) {
        StructureChampJson struct = new StructureChampJson();
        struct.setDelimiteurDate(objectToUpdate.getDelimiteurDate());
        struct.setFormatDate(objectToUpdate.getFormatDate());
        struct.setLibelle(objectToUpdate.getLibelle());
        struct.setListe(objectToUpdate.isListe());
        struct.setTypeOfSubObject(objectToUpdate.getTypeOfSubObject());
        struct.setFieldOfSubObject(objectToUpdate.getFieldOfSubObject());
        struct.setTypeDonnee(objectToUpdate.getTypeDonnee());
        struct.setDateCreation(objectToUpdate.getDateCreation());
        struct.setId(objectToUpdate.getId());
        struct.setModeleJson(objectToUpdate.getModeleJson());
        return struct;
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(StructureChampJson bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof StructureChampJsonEditFormController) {
            if (typeOperation.equals(TypeOperation.UPDATE) || typeOperation.equals(TypeOperation.VIEW)) {
                if (bindObject.getTypeDonnee().equals(TypeDonnee.DATE) && bindObject.getCodeDelimiteurDate() != null && !bindObject.getCodeDelimiteurDate().isEmpty()) {
                    bindObject.setDelimiteurDate(App.SEPARATEURS_DATE.get(bindObject.getCodeDelimiteurDate()));
                }
            }
        }
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        StringBuilder message = new StringBuilder("");
        StructureChampJson currentObject = getCurrentObject();
        if (currentObject != null) {
            if (currentObject.getLibelle() == null || currentObject.getLibelle().isEmpty()) {
                message.append("Le Libellé est obligatoire\n");
                proceed = false;
            } else {
                getCurrentObject().setLibelle(getCurrentObject().getLibelle().trim());
                StringBuilder subMessage = Utilities.validateName(getCurrentObject().getLibelle(), "Le libellé du champ");
                if (subMessage.length() != 0) {
                    message.append(subMessage);
                    proceed = false;
                }
            }
            if (currentObject.getTypeDonnee() == null) {
                message.append("Le type de données est obligatoire\n");
                proceed = false;
            } else if (currentObject.getTypeDonnee().equals(TypeDonnee.DATE)) {
                if (currentObject.getFormatDate() == null) {
                    message.append("Le format de la date est obligatoire\n");
                    proceed = false;
                }
                if (currentObject.getDelimiteurDate() == null) {
                    message.append("Le séparateur de date est obligatoire\n");
                    proceed = false;
                } else {
                    getCurrentObject().setCodeDelimiteurDate(getCurrentObject().getDelimiteurDate().getCode());
                }
            } else if (currentObject.getTypeDonnee().equals(TypeDonnee.OBJET) && currentObject.getTypeOfSubObject() == null) {
                message.append("Le type de l'objet est obligatoire\n");
                proceed = false;
            }
            if (!currentObject.getTypeDonnee().equals(TypeDonnee.DATE)) {
                getCurrentObject().setCodeDelimiteurDate(null);
                getCurrentObject().setFormatDate(null);
            }
            if(!currentObject.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                getCurrentObject().setTypeOfSubObject(null);
            }
            String subMessage = "";
            if (subObjectEditFormController != null) {
                subMessage = verifyIfCodeIsAlreadUsed(subObjectEditFormController.getSubStructureJsonListe());
            } else {
                subMessage = verifyIfCodeIsAlreadUsed(modeleJsonEditFormController.getStructureChampAbstractTable().getElementObservableList());
            }
            if (!subMessage.isEmpty()) {
                message.append(subMessage);
                proceed = false;
            }
        }
        if (!proceed) {
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog(message.toString(), NotificationType.ERROR, parentStage);
            notificationDialog.showNotification();
        }
        return proceed;
    }
    public void setSubObjectsList(ObservableList<SubObject> subObjectsList) {
        this.subObjectsList = subObjectsList;
    }
    public void setSubObjectEditFormController(SubObjectEditFormController subObjectEditFormController) {
        this.subObjectEditFormController = subObjectEditFormController;
    }
    public StructureChampJsonEditFormController getStructureChampJsonEditFormController() {
        return structureChampJsonEditFormController;
    }
    public void setModeleJsonEditFormController(ModeleJsonEditFormController modeleJsonEditFormController) {
        this.modeleJsonEditFormController = modeleJsonEditFormController;
    }
    private String verifyIfCodeIsAlreadUsed(List<StructureChampJson> observableList) {
        String message = "";
        List<StructureChampJson> foundListe = observableList.stream().filter(p
                -> {
            boolean testLibelle = p.getLibelle().equalsIgnoreCase(getCurrentObject().getLibelle());
            return (testLibelle && getTypeOperation().equals(TypeOperation.ADD))
                    || (getTypeOperation().equals(TypeOperation.UPDATE) && testLibelle && !p.equals(getCurrentObject()));
        }
        ).collect(Collectors.toList());
        if (!foundListe.isEmpty()) {
            message = "Le libellé \"" + getCurrentObject().getLibelle() + "\"" + " est déjà utilisé par un autre champ \n";
        }
        return message;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/SubObjectEditDialogController.java
New file
@@ -0,0 +1,240 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.forms.ModeleJsonEditFormController;
import com.megatim.fdxconvert.forms.SubObjectEditFormController;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import com.megatim.fdxconvert.service.StructureChampJsonService;
import com.megatim.fdxconvert.util.Utilities;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author ASUS
 */
public class SubObjectEditDialogController extends AbstractEditDialogController<SubObject> {
    private SubObjectEditFormController subObjectEditFormController;
    private ModeleJsonEditFormController modeleJsonEditFormController;
    private List<StructureChampJson> structJsonToBeDeleted = new ArrayList<>();
    private ObservableList<SubObject> subObjectsList;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        subObjectEditFormController = new SubObjectEditFormController();
        subObjectEditFormController.setCurrentSubObjectsListe(subObjectsList);
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Edition d'un sous-type";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(
                subObjectEditFormController.getClass().getResource("SubObjectEditForm.fxml"),
                subObjectEditFormController
        );
    }
    @Override
    public Object getContentFormController() {
        return subObjectEditFormController;
    }
    public void setSubObjectEditFormController(SubObjectEditFormController subObjectEditFormController) {
        this.subObjectEditFormController = subObjectEditFormController;
    }
    public void setModeleJsonEditFormController(ModeleJsonEditFormController modeleJsonEditFormController) {
        this.modeleJsonEditFormController = modeleJsonEditFormController;
    }
    public void setSubObjectsList(ObservableList<SubObject> subObjectsList) {
        this.subObjectsList = subObjectsList;
    }
    @Override
    public SubObject refreshObjectToUpdate(SubObject objectToUpdate) {
        SubObject subObject = new SubObject();
        subObject.setId(objectToUpdate.getId());
        subObject.getListeStructureJson().addAll(objectToUpdate.getListeStructureJson());
        subObject.setModeleJson(objectToUpdate.getModeleJson());
        subObject.setSubObjectName(objectToUpdate.getSubObjectName());
        subObject.setDateCreation(objectToUpdate.getDateCreation());
        return subObject;
    }
    @Override
    public void afterSave(ActionEvent event) {
        SubObject subObject = getCurrentObject();
        subObject.setListeStructureJson(new HashSet<>(subObjectEditFormController.getSubStructureJsonListe()));
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(SubObject bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof SubObjectEditFormController) {
            SubObjectEditFormController controller = (SubObjectEditFormController) formController;
            controller.getDeleteFieldButton().setOnMouseClicked(event -> {
                removeStructureJsonFromList(controller);
            });
            if (typeOperation.equals(TypeOperation.UPDATE) || typeOperation.equals(TypeOperation.VIEW)) {
                //Filtrer afin de ne garder que les champs des sous-objets
                controller.getSubStructureJsonListe().addAll(bindObject.getListeStructureJson()
                        .stream().filter(p -> p.getModeleJson() == null)
                        .collect(Collectors.toList()));
                controller.getSubStructureJsonListe().forEach(s -> {
                    if (s.getTypeDonnee().equals(TypeDonnee.DATE) && s.getCodeDelimiteurDate() != null) {
                        s.setDelimiteurDate(App.SEPARATEURS_DATE.get(s.getCodeDelimiteurDate()));
                    }
                });
            }
            if (typeOperation.equals(TypeOperation.VIEW)) {
                controller.getSubObjectNameTextField().setDisable(true);
                controller.getAddFieldButton().setDisable(true);
            }
            if (typeOperation.equals(TypeOperation.UPDATE) || typeOperation.equals(TypeOperation.ADD)) {
                controller.getDeleteFieldButton().disableProperty().bind(controller.getSubObjectsFieldsTableView().getSelectionModel().selectedItemProperty().isNull());
                controller.getUpdateFieldButton().disableProperty().bind(controller.getSubObjectsFieldsTableView().getSelectionModel().selectedItemProperty().isNull());
            }
        }
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        boolean proceed = super.beforeSave(event);
        StringBuilder message = new StringBuilder();
        if (getCurrentObject().getSubObjectName() == null || getCurrentObject().getSubObjectName().isEmpty()) {
            message.append("Bien vouloir renseigner le nom de l'objet\n");
            proceed = false;
        } else {
            getCurrentObject().setSubObjectName(getCurrentObject().getSubObjectName().trim());
            StringBuilder subMessage = Utilities.validateName(getCurrentObject().getSubObjectName(), "Le nom de l'objet ");
            if (subMessage.length() != 0) {
                message.append(subMessage);
                proceed = false;
            }
        }
        if (subObjectEditFormController.getSubStructureJsonListe().isEmpty()) {
            message.append("Bien vouloir renseigner la structure des champs de l'objet");
            proceed = false;
        }
        String subMessage = "";
        if (modeleJsonEditFormController != null) {
            subMessage = verifyIfSubObjectAlreadyExist(modeleJsonEditFormController.getSubObjectListe());
        }
        if (!subMessage.isEmpty()) {
            message.append(subMessage);
            proceed = false;
        }
        if (!proceed) {
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog(message.toString(), NotificationType.ERROR, parentStage);
            notificationDialog.showNotification();
        }
        try {
            List<StructureChampJson> liste = new ArrayList<>();
            liste.addAll(structJsonToBeDeleted);
            for (StructureChampJson s : liste) {
                StructureChampJsonService.getInstance().delete(s);
                structJsonToBeDeleted.remove(s);
            }
        } catch (Exception ex) {
            proceed = false;
            AlertMessageUtil.showAlertException(ex, "Une exception s'est produite pendant la supprression", "Erreur");
        }
        return proceed;
    }
    private String verifyIfSubObjectAlreadyExist(List<SubObject> observableList) {
        String message = "";
        List<SubObject> foundListe = observableList.stream().filter(p
                -> {
            boolean testLibelle = p.getSubObjectName().equalsIgnoreCase(getCurrentObject().getSubObjectName());
            return (testLibelle && getTypeOperation().equals(TypeOperation.ADD))
                    || (getTypeOperation().equals(TypeOperation.UPDATE) && testLibelle && !p.equals(getCurrentObject()));
        }
        ).collect(Collectors.toList());
        if (!foundListe.isEmpty()) {
            message = "Le libellé \"" + getCurrentObject().getSubObjectName() + "\"" + " est déjà utilisé par un autre objet \n";
        }
        return message;
    }
    private void removeStructureJsonFromList(SubObjectEditFormController controller) {
        Object selectedItem = controller.getSubObjectsFieldsTableView().getSelectionModel().getSelectedItem();
        if (selectedItem != null) {
            StructureChampJson structureChampJson = (StructureChampJson) controller.getSubObjectsFieldsTableView().getSelectionModel().getSelectedItem();
            controller.getSubStructureJsonListe().remove(structureChampJson);
            if (structureChampJson.getId() != null && structureChampJson.getId() != 0L && structureChampJson.getId() != 0) {
                structJsonToBeDeleted.add(structureChampJson);
            }
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TacheEditDialogController.java
New file
@@ -0,0 +1,360 @@
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.common.dialogs.NotificationDialog;
import com.megatimfx.common.dialogs.NotificationType;
import com.megatimfx.common.enums.ConfirmationType;
import com.megatimfx.common.enums.TypeOperation;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.forms.MetaAlphaNumeriqueFieldEditFormController;
import com.megatim.fdxconvert.forms.TacheEditFormController;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.service.MetaAlphaNumeriqueFieldService;
import com.megatim.fdxconvert.service.TacheJobService;
import com.megatim.fdxconvert.service.TacheService;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author MGT_DEV3
 */
public class TacheEditDialogController extends AbstractEditDialogController<Tache> {
    private TacheEditFormController tacheEditFormController;
    private MetaAlphaNumeriqueFieldEditDialogController metaAlphaNumeriqueFieldEditDialogController;
    private Map<String, AlphaNumeriqueField> newAlphaFields = new HashMap<>();
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        tacheEditFormController = new TacheEditFormController();
        metaAlphaNumeriqueFieldEditDialogController = new MetaAlphaNumeriqueFieldEditDialogController();
        metaAlphaNumeriqueFieldEditDialogController.setAlphaNumeriqueFieldEditFormController(new MetaAlphaNumeriqueFieldEditFormController());
        super.initialize(url, rb);
    }
    @Override
    public String getTitle() {
        return "Editer une tâche";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        FXMLLoader loader = new FXMLLoader(TacheEditFormController.class.getResource("TacheEditForm.fxml"));
        loader.setControllerFactory(param -> tacheEditFormController);
        Parent parent = loader.load();
        return (Pane) parent;
    }
    @Override
    public Object getContentFormController() {
        return tacheEditFormController;
    }
    @Override
    protected void afterBindCurrentObjectWithFormField(Tache bindObject, Object formController, TypeOperation typeOperation) {
        TacheEditFormController controller = (TacheEditFormController) formController;
        controller.getMetaAlphaNumeriqueFieldAbstractTable().setController(metaAlphaNumeriqueFieldEditDialogController);
    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(Tache bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof TacheEditFormController) {
            TacheEditFormController controller = (TacheEditFormController) formController;
            controller.getMetaAlphaNumeriqueFieldAbstractTable().setController(metaAlphaNumeriqueFieldEditDialogController);
            //metaAlphaNumeriqueFieldEditDialogController.setSelectedMetaAlphaNumeriqueFields(controller.getMetaAlphaNumeriqueFieldAbstractTable().getElementObservableList());
            switch (typeOperation) {
                case ADD:
                    controller.getTypeFichierAbstractSelectItem().selectedElementProperty().addListener((observable, oldValue, newValue) -> {
                        if (newValue != null) {
                            metaAlphaNumeriqueFieldEditDialogController.getAlphaNumeriqueFieldEditFormController().setTypeFichier(newValue);
                            controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(false);
                        }
                    });
                    controller.getSaisieAlphaNumeriqueFieldChecBox().selectedProperty().addListener(listener -> {
                        if (controller.getSaisieAlphaNumeriqueFieldChecBox().isSelected()) {
                            controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(false);
                        }
                    });
                    break;
                case UPDATE:
                    metaAlphaNumeriqueFieldEditDialogController.getAlphaNumeriqueFieldEditFormController()
                            .setTypeFichier(controller.getTypeFichierAbstractSelectItem().getSelectedElement());
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setSelected(true);
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                    break;
                default:
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setSelected(true);
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                    break;
            }
        }
    }
    @Override
    protected void beforeBindFormFieldWithCurrentObject(Tache bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof TacheEditFormController) {
            TacheEditFormController controller = (TacheEditFormController) formController;
            if (typeOperation.equals(TypeOperation.VIEW) || typeOperation.equals(TypeOperation.UPDATE)) {
                if (bindObject.getColDeliminter() != null) {
                    bindObject.setDelimiteurColonne(App.DELIMITEURS_COLONNE.get(bindObject.getColDeliminter()));
                }
                if (bindObject.getRowDeliminter() != null) {
                    bindObject.setDelimiteurLigne(App.DELIMITEURS_LIGNE.get(bindObject.getRowDeliminter()));
                }
            }
            if (typeOperation.equals(TypeOperation.ADD) || typeOperation.equals(TypeOperation.UPDATE)) {
                controller.getDelimiteurColonne().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getDelimiteurLigne().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getStrictValidationCheckbox().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNotEqualTo(DataType.XLS))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNotEqualTo(DataType.XLSX))
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getWithHeader().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isNull()
                        .or(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
                );
                controller.getUseExistingConversionModelCheckBox().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
                controller.getWithHeader().disableProperty().bind(controller.getDataTypeComboBox().getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
                if (controller.getDataTypeComboBox().getSelectionModel().getSelectedItem() != null
                        && controller.getDataTypeComboBox().getSelectionModel().getSelectedItem().equals(DataType.JSON)) {
                    controller.getSaisieAlphaNumeriqueFieldChecBox().setDisable(true);
                }
            }
            switch (typeOperation) {
                case ADD:
                    controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(true);
                    break;
                case UPDATE:
                    controller.getMetaAlphaNumeriqueFieldAbstractTable().setDisable(false);
                    break;
                default:
            }
        }
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        getCurrentObject().getMetaAlphaNumeriqueFields().forEach(m -> {
            if (m.getTache() == null) {
                m.setTache(getCurrentObject());
            }
            newAlphaFields.put(m.getAlphaNumeriqueField().getCodeColonne(), m.getAlphaNumeriqueField());
        });
        boolean proceed = super.beforeSave(event);
        StringBuilder message = new StringBuilder();
        if (proceed) {
            TacheService tacheService = TacheService.getInstance();
            //Tester l'unicité du type de fichier par tâche
            Tache tache = tacheService.findByTypefichier(getCurrentObject().getTypeFichier());
            proceed = (getTypeOperation().equals(TypeOperation.ADD) && tache == null)
                    || (getTypeOperation().equals(TypeOperation.UPDATE) && (tache == null || tache.getLibelle().equals(getCurrentObject().getLibelle())));
            if (proceed) {
                //Tester l'unicité du type du répertoire source
                tache = tacheService.findByRepertoireSource(getCurrentObject().getRepertoireSource());
                proceed = (getTypeOperation().equals(TypeOperation.ADD) && tache == null)
                        || (getTypeOperation().equals(TypeOperation.UPDATE) && (tache == null || tache.getLibelle().equals(getCurrentObject().getLibelle())));
                if (proceed) {
                    //Tester l'unicité du type du répertoire d'erreur
                    tache = tacheService.findByRepertoireErreur(getCurrentObject().getRepertoireErreur());
                    proceed = (getTypeOperation().equals(TypeOperation.ADD) && tache == null)
                            || (getTypeOperation().equals(TypeOperation.UPDATE) && (tache == null || tache.getLibelle().equals(getCurrentObject().getLibelle())));
                    if (proceed) {
                        //Verifier que les repertoires source et d'erreur sont différents
                        proceed = !getCurrentObject().getRepertoireErreur().equals(getCurrentObject().getRepertoireSource());
                        if (!proceed) {
                            message.append("Les répertoires source et d'erreur ne doivent pas être identiques\n");
                        } else {
                            //Tester l'unicité du type du répertoire de destination
                            tache = tacheService.findByRepertoireDestination(getCurrentObject().getRepertoireDestination());
                            proceed = (getTypeOperation().equals(TypeOperation.ADD) && tache == null)
                                    || (getTypeOperation().equals(TypeOperation.UPDATE) && (tache == null || tache.getLibelle().equals(getCurrentObject().getLibelle())));
                            if (proceed) {
                                //Verifier que les repertoires source et destination sont différents
                                boolean proceed1 = !getCurrentObject().getRepertoireDestination().equals(getCurrentObject().getRepertoireSource());
                                //Verifier que les repertoires destination et d'erreur sont différents
                                boolean proceed2 = !getCurrentObject().getRepertoireDestination().equals(getCurrentObject().getRepertoireErreur());
                                proceed = proceed1 && proceed2;
                                if (!proceed1) {
                                    message.append("Les répertoires source et destination ne doivent pas être identiques\n");
                                }
                                if (!proceed2) {
                                    message.append("Les répertoires d'erreur et destination ne doivent pas être identiques");
                                }
                            } else { //Alert problème de répertoire de destination
                                message.append("Le répertoire de destination est déjà utilisé\n");
                            }
                        }
                    } else {//Alert problème de répertoire d'erreur
                        message.append("Le répertoire d'erreur est déjà utilisé\n");
                    }
                } else { //Alert problème de répertoire source
                    message.append("Le repertoire source est déjà utilisé\n");
                }
            } else { //Alert problème de type fichier
                message.append("Le type de fichier est déjà utilisé\n");
            }
        }
        Delimiteur delimiteurColonne = getCurrentObject().getDelimiteurColonne();
        Delimiteur delimiteurLigne = getCurrentObject().getDelimiteurLigne();
        if (delimiteurColonne != null) {
            getCurrentObject().setColDeliminter(delimiteurColonne.getCode());
        }
        if (delimiteurLigne != null) {
            getCurrentObject().setRowDeliminter(delimiteurLigne.getCode());
        }
        boolean proceedIntervalleTache = getCurrentObject().isWithoutInterval() ? getCurrentObject().isWithoutInterval() : getCurrentObject().getIntervalleTache() > 0;
        proceed = proceed && proceedIntervalleTache;
        if (!proceedIntervalleTache) {
            message.append("L'intervalle de répétition doit être supérieure à 0");
        }
        if (!proceed && !message.toString().isEmpty()) {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            NotificationDialog notificationDialog = new NotificationDialog(
                    message.toString(),
                    NotificationType.ERROR,
                    parentStage
            );
            notificationDialog.showNotification();
        }
        return proceed;
    }
    @Override
    public void afterSave(ActionEvent event) {
        try {
            Tache currentObject = getCurrentObject();
            Set<MetaAlphaNumeriqueField> newSetMeta = currentObject.getMetaAlphaNumeriqueFields();
            newSetMeta.forEach(m -> {
                if (!newAlphaFields.containsKey(m.getAlphaNumeriqueField().getCodeColonne())) {
                    try {
                        MetaAlphaNumeriqueFieldService.getInstance().delete(m);
                    } catch (Exception ex) {
                        Logger.getLogger(TacheEditDialogController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        } catch (Exception ex) {
            Logger.getLogger(TacheEditDialogController.class.getName()).log(Level.SEVERE, null, ex);
        }
        Thread th = new Thread(() -> {
            TacheJobService.getInstance().restartJob();
        });
        th.setDaemon(true);
        th.start();
    }
    @Override
    public String getConfirmationMessage() {
        return "La tâche a été enregistrée avec succès";
    }
    @Override
    protected ConfirmationType getConfirmationType() {
        return ConfirmationType.CONFIRMATION;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TacheListeDialogController.java
New file
@@ -0,0 +1,89 @@
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.controller.search.TacheSearchFormController;
import com.megatim.fdxconvert.controller.table.TacheTable;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.service.TacheService;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.Pane;
/**
 *
 * @author MGT_DEV3
 */
public class TacheListeDialogController extends AbstractMainDialogController<Tache, Tache> {
    private TacheEditDialogController tacheEditDialogController;
    private TacheSearchFormController tacheSearchFormController;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        tacheEditDialogController = new TacheEditDialogController();
        tacheSearchFormController = new TacheSearchFormController();
        super.initialize(location, resources);
    }
    @Override
    public GenericCrudService<Tache> getGenericCrudService() {
        return TacheService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Liste des tâches planifiées";
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(
                TacheTable.libelleColumn(),
                TacheTable.typeFichierColumn(),
                TacheTable.dateCreationColumn(),
                TacheTable.dateMiseAJourColumn()
        );
    }
    @Override
    public AbstractEditDialogController<Tache> getAbstractEditDialogController() {
        return tacheEditDialogController;
    }
    @Override
    public Class<Tache> getElementClazz() {
        return Tache.class;
    }
    @Override
    public Tache getUpdatedEntity(Tache sourceEntity) {
        return TacheService.getInstance().findByTacheId(sourceEntity.getLibelle());
    }
    @Override
    public List<SearchCriteria> getPermanentSearchCriterias() {
        List<SearchCriteria> liste = new ArrayList<>();
        return liste;
    }
    @Override
    public Object getSearchFormController() {
        return tacheSearchFormController;
    }
    @Override
    public Pane getSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(tacheSearchFormController.getClass().getResource("TacheSearchForm.fxml"), tacheSearchFormController);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TxtFileToValidateEditDialogController.java
New file
@@ -0,0 +1,175 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.typefichier.validator.Validator;
import com.megatim.typefichier.validator.model.ConfigStreamValidator;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.dao.ValidateurDAO;
import com.megatim.fdxconvert.exceptions.ConfigException;
import com.megatim.fdxconvert.exceptions.ValidatorException;
import com.megatim.fdxconvert.forms.TxtFileToValidateEditFormController;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.pojo.TxtFileToValidate;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.util.Utilities;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Optional;
import java.util.ResourceBundle;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.apache.commons.io.IOUtils;
/**
 *
 * @author STEPHANIE
 */
public class TxtFileToValidateEditDialogController extends AbstractEditDialogController<TxtFileToValidate> {
    private TxtFileToValidateEditFormController txtFileToValidateEditFormController;
    @Override
    public String getTitle() {
        getEditButton().setText("Vérifier");
        return "Vérification format de fichier Fdx";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(txtFileToValidateEditFormController.getClass().getResource("TxtFileToValidateEditForm.fxml"), txtFileToValidateEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return txtFileToValidateEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        txtFileToValidateEditFormController = new TxtFileToValidateEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public void afterSave(ActionEvent event) {
        Configuration config = ConfigurationService.getInstance().getCurrentConfig();
        Task<Boolean> task = new Task<Boolean>() {
            @Override
            protected Boolean call() throws Exception {
                TxtFileToValidate val = getCurrentObject();
                return validate(val, config);
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            boolean valid = task.getValue();
            if (valid) {
                 NotificationDialog notificationDialog = new NotificationDialog(
                        "Vérification réussie. Fichier correcte",
                        NotificationType.SUCCESS,
                        parentStage
                );
                notificationDialog.showNotification();
            } else {
                 NotificationDialog notificationDialog = new NotificationDialog(
                        "Echec de la vérification. Le fichier contient des erreurs, veuillez consulter le fichier d'erreur pour en savoir plus",
                        NotificationType.ERROR,
                        parentStage
                );
                notificationDialog.showNotification();
            }
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            Throwable th = task.getException();
            if (th instanceof ConfigException || th instanceof ValidatorException) {
                Node source = (Node) event.getSource();
                Stage parentStage = (Stage) source.getScene().getWindow();
                NotificationDialog notificationDialog = new NotificationDialog(th.getMessage(), NotificationType.WARNING, parentStage);
                notificationDialog.showNotification();
            } else {
                AlertMessageUtil.showAlertException(th, "Une exception s'est produite pendant la validation du fichier", "Erreur");
            }
        });
        new Thread(task).start();
    }
    private boolean validate(TxtFileToValidate val, Configuration config) throws Exception {
        if (config == null) {
            throw new ConfigException("Validation impossible, les repertoires ne sont pas configurés. Bien vouloir les configurer avant avant d'effectuer cette action");
        }
        String codeTypeFichier = val.getTypeFichier().getCode();
        Optional<Validateur> validateur = ValidateurDAO.findByCodeTypeFichier(codeTypeFichier);
        if (!validateur.isPresent()) {
            throw new ValidatorException("Validation impossible. Le type fichier " + codeTypeFichier + " n'a pas de validateur enregistré");
        }
        File file = new File(val.getTxtFilePath());
        if (!file.exists()) {
            throw new FileNotFoundException("Le fichier " + file.getAbsolutePath() + " est introuvable");
        }
        byte[] targetArray = IOUtils.toByteArray(App.class.getClass().getResourceAsStream("/predicatelogic-engine.xml"));
        ConfigStreamValidator configValidator = new ConfigStreamValidator(targetArray, validateur.get().getContent(), config.getErrorDir(), config.getOutputDir(), file,file);
        return new Validator().validate(configValidator, Boolean.FALSE, Boolean.FALSE,Utilities.getNbThreads());
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TypeFichierEditDialogController.java
New file
@@ -0,0 +1,90 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.forms.TypeFichierEditFormController;
import com.megatim.fdxconvert.model.TypeFichier;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierEditDialogController extends AbstractEditDialogController<TypeFichier> {
    private TypeFichierEditFormController typeFichierEditFormController;
    @Override
    public String getTitle() {
        return "Edition d'un type fichier";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(typeFichierEditFormController.getClass().getResource("TypeFichierEditForm.fxml"), typeFichierEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return typeFichierEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        typeFichierEditFormController = new TypeFichierEditFormController();
        super.initialize(url, rb);
    }
//    @Override
//    public boolean beforeSave(ActionEvent event) {
//        boolean proceed = super.beforeSave(event);
//
//        if (getCurrentObject().getDataType() == null) {
//
//            Node source = (Node) event.getSource();
//            Stage parentStage = (Stage) source.getScene().getWindow();
//            NotificationDialog notificationDialog = new NotificationDialog(
//                    "Le type de données est obligatoire",
//                    NotificationType.ERROR,
//                    parentStage
//            );
//            notificationDialog.showNotification();
//
//            proceed = false;
//        }
//        return proceed;
//    }
    @Override
    protected void afterBindFormFieldWithCurrentObject(TypeFichier bindObject, Object formController, TypeOperation typeOperation) {
        if (formController instanceof TypeFichierEditFormController) {
            TypeFichierEditFormController controller = (TypeFichierEditFormController) formController;
            if (typeOperation.equals(TypeOperation.UPDATE)) {
                controller.getCodeTextField().setDisable(true);
            }
        }
    }
    @Override
    public String getConfirmationMessage() {
        return "Type Fichier " + getCurrentObject().getCode() + "enregistré avec succès";
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/TypeFichierListDialogController.java
New file
@@ -0,0 +1,97 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatim.fdxconvert.controller.search.TypeFichierAdvancedSearchFormController;
import com.megatim.fdxconvert.controller.search.TypeFichierSearchFormController;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.Pane;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierListDialogController extends AbstractMainDialogController<TypeFichier,TypeFichier>{
    private TypeFichierSearchFormController typeFichierSearchFormController;
    private TypeFichierAdvancedSearchFormController typeFichierAdvancedSearchFormController;
    @Override
    public GenericCrudService<TypeFichier> getGenericCrudService() {
        return TypeFichierService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Liste des type de fichiers";
    }
    @Override
    public Class<TypeFichier> getElementClazz() {
        return TypeFichier.class;
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(TypeFichierTable.codeColumn(),TypeFichierTable.libelleColumn(),TypeFichierTable.participantColumn());
    }
    @Override
    public AbstractEditDialogController<TypeFichier> getAbstractEditDialogController() {
        return new TypeFichierEditDialogController();
    }
    @Override
    public List<SearchCriteria> getPermanentSearchCriterias() {
        List<SearchCriteria> liste = new ArrayList<>();
        return liste;
    }
    @Override
    public Object getSearchFormController() {
        return typeFichierSearchFormController;
    }
    @Override
    public Pane getSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(typeFichierSearchFormController.getClass().getResource("TypeFichierSearchForm.fxml"), typeFichierSearchFormController);
    }
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        typeFichierSearchFormController = new TypeFichierSearchFormController();
        typeFichierAdvancedSearchFormController = new TypeFichierAdvancedSearchFormController();
//            setPrintButtonDisable(true);
            setPrintButtonRemoved(true);
        super.initialize(location, resources);
    }
    @Override
    public Object getAdvancedSearchFormController() {
        return typeFichierAdvancedSearchFormController;
    }
    @Override
    public Pane getAdvancedSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(typeFichierAdvancedSearchFormController.getClass().getResource("TypeFichierAdvancedSearchForm.fxml"), typeFichierAdvancedSearchFormController);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/ValidateurEditDialogController.java
New file
@@ -0,0 +1,202 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller;
import com.megatim.module.compression.impl.JavaZipZip4Impl;
import com.megatim.module.encryption.impl.AESImpl;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.enums.TypeOperation;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.dao.ValidateurDAO;
import com.megatim.fdxconvert.exceptions.ConfigException;
import com.megatim.fdxconvert.forms.ValidateurEditFormController;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.util.ParserUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.ResourceBundle;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.apache.commons.io.FileUtils;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurEditDialogController extends AbstractEditDialogController<Validateur> {
    private ValidateurEditFormController validateurEditFormController;
    private final String UNZIP_DIR = "UNZIP_DIR";
    Boolean result;
    @Override
    public String getTitle() {
        getEditButton().setText("Importer");
        return "Importer le validateur d'un type fichier";
    }
    @Override
    public Pane getContentFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(validateurEditFormController.getClass().getResource("ValidateurEditForm.fxml"), validateurEditFormController);
    }
    @Override
    public Object getContentFormController() {
        return validateurEditFormController;
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        validateurEditFormController = new ValidateurEditFormController();
        super.initialize(url, rb);
    }
    @Override
    public String getConfirmationMessage() {
        return "Validateur du typefichier " + getCurrentObject().getCodeTypeFichier() + " importé avec succès !";
    }
    @Override
    public boolean beforeSave(ActionEvent event) {
        result = false;
        boolean proceed = super.beforeSave(event);
        if (validateurEditFormController.getProtegeCheckBox().isSelected()) {
            proceed = proceed && validateurEditFormController.getKeyConfirmationField() != null
                    && validateurEditFormController.getKeyToDecryptField() != null;
        }
        if (proceed && getTypeOperation().equals(TypeOperation.ADD)) {
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            Validateur validateur = getCurrentObject();
            Configuration config = ConfigurationService.getInstance().getCurrentConfig();
            File decryptedFile = null;
            try {
                if (validateur.isProtege()) {
                    Optional<Validateur> exist = ValidateurDAO.findByCodeTypeFichier(validateur.getCodeTypeFichier());
                    if (!exist.isPresent()) {
                        File fileToUnzip = new File(validateur.getFilePath());
                        unzip(fileToUnzip, config);
                        decryptedFile = decrypt(validateur, config, fileToUnzip);
                        validateur.setFilePath(decryptedFile.getAbsolutePath());
                        setContent(validateur);
                        decryptedFile.deleteOnExit();
                        result = true;
                    } else {
                        NotificationDialog notificationDialog = new NotificationDialog(
                                "Validateur du typefichier " + validateur.getCodeTypeFichier() + " déjà enregistré. Bien vouloir supprimer l'existant avant d'effectuer cette action",
                                NotificationType.WARNING, parentStage);
                        notificationDialog.showNotification();
                        result = false;
                    }
                } else {
                    setContent(validateur);
                    result = true;
                }
            } catch (Exception th) {
                if (th instanceof javax.crypto.BadPaddingException || th instanceof java.security.spec.InvalidKeySpecException
                        || th instanceof java.security.InvalidKeyException) {
                    decryptedFile.deleteOnExit();
                    NotificationDialog notificationDialog = new NotificationDialog(
                            "Echec décryptage : La clé fournie n'est pas la bonne ",
                            NotificationType.ERROR,
                            parentStage
                    );
                    notificationDialog.showNotification();
                } else if (th instanceof ConfigException) {
                    NotificationDialog notificationDialog = new NotificationDialog(
                            th.getMessage(), NotificationType.ERROR, parentStage);
                    notificationDialog.showNotification();
                } else {
                    AlertMessageUtil.showAlertException(th, "Une exception s'est produite pendant le décryptage du fichier", "Erreur");
                }
            } finally {
                if (config != null) {
                    File unzipDir = new File(config.getValidatorsDir(), UNZIP_DIR);
                    if (unzipDir.exists() && unzipDir.isDirectory()) {
                        List<File> liste = Arrays.asList(unzipDir.listFiles());
                        liste.forEach(f -> f.deleteOnExit());
                    }
                }
            }
        }
        return result;
    }
    private void unzip(File fileToUnzip, Configuration config) throws Exception {
        JavaZipZip4Impl zip4Impl = new JavaZipZip4Impl();
        if (config == null) {
            throw new ConfigException("Bien vouloir configurer les répertoires  avant avant d'effectuer cette action");
        }
        File unzipDir = new File(config.getValidatorsDir(), UNZIP_DIR);
        if (!unzipDir.exists()) {
            unzipDir.mkdir();
        }
        Arrays.asList(unzipDir.listFiles()).forEach(f -> f.deleteOnExit());
        zip4Impl.unZipFile(fileToUnzip, unzipDir);
    }
    private File decrypt(Validateur val, Configuration config, File fileToUnzip) throws Exception {
        AESImpl aes = new AESImpl();
        File unzipDir = new File(config.getValidatorsDir(), UNZIP_DIR);
        String fileName = fileNameWithoutExtension(fileToUnzip);
        File inputFile = new File(unzipDir.getAbsolutePath(), fileName + ".xml");
        File outputFile = new File(config.getValidatorsDir(), inputFile.getName());
        aes.decryptFile(val.getKeyToDecrypt(), val.getKeyLength(), inputFile.getAbsolutePath(), outputFile.getAbsolutePath());
        inputFile.deleteOnExit();
        return outputFile;
    }
    private void setContent(Validateur validateur) throws Exception {
        TypeFichier typeFichier = getCurrentObject().getTypeFichier();
        getCurrentObject().setConvertDataBeforeValidation(ParserUtils.isConvertDataBeforeValidation(new File(validateur.getFilePath())));
        byte[] content = FileUtils.readFileToByteArray(new File(validateur.getFilePath()));
        getCurrentObject().setContent(content);
        getCurrentObject().setCodeTypeFichier(typeFichier.getCode());
    }
    private String fileNameWithoutExtension(File file) {
        String name = file.getName();
        int index = name.lastIndexOf(".");
        String fileName = name.substring(0, index);
        return fileName;
    }
    @Override
    public String getConfirmationDialogMessage() {
        return "Le validateur du typefichier " + getCurrentObject().getCodeTypeFichier() + " a été importé avec succès.";
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ConversionModelAdvancedSearchController.java
New file
@@ -0,0 +1,76 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
/**
 *
 * @author ASUS
 */
public class ConversionModelAdvancedSearchController implements Initializable {
    @FXML
    private ComboBox<Delimiteur> delimiteurLigneComboBox;
    @FXML
    private ComboBox<Delimiteur> delimiteurColonneComboBox;
    @FXML
    @Search(fieldName = "codeDelimiteurLigne", operateur = Operateur.EQUALS)
    private TextField codeDelimiteurLigneTextField;
    @FXML
    @Search(fieldName = "codeDelimiteurColonne", operateur = Operateur.EQUALS)
    private TextField codeDelimiteurColonneTextField;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        delimiteurColonneComboBox.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonneComboBox.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigneComboBox.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigneComboBox.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
        delimiteurColonneComboBox.setOnAction(e -> {
            Delimiteur delimiteurColonne = delimiteurColonneComboBox.getSelectionModel().getSelectedItem();
            if (delimiteurColonne != null) {
                codeDelimiteurColonneTextField.setText(delimiteurColonne.getCode());
            }
        });
        delimiteurLigneComboBox.setOnAction(e -> {
            Delimiteur delimiteurLigne = delimiteurLigneComboBox.getSelectionModel().getSelectedItem();
            if (delimiteurLigne != null) {
                codeDelimiteurLigneTextField.setText(delimiteurLigne.getCode());
            }
        });
    }
    public ComboBox<Delimiteur> getDelimiteurLigneComboBox() {
        return delimiteurLigneComboBox;
    }
    public ComboBox<Delimiteur> getDelimiteurColonneComboBox() {
        return delimiteurColonneComboBox;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ConversionModelSearchController.java
New file
@@ -0,0 +1,91 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class ConversionModelSearchController implements Initializable {
    @FXML
    @Search(fieldName = "typeFichier", operateur = Operateur.EQUALS)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Search(fieldName = "dataType", operateur = Operateur.EQUALS)
    private ComboBox<DataType> dataTypeComboBox;
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
        dataTypeComboBox.setItems(FXCollections.observableArrayList(
                DataType.values()
        ));
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/JournalAdvancedSearchFormController.java
New file
@@ -0,0 +1,59 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import com.megatim.fdxconvert.enums.JournalStatut;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
/**
 *
 * @author ASUS
 */
public class JournalAdvancedSearchFormController  implements Initializable {
    @FXML
    @Search(fieldName = "localDateAction", operateur = Operateur.GREATER_OR_EQUALS_THAN)
    private DatePicker dateDebutDatePicker;
    @FXML
    @Search(fieldName = "localDateAction", operateur = Operateur._LESS_OR_EQUALS_THAN)
    private DatePicker dateFinDatePicker;
    @FXML
    @Search(fieldName = "statut", operateur = Operateur.EQUALS)
    private ComboBox<JournalStatut> statutActionComboBox;
    @FXML
    @Search(fieldName = "destinationFileName", operateur = Operateur.LIKE)
    private TextField destinationFileNameTextField;
    @FXML
    @Search(fieldName = "sourceFileName", operateur = Operateur.LIKE)
    private TextField sourceFileNameTextField;
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        statutActionComboBox.setPromptText("Sélectionnez un élément dans la liste");
        statutActionComboBox.setItems(FXCollections.observableArrayList(
                JournalStatut.values()
        ));
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/JournalSearchFormController.java
New file
@@ -0,0 +1,95 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class JournalSearchFormController implements Initializable {
    @Search(fieldName = "codeTypefichier", operateur = Operateur.LIKE)
    @FXML
    private TextField typeFichierTextField;
    @FXML
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectionItem;
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        typeFichierAbstractSelectionItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectionItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectionItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        typeFichierAbstractSelectionItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue == null) {
                typeFichierTextField.setText("");
            } else {
                typeFichierTextField.setText(newValue.getCode());
            }
        });
        initElements();
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectionItem() {
        return typeFichierAbstractSelectionItem;
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectionItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ParametreAutoAdvancedSearchFormController.java
New file
@@ -0,0 +1,40 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import com.megatim.fdxconvert.enums.DataType;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
/**
 *
 * @author STEPHANIE
 */
public class ParametreAutoAdvancedSearchFormController implements Initializable {
    @Search(fieldName = "intervalle", operateur = Operateur.EQUALS, editable = false)
    @FXML
    private TextField intervalle;
//    @FXML
//    @Search(fieldName = "dataType", operateur = Operateur.EQUALS, editable = false)
//    private ComboBox<DataType> dataTypeComboBox;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
//         dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
//
//        dataTypeComboBox.setItems(FXCollections.observableArrayList(
//                DataType.values()
//        ));
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ParametreAutoSearchFormController.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
/**
 *
 * @author STEPHANIE
 */
public class ParametreAutoSearchFormController  implements Initializable {
    @Search(fieldName = "codeTypeFichier", operateur = Operateur.LIKE)
    @FXML
    private TextField code;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TacheSearchFormController.java
New file
@@ -0,0 +1,81 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class TacheSearchFormController implements Initializable {
    @FXML
    @Search(fieldName = "typeFichier", operateur = Operateur.EQUALS)
    private AbstractSelectionItem typeFichierAbstractSelectItem;
    private Set<TypeFichier> TypeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        intitTypeFichiers();
    }
    private void intitTypeFichiers() {
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier de la tâche");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn(),
                TypeFichierTable.participantColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                TypeFichierSet.clear();
                TypeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            typeFichierAbstractSelectItem.setElements(TypeFichierSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TruncatedElementAdvancedSearchFormController.java
New file
@@ -0,0 +1,34 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
/**
 *
 * @author ASUS
 */
public class TruncatedElementAdvancedSearchFormController implements Initializable {
    @FXML
    @Search(fieldName = "codeColonne", operateur = Operateur.LIKE)
    private TextField codeColonneTextfield;
    @FXML
    @Search(fieldName = "localDateAction", operateur = Operateur.EQUALS)
    private DatePicker dateActionDatePicker;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TruncatedElementSearchFormController.java
New file
@@ -0,0 +1,86 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class TruncatedElementSearchFormController implements Initializable {
    @FXML
    @Search(fieldName = "codeTypeFichier", operateur = Operateur.LIKE)
    private TextField codeTypeFichierTextfield;
    @FXML
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectionItem;
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        typeFichierAbstractSelectionItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectionItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectionItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        typeFichierAbstractSelectionItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            codeTypeFichierTextfield.setText(newValue.getCode());
        });
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectionItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TypeFichierAdvancedSearchFormController.java
New file
@@ -0,0 +1,38 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierAdvancedSearchFormController  implements Initializable {
    @Search(fieldName = "libelle", operateur = Operateur.LIKE, editable = false)
    @FXML
    private TextField libelle;
    @Search(fieldName = "codeParticipant", operateur = Operateur.LIKE, editable = false)
    @FXML
    private TextField participant;
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/TypeFichierSearchFormController.java
New file
@@ -0,0 +1,31 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.enums.Operateur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierSearchFormController implements Initializable{
    @Search(fieldName = "code", operateur = Operateur.LIKE)
    @FXML
    private TextField code;
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/search/ValidateurSearchFormController.java
New file
@@ -0,0 +1,99 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.search;
import com.megatimfx.common.annontations.Search;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.enums.Operateur;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.util.Pair;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurSearchFormController implements Initializable {
    @Search(fieldName = "codeTypeFichier", operateur = Operateur.LIKE)
    @FXML
    private TextField codeTypeFichierTextfield;
    @FXML
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectionItem;
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        typeFichierAbstractSelectionItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectionItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectionItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        typeFichierAbstractSelectionItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue == null) {
                codeTypeFichierTextfield.setText("");
            } else {
                codeTypeFichierTextfield.setText(newValue.getCode());
            }
        });
        initElements();
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectionItem() {
        return typeFichierAbstractSelectionItem;
    }
    public TextField getCodeTypeFichierTextfield() {
        return codeTypeFichierTextfield;
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectionItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/AlphaNumeriqueFieldTable.java
New file
@@ -0,0 +1,67 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class AlphaNumeriqueFieldTable {
    private AlphaNumeriqueFieldTable() {
    }
    public static TableColumn<AlphaNumeriqueField, String> codeTypeFichierColumn() {
        TableColumn<AlphaNumeriqueField, String> column = new TableColumn("Typefichier");
        column.setCellValueFactory(new PropertyValueFactory("codeTypefichier"));
        return column;
    }
    public static TableColumn<AlphaNumeriqueField, String> codeColonneColumn() {
        TableColumn<AlphaNumeriqueField, String> column = new TableColumn("Code du Champ");
        column.setCellValueFactory(e -> {
            return new SimpleStringProperty(e.getValue().getCodeColonne());
        });
        return column;
    }
    public static TableColumn<AlphaNumeriqueField, Boolean> shouldBeTruncatedColumn() {
        TableColumn<AlphaNumeriqueField, Boolean> column = new TableColumn("Peut être tronqué");
        column.setCellValueFactory(new PropertyValueFactory("shouldBeTruncated"));
        return column;
    }
    public static TableColumn<AlphaNumeriqueField, Integer> tailleColumn() {
        TableColumn<AlphaNumeriqueField, Integer> column = new TableColumn("Taille du champ");
        column.setCellValueFactory(new PropertyValueFactory("taille"));
        return column;
    }
    public static TableColumn<AlphaNumeriqueField, Integer> indexColumn() {
        TableColumn<AlphaNumeriqueField, Integer> column = new TableColumn("Index de début du champ");
        column.setCellValueFactory(new PropertyValueFactory("index"));
        return column;
    }
     public static TableColumn<AlphaNumeriqueField, String> dateCreationColumn() {
        TableColumn<AlphaNumeriqueField, String> column = new TableColumn("Date de creation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? ""+ date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ConversionModelTable.java
New file
@@ -0,0 +1,141 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class ConversionModelTable {
    private ConversionModelTable() {
    }
    public static TableColumn<ConversionModel, String> typeFichierColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Type Fichier");
        column.setCellValueFactory(c -> {
            TypeFichier typeFichier = c.getValue().getTypeFichier();
            return new SimpleStringProperty(typeFichier.getCode());
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> dataTypeColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Type de données");
        column.setCellValueFactory(c -> {
            DataType dataType = c.getValue().getDataType();
            return new SimpleStringProperty(dataType.toString());
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> delimiteurLigneColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Dél. ligne");
        column.setCellValueFactory(c -> {
            String codeDelimiteurLigne = c.getValue().getCodeDelimiteurLigne();
            if (App.DELIMITEURS_LIGNE.containsKey(codeDelimiteurLigne)) {
                return new SimpleStringProperty(App.DELIMITEURS_LIGNE.get(codeDelimiteurLigne).toString());
            } else {
                return new SimpleStringProperty("");
            }
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> delimiteurColonneColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Dél. colonne");
        column.setCellValueFactory(c -> {
            String codeDelimiteurColonne = c.getValue().getCodeDelimiteurColonne();
            if (App.DELIMITEURS_COLONNE.containsKey(codeDelimiteurColonne)) {
                return new SimpleStringProperty(App.DELIMITEURS_COLONNE.get(codeDelimiteurColonne).toString());
            } else {
                return new SimpleStringProperty("");
            }
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> repertoireSourceColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Rép. Source");
        column.setCellValueFactory(new PropertyValueFactory("repertoireSource"));
        return column;
    }
    public static TableColumn<ConversionModel, String> repertoireDestinationColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Rép. Destination");
        column.setCellValueFactory(new PropertyValueFactory("repertoireDestination"));
        return column;
    }
    public static TableColumn<ConversionModel, String> repertoireErreurColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Rép. Erreur");
        column.setCellValueFactory(new PropertyValueFactory("repertoireErreur"));
        return column;
    }
    public static TableColumn<ConversionModel, String> libelleColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Libellé");
        column.setCellValueFactory(new PropertyValueFactory("libelle"));
        return column;
    }
    public static TableColumn<ConversionModel, String> headerPresentColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Entête présente ?");
        column.setCellValueFactory(c -> {
            boolean headerPresent = c.getValue().isHeaderPresent();
            String value = headerPresent ? "Oui" : "Non";
            return new SimpleStringProperty(value);
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> strictValidationColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Validation Stricte ?");
        column.setCellValueFactory(c -> {
            boolean strictValidation = c.getValue().isStrictValidation();
            String value = strictValidation ? "Oui" : "Non";
            return new SimpleStringProperty(value);
        });
        return column;
    }
    public static TableColumn<ConversionModel, String> dateCreationColumn() {
        TableColumn<ConversionModel, String> column = new TableColumn("Date de création");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? "" + date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/JournalTable.java
New file
@@ -0,0 +1,61 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.enums.JournalStatut;
import com.megatim.fdxconvert.model.Journal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class JournalTable {
    private JournalTable() {
    }
    public static TableColumn<Journal, String> typeFichierColumn() {
        TableColumn<Journal, String> column = new TableColumn("Typefichier");
        column.setCellValueFactory(new PropertyValueFactory("codeTypefichier"));
        return column;
    }
    public static TableColumn<Journal, String> sourceFileNameColumn() {
        TableColumn<Journal, String> column = new TableColumn("Fichier source");
        column.setCellValueFactory(new PropertyValueFactory("sourceFileName"));
        return column;
    }
    public static TableColumn<Journal, String> destinationFileNameColumn() {
        TableColumn<Journal, String> column = new TableColumn("Fichier de destination");
        column.setCellValueFactory(new PropertyValueFactory("destinationFileName"));
        return column;
    }
    public static TableColumn<Journal, String> statutColumn() {
        TableColumn<Journal, String> column = new TableColumn("Statut");
        column.setCellValueFactory(c -> {
            JournalStatut staut = c.getValue().getStatut();
            return new SimpleStringProperty(staut.getDescription());
        });
        return column;
    }
    public static TableColumn<Journal, String> dateColumn() {
        TableColumn<Journal, String> column = new TableColumn("Date de l'action");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateAction();
            return new SimpleStringProperty(""+ date.format(formatter));
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/MetaAlphaNumeriqueFieldTable.java
New file
@@ -0,0 +1,40 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueFieldTable {
    private MetaAlphaNumeriqueFieldTable() {
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> alphaNumeriqueFieldColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("Code du Champ");
        column.setCellValueFactory(new PropertyValueFactory("alphaNumeriqueField"));
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> dateCreationColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("Date de creation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? "" + date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/MetaAlphaNumeriqueTable.java
New file
@@ -0,0 +1,75 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.Tache;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueTable {
    private MetaAlphaNumeriqueTable() {
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> codeColonneColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("Code");
        column.setCellValueFactory(e -> {
            return new SimpleStringProperty(e.getValue().getAlphaNumeriqueField().getCodeColonne());
        });
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, Integer> tailleColonneColumn() {
        TableColumn<MetaAlphaNumeriqueField, Integer> column = new TableColumn("Taille");
        column.setCellValueFactory(e -> {
            return new SimpleIntegerProperty(e.getValue().getAlphaNumeriqueField().getTaille()).asObject();
        });
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, Integer> indexColonneColumn() {
        TableColumn<MetaAlphaNumeriqueField, Integer> column = new TableColumn("Index de début");
        column.setCellValueFactory(e -> {
            return new SimpleIntegerProperty(e.getValue().getAlphaNumeriqueField().getIndex()).asObject();
        });
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> typeFichierColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("TypeFichier");
        column.setCellValueFactory(e -> {
            return new SimpleStringProperty(e.getValue().getAlphaNumeriqueField().getValidateur().getCodeTypeFichier());
        });
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> typeDonneeColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("Type de données");
        column.setCellValueFactory(e -> {
            return new SimpleStringProperty(e.getValue().getAlphaNumeriqueField().getTypeDonnee());
        });
        return column;
    }
    public static TableColumn<MetaAlphaNumeriqueField, String> dateCreationColumn() {
        TableColumn<MetaAlphaNumeriqueField, String> column = new TableColumn("Date de creation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? "" + date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ModeleJsonTable.java
New file
@@ -0,0 +1,25 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.ModeleJson;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class ModeleJsonTable {
    private ModeleJsonTable() {
    }
    public static TableColumn<ModeleJson, String> objectNameColumn() {
        TableColumn<ModeleJson, String> column = new TableColumn("Libellé de la structure");
        column.setCellValueFactory(new PropertyValueFactory("objectName"));
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/StructureChampJsonTable.java
New file
@@ -0,0 +1,54 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.model.StructureChampJson;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class StructureChampJsonTable {
    private StructureChampJsonTable() {
    }
    public static TableColumn<StructureChampJson, String> codeColumn() {
        TableColumn<StructureChampJson, String> column = new TableColumn("Libellé");
        column.setCellValueFactory(new PropertyValueFactory("libelle"));
        return column;
    }
    public static TableColumn<StructureChampJson, String> typeDonneeColumn() {
        TableColumn<StructureChampJson, String> column = new TableColumn("Type de données");
        column.setCellValueFactory(c -> {
            if (c.getValue().getTypeDonnee().equals(TypeDonnee.OBJET)) {
                return new SimpleStringProperty("Objet : " + c.getValue().getTypeOfSubObject().getSubObjectName());
            } else {
                return new SimpleStringProperty(c.getValue().getTypeDonnee().toString());
            }
        });
        return column;
    }
    public static TableColumn<StructureChampJson, String> simpleOrListeColumn() {
        TableColumn<StructureChampJson, String> column = new TableColumn("Liste ?");
        column.setCellValueFactory(c -> {
            if (c.getValue().isListe()) {
                return new SimpleStringProperty("Oui");
            } else {
                return new SimpleStringProperty("Non");
            }
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/SubObjectTable.java
New file
@@ -0,0 +1,26 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.SubObject;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class SubObjectTable {
    private SubObjectTable() {
    }
     public static TableColumn<SubObject, String> subObjectNameColumn() {
        TableColumn<SubObject, String> column = new TableColumn("Nom de l'objet");
        column.setCellValueFactory(new PropertyValueFactory("subObjectName"));
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TacheTable.java
New file
@@ -0,0 +1,71 @@
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author MGT_DEV3
 */
public class TacheTable {
    private TacheTable() {
    }
    public static TableColumn<Tache, String> libelleColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Libellé");
        column.setCellValueFactory(new PropertyValueFactory<>("libelle"));
        return column;
    }
    public static TableColumn<Tache, String> descriptionColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Description");
        column.setCellValueFactory(c -> {
            //
            return new SimpleStringProperty(c.getValue().getLibelle());
        });
        return column;
    }
    public static TableColumn<Tache, String> typeFichierColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Type Fichier");
        column.setCellValueFactory( c -> {
            TypeFichier typeFichier = c.getValue().getTypeFichier();
            return new SimpleStringProperty(typeFichier.getCode());
        });
        return column;
    }
    public static TableColumn<Tache, String> schedulerColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Plannification");
        column.setCellValueFactory(new PropertyValueFactory<>("scheduler"));
        return column;
    }
     public static TableColumn<Tache, String> dateCreationColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Date création");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? date.format(formatter) : "");
        });
        return column;
    }
     public static TableColumn<Tache, String> dateMiseAJourColumn() {
        TableColumn<Tache, String> column = new TableColumn<>("Date dernière modification");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateMiseAJour();
            return new SimpleStringProperty(date != null ? date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TruncatedElementTable.java
New file
@@ -0,0 +1,76 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.Journal;
import com.megatim.fdxconvert.model.TruncatedElement;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author ASUS
 */
public class TruncatedElementTable {
    private TruncatedElementTable() {
    }
      public static TableColumn<TruncatedElement, String> codeTypeFichierColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Code du type fichier");
        column.setCellValueFactory(new PropertyValueFactory("codeTypeFichier"));
        return column;
    }
      public static TableColumn<TruncatedElement, String> codeColonneColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Code de la colonne");
        column.setCellValueFactory(new PropertyValueFactory("codeColonne"));
        return column;
    }
      public static TableColumn<TruncatedElement, String> initialDataColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Donnée initiale");
        column.setCellValueFactory(new PropertyValueFactory("initialData"));
        return column;
    }
      public static TableColumn<TruncatedElement, String> finalDataColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Donnée finale");
        column.setCellValueFactory(new PropertyValueFactory("finalData"));
        return column;
    }
      public static TableColumn<TruncatedElement, String> fileNameColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Nom du fichier");
        column.setCellValueFactory(new PropertyValueFactory("fileName"));
        return column;
    }
      public static TableColumn<TruncatedElement, String> dateColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Date de l'action");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateAction();
            return new SimpleStringProperty(date != null ? ""+ date.format(formatter) : "");
        });
        return column;
    }
       public static TableColumn<TruncatedElement, String> dateCreationColumn() {
        TableColumn<TruncatedElement, String> column = new TableColumn("Date de creation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? ""+ date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/TypeFichierTable.java
New file
@@ -0,0 +1,53 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierTable {
     private TypeFichierTable() {
    }
    public static TableColumn<TypeFichier, String> codeColumn() {
        TableColumn<TypeFichier, String> column = new TableColumn("Code");
        column.setCellValueFactory(new PropertyValueFactory("code"));
        return column;
    }
    public static TableColumn<TypeFichier, String> libelleColumn() {
        TableColumn<TypeFichier, String> column = new TableColumn("Libellé");
        column.setCellValueFactory(new PropertyValueFactory("libelle"));
        return column;
    }
    public static TableColumn<TypeFichier, String> participantColumn() {
        TableColumn<TypeFichier, String> column = new TableColumn("Participant");
        column.setCellValueFactory(new PropertyValueFactory("codeParticipant"));
        return column;
    }
     public static TableColumn<TypeFichier, String> dateCreationColumn() {
        TableColumn<TypeFichier, String> column = new TableColumn("Date de creation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? ""+ date.format(formatter) : "");
        });
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/controller/table/ValidateurTable.java
New file
@@ -0,0 +1,53 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.controller.table;
import com.megatim.fdxconvert.model.Validateur;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
import lombok.NoArgsConstructor;
/**
 *
 * @author STEPHANIE
 */
@NoArgsConstructor
public class ValidateurTable {
    public static TableColumn<Validateur, String> typeFichierColumn() {
        TableColumn<Validateur, String> column = new TableColumn("Code du TypeFichier");
        column.setCellValueFactory(new PropertyValueFactory("codeTypeFichier"));
        return column;
    }
    public static TableColumn<Validateur, String> dateCreationColumn() {
        TableColumn<Validateur, String> column = new TableColumn("Date de l'importation");
        column.setCellValueFactory(c -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime date = c.getValue().getDateCreation();
            return new SimpleStringProperty(date != null ? "" + date.format(formatter) : "");
        });
        return column;
    }
    public static TableColumn<Validateur, String> dataConversionColumn() {
        TableColumn<Validateur, String> column = new TableColumn("Conversion des données\nen TXT avant validation ?");
        column.setCellValueFactory(c -> {
            return new SimpleStringProperty(c.getValue().isConvertDataBeforeValidation() ? "Oui" : "Non");
        });
        return column;
    }
    public static TableColumn<Validateur, Integer> keyLengthColumn() {
        TableColumn<Validateur, Integer> column = new TableColumn("Taille clé");
        column.setCellValueFactory(new PropertyValueFactory("keyLength"));
        return column;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/converter/DataTypeConverter.java
New file
@@ -0,0 +1,36 @@
package com.megatim.fdxconvert.converter;
import com.megatim.fdxconvert.enums.DataType;
import java.util.stream.Stream;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
/**
 *
 * @author STEPHANIE
 */
@Converter(autoApply = true)
public class DataTypeConverter implements AttributeConverter<DataType, String> {
    @Override
    public String convertToDatabaseColumn(DataType dataType) {
        if (dataType == null) {
            return null;
        }
        return dataType.getDataType();
    }
    @Override
    public DataType convertToEntityAttribute(String dataType) {
        if (dataType == null) {
            return null;
        }
        return Stream.of(DataType.values())
                .filter(c -> c.getDataType().equals(dataType))
                .findFirst()
                .orElseThrow(IllegalArgumentException::new);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/AbstractDAO.java
New file
@@ -0,0 +1,295 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.Session;
/**
 *
 * @author mela
 */
@Getter
@Setter
public class AbstractDAO<T> {
    private Class<T> clazz;
    private PaginationElts pagination;
    public AbstractDAO(Class<T> clas) {
        clazz = clas;
        pagination = new PaginationElts();
    }
    public <T> T add(T element) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            session.persist(element);
            session.getTransaction().commit();
            session.refresh(element);
            return element;
        }
    }
    public <T> T edit(T element) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            session.update(element);
            session.getTransaction().commit();
            session.refresh(element);
            return element;
        }
    }
    public void delete(T element) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            session.delete(element);
            session.getTransaction().commit();
        }
    }
    public void deleteAll(String tableName) {
        List<T> liste = getAll(tableName);
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            liste.forEach(t -> session.delete(t));
            session.getTransaction().commit();
        }
    }
    public <Optional> T find(Object element) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            return session.find(clazz, element);
        }
    }
    public List<T> getAll(String tableName) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            List<T> liste = session.createQuery("from " + tableName).getResultList();
            return liste;
        }
    }
    public List<T> getAllByPage(int indexDebut, int numberOfElt, List<SearchCriteria> searchCriterias) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(clazz);
            Root<T> root = criteriaQuery.from(clazz);
            List<Predicate> predicates = createPedicates(searchCriterias, criteriaBuilder, root);
            CriteriaQuery<T> cq = criteriaQuery.select(root);
            cq = cq.select(root).where(predicates.toArray(new Predicate[predicates.size()]));
            TypedQuery<T> typedQuery = session.createQuery(cq);
            typedQuery.setFirstResult(indexDebut);
            typedQuery.setMaxResults(numberOfElt);
            List<T> liste = typedQuery.getResultList();
            return liste;
        }
    }
    private long count(List<SearchCriteria> searchCriterias) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            CriteriaBuilder qb = session.getCriteriaBuilder();
            CriteriaQuery<Long> cq = qb.createQuery(Long.class);
            Root<T> root = cq.from(clazz);
            List<Predicate> predicates = createPedicates(searchCriterias, qb, root);
            cq.select(qb.count(root));
            cq.where(predicates.toArray(new Predicate[predicates.size()]));
            return (long) session.createQuery(cq).getSingleResult();
        }
    }
    public PaginationElts initPaginationElts(int pageNumber, List<SearchCriteria> searchCriterias) {
        int indexDebut = pageNumber * pagination.getNbEltsPerPage();
        pagination.setListe(getAllByPage(indexDebut, pagination.getNbEltsPerPage(), searchCriterias));
        pagination.setTotalElts(count(searchCriterias));
        pagination.setPage(pageNumber);
        if (pageNumber == 0) {
            pagination.setNumberOfElts(pagination.getListe().size());
        } else {
            pagination.setNumberOfElts(pageNumber * pagination.getNbEltsPerPage() + pagination.getListe().size());
        }
        pagination.setNumberOfPage((pagination.getTotalElts() % pagination.getNbEltsPerPage() == 0) ? (pagination.getTotalElts() / pagination.getNbEltsPerPage())
                : (pagination.getTotalElts() / pagination.getNbEltsPerPage()) + 1);
        return pagination;
    }
    /**
     * Méthode qui retounre la liste des champs de la classe clazz
     *
     * @return
     */
    private Map<String, Field> getClassFields() {
        Field[] fields = clazz.getDeclaredFields();
        Map<String, Field> mapOfFields = new HashMap<>();
        for (Field field : fields) {
            mapOfFields.put(field.getName(), field);
        }
        return mapOfFields;
    }
    /**
     * Méthode qui vérifie que le champ "fieldValue" de l'objet searchCriteria
     * est du même type que le champ "fieldName" dans la classe clazz
     *
     * @param field : contient les informations sur le champ correspondant
     * @param value : valeur dont on veut vérifier le type
     * @return : retourne vrai sivalue est du même type que celui renseigné dans
     * field
     */
    private boolean isFieldAndValueOfSameType(Field field, Object value) {
        boolean result = true;
        try {
            field.getType().cast(value);
        } catch (ClassCastException ex) {
            result = false;
        }
        return result;
        //String className = field.getType().getName();
    }
    /**
     * Méthode qui filtre la liste des critères afin de ne garder que ceux qui
     * respectent le type du champ correspondant dans la classe et ceux dont le
     * fieldName correspond à un champ de la classe clazz
     *
     * @param searchCriterias
     * @return
     */
    private List<SearchCriteria> verifySearchCriteria(List<SearchCriteria> searchCriterias) {
        Map<String, Field> mapOfFields = getClassFields();
        //Retire les critères dont le fieldName ne correspond à aucun champ de la classe clazz
        for (SearchCriteria criteria : searchCriterias) {
            if (!mapOfFields.containsKey(criteria.getFieldName())) {
                searchCriterias.remove(criteria);
//                continue;
            }
//            Retire les critères dont le type de fieldValue ne correspond pas au type du champ dans la classe clazz
//            if(!isFieldAndValueOfSameType(mapOfFields.get(criteria.getFieldName()),criteria.getFieldValue())){
//                searchCriterias.remove(criteria);
//            }
        }
        return searchCriterias;
    }
    /**
     * Méthode qui les prédicats à partir des critères de recherche
     *
     * @param searchCriterias
     * @param cb
     * @return
     */
    private List<Predicate> createPedicates(List<SearchCriteria> searchCriterias, CriteriaBuilder cb, Root<T> root) {
        List<Predicate> predicates = new ArrayList<>();
        searchCriterias = verifySearchCriteria(searchCriterias);
        searchCriterias.parallelStream().forEach(s -> {
            Predicate predicate = null;
            switch (s.getOperateur()) {
                case EQUALS:
                    predicate = cb.equal(root.get(s.getFieldName()), s.getFieldValue());
                    predicates.add(predicate);
                    break;
                case NOT_EQUALS:
                    predicate = cb.notEqual(root.get(s.getFieldName()), s.getFieldValue());
                    predicates.add(predicate);
                    break;
                case LIKE:
                    if (s.getFieldValue() instanceof String) {
                        predicate = cb.like(root.get(s.getFieldName()), "%" + s.getFieldValue().toString() + "%");
                        predicates.add(predicate);
                    }
                    break;
                case GREATER_THAN:
                    if (s.getFieldValue() instanceof Number) {
                        predicate = cb.gt(root.get(s.getFieldName()), (Number) s.getFieldValue());
                        predicates.add(predicate);
                    } else if (s.getFieldValue() instanceof LocalDate) {
                        predicate = cb.greaterThan(root.get(s.getFieldName()), (LocalDate) s.getFieldValue());
                        predicates.add(predicate);
                    }
                    break;
                case GREATER_OR_EQUALS_THAN:
                    if (s.getFieldValue() instanceof Number) {
                        predicate = cb.ge(root.get(s.getFieldName()), (Number) s.getFieldValue());
                        predicates.add(predicate);
                    } else if (s.getFieldValue() instanceof LocalDate) {
                        predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), (LocalDate) s.getFieldValue());
                        predicates.add(predicate);
                    }
                    break;
                case LESS_THAN:
                    if (s.getFieldValue() instanceof Number) {
                        predicate = cb.lt(root.get(s.getFieldName()), (Number) s.getFieldValue());
                        predicates.add(predicate);
                    } else if (s.getFieldValue() instanceof LocalDate) {
                        predicate = cb.lessThan(root.get(s.getFieldName()), (LocalDate)s.getFieldValue());
                        predicates.add(predicate);
                    }
                    break;
                case _LESS_OR_EQUALS_THAN:
                    if (s.getFieldValue() instanceof Number) {
                        predicate = cb.le(root.get(s.getFieldName()), (Number) s.getFieldValue());
                        predicates.add(predicate);
                    } else if (s.getFieldValue() instanceof LocalDate) {
                        predicate = cb.lessThanOrEqualTo(root.get(s.getFieldName()), (LocalDate)s.getFieldValue());
                        predicates.add(predicate);
                    }
                    break;
                case IN:
                    if (s.getFieldValue() instanceof java.util.Collection) {
                        predicate = root.get(s.getFieldName()).in(s.getFieldValue());
                        predicates.add(predicate);
                    }
                    break;
                default:
            }
        });
        return predicates;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/AlphaNumeriqueFieldDAO.java
New file
@@ -0,0 +1,42 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author ASUS
 */
public class AlphaNumeriqueFieldDAO {
    private AlphaNumeriqueFieldDAO() {
    }
     public static List<AlphaNumeriqueField> findByCodeTypeFichier(String code) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from AlphaNumeriqueField where codeTypeFichier= :code");
            query.setParameter("code", code);
            return query.getResultList();
        }
    }
     public static void updateCodeTypeFichier(String oldValue, String newValue) {
          try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("update AlphaNumeriqueField set codeTypeFichier =:newValue where codeTypeFichier = :oldValue");
            query.setParameter("oldValue", oldValue);
            query.setParameter("newValue", newValue);
            session.beginTransaction();
            query.executeUpdate();
            session.getTransaction().commit();
        }
     }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ConversionModelDAO.java
New file
@@ -0,0 +1,33 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.model.TypeFichier;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author ASUS
 */
public class ConversionModelDAO {
    private ConversionModelDAO() {
    }
    public static List<ConversionModel> findByTypeFichier(TypeFichier typeFichier) {
         try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select c from ConversionModel c where c.typeFichier.code = :codeTypeFichier");
            query.setParameter("codeTypeFichier",typeFichier.getCode());
            return query.getResultList();
        }
     }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/HibernateUtil.java
New file
@@ -0,0 +1,48 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
/**
 *
 * @author mela
 */
public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private HibernateUtil() {
    }
    public static synchronized SessionFactory getSessionFactory() {
        try {
            if (sessionFactory == null) {
                StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
//                        .configure("hibernate.cfg.xml").build();
                 .configure("file:hibernate.cfg.xml").build();
                Metadata metaData = new MetadataSources(standardRegistry)
                        .getMetadataBuilder()
                        .build();
                sessionFactory = metaData.getSessionFactoryBuilder().build();
            }
            return sessionFactory;
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static void shutdown() {
        if(sessionFactory != null)
            sessionFactory.close();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/JsonStructureDAO.java
New file
@@ -0,0 +1,43 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.JsonStructure;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;
import org.hibernate.Session;
/**
 *
 * @author ASUS
 */
public class JsonStructureDAO {
    private JsonStructureDAO() {
    }
    public static JsonStructure loadSubJsonStructure(JsonStructure jsonStructure) {
        List<JsonStructure> children = getChildren(jsonStructure.getId());
        List<JsonStructure> subJsonStructure = new ArrayList<>();
        for (JsonStructure j : children) {
            subJsonStructure.add(loadSubJsonStructure(j));
        }
        jsonStructure.setFields(subJsonStructure);
        return jsonStructure;
    }
    private static List<JsonStructure> getChildren(Long id) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("SELECT c from JsonStructure c where c.parent.id = :id ");
            query.setParameter("id", id);
            return (List<JsonStructure>) query.getResultList();
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/MetaAlphaNumeriqueFieldDAO.java
New file
@@ -0,0 +1,31 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueFieldDAO {
    private MetaAlphaNumeriqueFieldDAO() {
    }
    public static void deleteByAlphaNumeriqueField(AlphaNumeriqueField alphaNumeriqueField) {
          try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("delete from MetaAlphaNumeriqueField t where t.alphaNumeriqueField.id = :alphaNumeriqueFieldId");
            query.setParameter("alphaNumeriqueFieldId", alphaNumeriqueField.getId());
            session.beginTransaction();
            query.executeUpdate();
            session.getTransaction().commit();
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ModeleJsonDAO.java
New file
@@ -0,0 +1,32 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.model.TypeFichier;
import java.util.Optional;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author ASUS
 */
public class ModeleJsonDAO {
    private ModeleJsonDAO() {
    }
     public static Optional<ModeleJson> findByCodeTypeFichier(TypeFichier typeFichier) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from ModeleJson where typeFichier.code = :code");
            query.setParameter("code", typeFichier.getCode());
            return query.uniqueResultOptional();
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TacheDAO.java
New file
@@ -0,0 +1,43 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import java.util.List;
import java.util.Optional;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author STEPHANIE
 */
public class TacheDAO {
    private TacheDAO() {
    }
    public static Optional<Tache> getTacheByLibelle(String libelle) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from Tache t where t.libelle = :libelle");
            query.setParameter("libelle", libelle);
            return query.uniqueResultOptional();
        }
    }
    public static List<Tache> getTacheByTypeFichier(TypeFichier typeFichier) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from Tache t where t.typeFichier.code = :codeTypeFichier");
            query.setParameter("codeTypeFichier", typeFichier.getCode());
            return query.getResultList();
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TypeFichierDAO.java
New file
@@ -0,0 +1,104 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.Validateur;
import java.util.List;
import java.util.Optional;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierDAO {
    private TypeFichierDAO() {
    }
    public static List<TypeFichier> getAllTypeFichWithoutValidateur() {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t where t.code not in"
                    + "(select t from TypeFichier t, Validateur v  where t.code = v.codeTypeFichier)");
            return query.getResultList();
        }
    }
    public static Optional<TypeFichier> findByCode(TypeFichier t) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t where t.code = :code");
            query.setParameter("code", t.getCode());
            return query.uniqueResultOptional();
        }
    }
    public static Optional<TypeFichier> findByCode(String codeTypeFichier) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t where t.code = :code");
            query.setParameter("code", codeTypeFichier);
            return query.uniqueResultOptional();
        }
    }
    public static List<TypeFichier> getAllTypeFichWithoutParaAuto() {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t where t.code not in"
                    + "(select t from TypeFichier t, ParametreAutomatique p  where t.code = p.codeTypeFichier)");
            return query.getResultList();
        }
    }
    public static List<TypeFichier> getAllTypeFichierWithValidateur() {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t, Validateur v where v.codeTypeFichier = t.code");
            return query.getResultList();
        }
    }
    public static List<TypeFichier> getAllTypeFichierWithModelJson() {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("select t from TypeFichier t, ModeleJson m where t.code = m.typeFichier.code");
            return query.getResultList();
        }
    }
    public static void delete(TypeFichier typeFichier) throws Exception {
        List<ConversionModel> conversionModels = ConversionModelDAO.findByTypeFichier(typeFichier);
        Optional<Validateur> opt = ValidateurDAO.findByCodeTypeFichier(typeFichier.getCode());
        List<Tache> taches = TacheDAO.getTacheByTypeFichier(typeFichier);
        List<AlphaNumeriqueField> alphaFields = AlphaNumeriqueFieldDAO.findByCodeTypeFichier(typeFichier.getCode());
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            for (ConversionModel model : conversionModels) {
                session.delete(model);
            }
            for(AlphaNumeriqueField field : alphaFields) {
                session.delete(field);
            }
            if (opt.isPresent()) {
                session.delete(opt.get());
            }
            for (Tache tache : taches) {
                session.delete(tache);
            }
            session.delete(typeFichier);
            session.getTransaction().commit();
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/TypeFichierJsonDAO.java
New file
@@ -0,0 +1,40 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichierJson;
import java.util.List;
import java.util.Optional;
import javax.persistence.Query;
import org.hibernate.Session;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierJsonDAO {
    private TypeFichierJsonDAO() {
    }
    public static TypeFichierJson getByTypeFichier(String codeTypeFichier) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("SELECT t from TypeFichierJson t where t.typeFichier.code = :code ");
            query.setParameter("code", codeTypeFichier);
            Optional<TypeFichierJson> optTypeFichierJson = ((List<TypeFichierJson>) query.getResultList()).stream().findFirst();
            if (!optTypeFichierJson.isPresent()) {
                return null;
            }
            TypeFichierJson typeFichierJson = optTypeFichierJson.get();
            JsonStructure jsonStructure = JsonStructureDAO.loadSubJsonStructure(typeFichierJson.getJsonStructure());
            typeFichierJson.setJsonStructure(jsonStructure);
            return typeFichierJson;
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/dao/ValidateurDAO.java
New file
@@ -0,0 +1,101 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.dao;
import com.megatim.typefichier.validator.model.enums.TypeDonnee;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.util.ParserUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurDAO {
    private ValidateurDAO() {
    }
    public static Optional<Validateur> findByCodeTypeFichier(String code) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Validateur where codeTypeFichier= :code");
            query.setParameter("code", code);
            return query.uniqueResultOptional();
        }
    }
    public static void delete(Validateur t) {
        List<AlphaNumeriqueField> alphaFields = AlphaNumeriqueFieldDAO.findByCodeTypeFichier(t.getCodeTypeFichier());
        alphaFields.forEach(a -> {
            MetaAlphaNumeriqueFieldDAO.deleteByAlphaNumeriqueField(a);
        });
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            session.beginTransaction();
            for (AlphaNumeriqueField field : alphaFields) {
                Query query = session.createQuery("delete from MetaAlphaNumeriqueField t where t.alphaNumeriqueField.id = :alphaNumeriqueFieldId");
                query.setParameter("alphaNumeriqueFieldId", field.getId());
                query.executeUpdate();
                session.delete(field);
            }
            session.delete(t);
            session.getTransaction().commit();
        }
    }
    /**
     * Méthode qui extrait les champs alphanumériques dont la taille est
     * supérieure à 255, pour un éventuel troncage
     *
     * @param validateur
     * @return
     * @throws Exception
     */
    private List<AlphaNumeriqueField> getAplphaNumeriqueFields(Validateur validateur) throws Exception {
        Map<Integer, Map> mapElements = ParserUtils.getValidateurElements(validateur);
        List<Map<String, String>> paramsList = Arrays.asList(mapElements.values().toArray(new Map[mapElements.size()]));
        List<Map> alphanumMap = paramsList.stream()
                .filter(m -> m.containsKey("typeDonnee")
                && m.get("typeDonnee").equalsIgnoreCase(TypeDonnee.ALPHANUMERIQUE.getValue())
                )
                .collect(Collectors.toList());
        List<AlphaNumeriqueField> alphaNumeriqueFields = new ArrayList<>();
        alphanumMap.stream().forEach(m -> {
            String errorCode = (String) m.get("error-code");
            String codeTypeFichier = validateur.getCodeTypeFichier();
            int taille = Integer.parseInt((String) m.get("taille"));
            int index = Integer.parseInt((String) m.get("index"));
            //Dans le validateur xml, error-code = codeTypeFichier + codeColonne
            String codeColonne = errorCode.substring(codeTypeFichier.length());
            alphaNumeriqueFields.add(new AlphaNumeriqueField(validateur, TypeDonnee.ALPHANUMERIQUE.getValue(), codeColonne, taille, index));
        });
        return alphaNumeriqueFields;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/DataType.java
New file
@@ -0,0 +1,38 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template
 */
package com.megatim.fdxconvert.enums;
import java.util.stream.Stream;
/**
 *
 * @author STEPHANIE
 */
public enum DataType {
    CSV("CSV"), XLSX("Excel-XLSX"), XLS("Excel-XLS"), TXT("Texte(TXT)"),JSON("JSON");
    private final String  dataType;
    private DataType(String dataType) {
        this.dataType = dataType;
    }
     public static DataType of(String dataType) {
        return Stream.of(DataType.values())
          .filter(p -> p.getDataType().equals(dataType))
          .findFirst()
          .orElseThrow(IllegalArgumentException::new);
    }
    public String getDataType() {
        return dataType;
    }
    @Override
    public String toString() {
        return dataType;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/JournalStatut.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template
 */
package com.megatim.fdxconvert.enums;
import java.util.HashMap;
import java.util.Map;
/**
 *
 * @author ASUS
 */
public enum JournalStatut {
    SUCCES("Succès de la validation"),
    SUCCES_GEN_TXT("Succès génération du fichier texte"),
    ECHEC_REPERTOIRE("Echec, car Répertoires non configurés"),
    ECHEC_VALIDATEUR("Echec, car Validateur non trouvé"),
    ECHEC_GEN_TXT("Echec génération du fichier texte"),
    ECHEC_MODELE_JSON("Echec de la validation, car Modèle JSON non trouvé"),
    ECHEC("Echec de la validation");
    private final String description;
    private static final Map<String, JournalStatut> BY_DESCRIPTION = new HashMap<>();
    static {
        for(JournalStatut js : values()) {
            BY_DESCRIPTION.put(js.getDescription(), js);
        }
    }
    JournalStatut(String desc) {
        description = desc;
    }
     public static JournalStatut valueOfDescription(String desc) {
        return BY_DESCRIPTION.get(desc);
    }
    public String getDescription() {
        return description;
    }
    @Override
    public String toString() {
        return this.description;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/enums/StatutConverter.java
New file
@@ -0,0 +1,38 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.enums;
import java.util.stream.Stream;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
/**
 *
 * @author ASUS
 */
@Converter(autoApply = true)
public class StatutConverter implements AttributeConverter<JournalStatut, String> {
    @Override
    public String convertToDatabaseColumn(JournalStatut js) {
        if(js == null) {
            return null;
        }
        return js.getDescription();
    }
    @Override
    public JournalStatut convertToEntityAttribute(String description) {
         if (description == null) {
            return null;
        }
        return Stream.of(JournalStatut.values())
          .filter(c -> c.getDescription().equals(description))
          .findFirst()
          .orElseThrow(IllegalArgumentException::new);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/AttributeFormatException.java
New file
@@ -0,0 +1,23 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.exceptions;
/**
 *
 * @author mela
 */
public class AttributeFormatException extends RuntimeException {
     public AttributeFormatException(String message) {
        super(message);
    }
    public AttributeFormatException(String message, Throwable cause) {
        super(message, cause);
    }
    public AttributeFormatException(Throwable cause) {
        super(cause);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/ConfigException.java
New file
@@ -0,0 +1,24 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.exceptions;
/**
 *
 * @author STEPHANIE
 */
public class ConfigException extends RuntimeException {
    public ConfigException(String message) {
        super(message);
    }
    public ConfigException(String message, Throwable cause) {
        super(message, cause);
    }
    public ConfigException(Throwable cause) {
        super(cause);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/exceptions/ValidatorException.java
New file
@@ -0,0 +1,26 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.exceptions;
/**
 *
 * @author STEPHANIE
 */
public class ValidatorException extends RuntimeException {
    public ValidatorException(String message) {
        super(message);
    }
    public ValidatorException(Throwable cause) {
        super(cause);
    }
    public ValidatorException(String message,Throwable cause) {
        super(message, cause);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/AproposEditFormController.java
New file
@@ -0,0 +1,48 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
/**
 *
 * @author STEPHANIE
 */
public class AproposEditFormController implements Initializable {
    private double x, y;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
//    @FXML
//    public void close(ActionEvent e) {
//        //Fermeture de la console
//        ((Stage) ((Node) e.getSource()).getScene().getWindow()).close();
//    }
    @FXML
    void mouseDraggedTitleBar(MouseEvent event) {
        Stage currentStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        currentStage.setX(event.getScreenX() - x);
        currentStage.setY(event.getScreenY() - y);
    }
    @FXML
    void mousePressedTitleBar(MouseEvent event) {
        //Stage currentStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        x = event.getSceneX();
        y = event.getSceneY();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ConfigEditFormController.java
New file
@@ -0,0 +1,51 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/javafx/FXMLController.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.CustomDirectoryChooser;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
/**
 * FXML Controller class
 *
 * @author mela
 */
public class ConfigEditFormController implements Initializable {
    @Champ(mappedBy = "errorDir")
    @FXML
    private CustomDirectoryChooser errorDirectoryChooser;
    @Champ(mappedBy = "validatorsDir")
    @FXML
    private CustomDirectoryChooser validatorsDirectoryChooser;
    @Champ(mappedBy = "datasDir")
    @FXML
    private CustomDirectoryChooser datasDirectoryChooser;
    @Champ(mappedBy = "outputDir")
    @FXML
    private CustomDirectoryChooser outputDirectoryChooser;
    @Champ(mappedBy = "archivesDir")
    @FXML
    private CustomDirectoryChooser archivesDirectoryChooser;
    /**
     * Initializes the controller class.
     *
     * @param url
     * @param rb
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ConversionModelEditFormController.java
New file
@@ -0,0 +1,218 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractNestedEntityTable;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomDirectoryChooser;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.controller.table.MetaAlphaNumeriqueTable;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.MetaAlphaNumeriqueFieldService;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class ConversionModelEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "delimiteurLigne", type = Delimiteur.class)
    private ComboBox<Delimiteur> delimiteurLigne;
    @FXML
    @Champ(mappedBy = "delimiteurColonne", type = Delimiteur.class)
    private ComboBox<Delimiteur> delimiteurColonne;
    @FXML
    @Champ(mappedBy = "dataType", type = DataType.class)
    private ComboBox<DataType> dataTypeComboBox;
    @FXML
    @Champ(mappedBy = "repertoireSource")
    private CustomDirectoryChooser repertoireSource;
    @FXML
    @Champ(mappedBy = "repertoireDestination")
    private CustomDirectoryChooser repertoireDestination;
    @FXML
    @Champ(mappedBy = "repertoireErreur")
    private CustomDirectoryChooser repertoireErreur;
    @FXML
    @Champ(mappedBy = "strictValidation", type = Boolean.class)
    private CheckBox strictValidationCheckbox;
    @FXML
    @Champ(mappedBy = "headerPresent", type = Boolean.class)
    private CheckBox headerPresentCheckbox;
    @FXML
    private CheckBox saisieAlphaNumeriqueFieldChecBox;
    @FXML
    @Champ(mappedBy = "libelle")
    private TextField libelleTextField;
    @FXML
    @Champ(mappedBy = "metaAlphaNumeriqueFields", type = MetaAlphaNumeriqueField.class, update = true)
    private AbstractNestedEntityTable<MetaAlphaNumeriqueField, ConversionModel> metaAlphaNumeriqueFieldAbstractTable;
    @FXML
    private TabPane tabPane;
    private final MetaAlphaNumeriqueFieldService metaAlphaNumeriqueFieldService = MetaAlphaNumeriqueFieldService.getInstance();
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
        metaAlphaNumeriqueFieldAbstractTable.setParentFieldName("configurationConversion");
        saisieAlphaNumeriqueFieldChecBox.setDisable(true);
        metaAlphaNumeriqueFieldAbstractTable.setDisable(true);
        delimiteurColonne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
        dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
        dataTypeComboBox.setItems(FXCollections.observableArrayList(
                DataType.values()
        ));
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        metaAlphaNumeriqueFieldAbstractTable.setClazz(MetaAlphaNumeriqueField.class);
        metaAlphaNumeriqueFieldAbstractTable.setColums(Arrays.asList(
                MetaAlphaNumeriqueTable.typeFichierColumn(),MetaAlphaNumeriqueTable.typeDonneeColumn(),
                MetaAlphaNumeriqueTable.codeColonneColumn(),
                MetaAlphaNumeriqueTable.tailleColonneColumn(),
                MetaAlphaNumeriqueTable.indexColonneColumn()
        ));
        metaAlphaNumeriqueFieldAbstractTable.setGenericCrudService(metaAlphaNumeriqueFieldService);
        saisieAlphaNumeriqueFieldChecBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {
                typeFichierAbstractSelectItem.setDisable(true);
                saisieAlphaNumeriqueFieldChecBox.setDisable(true);
            }
        });
        typeFichierAbstractSelectItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                saisieAlphaNumeriqueFieldChecBox.setDisable(typeFichierAbstractSelectItem == null);
            }
        });
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectItem() {
        return typeFichierAbstractSelectItem;
    }
    public CheckBox getSaisieAlphaNumeriqueFieldChecBox() {
        return saisieAlphaNumeriqueFieldChecBox;
    }
    public AbstractNestedEntityTable<MetaAlphaNumeriqueField, ConversionModel> getMetaAlphaNumeriqueFieldAbstractTable() {
        return metaAlphaNumeriqueFieldAbstractTable;
    }
    public CheckBox getStrictValidationCheckbox() {
        return strictValidationCheckbox;
    }
    public ComboBox<Delimiteur> getDelimiteurLigne() {
        return delimiteurLigne;
    }
    public ComboBox<Delimiteur> getDelimiteurColonne() {
        return delimiteurColonne;
    }
    public ComboBox<DataType> getDataTypeComboBox() {
        return dataTypeComboBox;
    }
    public CheckBox getHeaderPresentCheckbox() {
        return headerPresentCheckbox;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/DataFileToJsonFormController.java
New file
@@ -0,0 +1,136 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class DataFileToJsonFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "fileToConvertPath")
    private CustomFileChooser fileToConvertFileChooser;
    @FXML
    @Champ(mappedBy = "validateurPath")
    private CustomFileChooser validateurFileChooser;
    @FXML
    @Champ(mappedBy = "delimiteurLigne")
    private ComboBox<Delimiteur> delimiteurLigne;
    @FXML
    @Champ(mappedBy = "delimiteurColonne")
    private ComboBox<Delimiteur> delimiteurColonne;
    @FXML
    @Champ(mappedBy = "dataType")
    private ComboBox<DataType> dataTypeComboBox;
    @FXML
    @Champ(mappedBy = "headerPresent", type = Boolean.class)
    private CheckBox headerPresentCheckbox;
    private final TypeFichierService typeFichierService = TypeFichierService.getInstance();
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        delimiteurColonne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
        delimiteurColonne.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNull()
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
        );
        delimiteurLigne.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNull()
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
        );
        headerPresentCheckbox.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
        dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
        dataTypeComboBox.setItems(FXCollections.observableArrayList(
                DataType.values()
        ));
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(typeFichierService.getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/DecryptageAESEditFormController.java
New file
@@ -0,0 +1,76 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.CustomDirectoryChooser;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatim.fdxconvert.App;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
/**
 *
 * @author STEPHANIE
 */
public class DecryptageAESEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "filePath")
    private CustomFileChooser fileToDecrypt;
    @FXML
    @Champ(mappedBy = "keyToDecrypt")
    private PasswordField keyToDecryptField;
    @FXML
    @Champ(mappedBy = "keyConfirmation")
    private PasswordField keyConfirmationField;
    @FXML
    @Champ(mappedBy = "outputDir")
    private CustomDirectoryChooser outputDir;
    @FXML
    private TextField showKeyTextField;
    @FXML
    private ImageView eyeImageView;
    private boolean passwordVisible;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        keyToDecryptWithEye();
    }
    @FXML
    void eyeOnMousePressed(MouseEvent event) {
        if (passwordVisible) {
            showKeyTextField.setVisible(false);
            keyToDecryptField.setVisible(true);
            passwordVisible = false;
        } else {
            keyToDecryptField.setVisible(false);
            showKeyTextField.setVisible(true);
            passwordVisible = true;
        }
    }
    private void keyToDecryptWithEye() {
        passwordVisible = false;
        keyToDecryptField.textProperty().bindBidirectional(showKeyTextField.textProperty());
        showKeyTextField.setVisible(false);
        keyToDecryptField.setVisible(true);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/FileToValidateEditFormController.java
New file
@@ -0,0 +1,305 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractNestedEntityTable;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.controller.table.ConversionModelTable;
import com.megatim.fdxconvert.controller.table.MetaAlphaNumeriqueTable;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.dao.TypeFichierDAO;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.pojo.FileToValidate;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.ConversionModelService;
import com.megatim.fdxconvert.service.MetaAlphaNumeriqueFieldService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TabPane;
import javafx.util.Pair;
/**
 *
 * @author STEPHANIE
 */
public class FileToValidateEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    private AbstractSelectionItem<ConversionModel> conversionModelAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "delimiteurLigne")
    private ComboBox<Delimiteur> delimiteurLigne;
    @FXML
    @Champ(mappedBy = "delimiteurColonne")
    private ComboBox<Delimiteur> delimiteurColonne;
    @FXML
    @Champ(mappedBy = "dataType")
    private ComboBox<DataType> dataTypeComboBox;
    @FXML
    @Champ(mappedBy = "strictValidation", type = Boolean.class)
    private CheckBox strictValidationCheckbox;
    @FXML
    @Champ(mappedBy = "headerPresent", type = Boolean.class)
    private CheckBox headerPresentCheckbox;
    @FXML
    private CheckBox saisieAlphaNumeriqueFieldChecBox;
    @FXML
    @Champ(mappedBy = "filePath")
    private CustomFileChooser fileToValidateFileChooser;
    @FXML
    @Champ(mappedBy = "metaAlphaNumeriqueFields", type = MetaAlphaNumeriqueField.class, update = true)
    private AbstractNestedEntityTable<MetaAlphaNumeriqueField, FileToValidate> metaAlphaNumeriqueFieldAbstractTable;
    @FXML
    private TabPane tabPane;
    @FXML
    private CheckBox useExistingConversionModelCheckBox;
    private final MetaAlphaNumeriqueFieldService metaAlphaNumeriqueFieldService = MetaAlphaNumeriqueFieldService.getInstance();
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    private final Set<ConversionModel> conversionModelSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
        saisieAlphaNumeriqueFieldChecBox.setDisable(true);
        metaAlphaNumeriqueFieldAbstractTable.setDisable(true);
        delimiteurColonne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
        delimiteurColonne.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNull()
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
        );
        delimiteurLigne.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNull()
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLS))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.XLSX))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
        );
        strictValidationCheckbox.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNull()
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isNotEqualTo(DataType.TXT))
                .or(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON))
        );
        useExistingConversionModelCheckBox.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
        conversionModelAbstractSelectItem.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
        headerPresentCheckbox.disableProperty().bind(dataTypeComboBox.getSelectionModel().selectedItemProperty().isEqualTo(DataType.JSON));
        dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
        dataTypeComboBox.setItems(FXCollections.observableArrayList(
                DataType.values()
        ));
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        conversionModelAbstractSelectItem.setTitle("Choix du modèle de conversion");
        conversionModelAbstractSelectItem.setColumns(Arrays.asList(
                ConversionModelTable.libelleColumn(),
                ConversionModelTable.typeFichierColumn(), ConversionModelTable.dataTypeColumn(),
                ConversionModelTable.headerPresentColumn(), ConversionModelTable.strictValidationColumn(),
                ConversionModelTable.delimiteurLigneColumn(),
                ConversionModelTable.delimiteurColonneColumn()
        ));
        conversionModelAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("libelle", "Libellé")
        ));
        metaAlphaNumeriqueFieldAbstractTable.setClazz(MetaAlphaNumeriqueField.class);
        metaAlphaNumeriqueFieldAbstractTable.setColums(Arrays.asList(
                MetaAlphaNumeriqueTable.typeFichierColumn(),MetaAlphaNumeriqueTable.typeDonneeColumn(),
                MetaAlphaNumeriqueTable.codeColonneColumn(),
                MetaAlphaNumeriqueTable.tailleColonneColumn(),
                MetaAlphaNumeriqueTable.indexColonneColumn()
        ));
        metaAlphaNumeriqueFieldAbstractTable.setGenericCrudService(metaAlphaNumeriqueFieldService);
        saisieAlphaNumeriqueFieldChecBox.setOnAction(event -> {
            typeFichierAbstractSelectItem.setDisable(saisieAlphaNumeriqueFieldChecBox.isSelected());
        });
        saisieAlphaNumeriqueFieldChecBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {
                typeFichierAbstractSelectItem.setDisable(true);
                saisieAlphaNumeriqueFieldChecBox.setDisable(true);
            }
        });
        typeFichierAbstractSelectItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                saisieAlphaNumeriqueFieldChecBox.setDisable(typeFichierAbstractSelectItem == null);
            }
        });
        conversionModelAbstractSelectItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                dataTypeComboBox.setValue(newValue.getDataType());
                if (newValue.getCodeDelimiteurColonne()!= null) {
                    delimiteurColonne.setValue(App.DELIMITEURS_COLONNE.get(newValue.getCodeDelimiteurColonne()));
                }
                if (newValue.getCodeDelimiteurLigne()!= null) {
                    delimiteurLigne.setValue(App.DELIMITEURS_LIGNE.get(newValue.getCodeDelimiteurLigne()));
                }
                strictValidationCheckbox.setSelected(newValue.isStrictValidation());
                headerPresentCheckbox.setSelected(newValue.isHeaderPresent());
                metaAlphaNumeriqueFieldAbstractTable.setElements(newValue.getMetaAlphaNumeriqueFields());
                typeFichierAbstractSelectItem.setOldElement(newValue.getTypeFichier());
            }
        });
        conversionModelAbstractSelectItem.disableProperty().bind(useExistingConversionModelCheckBox.selectedProperty().not());
        initElements();
    }
    public ComboBox<DataType> getDataTypeComboBox() {
        return dataTypeComboBox;
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierDAO.getAllTypeFichierWithValidateur());
                typeFichierSet.addAll(TypeFichierDAO.getAllTypeFichierWithModelJson());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
        Task<Void> task1 = new Task() {
            @Override
            protected Object call() throws Exception {
                conversionModelSet.clear();
                conversionModelSet.addAll(ConversionModelService.getInstance().getAll());
                return null;
            }
        };
        task1.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task1.setOnSucceeded(e -> {
            conversionModelAbstractSelectItem.setElements(conversionModelSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task1.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task1.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread1 = new Thread(task1);
        thread1.setDaemon(true);
        thread1.start();
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectItem() {
        return typeFichierAbstractSelectItem;
    }
    public CheckBox getSaisieAlphaNumeriqueFieldChecBox() {
        return saisieAlphaNumeriqueFieldChecBox;
    }
    public void setSaisieAlphaNumeriqueFieldChecBox(CheckBox saisieAlphaNumeriqueFieldChecBox) {
        this.saisieAlphaNumeriqueFieldChecBox = saisieAlphaNumeriqueFieldChecBox;
    }
    public void setTypeFichierAbstractSelectItem(AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem) {
        this.typeFichierAbstractSelectItem = typeFichierAbstractSelectItem;
    }
    public AbstractNestedEntityTable<MetaAlphaNumeriqueField, FileToValidate> getMetaAlphaNumeriqueFieldAbstractTable() {
        return metaAlphaNumeriqueFieldAbstractTable;
    }
    public void setMetaAlphaNumeriqueFieldAbstractTable(AbstractNestedEntityTable<MetaAlphaNumeriqueField, FileToValidate> metaAlphaNumeriqueFieldAbstractTable) {
        this.metaAlphaNumeriqueFieldAbstractTable = metaAlphaNumeriqueFieldAbstractTable;
    }
    public CheckBox getStrictValidationCheckbox() {
        return strictValidationCheckbox;
    }
    public void setStrictValidationCheckbox(CheckBox strictValidationCheckbox) {
        this.strictValidationCheckbox = strictValidationCheckbox;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ImportTypeFichierEditFormController.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
/**
 *
 * @author STEPHANIE
 */
public class ImportTypeFichierEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "delimiteurLigne")
    private ComboBox<Delimiteur> delimiteurLigne;
    @FXML
    @Champ(mappedBy = "delimiteurColonne")
    private ComboBox<Delimiteur> delimiteurColonne;
    @FXML
    @Champ(mappedBy = "filePath")
    private CustomFileChooser fileToImportCustomFile;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        delimiteurColonne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/JournalEditFormController.java
New file
@@ -0,0 +1,80 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatim.fdxconvert.enums.JournalStatut;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ResourceBundle;
import java.util.function.UnaryOperator;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
/**
 *
 * @author ASUS
 */
public class JournalEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "dateAction", type = java.time.LocalDateTime.class)
    private TextField dateActionTextfield;
    @FXML
    @Champ(mappedBy = "statut", type = JournalStatut.class)
    private TextField statutActionTextfield;
    @FXML
    @Champ(mappedBy = "codeTypefichier", type = String.class)
    private TextField typefichierfichierTextfield;
    @FXML
    @Champ(mappedBy = "sourceDirectory")
    private TextField sourceDirectoryTextfield;
    @FXML
    @Champ(mappedBy = "sourceFileName")
    private TextField sourceFileNameTextfield;
    @FXML
    private TextField nombreLignesTextfield;
    @FXML
    @Champ(mappedBy = "destinationDirectory")
    private TextField destinationDirectoryTextfield;
    @FXML
    @Champ(mappedBy = "destinationFileName")
    private TextField destinationFileNameTextfield;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        UnaryOperator<TextFormatter.Change> filterDate = change -> {
            if (change.getControlNewText() != null && !change.getControlNewText().isEmpty()) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTime dateTime = LocalDateTime.parse(change.getControlNewText());
                change.setText(dateTime.format(formatter));
                return change;
            } else {
                return null;
            }
        };
        TextFormatter<String> dateFormatter = new TextFormatter<>(filterDate);
        dateActionTextfield.setTextFormatter(dateFormatter);
    }
    public TextField getNombreLignesTextfield() {
        return nombreLignesTextfield;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/MetaAlphaNumeriqueFieldEditFormController.java
New file
@@ -0,0 +1,95 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.AlphaNumeriqueFieldTable;
import com.megatim.fdxconvert.dao.AlphaNumeriqueFieldDAO;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.AlphaNumeriqueFieldService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueFieldEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "alphaNumeriqueField", type = AlphaNumeriqueField.class, update = false)
    private AbstractSelectionItem<AlphaNumeriqueField> alphaNumeriqueFieldAbstractSelectItem;
    private AlphaNumeriqueFieldService alphaNumeriqueFieldService = AlphaNumeriqueFieldService.getInstance();
    private TypeFichier typeFichier;
    private final Set<AlphaNumeriqueField> alphaNumeriqueFieldSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        alphaNumeriqueFieldAbstractSelectItem.setTitle("Choix des colonnes à tronquer");
        alphaNumeriqueFieldAbstractSelectItem.setColumns(Arrays.asList(
                AlphaNumeriqueFieldTable.codeColonneColumn(),
                AlphaNumeriqueFieldTable.tailleColumn(),
                AlphaNumeriqueFieldTable.indexColumn()
        ));
        alphaNumeriqueFieldAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("codeColonne", "Code du champ"),
                new Pair<>("taille", "Taille du champ"),
                new Pair<>("index", "Index du champ")
        ));
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                alphaNumeriqueFieldSet.clear();
                alphaNumeriqueFieldSet.addAll(AlphaNumeriqueFieldDAO.findByCodeTypeFichier(typeFichier.getCode()));
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            alphaNumeriqueFieldAbstractSelectItem.setElements(alphaNumeriqueFieldSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public TypeFichier getTypeFichier() {
        return typeFichier;
    }
    public void setTypeFichier(TypeFichier typeFichier) {
        this.typeFichier = typeFichier;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ModeleJsonEditFormController.java
New file
@@ -0,0 +1,254 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractNestedEntityTable;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.context.AbstractViewContext;
import com.megatimfx.common.enums.TypeOperation;
import com.megatim.fdxconvert.controller.MainController;
import com.megatim.fdxconvert.controller.SubObjectEditDialogController;
import com.megatim.fdxconvert.controller.table.StructureChampJsonTable;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Pair;
/**
 *
 * @author ASUS
 */
public class ModeleJsonEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "objectName", type = String.class, update = false)
    private TextField objectNameTextField;
    @FXML
    @Champ(mappedBy = "listeStructureJson", type = StructureChampJson.class, update = true)
    private AbstractNestedEntityTable<StructureChampJson, ModeleJson> structureChampAbstractTable;
    @FXML
    private Button subTypeAddButton;
    @FXML
    private Button subTypeUpdateButton;
    @FXML
    private Button subTypeDeleteButton;
    @FXML
    private TableView subObjetsTableView;
    @FXML
    private TableColumn subObjectTableColumn;
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    private ObservableList<SubObject> subObjectListe = FXCollections.observableArrayList();
    private Property<ObservableList<SubObject>> subModeleJsonListeProperty = new SimpleObjectProperty<>(subObjectListe);
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        initSubObjetsTableView();
        objectNameTextField.setText("");
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        structureChampAbstractTable.setClazz(StructureChampJson.class);
        structureChampAbstractTable.setParentFieldName("modeleJson");
        structureChampAbstractTable.setColums(Arrays.asList(
                StructureChampJsonTable.codeColumn(),
                StructureChampJsonTable.typeDonneeColumn(),
                StructureChampJsonTable.simpleOrListeColumn()
        ));
        subTypeAddButton.setOnAction(event -> {
            openSubObjectDialog(event, new SubObject(), TypeOperation.ADD);
        });
         subTypeUpdateButton.setOnMouseClicked(event -> {
            updateSubObject(event);
        });
        subObjetsTableView.setRowFactory(rf -> {
            TableRow<SubObject> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    SubObject rowData = row.getItem();
                    openSubObjectDialog(event, rowData, TypeOperation.VIEW);
                }
            });
            return row;
        });
        initElements();
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectItem() {
        return typeFichierAbstractSelectItem;
    }
    public TextField getObjectNameTextField() {
        return objectNameTextField;
    }
    public AbstractNestedEntityTable<StructureChampJson, ModeleJson> getStructureChampAbstractTable() {
        return structureChampAbstractTable;
    }
    public ObservableList<SubObject> getSubObjectListe() {
        return subObjectListe;
    }
    public Button getSubTypeAddButton() {
        return subTypeAddButton;
    }
    public Button getSubTypeUpdateButton() {
        return subTypeUpdateButton;
    }
    public Button getSubTypeDeleteButton() {
        return subTypeDeleteButton;
    }
    public TableView getSubObjetsTableView() {
        return subObjetsTableView;
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    private void initSubObjetsTableView() {
        subObjetsTableView.itemsProperty().bind(subModeleJsonListeProperty);
        subObjectTableColumn.setCellValueFactory(new PropertyValueFactory<SubObject, String>("subObjectName"));
    }
    private void openSubObjectDialog(Event event, SubObject subObject, TypeOperation typeOperation) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            SubObjectEditDialogController controller = new SubObjectEditDialogController();
            controller.setModeleJsonEditFormController(this);
            controller.setSubObjectsList(subObjectListe);
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            controller.initData(parentStage, typeOperation, subObject, null,
                    subObjectListe, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
     private void updateSubObject(Event event) {
        Object selectedItem = subObjetsTableView.getSelectionModel().getSelectedItem();
        if (selectedItem != null) {
            SubObject subObjectToBeUpdated = (SubObject) selectedItem;
            openSubObjectDialog(event, subObjectToBeUpdated, TypeOperation.UPDATE);
        }
    }
    private void setStage(Parent root) {
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/StructureChampJsonEditFormController.java
New file
@@ -0,0 +1,88 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatimfx.common.annontations.Champ;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.model.SubObject;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
/**
 *
 * @author ASUS
 */
public class StructureChampJsonEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeDonnee", type = TypeDonnee.class)
    private ComboBox<TypeDonnee> typeDonneeComboBox;
    @FXML
    @Champ(mappedBy = "typeOfSubObject", type = SubObject.class)
    private ComboBox<SubObject> typeObjetComboBox;
    @FXML
    @Champ(mappedBy = "libelle", type = String.class)
    private TextField libelleTextField;
    @FXML
    @Champ(mappedBy = "formatDate", type = String.class)
    private ComboBox<String> formatDateComboBox;
    @FXML
    @Champ(mappedBy = "liste", type = Boolean.class)
    private CheckBox listeCheckBox;
    @FXML
    @Champ(mappedBy = "delimiteurDate", type = Delimiteur.class)
    private ComboBox<Delimiteur> delimiteurDateComboBox;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        formatDateComboBox.setPromptText("Sélectionnez un élément dans la liste");
        formatDateComboBox.setItems(FXCollections.observableArrayList(
                App.FORMATS_DATE
        ));
        delimiteurDateComboBox.setDisable(true);
        formatDateComboBox.setDisable(true);
        delimiteurDateComboBox.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurDateComboBox.setItems(FXCollections.observableArrayList(
                App.SEPARATEURS_DATE.values()
        ));
        typeDonneeComboBox.setItems(FXCollections.observableArrayList(TypeDonnee.values()));
        typeDonneeComboBox.setOnAction(event -> {
            boolean isObjet = typeDonneeComboBox.getValue() != null && typeDonneeComboBox.getValue().equals(TypeDonnee.OBJET);
            typeObjetComboBox.setDisable(!isObjet);
            boolean isDate = typeDonneeComboBox.getValue() != null && typeDonneeComboBox.getValue().equals(TypeDonnee.DATE);
            formatDateComboBox.setDisable(!isDate);
            delimiteurDateComboBox.setDisable(!isDate);
        });
    }
    public TextField getLibelleTextField() {
        return libelleTextField;
    }
    public ComboBox<SubObject> getTypeObjetComboBox() {
        return typeObjetComboBox;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/SubObjectEditFormController.java
New file
@@ -0,0 +1,206 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.context.AbstractViewContext;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.enums.TypeOperation;
import com.megatim.fdxconvert.controller.MainController;
import com.megatim.fdxconvert.controller.StructureChampJsonEditDialogController;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
/**
 *
 * @author ASUS
 */
public class SubObjectEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "subObjectName")
    private TextField subObjectNameTextField;
    @FXML
    private Button addFieldButton;
    @FXML
    private Button updateFieldButton;
    @FXML
    private Button deleteFieldButton;
    @FXML
    private TableColumn<StructureChampJson, String> fieldNameTableColumn;
    @FXML
    private TableColumn<StructureChampJson, String> dataTypeTableColumn;
    @FXML
    private TableColumn<StructureChampJson, String> isListeTableColumn;
    @FXML
    private TableColumn<StructureChampJson, String> formatDateTableColumn;
    @FXML
    private TableColumn<StructureChampJson, String> separateurDateTableColumn;
    @FXML
    private TableView subObjectsFieldsTableView;
    private ObservableList<StructureChampJson> subStructureJsonListe = FXCollections.observableArrayList();
    private Property<ObservableList<StructureChampJson>> subChampListeProperty = new SimpleObjectProperty<>(subStructureJsonListe);
    private ObservableList<SubObject> currentSubObjectsListe;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        initSubObjectsFieldsTableView();
        subObjectNameTextField.setText("");
        addFieldButton.setOnMouseClicked(event -> {
            openStructureChampJsonDialog(event, new StructureChampJson(), TypeOperation.ADD);
        });
        updateFieldButton.setOnMouseClicked(event -> {
            updateStructureJson(event);
        });
        subObjectsFieldsTableView.setRowFactory(rf -> {
            TableRow<StructureChampJson> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    StructureChampJson rowData = row.getItem();
                    openStructureChampJsonDialog(event, rowData, TypeOperation.VIEW);
                }
            });
            return row;
        });
    }
    public ObservableList<StructureChampJson> getSubStructureJsonListe() {
        return subStructureJsonListe;
    }
    public void setCurrentSubObjectsListe(ObservableList<SubObject> currentSubObjectsListe) {
        this.currentSubObjectsListe = currentSubObjectsListe;
    }
    public TextField getSubObjectNameTextField() {
        return subObjectNameTextField;
    }
    public Button getAddFieldButton() {
        return addFieldButton;
    }
    public Button getUpdateFieldButton() {
        return updateFieldButton;
    }
    public Button getDeleteFieldButton() {
        return deleteFieldButton;
    }
    public TableView getSubObjectsFieldsTableView() {
        return subObjectsFieldsTableView;
    }
    private void initSubObjectsFieldsTableView() {
        subObjectsFieldsTableView.itemsProperty().bind(subChampListeProperty);
        separateurDateTableColumn.setCellValueFactory(new PropertyValueFactory("delimiteurDate"));
        formatDateTableColumn.setCellValueFactory(new PropertyValueFactory("formatDate"));
        isListeTableColumn.setCellValueFactory(c -> {
            if (c.getValue().isListe()) {
                return new SimpleStringProperty("Oui");
            } else {
                return new SimpleStringProperty("Non");
            }
        });
        dataTypeTableColumn.setCellValueFactory(new PropertyValueFactory("typeDonnee"));
        fieldNameTableColumn.setCellValueFactory(new PropertyValueFactory("libelle"));
    }
    private void updateStructureJson(Event event) {
        Object selectedItem = subObjectsFieldsTableView.getSelectionModel().getSelectedItem();
        if (selectedItem != null) {
            StructureChampJson structureToBeUpdated = (StructureChampJson) selectedItem;
            openStructureChampJsonDialog(event, structureToBeUpdated, TypeOperation.UPDATE);
        }
    }
    private void openStructureChampJsonDialog(Event event, StructureChampJson structureJson, TypeOperation typeOperation) {
        try {
            FXMLLoader loader = new FXMLLoader(
                    (AbstractViewContext.getInstance().getAbstractEditDialogControllerURL() == null)
                    ? AbstractEditDialogController.class.getResource("AbstractEditDialog.fxml")
                    : AbstractViewContext.getInstance().getAbstractEditDialogControllerURL()
            );
            StructureChampJsonEditDialogController controller = new StructureChampJsonEditDialogController();
            controller.setSubObjectEditFormController(this);
            controller.setSubObjectsList(currentSubObjectsListe);
            loader.setControllerFactory(param -> controller);
            Parent root = loader.load();
            Node source = (Node) event.getSource();
            Stage parentStage = (Stage) source.getScene().getWindow();
            controller.initData(parentStage, typeOperation, structureJson, null,
                    subStructureJsonListe, true);
            setStage(root);
        } catch (IOException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    private void setStage(Parent root) {
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TacheEditFormController.java
New file
@@ -0,0 +1,411 @@
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractNestedEntityTable;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomDirectoryChooser;
import com.megatimfx.common.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.controller.table.ConversionModelTable;
import com.megatim.fdxconvert.controller.table.MetaAlphaNumeriqueTable;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.ConversionModelService;
import com.megatim.fdxconvert.service.MetaAlphaNumeriqueFieldService;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TabPane;
import javafx.scene.control.TabPane.TabClosingPolicy;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Pair;
/**
 *
 * @author MGT_DEV3
 */
public class TacheEditFormController implements Initializable {
    @FXML
    private VBox paneContainer;
    @FXML
    private HBox sourceHBox;
    @FXML
    private HBox destinationHBox;
    @FXML
    private AbstractSelectionItem<ConversionModel> conversionModelAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "patternSuppression")
    private TextField patternSuppression;
    @FXML
    @Champ(mappedBy = "repertoireSource")
    private CustomDirectoryChooser repertoireSource;
    @FXML
    @Champ(mappedBy = "repertoireDestination")
    private CustomDirectoryChooser repertoireDestination;
    @FXML
    @Champ(mappedBy = "repertoireErreur")
    private CustomDirectoryChooser repertoireErreur;
    //OLD ELEMENTS
    @Champ(mappedBy = "libelle", type = String.class, update = false)
    @FXML
    private TextField libelleTextField;
    @FXML
    @Champ(mappedBy = "heureTache", type = Integer.class)
    private TextField heureTextField;
    @FXML
    @Champ(mappedBy = "minuteTache", type = Integer.class)
    private TextField minuteTextField;
    @Champ(mappedBy = "monday", type = Boolean.class)
    @FXML
    private CheckBox lundiCheckbox;
    @Champ(mappedBy = "tuesday", type = Boolean.class)
    @FXML
    private CheckBox mardiCheckbox;
    @Champ(mappedBy = "wednesday", type = Boolean.class)
    @FXML
    private CheckBox mercrediCheckbox;
    @Champ(mappedBy = "thursday", type = Boolean.class)
    @FXML
    private CheckBox jeudiCheckbox;
    @Champ(mappedBy = "friday", type = Boolean.class)
    @FXML
    private CheckBox vendrediCheckbox;
    @Champ(mappedBy = "saturday", type = Boolean.class)
    @FXML
    private CheckBox samediCheckbox;
    @Champ(mappedBy = "sunday", type = Boolean.class)
    @FXML
    private CheckBox dimancheCheckbox;
    @FXML
    @Champ(mappedBy = "strictValidation", type = Boolean.class)
    private CheckBox strictValidationCheckbox;
    @FXML
    private CheckBox useExistingConversionModelCheckBox;
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class)
    @FXML
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "delimiteurLigne", type = Delimiteur.class)
    private ComboBox<Delimiteur> delimiteurLigne;
    @FXML
    @Champ(mappedBy = "delimiteurColonne", type = Delimiteur.class)
    private ComboBox<Delimiteur> delimiteurColonne;
    @FXML
    @Champ(mappedBy = "withHeader", type = Boolean.class)
    private CheckBox withHeader;
    @FXML
    @Champ(mappedBy = "active", type = Boolean.class)
    private CheckBox active;
    @FXML
    @Champ(mappedBy = "dataType", type = DataType.class)
    private ComboBox<DataType> dataTypeComboBox;
    @FXML
    @Champ(mappedBy = "withoutInterval", type = Boolean.class)
    private CheckBox withoutInterval;
    @FXML
    @Champ(mappedBy = "intervalleTache", type = Integer.class)
    private TextField intervalleTache;
    @FXML
    private CheckBox saisieAlphaNumeriqueFieldChecBox;
    @FXML
    @Champ(mappedBy = "metaAlphaNumeriqueFields", type = MetaAlphaNumeriqueField.class, update = true)
    private AbstractNestedEntityTable<MetaAlphaNumeriqueField, Tache> metaAlphaNumeriqueFieldAbstractTable;
    @FXML
    private TabPane tabPane;
    private MetaAlphaNumeriqueFieldService metaAlphaNumeriqueFieldService = MetaAlphaNumeriqueFieldService.getInstance();
    private Set<TypeFichier> TypeFichierSet = new HashSet<>();
    private Set<ConversionModel> configurationConversionSet = new HashSet<>();
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
        saisieAlphaNumeriqueFieldChecBox.setDisable(true);
        withoutInterval.setOnAction(e -> {
            if (withoutInterval.isSelected()) {
                intervalleTache.setDisable(true);
            } else {
                intervalleTache.setDisable(false);
            }
        });
        intervalleTache.disableProperty().bind(withoutInterval.selectedProperty());
        intervalleTache.textProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue.matches("\\d+") || (Integer.parseInt(newValue) > 59) || (Integer.parseInt(newValue) < 0)) {
                heureTextField.setText(oldValue);
            }
        });
        heureTextField.textProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue.matches("\\d*") || (Integer.parseInt(newValue) > 23) || (Integer.parseInt(newValue) < 0)) {
                heureTextField.setText(oldValue);
            }
        });
        minuteTextField.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
            if (!newValue.matches("\\d*") || (Integer.parseInt(newValue) > 59) || (Integer.parseInt(newValue) < 0)) {
                minuteTextField.setText(oldValue);
            }
        });
        delimiteurColonne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurColonne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_COLONNE.values()
        ));
        delimiteurLigne.setPromptText("Sélectionnez un élément dans la liste");
        delimiteurLigne.setItems(FXCollections.observableArrayList(
                App.DELIMITEURS_LIGNE.values()
        ));
        dataTypeComboBox.setPromptText("Sélectionnez un élément dans la liste");
        dataTypeComboBox.setItems(FXCollections.observableArrayList(
                DataType.values()
        ));
        metaAlphaNumeriqueFieldAbstractTable.setClazz(MetaAlphaNumeriqueField.class);
        metaAlphaNumeriqueFieldAbstractTable.setParentFieldName("tache");
        metaAlphaNumeriqueFieldAbstractTable.setColums(Arrays.asList(
                MetaAlphaNumeriqueTable.codeColonneColumn(),
                MetaAlphaNumeriqueTable.tailleColonneColumn(),
                MetaAlphaNumeriqueTable.indexColonneColumn()
        ));
        metaAlphaNumeriqueFieldAbstractTable.setGenericCrudService(metaAlphaNumeriqueFieldService);
        saisieAlphaNumeriqueFieldChecBox.setOnAction(event -> {
            typeFichierAbstractSelectItem.setDisable(saisieAlphaNumeriqueFieldChecBox.isSelected());
        });
        saisieAlphaNumeriqueFieldChecBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {
                typeFichierAbstractSelectItem.setDisable(true);
                saisieAlphaNumeriqueFieldChecBox.setDisable(true);
            }
        });
        typeFichierAbstractSelectItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                saisieAlphaNumeriqueFieldChecBox.setDisable(typeFichierAbstractSelectItem == null);
            }
        });
        conversionModelAbstractSelectItem.disableProperty().bind(useExistingConversionModelCheckBox.selectedProperty().not());
        intitTypeFichiers();
        initConversionModel();
    }
    public void intitTypeFichiers() {
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier de la tâche");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn(),
                TypeFichierTable.participantColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                TypeFichierSet.clear();
                TypeFichierSet.addAll(TypeFichierService.getInstance().getAll());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            typeFichierAbstractSelectItem.setElements(TypeFichierSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public CheckBox getSaisieAlphaNumeriqueFieldChecBox() {
        return saisieAlphaNumeriqueFieldChecBox;
    }
    public AbstractSelectionItem<TypeFichier> getTypeFichierAbstractSelectItem() {
        return typeFichierAbstractSelectItem;
    }
    public AbstractNestedEntityTable<MetaAlphaNumeriqueField, Tache> getMetaAlphaNumeriqueFieldAbstractTable() {
        return metaAlphaNumeriqueFieldAbstractTable;
    }
    public CheckBox getStrictValidationCheckbox() {
        return strictValidationCheckbox;
    }
    public ComboBox<Delimiteur> getDelimiteurLigne() {
        return delimiteurLigne;
    }
    public ComboBox<Delimiteur> getDelimiteurColonne() {
        return delimiteurColonne;
    }
    public ComboBox<DataType> getDataTypeComboBox() {
        return dataTypeComboBox;
    }
    public CheckBox getUseExistingConversionModelCheckBox() {
        return useExistingConversionModelCheckBox;
    }
    public CheckBox getWithHeader() {
        return withHeader;
    }
    private void initConversionModel() {
        conversionModelAbstractSelectItem.setTitle("Choix du modèle de conversion");
        conversionModelAbstractSelectItem.setColumns(Arrays.asList(ConversionModelTable.typeFichierColumn(),
                ConversionModelTable.dataTypeColumn(), ConversionModelTable.delimiteurLigneColumn(),
                ConversionModelTable.delimiteurColonneColumn(), ConversionModelTable.repertoireSourceColumn(),
                ConversionModelTable.repertoireDestinationColumn(), ConversionModelTable.repertoireErreurColumn()
        ));
        conversionModelAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("delimiteurLigne", "Délimiteur Ligne"),
                new Pair<>("delimiteurColonne", "Délimiteur Colonne")
        ));
        conversionModelAbstractSelectItem.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                dataTypeComboBox.setValue(newValue.getDataType());
                if (newValue.getCodeDelimiteurColonne() != null) {
                    delimiteurColonne.setValue(App.DELIMITEURS_COLONNE.get(newValue.getCodeDelimiteurColonne()));
                }
                if (newValue.getCodeDelimiteurLigne() != null) {
                    delimiteurLigne.setValue(App.DELIMITEURS_LIGNE.get(newValue.getCodeDelimiteurLigne()));
                }
                strictValidationCheckbox.setSelected(newValue.isStrictValidation());
                withHeader.setSelected(newValue.isHeaderPresent());
                typeFichierAbstractSelectItem.setOldElement(newValue.getTypeFichier());
                repertoireDestination.setDirectoryLocation(newValue.getRepertoireDestination());
                repertoireErreur.setDirectoryLocation(newValue.getRepertoireErreur());
                repertoireSource.setDirectoryLocation(newValue.getRepertoireSource());
                //MetaAlalphanumériqueField provenant de la BD
                Set<MetaAlphaNumeriqueField> metasFromBd = newValue.getMetaAlphaNumeriqueFields();
                metasFromBd.stream().forEach(m -> {
                    //Création de nouveaux MetaAlalphanumériqueField avec uniquement le champ alphaNumerique
                    metaAlphaNumeriqueFieldAbstractTable.getElementObservableList().add(new MetaAlphaNumeriqueField(m.getAlphaNumeriqueField()));
                });
            }
        });
        Task<Void> task1 = new Task() {
            @Override
            protected Object call() throws Exception {
                configurationConversionSet.clear();
                configurationConversionSet.addAll(ConversionModelService.getInstance().getAll());
                return null;
            }
        };
        task1.setOnRunning(e -> com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task1.setOnSucceeded(e -> {
            conversionModelAbstractSelectItem.setElements(configurationConversionSet);
            com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
        });
        task1.setOnFailed(e -> {
            com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task1.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread1 = new Thread(task1);
        thread1.setDaemon(true);
        thread1.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TruncatedElementEditFormController.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
/**
 *
 * @author ASUS
 */
public class TruncatedElementEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "codeTypeFichier")
    private TextField codeTypeFichierTextfield;
    @FXML
    @Champ(mappedBy = "codeColonne")
    private TextField codeColonneTexfield;
    @FXML
    @Champ(mappedBy = "initialData")
    private TextArea initialDataTextArea;
    @FXML
    @Champ(mappedBy = "finalData")
    private TextArea finalDataTextArea;
    @FXML
    @Champ(mappedBy = "fileName")
    private TextField fileNameTextfield;
    @FXML
    @Champ(mappedBy = "displayDate")
    private TextField dateActionTextfield;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TxtFileToValidateEditFormController.java
New file
@@ -0,0 +1,83 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.util.Pair;
/**
 *
 * @author STEPHANIE
 */
public class TxtFileToValidateEditFormController implements Initializable{
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "txtFilePath")
    private CustomFileChooser fileToValidate;
    private final TypeFichierService typeFichierService = TypeFichierService.getInstance();
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        initElements();
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(typeFichierService.getAll());
                return null;
            }
        };
        task.setOnRunning(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show();
        });
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/TypeFichierEditFormController.java
New file
@@ -0,0 +1,43 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatim.fdxconvert.enums.DataType;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierEditFormController  implements Initializable{
    @Champ(mappedBy = "code", type = String.class)
    @FXML
    private TextField codeTextField;
    @Champ(mappedBy = "libelle")
    @FXML
    private TextField libelleTextField;
    @Champ(mappedBy = "codeParticipant")
    @FXML
    private TextField codeParticipantTextField;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
    public TextField getCodeTextField() {
        return codeTextField;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ValidateurEditFormController.java
New file
@@ -0,0 +1,147 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.annontations.Champ;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatimfx.common.customcontrols.CustomFileChooser;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.TypeFichierService;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.util.Pair;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurEditFormController implements Initializable {
    @FXML
    @Champ(mappedBy = "typeFichier", type = TypeFichier.class, update = false)
    private AbstractSelectionItem<TypeFichier> typeFichierAbstractSelectItem;
    @FXML
    @Champ(mappedBy = "filePath")
    private CustomFileChooser FileToImport;
    @FXML
    @Champ(mappedBy = "keyToDecrypt")
    private PasswordField keyToDecryptField;
    @FXML
    @Champ(mappedBy = "keyConfirmation")
    private PasswordField keyConfirmationField;
    @FXML
    private TextField showKeyTextField;
    @FXML
    private ImageView eyeImageView;
    @FXML
    @Champ(mappedBy = "protege", type = Boolean.class)
    private CheckBox protegeCheckBox;
    private boolean passwordVisible;
    private final TypeFichierService typeFichierService = TypeFichierService.getInstance();
    private final Set<TypeFichier> typeFichierSet = new HashSet<>();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        keyToDecryptWithEye();
        keyToDecryptField.setEditable(false);
        keyConfirmationField.setEditable(false);
        showKeyTextField.setEditable(false);
        protegeCheckBox.selectedProperty().bindBidirectional(keyToDecryptField.editableProperty());
        protegeCheckBox.selectedProperty().bindBidirectional(keyConfirmationField.editableProperty());
        protegeCheckBox.selectedProperty().bindBidirectional(showKeyTextField.editableProperty());
        typeFichierAbstractSelectItem.setTitle("Choix du type de fichier");
        typeFichierAbstractSelectItem.setColumns(Arrays.asList(
                TypeFichierTable.codeColumn(),
                TypeFichierTable.libelleColumn()
        ));
        typeFichierAbstractSelectItem.setSearchFieldPairs(Arrays.asList(
                new Pair<>("code", "Code"),
                new Pair<>("libelle", "Libellé")
        ));
        initElements();
    }
    @FXML
    void eyeOnMousePressed(MouseEvent event) {
        if (passwordVisible) {
            showKeyTextField.setVisible(false);
            keyToDecryptField.setVisible(true);
            passwordVisible = false;
        } else {
            keyToDecryptField.setVisible(false);
            showKeyTextField.setVisible(true);
            passwordVisible = true;
        }
    }
    private void keyToDecryptWithEye() {
        passwordVisible = false;
        keyToDecryptField.textProperty().bindBidirectional(showKeyTextField.textProperty());
        showKeyTextField.setVisible(false);
        keyToDecryptField.setVisible(true);
    }
    private void initElements() {
        Task<Void> task = new Task() {
            @Override
            protected Object call() throws Exception {
                typeFichierSet.clear();
                typeFichierSet.addAll(typeFichierService.getAllTypeFichWithoutValidateur());
                return null;
            }
        };
        task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
        task.setOnSucceeded(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            typeFichierAbstractSelectItem.setElements(typeFichierSet);
        });
        task.setOnFailed(e -> {
            LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
            AlertMessageUtil.showAlertException(task.getException(),
                    "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public PasswordField getKeyToDecryptField() {
        return keyToDecryptField;
    }
    public PasswordField getKeyConfirmationField() {
        return keyConfirmationField;
    }
    public CheckBox getProtegeCheckBox() {
        return protegeCheckBox;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/forms/ValidateurListFormController.java
New file
@@ -0,0 +1,237 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.forms;
import com.megatimfx.common.abstracts.AbstractEditDialogController;
import com.megatimfx.common.abstracts.AbstractMainDialogController;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatimfx.common.utils.ViewLoaderUtil;
import com.megatimfx.components.customdialogs.LoadinIndicatorDialogUtil;
import com.megatimfx.components.dialogs.NotificationDialog;
import com.megatimfx.components.dialogs.NotificationType;
import com.megatim.fdxconvert.controller.ValidateurEditDialogController;
import com.megatim.fdxconvert.controller.search.ValidateurSearchFormController;
import com.megatim.fdxconvert.controller.table.ValidateurTable;
import com.megatim.fdxconvert.exceptions.ConfigException;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.service.ConfigurationService;
import com.megatim.fdxconvert.service.ValidateurService;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.concurrent.Task;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.apache.commons.io.FileUtils;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurListFormController extends AbstractMainDialogController<Validateur, Validateur> {
    private ValidateurSearchFormController validateurSearchFormController;
    private double dx, dy;
    @FXML
    private Button btnPrintValidator;
    @FXML
    private Label btnPrintValidatorLabel;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        validateurSearchFormController = new ValidateurSearchFormController();
        setPrintButtonRemoved(true);
        setEditButtonRemoved(true);
        btnPrintValidator.setOnAction(e -> {
            exportValidatorFile(e);
        });
        btnPrintValidatorLabel.setOnMouseClicked(e -> {
            exportValidatorFile(e);
        });
        super.initialize(url, rb);
    }
    @Override
    public GenericCrudService<Validateur> getGenericCrudService() {
        return ValidateurService.getInstance();
    }
    @Override
    public String getTitle() {
        return "Importations des formats de validation";
    }
    @Override
    public Class<Validateur> getElementClazz() {
        return Validateur.class;
    }
    @Override
    public List<TableColumn> getElementTableColumns() {
        return Arrays.asList(ValidateurTable.typeFichierColumn(), ValidateurTable.dataConversionColumn(), ValidateurTable.dateCreationColumn(), ValidateurTable.keyLengthColumn());
    }
    @Override
    public AbstractEditDialogController<Validateur> getAbstractEditDialogController() {
        return new ValidateurEditDialogController();
    }
    @Override
    public List<SearchCriteria> getPermanentSearchCriterias() {
        List<SearchCriteria> liste = new ArrayList<>();
        return liste;
    }
    @Override
    public Object getSearchFormController() {
        return validateurSearchFormController;
    }
    @Override
    public void resetFormFields(Object searchController, Object advancedSearchController) {
        if (searchController instanceof ValidateurSearchFormController) {
            ValidateurSearchFormController controller = (ValidateurSearchFormController) searchController;
            controller.getTypeFichierAbstractSelectionItem().setOldElement(null);
        }
    }
    @Override
    public Pane getSearchFormPane() throws IOException {
        return ViewLoaderUtil.getPaneFromFxmlFile(validateurSearchFormController.getClass().getResource("ValidateurSearchForm.fxml"), validateurSearchFormController);
    }
    @FXML
    public void titleBarMousePressed(MouseEvent event) {
        Scene scene = ((Node) event.getSource()).getScene();
        Stage stage = (Stage) scene.getWindow();
        dx = stage.getX() - event.getScreenX();
        dy = stage.getY() - event.getScreenY();
    }
    @FXML
    public void titleBarMouseDragged(MouseEvent event) {
        Scene scene = ((Node) event.getSource()).getScene();
        Stage stage = (Stage) scene.getWindow();
        stage.setX(event.getScreenX() + dx);
        stage.setY(event.getScreenY() + dy);
    }
    private void exportValidatorFile(Event event) {
        Node node = (Node) event.getSource();
        Stage parentStage = (Stage) node.getScene().getWindow();
        Validateur validateur = getElementTable().getSelectionModel().getSelectedItem();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss");
        try {
            Configuration config = ConfigurationService.getInstance().getCurrentConfig();
            if (config == null) {
                throw new ConfigException("Répertoires non configurés");
            }
            if (validateur != null) {
                exportOneFile(validateur.getCodeTypeFichier(), config.getValidatorsDir(), dtf, validateur.getContent());
                NotificationDialog notificationDialog = new NotificationDialog(
                        "Succès de l'exportation, consulter le répertoire '" + config.getValidatorsDir() + "' pour voir le fichier validateur du typefichier " + validateur.getCodeTypeFichier(),
                        NotificationType.SUCCESS,
                        parentStage
                );
                notificationDialog.showNotification();
            } else {
                List<Validateur> validateurs = ValidateurService.getInstance().getAll();
                Task<Void> task = new Task<Void>() {
                    @Override
                    protected Void call() throws Exception {
                        for (Validateur v : validateurs) {
                            exportOneFile(v.getCodeTypeFichier(), config.getValidatorsDir(), dtf, v.getContent());
                        }
                        return null;
                    }
                };
                task.setOnRunning(e -> LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().show());
                task.setOnSucceeded(e -> {
                    String message = "";
                    if (validateurs.isEmpty()) {
                        message = "Aucun validateur à exporter";
                    } else {
                        message = "Tous les validateurs ont été exporté dans le répertoire " + config.getValidatorsDir();
                    }
                    LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
                    NotificationDialog notificationDialog = new NotificationDialog(
                            message, NotificationType.INFO, parentStage
                    );
                    notificationDialog.showNotification();
                });
                task.setOnFailed(e -> {
                    LoadinIndicatorDialogUtil.getLoadingIndicatorDialog().hide();
                    NotificationDialog notificationDialog = new NotificationDialog(
                            "Echec de l'exportation, une erreur est survenue ",
                            NotificationType.ERROR,
                            parentStage
                    );
                    notificationDialog.showNotification();
                });
                Thread thread1 = new Thread(task);
                thread1.setDaemon(true);
                thread1.start();
            }
        } catch (ConfigException ex) {
            NotificationDialog notificationDialog = new NotificationDialog(
                    "Echec de l'exportation, Veuillez configurer les répertoires avant d'exécuter cette opération",
                    NotificationType.WARNING,
                    parentStage
            );
            notificationDialog.showNotification();
        } catch (Exception ex) {
            NotificationDialog notificationDialog = new NotificationDialog(
                    "Echec de l'exportation, une erreur est survenue ",
                    NotificationType.ERROR,
                    parentStage
            );
            notificationDialog.showNotification();
            Logger.getLogger(ValidateurListFormController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private void exportOneFile(String codeTypeFichier, String validatorsDir, DateTimeFormatter dtf, byte[] content) throws IOException {
        File file = new File(validatorsDir, "Fdx-Validateur" + codeTypeFichier + "-" + dtf.format(LocalDateTime.now()) + ".xml");
        FileUtils.writeByteArrayToFile(file, content, false);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/AlphaNumeriqueField.java
New file
@@ -0,0 +1,102 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author ASUS
 */
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(uniqueConstraints = {
    @UniqueConstraint(name = "UniquecodeColonneAndCodeTypeFichier", columnNames = {"codeColonne", "codeTypeFichier"})})
public class AlphaNumeriqueField implements Serializable {
    @GeneratedValue
    @Id
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "codeTypeFichier")
    private Validateur validateur;
    private String codeColonne;
    private int taille;
    private int index;
    private String typeDonnee;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
    @OneToMany(mappedBy = "alphaNumeriqueField")
    private Set<MetaAlphaNumeriqueField> metaAlphaNumeriqueFields;
    public AlphaNumeriqueField(Validateur validateur, String type, String codeColonne, int taille, int index) {
        this.validateur = validateur;
        this.codeColonne = codeColonne;
        this.taille = taille;
        this.index = index;
        this.typeDonnee = type;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 31 * hash + Objects.hashCode(this.validateur.getCodeTypeFichier());
        hash = 31 * hash + Objects.hashCode(this.codeColonne);
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final AlphaNumeriqueField other = (AlphaNumeriqueField) obj;
        if (!Objects.equals(this.validateur.getCodeTypeFichier(), other.getValidateur().getCodeTypeFichier())) {
            return false;
        }
        return Objects.equals(this.codeColonne, other.codeColonne);
    }
    @Override
    public String toString() {
        return validateur.getCodeTypeFichier() + " - " + codeColonne;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Configuration.java
New file
@@ -0,0 +1,55 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.constraint.ErrorDirConstraint;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author STEPHANIE
 */
@Entity
@Getter
@Setter
@ErrorDirConstraint(groups = {ViewFormValidationGroup.class})
public class Configuration implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @NotEmpty(message="Le répertoire des erreurs est obligatoire", groups = {ViewFormValidationGroup.class})
    private String errorDir;
    @NotEmpty(message="Le répertoire d'exportation des validateurs est obligatoire", groups = {ViewFormValidationGroup.class})
    private String validatorsDir;
    @NotEmpty(message="Le répertoire des données est obligatoire", groups = {ViewFormValidationGroup.class})
    private String datasDir;
    @NotEmpty(message="Le répertoire de sortie est obligatoire", groups = {ViewFormValidationGroup.class})
    private String outputDir;
    @NotEmpty(message="Le répertoire d'archivage est obligatoire", groups = {ViewFormValidationGroup.class})
    private String archivesDir;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/ConversionModel.java
New file
@@ -0,0 +1,90 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.constraint.ConfigurationConversionDelimiterConstraint;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
/**
 *
 * @author ASUS
 */
@Entity
@Getter
@Setter
@NoArgsConstructor
@ConfigurationConversionDelimiterConstraint(groups = {ViewFormValidationGroup.class})
public class ConversionModel implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @NotEmpty(message = "Le libellé est obligatoire", groups = {ViewFormValidationGroup.class})
    private String libelle;
    @ManyToOne
    @JoinColumn(name = "typefichier_code")
    @NotNull(message = "Le typefichier est obligatoire", groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
    @Enumerated(EnumType.STRING)
    @NotNull(message = "Le format du fichier de données est obligatoire", groups = {ViewFormValidationGroup.class})
    private DataType dataType;
    @Transient
    private Delimiteur delimiteurLigne;
    @Transient
    private Delimiteur delimiteurColonne;
    private String codeDelimiteurLigne;
    private String codeDelimiteurColonne;
    private boolean headerPresent;
    private boolean strictValidation;
    private String repertoireSource;
    private String repertoireDestination;
    private String repertoireErreur;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @OneToMany(mappedBy = "configurationConversion",  fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<MetaAlphaNumeriqueField> metaAlphaNumeriqueFields = new HashSet<>();
    @Override
    public String toString() {
        return this.getTypeFichier() +" : "+ this.getDataType().toString();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Journal.java
New file
@@ -0,0 +1,58 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.fdxconvert.enums.JournalStatut;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Journal implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private LocalDateTime dateAction;
    private String sourceFileName;
    private String sourceDirectory;
    private String destinationDirectory;
    private String destinationFileName;
    @Enumerated(EnumType.STRING)
    private JournalStatut statut;
    private LocalDate localDateAction;
    private String codeTypefichier;
    private long nombreLignes;
    public Journal(LocalDateTime dateAction,JournalStatut statut, String codeTypefichier) {
        this.dateAction = dateAction;
        this.statut = statut;
        this.codeTypefichier = codeTypefichier;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/JsonStructure.java
New file
@@ -0,0 +1,82 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class JsonStructure implements Serializable {
    @Id
    @SequenceGenerator(name = "SEQ_TYPE_FICHIER_JSON", sequenceName = "SEQ_TYPE_FICHIER_JSON", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TYPE_FICHIER_JSON")
    @XmlTransient
    private Long id;
    @NotNull(message = "Le type de données est obligatoire")
    @Enumerated(EnumType.STRING)
    @XmlAttribute
    private TypeDonnee typeDonnee;
    @NotNull(message = "Le nom est obligatoire")
    @XmlAttribute
    private String name;
    @Min(value = 1, message = "La taille doit être supérieure à 0")
    @XmlAttribute
    private int lengthh;
    @XmlAttribute
    private boolean required;
    @XmlAttribute
    private boolean collection;
    @XmlAttribute
    private String formatDate;
    @Transient
    @XmlTransient
    private Delimiteur delimiteurDate;
    @XmlAttribute
    private String codeDelimiteurDate;
    @OneToOne
    @XmlTransient
    private TypeFichierJson typeFichierJson;
    @ManyToOne
    @XmlTransient
    private JsonStructure parent;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    @XmlElement(name = "jsonStructure")
    private List<JsonStructure> fields = new ArrayList<>();
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/MetaAlphaNumeriqueField.java
New file
@@ -0,0 +1,66 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.fdxconvert.pojo.FileToValidate;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author ASUS
 */
@Entity
@Getter
@Setter
@NoArgsConstructor
public class MetaAlphaNumeriqueField implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @ManyToOne
    @JoinColumn(name = "alphaNumeriqueField_id")
    private AlphaNumeriqueField alphaNumeriqueField;
    @Transient
    @ManyToOne
    private FileToValidate fileToValidate;
    @ManyToOne
    @JoinColumn(name = "tache_id")
    private Tache tache;
    @ManyToOne
    @JoinColumn(name = "configuration_conversion_id")
    private ConversionModel configurationConversion;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
    public MetaAlphaNumeriqueField(AlphaNumeriqueField field) {
        this.alphaNumeriqueField = field;
    }
    @Override
    public String toString() {
        return alphaNumeriqueField.getCodeColonne();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/ModeleJson.java
New file
@@ -0,0 +1,84 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@Entity
public class ModeleJson implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @OneToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "type_fichier_code")
//    @NotNull(message = "Le code du type de fichier est obligatoire" , groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
//     @NotEmpty(message = "Le nom de l'objet est obligatoire" , groups = {ViewFormValidationGroup.class})
    private String objectName;
    @OneToMany(mappedBy = "modeleJson", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<StructureChampJson> listeStructureJson = new HashSet<>();
    @OneToMany(mappedBy = "modeleJson", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<SubObject> subObjects  = new HashSet<>();
    private LocalDateTime dateCreation;
    public ModeleJson() {
         dateCreation = LocalDateTime.now();
    }
    @Override
    public String toString() {
        return "ModeleJson{" + "typeFichier=" + typeFichier + ", objectName=" + objectName + ", listeStructureJson=" + listeStructureJson + '}';
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 79 * hash + Objects.hashCode(this.dateCreation);
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ModeleJson other = (ModeleJson) obj;
        return Objects.equals(this.dateCreation, other.dateCreation);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/StructureChampJson.java
New file
@@ -0,0 +1,96 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@Entity
public class StructureChampJson implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String libelle;
    @NotNull(message = "Le type de données est obligatoire")
    private TypeDonnee typeDonnee;
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "field_of_subobject")
    private SubObject fieldOfSubObject; //subObject;
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "type_of_subobject")
    private SubObject typeOfSubObject;
    private boolean liste ;
    private String formatDate;
    @ManyToOne
    @JoinColumn(name = "modele_json_id")
    private ModeleJson modeleJson;
    @Transient
    private Delimiteur delimiteurDate;
    private String codeDelimiteurDate;
    private LocalDateTime dateCreation;
    public StructureChampJson() {
        dateCreation = LocalDateTime.now();
    }
    @Override
    public String toString() {
        return "StructureChampJson{" + "libellé=" + libelle + ", typeDonnee=" + typeDonnee + ", liste=" + liste + ", formatDate=" + formatDate + ", delimiteurDate=" + delimiteurDate + '}';
    }
    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final StructureChampJson other = (StructureChampJson) obj;
        return Objects.equals(this.dateCreation, other.dateCreation);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/SubObject.java
New file
@@ -0,0 +1,81 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@Entity
public class SubObject implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @NotNull(message = "Le nom de l'objet à définir est obligatoire", groups = {ViewFormValidationGroup.class})
    private String subObjectName;
    @OneToMany(mappedBy = "fieldOfSubObject", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<StructureChampJson> listeStructureJson = new HashSet<>();
    @ManyToOne(optional = false)
    @JoinColumn(name = "modele_json_id")
    private ModeleJson modeleJson;
    private LocalDateTime dateCreation;
    public SubObject() {
        dateCreation = LocalDateTime.now();
    }
    @Override
    public String toString() {
        return subObjectName;
    }
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + Objects.hashCode(this.dateCreation);
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final SubObject other = (SubObject) obj;
        return Objects.equals(this.dateCreation, other.dateCreation);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Tache.java
New file
@@ -0,0 +1,130 @@
package com.megatim.fdxconvert.model;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.constraint.DelimiterConstraint;
import com.megatim.fdxconvert.model.constraint.SchedulerConstraint;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
@Entity
@Table(name = "CONVERT_TACHE")
@Getter
@Setter
@SchedulerConstraint(groups = {ViewFormValidationGroup.class})
@DelimiterConstraint(groups = {ViewFormValidationGroup.class})
public class Tache implements Serializable {
    @Id
    @NotEmpty(message = "Le libelle est obligatoire", groups = {ViewFormValidationGroup.class})
    private String libelle;
    private boolean active;
    //PLANNICATION
    private int heureTache = 0;
    private int minuteTache = 0;
    private int intervalleTache = 0;
    private boolean withoutInterval;
    private boolean monday;
    private boolean tuesday;
    private boolean wednesday;
    private boolean thursday;
    private boolean friday;
    private boolean saturday;
    private boolean sunday;
    private int intervalleExecution;
    private boolean executeOnce;
    @NotEmpty(message = "Le repertoire source est obligatoire", groups = {ViewFormValidationGroup.class})
    private String repertoireSource;
    @NotEmpty(message = "Le repertoire de destination est obligatoire", groups = {ViewFormValidationGroup.class})
    private String repertoireDestination;
    @NotEmpty(message = "Le repertoire des erreurs est obligatoire", groups = {ViewFormValidationGroup.class})
    private String repertoireErreur;
    @ManyToOne
    @JoinColumn(name = "typefichier_code")
    @NotNull(message = "Le typefichier est obligatoire", groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
    private boolean withHeader;
    private boolean strictValidation;
    @Transient
    private Delimiteur delimiteurLigne;
    @Transient
    private Delimiteur delimiteurColonne;
    private String rowDeliminter;
    private String colDeliminter;
    @NotNull(message = "Le format de fichier de données est obligatoire", groups = {ViewFormValidationGroup.class})
    private DataType dataType;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
    @OneToMany(mappedBy = "tache", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<MetaAlphaNumeriqueField> metaAlphaNumeriqueFields = new HashSet<>();
    @Override
    public String toString() {
        return libelle;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Tache)) {
            return false;
        }
        final Tache other = (Tache) obj;
        if (this.getLibelle() != null && !this.getLibelle().equals(other.getLibelle())) {
            return false;
        }
        return true;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TruncatedElement.java
New file
@@ -0,0 +1,84 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@NoArgsConstructor
public class TruncatedElement implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String codeTypeFichier;
    private String codeColonne;
    @Column(length = 1000)
    private String initialData;
    @Column(length = 1000)
    private String finalData;
    private int tailleAttendue;
    private int tailleTrouvee;
    private String fileName;
    private int lineNumber;
    private LocalDateTime dateAction;
    private LocalDate localDateAction;
    @Transient
    private String displayDate;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
    public TruncatedElement(String codeTypeFichier, String codeColonne, String initialData, String finalData, String fileName,
            LocalDateTime dateAction,int ligne,int tailleA,int tailleT) {
        this.codeTypeFichier = codeTypeFichier;
        this.codeColonne = codeColonne;
        this.initialData = initialData;
        this.finalData = finalData;
        this.fileName = fileName;
        this.dateAction = dateAction;
        this.lineNumber = ligne;
        this.tailleAttendue = tailleA;
        this.tailleTrouvee = tailleT;
    }
    @Override
    public String toString() {
        return "TruncatedElement{" + "codeTypeFichier=" + codeTypeFichier + ", codeColonne=" + codeColonne + ", initialData=" + initialData + ", finalData=" + finalData + ", fileName=" + fileName + '}';
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TypeFichier.java
New file
@@ -0,0 +1,94 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.validation.constraints.NotEmpty;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author STEPHANIE
 */
@Entity
@Getter
@Setter
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TypeFichier implements Serializable {
    @Id
    @NotEmpty(message = "Le code du type de fichier est obligatoire", groups = {ViewFormValidationGroup.class})
    private String code;
    @NotEmpty(message = "Le libellé du type de fichier est obligatoire", groups = {ViewFormValidationGroup.class})
    @XmlTransient
    private String libelle;
    @NotEmpty(message = "Le code du participant est obligatoire", groups = {ViewFormValidationGroup.class})
    @XmlTransient
    private String codeParticipant;
    @OneToOne(mappedBy = "typeFichier", cascade = CascadeType.REMOVE)
    @XmlTransient
    private TypeFichierJson typeFichierJson;
    @CreationTimestamp
    @XmlTransient
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    @XmlTransient
    private LocalDateTime dateMiseAJour;
    @Override
    public String toString() {
        return this.getCode();
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof TypeFichier)) {
            return false;
        }
        final TypeFichier other = (TypeFichier) obj;
        if (this.getCode() != null && !this.getCode().equals(other.getCode())) {
            return false;
        }
        return true;
    }
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 73 * hash + Objects.hashCode(this.code);
        hash = 73 * hash + Objects.hashCode(this.libelle);
        return hash;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/TypeFichierJson.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 * @author ASUS
 */
@Getter
@Setter
@Entity
@NoArgsConstructor
@XmlRootElement(name = "typeFichierJson")
@XmlAccessorType(XmlAccessType.FIELD)
public class TypeFichierJson implements Serializable {
    @Id
    @SequenceGenerator(name = "SEQ_TYPE_FICHIER",
            sequenceName = "SEQ_TYPE_FICHIER",
            allocationSize = 1,
            initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TYPE_FICHIER")
    @XmlTransient
    private Long id;
    @OneToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "type_fichier_code")
    private TypeFichier typeFichier;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "json_structure_id")
    private JsonStructure jsonStructure;
    public TypeFichierJson(TypeFichier typeFichier, JsonStructure jsonStructure) {
        this.typeFichier = typeFichier;
        this.jsonStructure = jsonStructure;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/Validateur.java
New file
@@ -0,0 +1,69 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model;
import com.megatim.fdxconvert.pojo.Decryptage;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.constraint.KeyToDecryptConstraint;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Pattern.Flag;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
/**
 *
 * @author STEPHANIE
 */
@Getter
@Setter
@Entity
@KeyToDecryptConstraint(groups = {ViewFormValidationGroup.class})
@NoArgsConstructor
public class Validateur extends Decryptage implements Serializable {
    @Id
    private String codeTypeFichier;
    @Transient
    @NotNull(message = "Le type fichier est obligatoire", groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
    @NotEmpty(message = "Le validateur est obligatoire", groups = {ViewFormValidationGroup.class})
    @Transient
    @Pattern(regexp = ".+\\.zip|.+\\.xml", flags = Flag.CASE_INSENSITIVE, message = "Le fichier attendu doit être au format ZIP ou XML", groups = {ViewFormValidationGroup.class})
    private String filePath;
    @Lob
    private byte[] content;
    private boolean convertDataBeforeValidation;
    @OneToMany(mappedBy = "validateur", cascade = CascadeType.ALL)
    private List<AlphaNumeriqueField> alphaFields;
    @Transient
    private int keyLength = 128;
    @CreationTimestamp
    private LocalDateTime dateCreation;
    @UpdateTimestamp
    private LocalDateTime dateMiseAJour;
    }
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigConstraint.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/AnnotationType.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author STEPHANIE
 */
@Documented
@Constraint(validatedBy = ConfigValidator.class)
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigConstraint {
    String message() default "Validation impossible, veuillez configurer les répertoires avant d'effectuer cette action";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigValidator.java
New file
@@ -0,0 +1,28 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.pojo.FileToValidate;
import com.megatim.fdxconvert.service.ConfigurationService;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author STEPHANIE
 */
public class ConfigValidator implements  ConstraintValidator<ConfigConstraint, FileToValidate> {
    @Override
    public void initialize(ConfigConstraint cons) {
    }
    @Override
    public boolean isValid(FileToValidate val, ConstraintValidatorContext cxt) {
        Configuration config = ConfigurationService.getInstance().getCurrentConfig();
        return config != null;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigurationConversionDelimiterConstraint.java
New file
@@ -0,0 +1,30 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author ASUS
 */
@Documented
@Constraint(validatedBy = ConfigurationConversionDelimiterValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigurationConversionDelimiterConstraint {
       String message() default "Les délimiteurs de ligne et de colonne sont obligatoires";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ConfigurationConversionDelimiterValidator.java
New file
@@ -0,0 +1,31 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.model.Tache;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author ASUS
 */
public class ConfigurationConversionDelimiterValidator  implements ConstraintValidator<ConfigurationConversionDelimiterConstraint,ConversionModel> {
     @Override
    public boolean isValid(ConversionModel t, ConstraintValidatorContext cvc) {
        if (t.getDataType() != null
                && (t.getDataType().equals(DataType.CSV) || t.getDataType().equals(DataType.TXT))) {
            return t.getDelimiteurColonne()!= null && t.getDelimiteurLigne()!= null ;
        }
        return true;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DataTypeConstraint.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author STEPHANIE
 */
@Documented
@Constraint(validatedBy = DataTypeValidator.class)
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DataTypeConstraint {
    String message() default "Le fichier à valider et le type de données selectionnés ne sont pas compatibles ";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DataTypeValidator.java
New file
@@ -0,0 +1,26 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.pojo.FileToValidate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author STEPHANIE
 */
public class DataTypeValidator implements  ConstraintValidator<DataTypeConstraint, FileToValidate> {
    @Override
    public boolean isValid(FileToValidate t, ConstraintValidatorContext cvc) {
        return t.getFilePath().matches(".+\\.csv|.+\\.CSV") && t.getDataType().equals(DataType.CSV)
                || t.getFilePath().matches(".+\\.xls|.+\\.XLS") && t.getDataType().equals(DataType.XLS)
                || t.getFilePath().matches(".+\\.xlsx|.+\\.XLSX") && t.getDataType().equals(DataType.XLSX)
                || t.getFilePath().matches(".+\\.txt|.+\\.TXT") && t.getDataType().equals(DataType.TXT);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DecryptageAESConstraint.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/AnnotationType.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author STEPHANIE
 */
@Documented
@Constraint(validatedBy = DecryptageAESValidator.class)
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DecryptageAESConstraint {
    String message() default "Le répertoire de dépôt doit être différent du repertoire d'origine du fichier";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DecryptageAESValidator.java
New file
@@ -0,0 +1,24 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.pojo.DecryptageAES;
import java.io.File;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author STEPHANIE
 */
public class DecryptageAESValidator implements  ConstraintValidator<DecryptageAESConstraint,DecryptageAES>{
    @Override
    public boolean isValid(DecryptageAES t, ConstraintValidatorContext cvc) {
        String fileName = new File(t.getFilePath()).getName();
        return !t.getFilePath().equals(new File(t.getOutputDir(),fileName).getAbsolutePath());
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DelimiterConstraint.java
New file
@@ -0,0 +1,22 @@
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Documented
@Constraint(validatedBy = DelimiterValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DelimiterConstraint {
    String message() default "Les délimiteurs de ligne et de colonne sont obligatoires";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/DelimiterValidator.java
New file
@@ -0,0 +1,23 @@
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.Tache;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class DelimiterValidator implements ConstraintValidator<DelimiterConstraint, Tache> {
    @Override
    public boolean isValid(Tache t, ConstraintValidatorContext cvc) {
        if (t.getDataType() != null
                && (t.getDataType().equals(DataType.CSV) || t.getDataType().equals(DataType.TXT))) {
            return t.getDelimiteurColonne()!= null && t.getDelimiteurLigne()!= null ;
        }
        return true;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ErrorDirConstraint.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/AnnotationType.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author STEPHANIE
 */
@Documented
@Constraint(validatedBy = ErrorDirValidator.class)
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ErrorDirConstraint {
    String message() default "Les répertoires doivent être tous différents";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/ErrorDirValidator.java
New file
@@ -0,0 +1,34 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.model.Configuration;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author STEPHANIE
 */
public class ErrorDirValidator implements  ConstraintValidator<ErrorDirConstraint, Configuration> {
    @Override
    public void initialize(ErrorDirConstraint errDirCons) {
    }
    @Override
    public boolean isValid(Configuration conf, ConstraintValidatorContext cxt) {
        boolean proceed1 = !conf.getErrorDir().equals(conf.getDatasDir()) && !conf.getErrorDir().equals(conf.getValidatorsDir())
                 && !conf.getErrorDir().equals(conf.getArchivesDir()) && !conf.getErrorDir().equals(conf.getOutputDir());
        boolean proceed2 = !conf.getDatasDir().equals(conf.getValidatorsDir()) && !conf.getDatasDir().equals(conf.getArchivesDir())
                && !conf.getDatasDir().equals(conf.getOutputDir());
        boolean proceed3 = !conf.getValidatorsDir().equals(conf.getArchivesDir()) &&  !conf.getValidatorsDir().equals(conf.getOutputDir());
        boolean proceed4 = !conf.getArchivesDir().equals(conf.getOutputDir());
         return proceed1 && proceed2 && proceed3 && proceed4;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/FileToValidateDelimiterConstraint.java
New file
@@ -0,0 +1,30 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author ASUS
 */
@Documented
@Constraint(validatedBy = FileToValidateDelimiterValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FileToValidateDelimiterConstraint {
     String message() default "Les délimiteurs de ligne et de colonne sont obligatoires";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/FileToValidateDelimiterValidator.java
New file
@@ -0,0 +1,30 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.pojo.FileToValidate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author ASUS
 */
public class FileToValidateDelimiterValidator  implements ConstraintValidator<FileToValidateDelimiterConstraint, FileToValidate> {
    @Override
    public boolean isValid(FileToValidate t, ConstraintValidatorContext cvc) {
        if (t.getDataType() != null
                && (t.getDataType().equals(DataType.CSV) || t.getDataType().equals(DataType.TXT))) {
            return t.getDelimiteurColonne()!= null && t.getDelimiteurLigne()!= null ;
        }
        return true;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/KeyToDecryptConstraint.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/AnnotationType.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 *
 * @author STEPHANIE
 */
@Documented
@Constraint(validatedBy = KeyToDecryptValidator.class)
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface KeyToDecryptConstraint {
    String message() default "La clé est sa confirmation doivent être non nulles avoir la même valeur";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/KeyToDecryptValidator.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.pojo.Decryptage;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 *
 * @author STEPHANIE
 */
public class KeyToDecryptValidator implements  ConstraintValidator<KeyToDecryptConstraint, Decryptage>{
    @Override
    public boolean isValid(Decryptage t, ConstraintValidatorContext cvc) {
        System.out.println("Protege = "+t.isProtege());
        if(t.isProtege())
            return t.getKeyToDecrypt()!= null && !t.getKeyToDecrypt().isEmpty() &&
                    t.getKeyToDecrypt().equals(t.getKeyConfirmation());
        else return true;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/SChedulerValidator.java
New file
@@ -0,0 +1,16 @@
package com.megatim.fdxconvert.model.constraint;
import com.megatim.fdxconvert.model.Tache;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class SChedulerValidator implements ConstraintValidator<SchedulerConstraint, Tache> {
    @Override
    public boolean isValid(Tache t, ConstraintValidatorContext cvc) {
        return t.isMonday() || t.isTuesday()
                || t.isWednesday() || t.isThursday()
                || t.isFriday() || t.isSaturday() || t.isSunday();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/constraint/SchedulerConstraint.java
New file
@@ -0,0 +1,22 @@
package com.megatim.fdxconvert.model.constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Documented
@Constraint(validatedBy = SChedulerValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SchedulerConstraint {
    String message() default "Vous devez sélectionné au moins un jour de la semaine";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Assertion.java
New file
@@ -0,0 +1,63 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
/**
 *
 * @author ASUS
 */
//@XmlRootElement(name = "assertion")
public class Assertion {
    private String assertName;
    private String errorCode;
    private boolean activate;
    private List<ParamValue> paramValues = new ArrayList<>();
    @XmlAttribute(name = "assert-name")
    public String getAssertName() {
        return assertName;
    }
    public void setAssertName(String assertName) {
        this.assertName = assertName;
    }
    @XmlAttribute(name = "error-code")
    public String getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
    @XmlAttribute
    public boolean isActivate() {
        return activate;
    }
    public void setActivate(boolean activate) {
        this.activate = activate;
    }
    @XmlElement(name = "param-value")
    public List<ParamValue> getParamValues() {
        return paramValues;
    }
    public void setParamValues(List<ParamValue> paramValues) {
        this.paramValues = paramValues;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Entity.java
New file
@@ -0,0 +1,62 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
/**
 *
 * @author ASUS
 */
public class Entity {
    private String name;
    private String errorReportField;
    private boolean activate;
    private List<Validation> validations = new ArrayList<>();
    @XmlAttribute
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlAttribute(name = "error-report-field")
    public String getErrorReportField() {
        return errorReportField;
    }
    public void setErrorReportField(String errorReportField) {
        this.errorReportField = errorReportField;
    }
    @XmlAttribute
    public boolean isActivate() {
        return activate;
    }
    public void setActivate(boolean activate) {
        this.activate = activate;
    }
    @XmlElement(name = "validation")
    public List<Validation> getValidations() {
        return validations;
    }
    public void setValidations(List<Validation> validations) {
        this.validations = validations;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/EntityList.java
New file
@@ -0,0 +1,29 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
/**
 *
 * @author ASUS
 */
//@XmlRootElement(name = "entities")
public class EntityList {
    @XmlElement(name = "entity")
    private List<Entity> entityList = new ArrayList<>();
    public List<Entity> getEntities() {
        return entityList;
    }
    public void setEntities(List<Entity> entities) {
        this.entityList = entities;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/ParamValue.java
New file
@@ -0,0 +1,49 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import javax.xml.bind.annotation.XmlAttribute;
/**
 *
 * @author ASUS
 */
//@XmlRootElement(name = "param-value")
public class ParamValue {
    private String name;
    private String value;
    private String field;
    @XmlAttribute
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlAttribute
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    @XmlAttribute
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/PredicateConfig.java
New file
@@ -0,0 +1,62 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
 *
 * @author ASUS
 */
@XmlRootElement(name = "predicate-config")
public class PredicateConfig {
    private String xmlnsXsi;
    private String xsiSchemaLocation;
    private String xmlns;
    private EntityList entityList;
    @XmlAttribute(name = "xmlns:xsi")
    public String getXmlnsXsi() {
        return xmlnsXsi;
    }
    public void setXmlnsXsi(String xmlnsXsi) {
        this.xmlnsXsi = xmlnsXsi;
    }
    @XmlAttribute(name = "xsi:schemaLocation")
    public String getXsiSchemaLocation() {
        return xsiSchemaLocation;
    }
    public void setXsiSchemaLocation(String xsiSchemaLocation) {
        this.xsiSchemaLocation = xsiSchemaLocation;
    }
    @XmlAttribute(name = "xmlns")
    public String getXmlns() {
        return xmlns;
    }
    public void setXmlns(String xmlns) {
        this.xmlns = xmlns;
    }
    @XmlElement(name = "entities")
    public EntityList getEntityList() {
        return entityList;
    }
    public void setEntityList(EntityList entityList) {
        this.entityList = entityList;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/TypeFichierJsonsList.java
New file
@@ -0,0 +1,35 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import com.megatim.fdxconvert.model.TypeFichierJson;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Setter
@Getter
public class TypeFichierJsonsList {
    private List<TypeFichierJson> typeFichierJson = new ArrayList<>();
    public TypeFichierJsonsList() {
    }
    public TypeFichierJsonsList(List<TypeFichierJson> typeFichierJson) {
        this.typeFichierJson = typeFichierJson;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/model/jaxb/Validation.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.model.jaxb;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
/**
 *
 * @author ASUS
 */
//@XmlRootElement(name = "validation")
public class Validation {
    private String fieldName;
    private boolean activate;
    private Assertion assertion;
    @XmlAttribute(name = "field-name")
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    @XmlAttribute
    public boolean isActivate() {
        return activate;
    }
    public void setActivate(boolean activate) {
        this.activate = activate;
    }
    @XmlElement
    public Assertion getAssertion() {
        return assertion;
    }
    public void setAssertion(Assertion assertion) {
        this.assertion = assertion;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ColumnDefinition.java
New file
@@ -0,0 +1,28 @@
package com.megatim.fdxconvert.pojo;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
public class ColumnDefinition {
    private String name;
    private String typeDonnee;
    private int taille;
    private int taillePartieDecimale;
    private String formatDate;
    private String separateurDate;
    private int position;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DataFileToJson.java
New file
@@ -0,0 +1,45 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.TypeFichier;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Pattern.Flag;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
public class DataFileToJson {
    @NotEmpty(message = "Le fichier à convertir est obligatoire", groups = {ViewFormValidationGroup.class})
    private String fileToConvertPath;
//    @NotEmpty(message = "Le validateur XML est obligatoire", groups = {ViewFormValidationGroup.class})
//    @Pattern(regexp = ".+\\.xml", flags = Flag.CASE_INSENSITIVE, message = "Bien vouloir sélectionner un fichier xml", groups = {ViewFormValidationGroup.class})
    private String validateurPath;
    private byte[] validateurBytes;
    private Delimiteur delimiteurLigne;
    private Delimiteur delimiteurColonne;
    @NotNull(message = "Le format du fichier de données est obligatoire", groups = {ViewFormValidationGroup.class})
    private DataType dataType;
    private boolean headerPresent;
    @NotNull(message = "Le typefichier ets obligatoire")
    private TypeFichier typeFichier;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DataToImport.java
New file
@@ -0,0 +1,37 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import java.io.File;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 *
 * @author mela
 * @param <T>
 */
@Getter @Setter
@NoArgsConstructor @AllArgsConstructor
public class DataToImport<T> {
    //Fichier duquel seront extraits les données
    File file;
    //délimiteur de ligne
    String rowDelimiter;
    //délimiteur de colonne
    String columnDelimiter;
    //type des objets qui vont contenir les données extraites
    Class<T> type;
    //liste des champs dans leur ordre d'apparition dans le fichier "file"
    List<String> fields;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/Decryptage.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter @Setter
@MappedSuperclass
public class Decryptage {
    @Transient
    protected String keyToDecrypt;
    @Transient
    protected String keyConfirmation;
    @Transient
    protected boolean protege;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/DecryptageAES.java
New file
@@ -0,0 +1,36 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.constraint.DecryptageAESConstraint;
import com.megatim.fdxconvert.model.constraint.KeyToDecryptConstraint;
import javax.persistence.Transient;
import javax.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter @Setter
@DecryptageAESConstraint(groups = {ViewFormValidationGroup.class})
public class DecryptageAES {
    @Transient
    private String keyToDecrypt;
    @Transient
    private String keyConfirmation;
    @NotEmpty(message= "Le fichier à décrypter est obligatoire", groups = {ViewFormValidationGroup.class})
    private String filePath;
    @NotEmpty(message= "Le repertoire de dépôt est obligatoire", groups = {ViewFormValidationGroup.class})
    private String outputDir;
    private int keyLength = 128;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/Delimiteur.java
New file
@@ -0,0 +1,28 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter
@Setter
@AllArgsConstructor
public class Delimiteur {
    private String code;
    private String libelle;
    @Override
    public String toString() {
        return this.getLibelle();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/FileToValidate.java
New file
@@ -0,0 +1,58 @@
package com.megatim.fdxconvert.pojo;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.constraint.ConfigConstraint;
import com.megatim.fdxconvert.enums.DataType;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.constraint.FileToValidateDelimiterConstraint;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter
@Setter
@ConfigConstraint(groups = {ViewFormValidationGroup.class})
@FileToValidateDelimiterConstraint(groups = {ViewFormValidationGroup.class})
public class FileToValidate {
    @NotEmpty(message = "Le fichier à valider est obligatoire", groups = {ViewFormValidationGroup.class})
    //@Pattern(regexp="(.+\\.csv)|(.+\\.xlsx)|(.+\\.xls|.+\\.txt)", flags = Flag.CASE_INSENSITIVE, message="Bien vouloir sélectionner un fichier csv, xlsx, xls ou txt" , groups = {ViewFormValidationGroup.class})
    private String filePath;
    @NotNull(message = "Le typefichier est obligatoire", groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
    private Delimiteur delimiteurLigne;
    private Delimiteur delimiteurColonne;
    private String txtFilePath;
    private String errorFilePath;
    @NotNull(message = "Le format du fichier de données est obligatoire", groups = {ViewFormValidationGroup.class})
    private DataType dataType;
    private boolean headerPresent;
    private boolean strictValidation;
    @OneToMany(mappedBy = "fileTovalidate", cascade = CascadeType.ALL)
    private Set<MetaAlphaNumeriqueField> metaAlphaNumeriqueFields = new HashSet<>();
    @Override
    public String toString() {
        return filePath+":"+typeFichier.getCode()+":"+dataType.getDataType();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/FileToValidateDescription.java
New file
@@ -0,0 +1,33 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import java.io.File;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 * Classe qui sert à importer les données des fichiers à transférer
 *
 * @author STEPHANIE
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class FileToValidateDescription {
    //Fichier duquel seront extraits les données
    File file;
    //délimiteur de ligne
    String rowDelimiter;
    //délimiteur de colonne
    String columnDelimiter;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ImportFile.java
New file
@@ -0,0 +1,43 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.TypeFichier;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter @Setter
public class ImportFile<T> {
    @NotEmpty(message = "Le fichier à importer est obligatoire" , groups = {ViewFormValidationGroup.class})
    @Pattern(regexp=".+\\.csv", flags = Pattern.Flag.CASE_INSENSITIVE, message="Bien vouloir sélectionner un fichier csv" , groups = {ViewFormValidationGroup.class})
    private String filePath;
//    @NotEmpty(message = "Le format du fichier est obligatoire" , groups = {ViewFormValidationGroup.class})
//    private String formatFichier;
    @NotNull(message = "Le délimiteur de ligne est obligatoire" , groups = {ViewFormValidationGroup.class})
    private Delimiteur delimiteurLigne;
    @NotNull(message = "Le délimiteur de colonne est obligatoire" , groups = {ViewFormValidationGroup.class})
    private Delimiteur delimiteurColonne;
    //type des objets qui vont contenir les données extraites
    Class<T> type;
    //Typefichier du fichier à importer
    private TypeFichier typeFichier;
    //Chemin vers le repertoire où sera crée le fichier txt
    private String outputDirPath;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/ResultFileParsing.java
New file
@@ -0,0 +1,21 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 *
 * @author ASUS
 */
@Getter
@Setter
@NoArgsConstructor
public class ResultFileParsing {
    private String[] finalColumnsTableLine;
    private boolean columnTruncated;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/pojo/TxtFileToValidate.java
New file
@@ -0,0 +1,27 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.pojo;
import com.megatimfx.common.validationgroups.ViewFormValidationGroup;
import com.megatim.fdxconvert.model.TypeFichier;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
 *
 * @author STEPHANIE
 */
@Getter @Setter
public class TxtFileToValidate {
    @NotEmpty(message = "Le fichier à valider est obligatoire" , groups = {ViewFormValidationGroup.class})
    private String txtFilePath;
    //Type du fichier à valider
    @NotNull(message = "Le typefichier est obligatoire" , groups = {ViewFormValidationGroup.class})
    private TypeFichier typeFichier;
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/AlphaNumeriqueFieldService.java
New file
@@ -0,0 +1,53 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class AlphaNumeriqueFieldService implements GenericCrudService<AlphaNumeriqueField> {
    private static AlphaNumeriqueFieldService alphaNumeriqueFieldService;
    private static AbstractDAO<AlphaNumeriqueField> dao;
    private AlphaNumeriqueFieldService() {
    }
     public static synchronized AlphaNumeriqueFieldService getInstance() {
        if (alphaNumeriqueFieldService == null) {
            alphaNumeriqueFieldService = new AlphaNumeriqueFieldService();
            dao = new AbstractDAO<>(AlphaNumeriqueField.class);
        }
        return alphaNumeriqueFieldService;
    }
    @Override
    public AlphaNumeriqueField add(AlphaNumeriqueField t) throws Exception {
        return dao.add(t);
    }
    @Override
    public AlphaNumeriqueField edit(AlphaNumeriqueField t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<AlphaNumeriqueField> getAll() throws Exception {
        return dao.getAll("AlphaNumeriqueField");
    }
    @Override
    public void delete(AlphaNumeriqueField t) throws Exception {
        dao.delete(t);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ConfigurationService.java
New file
@@ -0,0 +1,63 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.Configuration;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author mela
 */
public class ConfigurationService implements GenericCrudService<Configuration> {
    private static ConfigurationService configurationService;
    private static AbstractDAO<Configuration> dao;
    private ConfigurationService() {
    }
    public static synchronized ConfigurationService getInstance() {
        if (configurationService == null) {
            configurationService = new ConfigurationService();
            dao = new AbstractDAO<>(Configuration.class);
        }
        return configurationService;
    }
    @Override
    public Configuration add(Configuration t) throws Exception {
        return dao.add(t);
    }
    @Override
    public Configuration edit(Configuration t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<Configuration> getAll() throws Exception {
        return dao.getAll("Configuration");
    }
    @Override
    public void delete(Configuration t) throws Exception {
        dao.delete(t);
    }
    public Configuration getCurrentConfig(){
        try {
            return getAll().stream().findFirst().orElse(null);
        } catch (Exception ex) {
            Logger.getLogger(ConfigurationService.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ConversionModelService.java
New file
@@ -0,0 +1,96 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.ConversionModel;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class ConversionModelService implements GenericCrudService<ConversionModel> {
    private static ConversionModelService conversionModelService;
    private static AbstractDAO<ConversionModel> dao;
    private PaginationElts<ConversionModel> pagination;
    private ConversionModelService() {
    }
    public static synchronized ConversionModelService getInstance() {
        if (conversionModelService == null) {
            conversionModelService = new ConversionModelService();
            dao = new AbstractDAO<>(ConversionModel.class);
        }
        return conversionModelService;
    }
    @Override
    public ConversionModel add(ConversionModel t) throws Exception {
        return dao.add(t);
    }
    @Override
    public ConversionModel edit(ConversionModel t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<ConversionModel> getAll() throws Exception {
        return dao.getAll("ConversionModel");
    }
    @Override
    public void delete(ConversionModel t) throws Exception {
        dao.delete(t);
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<ConversionModel> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
         pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
    public  AbstractDAO<ConversionModel> getDao() {
        return dao;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/DecryptageAESService.java
New file
@@ -0,0 +1,50 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.pojo.DecryptageAES;
import java.util.List;
/**
 *
 * @author STEPHANIE
 */
public class DecryptageAESService  implements GenericCrudService<DecryptageAES>{
    private static DecryptageAESService decryptageAESService;
    private DecryptageAESService() {
    }
    public static synchronized DecryptageAESService getInstance() {
        if (decryptageAESService == null) {
            decryptageAESService = new DecryptageAESService();
        }
        return decryptageAESService;
    }
    @Override
    public DecryptageAES add(DecryptageAES t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public DecryptageAES edit(DecryptageAES t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public List<DecryptageAES> getAll() throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public void delete(DecryptageAES t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ImportFileService.java
New file
@@ -0,0 +1,88 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.dao.TypeFichierDAO;
import com.megatim.fdxconvert.pojo.ImportFile;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.pojo.DataToImport;
import com.megatim.fdxconvert.util.ImportData;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
 * structLigne : id, code,format_date, position, taille, type_donnee,
 * validateur_fichier_id ValidateurFichier : id, nombre_position,
 * type_fichier_code
 *
 * @author STEPHANIE
 */
public class ImportFileService implements GenericCrudService<ImportFile> {
    private static ImportFileService importFileService;
    private PaginationElts<TypeFichier> pagination;
    private ImportFileService() {
    }
    public static synchronized ImportFileService getInstance() {
        if (importFileService == null) {
            importFileService = new ImportFileService();
        }
        return importFileService;
    }
    @Override
    public ImportFile add(ImportFile t) throws Exception {
        importDataFromFile(t);
        return t;
    }
    @Override
    public ImportFile edit(ImportFile t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public List<ImportFile> getAll() throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public void delete(ImportFile t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    private void importDataFromFile(ImportFile im) throws Exception{
        List<String> fields = new ArrayList<>();
        if (im != null && im.getType() != null) {
            if (im.getType().equals(TypeFichier.class)) {
                fields.add("code");
                fields.add("libelle");
                fields.add("codeParticipant");
            }
        }
        DataToImport datIm = new DataToImport(new File(im.getFilePath()), im.getDelimiteurLigne().getCode(), im.getDelimiteurColonne().getCode(), im.getType(), fields);
        List<Object> datas = ImportData.importDataFromCsvFile(datIm);
        if (im.getType().equals(TypeFichier.class)) {
            AbstractDAO<TypeFichier> dao = new AbstractDAO<>(TypeFichier.class);
            datas.forEach(d -> {
                TypeFichier t = (TypeFichier) d;
                Optional<TypeFichier> opt = TypeFichierDAO.findByCode(t);
                if(!opt.isPresent())
                     dao.add(t);
            });
        }
    }
}
//{}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/JournalService.java
New file
@@ -0,0 +1,97 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.Journal;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class JournalService implements GenericCrudService<Journal> {
    private static JournalService journalService;
    private static AbstractDAO<Journal> dao;
    private PaginationElts<Journal> pagination;
    private JournalService() {
    }
    public static synchronized JournalService getInstance() {
        if (journalService == null) {
            journalService = new JournalService();
            dao = new AbstractDAO<>(Journal.class);
        }
        return journalService;
    }
     @Override
    public Journal add(Journal t) throws Exception {
        if(t.getDateAction() != null) {
            t.setLocalDateAction(t.getDateAction().toLocalDate());
        }
        return dao.add(t);
    }
    @Override
    public Journal edit(Journal t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<Journal> getAll() throws Exception {
        return dao.getAll("Journal");
    }
    @Override
    public void delete(Journal t) throws Exception {
        dao.delete(t);
    }
     //PAGINATION BLOCK
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<Journal> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/JsonStructureService.java
New file
@@ -0,0 +1,95 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class JsonStructureService implements GenericCrudService<JsonStructure> {
    private static JsonStructureService jsonStructureService;
    private static AbstractDAO<JsonStructure> dao;
    private PaginationElts<JsonStructure> pagination;
    private JsonStructureService() {
    }
    public static synchronized JsonStructureService getInstance() {
        if (jsonStructureService == null) {
            jsonStructureService = new JsonStructureService();
            dao = new AbstractDAO<>(JsonStructure.class);
        }
        return jsonStructureService;
    }
    @Override
    public JsonStructure add(JsonStructure t) throws Exception {
        return dao.add(t);
    }
    @Override
    public JsonStructure edit(JsonStructure t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<JsonStructure> getAll() throws Exception {
        return dao.getAll("JsonStructure");
    }
    @Override
    public void delete(JsonStructure t) throws Exception {
        dao.delete(t);
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<JsonStructure> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
    public AbstractDAO<JsonStructure> getDao() {
        return dao;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/MetaAlphaNumeriqueFieldService.java
New file
@@ -0,0 +1,52 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class MetaAlphaNumeriqueFieldService implements GenericCrudService<MetaAlphaNumeriqueField>{
    private static MetaAlphaNumeriqueFieldService metaAlphaNumeriqueFieldService;
    private static AbstractDAO<MetaAlphaNumeriqueField> dao;
    private MetaAlphaNumeriqueFieldService() {
    }
    public static synchronized MetaAlphaNumeriqueFieldService getInstance() {
        if (metaAlphaNumeriqueFieldService == null) {
            metaAlphaNumeriqueFieldService = new MetaAlphaNumeriqueFieldService();
            dao = new AbstractDAO<>(MetaAlphaNumeriqueField.class);
        }
        return metaAlphaNumeriqueFieldService;
    }
     @Override
    public MetaAlphaNumeriqueField add(MetaAlphaNumeriqueField t) throws Exception {
        return dao.add(t);
    }
    @Override
    public MetaAlphaNumeriqueField edit(MetaAlphaNumeriqueField t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<MetaAlphaNumeriqueField> getAll() throws Exception {
        return dao.getAll("MetaAlphaNumeriqueField");
    }
    @Override
    public void delete(MetaAlphaNumeriqueField t) throws Exception {
        dao.delete(t);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ModeleJsonService.java
New file
@@ -0,0 +1,96 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class ModeleJsonService implements GenericCrudService<ModeleJson> {
    private static ModeleJsonService modeleJsonService;
    private static AbstractDAO<ModeleJson> dao;
    private PaginationElts<ModeleJson> pagination;
    private ModeleJsonService() {
    }
    public static synchronized ModeleJsonService getInstance() {
        if (modeleJsonService == null) {
            modeleJsonService = new ModeleJsonService();
            dao = new AbstractDAO<>(ModeleJson.class);
        }
        return modeleJsonService;
    }
    @Override
    public ModeleJson add(ModeleJson t) throws Exception {
        return dao.add(t);
    }
    @Override
    public ModeleJson edit(ModeleJson t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<ModeleJson> getAll() throws Exception {
        return dao.getAll("ModeleJson");
    }
    @Override
    public void delete(ModeleJson t) throws Exception {
        dao.delete(t);
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<ModeleJson> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
         pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
    public  AbstractDAO<ModeleJson> getDao() {
        return dao;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/StructureChampJsonService.java
New file
@@ -0,0 +1,51 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.StructureChampJson;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class StructureChampJsonService implements GenericCrudService<StructureChampJson> {
    private static StructureChampJsonService structureChampJsonService;
    private static AbstractDAO<StructureChampJson> dao;
    public static synchronized StructureChampJsonService getInstance() {
        if(structureChampJsonService == null) {
            structureChampJsonService = new StructureChampJsonService();
            dao = new AbstractDAO<>(StructureChampJson.class);
        }
        return structureChampJsonService;
    }
    @Override
    public StructureChampJson add(StructureChampJson t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public StructureChampJson edit(StructureChampJson t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public List<StructureChampJson> getAll() throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public void delete(StructureChampJson t) throws Exception {
        dao.delete(t);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/SubObjectService.java
New file
@@ -0,0 +1,51 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.SubObject;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class SubObjectService implements GenericCrudService<SubObject> {
    private static SubObjectService subObjectService;
    private static AbstractDAO<SubObject> dao;
    public static synchronized SubObjectService getInstance() {
        if(subObjectService == null) {
            subObjectService = new SubObjectService();
             dao = new AbstractDAO<>(SubObject.class);
        }
        return subObjectService;
    }
    @Override
    public SubObject add(SubObject t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public SubObject edit(SubObject t) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public List<SubObject> getAll() throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }
    @Override
    public void delete(SubObject t) throws Exception {
        dao.delete(t);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheJob.java
New file
@@ -0,0 +1,281 @@
package com.megatim.fdxconvert.service;
import com.megatim.typefichier.validator.Validator;
import com.megatim.typefichier.validator.model.ConfigJsonValidator;
import com.megatim.typefichier.validator.model.ConfigStreamValidator;
import static com.megatim.typefichier.validator.utilities.Utilities.getCharset;
import com.megatim.fdxconvert.controller.FileToValidateEditDialogController;
import com.megatim.fdxconvert.dao.TypeFichierJsonDAO;
import com.megatim.fdxconvert.dao.ValidateurDAO;
import com.megatim.fdxconvert.enums.DataType;
import static com.megatim.fdxconvert.enums.DataType.CSV;
import static com.megatim.fdxconvert.enums.DataType.TXT;
import static com.megatim.fdxconvert.enums.DataType.XLS;
import static com.megatim.fdxconvert.enums.DataType.XLSX;
import com.megatim.fdxconvert.enums.JournalStatut;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.Configuration;
import com.megatim.fdxconvert.model.Journal;
import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.util.ImportData;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import com.megatim.fdxconvert.util.TypeFichierJsonConverter;
import com.megatim.fdxconvert.util.Utilities;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
 *
 * @author MGT_DEV3
 */
public class TacheJob implements Job  {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        Tache tache = TacheService.getInstance().findByTacheId(dataMap.getString("tacheId"));
        //On peut concrètement exploitater la tâche ici !!
        File sourceDirectory = new File(tache.getRepertoireSource());
        if (sourceDirectory.exists() && sourceDirectory.isDirectory()) {
            Configuration config = ConfigurationService.getInstance().getCurrentConfig();
            for (File file : sourceDirectory.listFiles()) {
                if (file.isFile()) {
                    try {
                        if (tache.getDataType().equals(DataType.JSON)) {
                            validateJsonFile(tache, file, config);
                        } else {
                            //On converti le fichier à valider en fichier
                            generateAndParseTxtFile(tache, file, config);
                        }
                    } catch (Exception ex) {
                        Logger.getLogger(TacheJob.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
                    }
                }
            }
        }
    }
    private void generateAndParseTxtFile(Tache tache, File fileToValidate, Configuration config) throws Exception {
        Charset charset = getCharset(fileToValidate);
        long lignes = numberOfLines(fileToValidate, charset);
        if (config == null) {
            saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), fileToValidate.getParent());
            return;
        }
        Optional<Validateur> validateur = ValidateurDAO.findByCodeTypeFichier(tache.getTypeFichier().getCode());
        if (!validateur.isPresent()) {
            saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.ECHEC_VALIDATEUR, tache.getTypeFichier().getCode(), fileToValidate.getParent());
            return;
        }
        String fileName = tache.getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + generateTierce() + ".txt";
        File outputFile = new File(config.getDatasDir(), fileName);
        if (!outputFile.exists()) {
            //Creation du fichier
            outputFile.createNewFile();
        }
        FileToValidateDescription raw;
        Set<MetaAlphaNumeriqueField> metaAlphaFields = tache.getMetaAlphaNumeriqueFields();
        Set<AlphaNumeriqueField> alphaFields = new HashSet<>();
        metaAlphaFields.stream().forEach(m -> {
            alphaFields.add(m.getAlphaNumeriqueField());
        });
        switch (tache.getDataType()) {
            case TXT:
                raw = new FileToValidateDescription(fileToValidate, tache.getRowDeliminter(), tache.getColDeliminter());
                if (tache.isStrictValidation()) {
                    ImportData.parseFileByFieldLength(raw, validateur.get(), outputFile, tache.isWithHeader());
                } else {
                    ImportData.parseFileCharacterByCharacter(raw, validateur.get(), outputFile, tache.isWithHeader(), alphaFields);
                }
                break;
            case CSV:
                raw = new FileToValidateDescription(fileToValidate, tache.getRowDeliminter(), tache.getColDeliminter());
                ImportData.parseCsvFile(raw, validateur.get(), outputFile, tache.isWithHeader(), alphaFields);
                break;
            case XLS:
                ImportData.parseXlsFile(fileToValidate.getAbsolutePath(), tache.isWithHeader(), outputFile, validateur.get(), alphaFields);
                break;
            case XLSX:
                ImportData.parseXlsxFile(fileToValidate.getAbsolutePath(), tache.isWithHeader(), outputFile, validateur.get(), alphaFields);
                break;
            default:
                break;
        }
        saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.SUCCES_GEN_TXT, tache.getTypeFichier().getCode(), fileToValidate.getParent());
        validate(tache, outputFile, fileToValidate, config);
    }
    private void validateJsonFile(Tache tache, File fileToValidate, Configuration config) throws Exception {
        Path errorPath = Paths.get(tache.getRepertoireErreur(),
                tache.getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + generateTierce() + "_JSON.txt");
        Charset charset = getCharset(fileToValidate);
        int lignes = numberOfLines(fileToValidate, charset);
        if (config == null) {
            saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), fileToValidate.getParent());
            return;
        }
        TypeFichierJson typefichierJson = TypeFichierJsonDAO.getByTypeFichier(tache.getTypeFichier().getCode());
        if (typefichierJson == null) {
            saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC_MODELE_JSON, tache.getTypeFichier().getCode(), fileToValidate.getParent());
            return;
        }
        Validator validator = new Validator();
        ConfigJsonValidator configJson = new ConfigJsonValidator(
                errorPath.toString(),
                tache.getRepertoireDestination(),
                fileToValidate,
                new TypeFichierJsonConverter(typefichierJson).convert());
        boolean result = validator.validate(configJson, "", true, true, Utilities.getNbThreads());
        if (result) {
            saveJournal(fileToValidate.getName(), lignes, JournalStatut.SUCCES, tache.getTypeFichier().getCode(), tache.getRepertoireDestination());
        } else {
            saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC, tache.getTypeFichier().getCode(), tache.getRepertoireErreur());
        }
    }
    private void saveJournal(String fileName, int lignes, JournalStatut statut, String codeTypeFichier, String sourceDirectory) throws Exception {
        Journal journal = new Journal(LocalDateTime.now(), statut, codeTypeFichier);
        journal.setSourceDirectory(sourceDirectory);
        journal.setSourceFileName(fileName);
        journal.setNombreLignes(lignes);
        JournalService.getInstance().add(journal);
    }
    /**
     *
     * @param tache
     * @param fileToValidate : Fichier contenant les données normalisées
     * @param originalFile : Fichier d'origine contenant les données brutes
     * @param config
     * @throws Exception
     */
    private void validate(Tache tache, File outputFile, File originalFile, Configuration config) throws Exception {
        Charset charset = getCharset(outputFile);
        final int lignes = numberOfLines(outputFile, charset);
        if (config == null) {
            saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), outputFile.getParent());
            return;
        }
        Optional<Validateur> validateur = ValidateurDAO.findByCodeTypeFichier(tache.getTypeFichier().getCode());
        if (!validateur.isPresent()) {
            saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC_VALIDATEUR, tache.getTypeFichier().getCode(), outputFile.getParent());
            return;
        }
        byte[] targetArray = IOUtils.toByteArray(FileToValidateEditDialogController.class.getClassLoader().getResourceAsStream("predicatelogic-engine.xml"));
        ConfigStreamValidator configValidator
                = new ConfigStreamValidator(targetArray, validateur.get().getContent(), tache.getRepertoireErreur(),
                        tache.getRepertoireDestination(), outputFile, originalFile);
        Validator validator = new Validator();
        boolean result = validator.validate(configValidator, Boolean.TRUE, Boolean.TRUE, Utilities.getNbThreads());
        if (result) {
            saveJournal(outputFile.getName(), lignes, JournalStatut.SUCCES, tache.getTypeFichier().getCode(), tache.getRepertoireDestination());
        } else {
            saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC, tache.getTypeFichier().getCode(), tache.getRepertoireErreur());
        }
    }
    private String generateTierce() {
        // Instance of random class
        Random rand = new Random();
        int upperbound = 60;
        int random = rand.nextInt(upperbound);
        return String.format("%02d", random);
    }
    private int numberOfLines(File file, Charset charset) {
        int nb = 0;
        try ( FileInputStream fis = new FileInputStream(file);  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
            while (reader.readLine() != null) {
                nb++;
            }
        } catch (IOException ex) {
            Logger.getLogger(TacheJob.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
        return nb;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheJobService.java
New file
@@ -0,0 +1,91 @@
package com.megatim.fdxconvert.service;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.service.util.SchedulerUtil;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
/**
 *
 * @author MGT_DEV3
 */
public class TacheJobService {
    private TacheJobService() {
    }
    private static Scheduler scheduler;
    private static TacheJobService tacheJobService;
    public static TacheJobService getInstance() {
        if (tacheJobService == null) {
            try {
                scheduler = StdSchedulerFactory.getDefaultScheduler();
                tacheJobService = new TacheJobService();
            } catch (SchedulerException ex) {
            }
        }
        return tacheJobService;
    }
    public void startJobs() {
        try {
            scheduler.start();
            List<Tache> taches = TacheService.getInstance().getAll();
            taches.forEach(t -> {
                if (t.isActive()) {
                    //Creation concrète du Job (un Job concrèt se matérialise via la classe JobDetail)
                    JobDetail job = JobBuilder
                            .newJob(TacheJob.class)
                            .withIdentity(t.getLibelle())
                            .usingJobData("tacheId", t.getLibelle()).build();
                    //Ajout du Job crée dans l'ordonnanceur
                    try {
                        scheduler.scheduleJob(job, SchedulerUtil.buildTriggerForTache(t));
                    } catch (SchedulerException ex) {
                        Logger.getLogger(TacheJobService.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        } catch (Exception ex) {
            Logger.getLogger(TacheJobService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void restartJob() {
        try {
            scheduler.clear();
            this.startJobs();
        } catch (SchedulerException ex) {
            Logger.getLogger(TacheJobService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TacheService.java
New file
@@ -0,0 +1,156 @@
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.dao.HibernateUtil;
import com.megatim.fdxconvert.model.Tache;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 *
 * @author lenovo
 */
public class TacheService implements GenericCrudService<Tache> {
    private static TacheService service;
    private static AbstractDAO<Tache> dao;
    private PaginationElts<Tache> pagination;
    public static synchronized TacheService getInstance() {
        if (service == null) {
            service = new TacheService();
            dao = new AbstractDAO<>(Tache.class);
        }
        return service;
    }
    @Override
    public Tache add(Tache t) throws Exception {
        return dao.add(t);
    }
    @Override
    public Tache edit(Tache t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<Tache> getAll() throws Exception {
        return dao.getAll("Tache");
    }
    @Override
    public void delete(Tache t) throws Exception {
        dao.delete(t);
        Thread th = new Thread(() -> {
            TacheJobService.getInstance().restartJob();
        });
        th.setDaemon(true);
        th.start();
    }
    public Tache findByTacheId(String tacheId) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Tache where libelle = :tacheId");
            query.setParameter("tacheId", tacheId);
            return (Tache) query.uniqueResult();
        }
    }
    public Tache findByTypefichier(TypeFichier typeFichier) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Tache where typeFichier = :typeFichier");
            query.setParameter("typeFichier", typeFichier);
            return (Tache) query.uniqueResult();
        }
    }
    public Tache findByRepertoireSource(String repertoireSource) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Tache where repertoireSource = :repertoireSource");
            query.setParameter("repertoireSource", repertoireSource);
            return (Tache) query.uniqueResult();
        }
    }
    public Tache findByRepertoireDestination(String repertoireDestination) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Tache where repertoireDestination = :repertoireDestination");
            query.setParameter("repertoireDestination", repertoireDestination);
            return (Tache) query.uniqueResult();
        }
    }
    public Tache findByRepertoireErreur(String repertoireErreur) {
        try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
            Query query = session.createQuery("from Tache where repertoireErreur = :repertoireErreur");
            query.setParameter("repertoireErreur", repertoireErreur);
            return (Tache) query.uniqueResult();
        }
    }
    //PAGINATION BLOCK
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<Tache> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TruncatedElementService.java
New file
@@ -0,0 +1,98 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.TruncatedElement;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class TruncatedElementService implements GenericCrudService<TruncatedElement> {
    private static TruncatedElementService truncatedElementService;
    private static AbstractDAO<TruncatedElement> dao;
    private PaginationElts<TruncatedElement> pagination;
    private TruncatedElementService() {
    }
    public static synchronized TruncatedElementService getInstance() {
        if (truncatedElementService == null) {
            truncatedElementService = new TruncatedElementService();
            dao = new AbstractDAO<>(TruncatedElement.class);
        }
        return truncatedElementService;
    }
    @Override
    public TruncatedElement add(TruncatedElement t) throws Exception {
        if(t.getDateAction() != null) {
            t.setLocalDateAction(t.getDateAction().toLocalDate());
        }
        return dao.add(t);
    }
    @Override
    public TruncatedElement edit(TruncatedElement t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<TruncatedElement> getAll() throws Exception {
        return dao.getAll("TruncatedElement");
    }
    @Override
    public void delete(TruncatedElement t) throws Exception {
        dao.delete(t);
    }
    //PAGINATION BLOCK
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<TruncatedElement> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TypeFichierJsonService.java
New file
@@ -0,0 +1,92 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierJsonService implements GenericCrudService<TypeFichierJson> {
    private static TypeFichierJsonService typeFichierService;
    private static AbstractDAO<TypeFichierJson> dao;
    private PaginationElts<TypeFichierJson> pagination;
    private TypeFichierJsonService() {
    }
    public static synchronized TypeFichierJsonService getInstance() {
        if (typeFichierService == null) {
            typeFichierService = new TypeFichierJsonService();
            dao = new AbstractDAO<>(TypeFichierJson.class);
        }
        return typeFichierService;
    }
    @Override
    public TypeFichierJson add(TypeFichierJson t) throws Exception {
        return dao.add(t);
    }
    @Override
    public TypeFichierJson edit(TypeFichierJson t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<TypeFichierJson> getAll() throws Exception {
        return dao.getAll("TypeFichierJson");
    }
    @Override
    public void delete(TypeFichierJson t) throws Exception {
        dao.delete(t);
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<TypeFichierJson> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/TypeFichierService.java
New file
@@ -0,0 +1,108 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.dao.TypeFichierDAO;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import java.util.List;
/**
 *
 * @author STEPHANIE
 */
public class TypeFichierService implements GenericCrudService<TypeFichier> {
    private static TypeFichierService typeFichierService;
    private static AbstractDAO<TypeFichier> dao;
    private PaginationElts<TypeFichier> pagination;
    private TypeFichierService() {
    }
    public static synchronized TypeFichierService getInstance() {
        if (typeFichierService == null) {
            typeFichierService = new TypeFichierService();
            dao = new AbstractDAO<>(TypeFichier.class);
        }
        return typeFichierService;
    }
    @Override
    public TypeFichier add(TypeFichier t) throws Exception {
        return dao.add(t);
    }
    @Override
    public TypeFichier edit(TypeFichier t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<TypeFichier> getAll() throws Exception {
        return dao.getAll("TypeFichier");
    }
    public List<TypeFichier> getAllTypeFichWithoutValidateur() throws Exception {
        return TypeFichierDAO.getAllTypeFichWithoutValidateur();
    }
    public List<TypeFichier> getAllTypeFichWithoutParaAuto() throws Exception {
        return TypeFichierDAO.getAllTypeFichWithoutParaAuto();
    }
    @Override
    public void delete(TypeFichier t) throws Exception {
        TypeFichierDAO.delete(t);
        Thread th = new Thread(() -> {
            TacheJobService.getInstance().restartJob();
        });
        th.setDaemon(true);
        th.start();
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<TypeFichier> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/ValidateurService.java
New file
@@ -0,0 +1,152 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service;
import com.megatim.typefichier.validator.model.enums.TypeDonnee;
import com.megatimfx.common.pojo.SearchCriteria;
import com.megatimfx.common.service.GenericCrudService;
import com.megatim.fdxconvert.dao.AbstractDAO;
import com.megatim.fdxconvert.dao.ValidateurDAO;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.service.pojo.PaginationElts;
import com.megatim.fdxconvert.util.ParserUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 *
 * @author STEPHANIE
 */
public class ValidateurService implements GenericCrudService<Validateur> {
    private static ValidateurService validateurService;
    private static AbstractDAO<Validateur> dao;
    private PaginationElts<Validateur> pagination;
    private ValidateurService() {
    }
    public static synchronized ValidateurService getInstance() {
        if (validateurService == null) {
            validateurService = new ValidateurService();
            dao = new AbstractDAO<>(Validateur.class);
        }
        return validateurService;
    }
    @Override
    public Validateur add(Validateur t) throws Exception {
        List<AlphaNumeriqueField> fields = getAlphaNumeriqueFields(t);
        t.setAlphaFields(fields);
        return dao.add(t);
    }
    @Override
    public Validateur edit(Validateur t) throws Exception {
        return dao.edit(t);
    }
    @Override
    public List<Validateur> getAll() throws Exception {
        return dao.getAll("Validateur");
    }
    @Override
    public void delete(Validateur t) throws Exception {
        ValidateurDAO.delete(t);
    }
    @Override
    public boolean isLast() {
        return pagination.isLast();
    }
    @Override
    public boolean isFirst() {
        return pagination.isFirst();
    }
    @Override
    public int getCurrentPage() {
        return pagination.getPage();
    }
    @Override
    public int getNumberOfElements() {
        return pagination.getNumberOfElts();
    }
    @Override
    public int getNumberPerPage() {
        return pagination.getNbEltsPerPage();
    }
    @Override
    public Long getTotalElements() {
        return pagination.getTotalElts();
    }
    @Override
    public List<Validateur> getAllByPage(int pageNumber, List<SearchCriteria> searchCriterias) {
        pagination = dao.initPaginationElts(pageNumber, searchCriterias);
        return pagination.getListe();
    }
    public AbstractDAO<Validateur> getDao() {
        return dao;
    }
    /**
     * Méthode qui extrait les champs alphanumériques dont la taille est
     * supérieure à 255, pour un éventuel troncage
     *
     * @param validateur
     * @return
     * @throws Exception
     */
    private List<AlphaNumeriqueField> getAlphaNumeriqueFields(Validateur validateur) throws Exception {
        Map<Integer, Map> mapElements = ParserUtils.getValidateurElements(validateur);
        List<Map<String, String>> paramsList = Arrays.asList(mapElements.values().toArray(new Map[mapElements.size()]));
        List<Map> alphanumMap = paramsList.stream()
                .filter(m -> m.containsKey("typeDonnee")
                && m.get("typeDonnee").equalsIgnoreCase(TypeDonnee.ALPHANUMERIQUE.getValue())
                )
                .collect(Collectors.toList());
        List<AlphaNumeriqueField> alphaNumeriqueFields = new ArrayList<>();
        alphanumMap.stream().forEach(m -> {
            String errorCode = (String) m.get("error-code");
            int taille = 0;
            int index = 0;
            if (validateur.isConvertDataBeforeValidation()) {
                taille = Integer.parseInt((String) m.get("taille"));
                index = Integer.parseInt((String) m.get("index"));
            }
            /**
             * Dans le validateur xml, error-code = codeTypeFichier +
             * codeColonne String codeColonne =
             * errorCode.substring(codeTypeFichier.length());*
             */
            String codeColonne = errorCode;
            alphaNumeriqueFields.add(new AlphaNumeriqueField(validateur, TypeDonnee.ALPHANUMERIQUE.getValue(), codeColonne, taille, index));
        });
        return alphaNumeriqueFields;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/pojo/PaginationElts.java
New file
@@ -0,0 +1,49 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.service.pojo;
import java.util.List;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 *
 * @author mela
 */
@Getter
@Setter
@NoArgsConstructor
public class PaginationElts<T> {
    //Numéro de page courante
    private int page = 0;
    //Nombre de pages
    private long numberOfPage = 0;
    //Nombre d'éléments à afficher par page
    private int nbEltsPerPage = 10;
    //Nombre d'éléments total à afficher
    private long totalElts = 0;
    //Nombre délémnts sur une pages quelconque : peut être inférieure ou égale à nbEltsPerPage
    private int numberOfElts = 0;
    private  List<T> liste;
    public PaginationElts(int nbEltsPerPage){
        this.nbEltsPerPage = nbEltsPerPage;
    }
    public boolean isLast() {
        return page == (numberOfPage == 0 ? numberOfPage : numberOfPage - 1);
    }
    public boolean isFirst() {
        return page == 0;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/service/util/SchedulerUtil.java
New file
@@ -0,0 +1,298 @@
package com.megatim.fdxconvert.service.util;
import com.megatim.fdxconvert.model.Tache;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalTime;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.TriggerBuilder;
/**
 *
 * @author MGT_DEV3
 */
public class SchedulerUtil {
    private SchedulerUtil() {
    }
    public static CronTrigger buildTriggerForTache(Tache tache) {
        return TriggerBuilder.newTrigger()
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule(getPlanification(tache))) //"0/20 * * * * ?"
                .build();
    }
    //Prend une tâche en entrée et renvoie l'expression cron de sa planifaction
    public static String getPlanification(Tache tache) {
        LocalDate localDate = LocalDate.now();
        boolean isActual = (tache.isMonday() && localDate.getDayOfWeek() == DayOfWeek.MONDAY)
                || (tache.isTuesday() && localDate.getDayOfWeek() == DayOfWeek.TUESDAY)
                || (tache.isWednesday() && localDate.getDayOfWeek() == DayOfWeek.WEDNESDAY)
                || (tache.isThursday() && localDate.getDayOfWeek() == DayOfWeek.THURSDAY)
                || (tache.isFriday() && localDate.getDayOfWeek() == DayOfWeek.FRIDAY)
                || (tache.isSaturday() && localDate.getDayOfWeek() == DayOfWeek.SATURDAY)
                || (tache.isSunday() && localDate.getDayOfWeek() == DayOfWeek.SUNDAY);
        int heureTache = tache.getHeureTache();
        int minuteTache = tache.getMinuteTache();
        LocalTime tacheTime = LocalTime.parse(String.format("%02d", heureTache) + ":" + String.format("%02d", minuteTache) + ":00");
        LocalTime actualTime = LocalTime.now();
        if (isActual && !tache.isWithoutInterval() && actualTime.isAfter(tacheTime)) {
            heureTache = actualTime.getHour();
            minuteTache = actualTime.getMinute();
        }
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.append("0 ");
        if (tache.isWithoutInterval()) {
            strBuilder.append(minuteTache).append(" ");
            strBuilder.append(heureTache).append(" ");
        } else {
            strBuilder.append(minuteTache).append("/").append(tache.getIntervalleTache()).append(" ");
            if (heureTache == 0) {
                strBuilder.append("*").append(" ");
            } else {
                strBuilder.append(heureTache).append("-").append("0").append(" ");
            }
        }
        strBuilder.append("? * ");
        StringBuilder strBuilderJour = new StringBuilder();
        if (tache.isMonday()) {
            strBuilderJour.append("2");
        }
        if (tache.isTuesday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("3");
            } else {
                strBuilderJour.append(",3");
            }
        }
        if (tache.isWednesday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("4");
            } else {
                strBuilderJour.append(",4");
            }
        }
        if (tache.isThursday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("5");
            } else {
                strBuilderJour.append(",5");
            }
        }
        if (tache.isFriday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("6");
            } else {
                strBuilderJour.append(",6");
            }
        }
        if (tache.isSaturday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("7");
            } else {
                strBuilderJour.append(",7");
            }
        }
        if (tache.isSunday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("1");
            } else {
                strBuilderJour.append(",1");
            }
        }
        //Ajout de l'expression énumérant les jours construite
        strBuilder.append(strBuilderJour.toString());
        return strBuilder.toString();
    }
    //Prend une tâche du protocol fdx en paramêtre et contruit en fonction des information de celle-ci le déclencheur approprié
    /*public static CronTrigger buildTriggerForTache(Tache tache) {
        System.out.println("LA PLANIFICATION SPECIFIEE EST : " + getPlanification(tache));
        return TriggerBuilder.newTrigger()
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule(getPlanification(tache))) //"0/20 * * * * ?"
                .withIdentity(tache.getLibelle())
                .build();
    }
    //Prend une tâche en entrée et renvoie l'expression cron de sa planifaction
    public static String getPlanification(Tache tache) {
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.append("0 ");
        strBuilder.append(tache.getMinuteTache()).append(" ");
        strBuilder.append(tache.getHeureTache()).append(" ");
        strBuilder.append("? * ");
        StringBuilder strBuilderJour = new StringBuilder();
        if (tache.isMonday()) {
            strBuilderJour.append("2");
        }
        if (tache.isTuesday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("3");
            } else {
                strBuilderJour.append(",3");
            }
        }
        if (tache.isWednesday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("4");
            } else {
                strBuilderJour.append(",4");
            }
        }
        if (tache.isThursday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("5");
            } else {
                strBuilderJour.append(",5");
            }
        }
        if (tache.isFriday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("6");
            } else {
                strBuilderJour.append(",6");
            }
        }
        if (tache.isSaturday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("7");
            } else {
                strBuilderJour.append(",7");
            }
        }
        if (tache.isSunday()) {
            if (strBuilderJour.toString().isEmpty()) {
                strBuilderJour.append("1");
            } else {
                strBuilderJour.append(",1");
            }
        }
        //Ajout de l'expression énumérant les jours construite
        strBuilder.append(strBuilderJour.toString());
        return strBuilder.toString();
    }*/
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/Count.java
New file
@@ -0,0 +1,158 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import static com.megatim.typefichier.validator.utilities.Utilities.getCharset;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 *
 * @author ASUS
 */
public class Count {
    public static int countEltsOfTextFile(FileToValidateDescription fileDesc, boolean headerPresent) throws Exception {
        int nbElts = 0;
        if (fileDesc != null) {
            Charset charset = getCharset(fileDesc.getFile());
            //Lecture des lignes du fichier et chargement dans une liste
            try ( FileInputStream fis = new FileInputStream(fileDesc.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                boolean withHeader = headerPresent;
                int c = 0;
                boolean carriageReaded = false; //Indique si on a lu un retour chariot
                char lastCharacter = '\u0000';
                while ((c = reader.read()) != -1) {
                    char characterRead = (char) c;
                    if (characterRead == '\r') {
                        if (carriageReaded) { //On a lu le retour chariot deux fois consécutives donc on a pas de séparateur de ligne au sens windows
                            carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                        } else { // Première lecture du retour chariot
                            carriageReaded = true; // On marque que nous avons lu un retour chariot
                        }
                    } else {
                        if (carriageReaded) { // Le caractère précédemment lu c'est le retour chariot
                            if (characterRead == '\n') { // Si le nouveau caractère lu est un saut de ligne c'est que nous venons de lire une nouvelle ligne
                                if (!withHeader) {
                                    if (fileDesc.getColumnDelimiter().equals("\\t")) {
                                        nbElts++;
                                    } else if (fileDesc.getColumnDelimiter().isEmpty()) {
                                        nbElts++;
                                    } else {
                                        nbElts++;
                                    }
                                } else {
                                    withHeader = false;
                                }
                                carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                            } else {
                            }
                        } else {
                            if (characterRead == '\n') {
                                if (lastCharacter != '\n') {
                                }
                            } else {
                            }
                        }
                    }
                    lastCharacter = characterRead;
                }
            }
        }
        return nbElts;
    }
    public static int countEltsOfCsvFile(FileToValidateDescription fileDesc, boolean headerPresent) throws Exception {
        int nbElts = 0;
        Charset charset = getCharset(fileDesc.getFile());
        AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
        try ( FileInputStream fis = new FileInputStream(fileDesc.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
            CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder()
                    .setSkipHeaderRecord(headerPresent)
                    .setIgnoreSurroundingSpaces(true)
                    .setTrim(true)
                    .setDelimiter(fileDesc.getColumnDelimiter())
                    .setRecordSeparator(fileDesc.getRowDelimiter())
                    .build());
            for (CSVRecord record : parser) {
                if (!withHeader.get()) {
                    nbElts++;
                } else {
                    withHeader.set(false);
                }
            }
        } catch (Exception e) {
            Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, e.getMessage(), e);
        }
        return nbElts;
    }
    public static int countEltsOfparseXlsxFile(File file, int sheetNumber, boolean headerPresent) throws Exception {
        try ( InputStream is = new FileInputStream(file);  Workbook wb = new XSSFWorkbook(is)) {
            return countEltsOfExcelFile(wb, sheetNumber, headerPresent);
        }
    }
    public static int countEltsOfXlsFile(File file, int sheetNumber, boolean headerPresent) throws Exception {
        try ( InputStream is = new FileInputStream(file);  Workbook wb = new HSSFWorkbook(is)) {
            return countEltsOfExcelFile(wb, sheetNumber, headerPresent);
        }
    }
    private static int countEltsOfExcelFile(Workbook wb, int sheetNumber, boolean headerPresent) {
        int nbElts = 0;
        Sheet sheet = wb.getSheetAt(sheetNumber);
        AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
        for (Row r : sheet) {
            if (!withHeader.get()) {
                nbElts++;
            } else {
                withHeader.set(false);
            }
        }
        return nbElts;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ExportToJson.java
New file
@@ -0,0 +1,242 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.typefichier.validator.utilities.ParserUtils;
import static com.megatim.typefichier.validator.utilities.Utilities.getCharset;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import com.megatim.fdxconvert.pojo.ColumnDefinition;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 *
 * @author ASUS
 */
public class ExportToJson {
    public static void parseFileByColumnLength(FileToValidateDescription fileDesc, File outputFile, List<ColumnDefinition> colDefs) throws Exception {
        final int nbElts = Count.countEltsOfTextFile(fileDesc, false);
        int index = 1;
        Collections.sort(colDefs, (c1, c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition()));
        if (fileDesc != null) {
            Charset charset = getCharset(fileDesc.getFile());
            //Lecture des lignes du fichier et chargement dans une liste
            try ( FileInputStream fis = new FileInputStream(fileDesc.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                if (outputFile.exists()) {
                    outputFile.delete();
                }
                //Initialisation du writer pour ecrire chaque objet json
                try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);) {
                    bufferWriter.write("[");
                    String line;
                    while ((line = reader.readLine()) != null) {
                        String json = createJson(colDefs, line);
                        bufferWriter.write(json);
                        if (index < nbElts) {
                            bufferWriter.write(",");
                            index++;
                        }
                    }
                    bufferWriter.write("]");
                }
            }
        }
    }
    public static void parseCsvFile(FileToValidateDescription fileDesc, File outputFile, List<ColumnDefinition> colDefs, boolean headerPresent) throws Exception {
        final int nbElts = Count.countEltsOfCsvFile(fileDesc, headerPresent);
        int index = 0;
        if (fileDesc != null) {
            Charset charset = getCharset(fileDesc.getFile());
            AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
            if (outputFile.exists()) {
                outputFile.delete();
            }
            try ( FileInputStream fis = new FileInputStream(fileDesc.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                //Initialisation du writer pour ecrire chaque objet json
                try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) {
                    CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder()
                            .setSkipHeaderRecord(headerPresent)
                            .setIgnoreSurroundingSpaces(true)
                            .setTrim(true)
                            .setDelimiter(fileDesc.getColumnDelimiter())
                            .setRecordSeparator(fileDesc.getRowDelimiter())
                            .build());
                    bufferWriter.write("[");
                    for (CSVRecord record : parser) {
                        String[] columnsTableLine = new String[colDefs.size()];
                        AtomicInteger i = new AtomicInteger(0);
                        if (!withHeader.get()) {
                            record.forEach(column -> {
                                columnsTableLine[i.getAndIncrement()] = column != null ? column.replaceAll(" {2,}", " ").replaceAll("\r", "").replaceAll("\n", "").replaceAll("\t", "") : "";
                            });
                            String json = createJson(colDefs, columnsTableLine);
                            bufferWriter.write(json);
                            if (index < nbElts) {
                                bufferWriter.write(",");
                                index++;
                            }
                        } else {
                            withHeader.set(false);
                        }
                    }
                    bufferWriter.write("]");
                }
            } catch (Exception e) {
                Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, e.getMessage(), e);
            }
        }
    }
    public static void parseXlsFile(FileToValidateDescription fileDesc, File outputFile, List<ColumnDefinition> colDefs, boolean headerPresent) throws Exception {
        try ( InputStream is = new FileInputStream(fileDesc.getFile());  Workbook wb = new HSSFWorkbook(is)) {
            parseExcelFile(fileDesc, wb, outputFile, colDefs, headerPresent);
        }
    }
    public static void parseXlsxFile(FileToValidateDescription fileDesc, File outputFile, List<ColumnDefinition> colDefs, boolean headerPresent) throws Exception {
        try ( InputStream is = new FileInputStream(fileDesc.getFile());  Workbook wb = new XSSFWorkbook(is)) {
            parseExcelFile(fileDesc, wb, outputFile, colDefs, headerPresent);
        }
    }
    private static Path filePath(File file, int sheetNumber) {
        int extensionIndex = file.getName().lastIndexOf(".");
        return Paths.get(file.getParent(),
                file.getName().substring(0, extensionIndex) + sheetNumber + file.getName().substring(extensionIndex + 1));
    }
    private static void parseExcelFile(FileToValidateDescription fileDesc, Workbook wb, File outputFile, List<ColumnDefinition> colDefs, boolean headerPresent) throws IOException, Exception {
        Charset charset = getCharset(fileDesc.getFile());
        AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
            Sheet sheet = wb.getSheetAt(i);
            final int nbElts = Count.countEltsOfXlsFile(fileDesc.getFile(), i, headerPresent);
            AtomicInteger position = new AtomicInteger(1);
            if (outputFile.exists()) {
                outputFile.delete();
            }
            //Initialisation du writer pour ecrire chaque objet json
            try ( BufferedWriter bufferWriter = Files.newBufferedWriter(filePath(outputFile, i), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);) {
                bufferWriter.write("[");
                for (org.apache.poi.ss.usermodel.Row r : sheet) {
                    if (!withHeader.get()) {
                        //Représente les colonnes extraites de chaque ligne du  fichier
                        String[] columnsTableLine = new String[colDefs.size()];
                        AtomicInteger index = new AtomicInteger(0);
                        r.forEach(c -> {
                            columnsTableLine[index.get()] = ParserUtils.getXlxsCellValue(c,
                                    wb,
                                    colDefs.get(index.get()).getTypeDonnee(),
                                    colDefs.get(index.get()).getFormatDate(),
                                    colDefs.get(index.get()).getSeparateurDate(),
                                    colDefs.get(index.get()).getName()
                            );
                            index.incrementAndGet();
                        });
                        String json = createJson(colDefs, columnsTableLine);
                        bufferWriter.write(json);
                        if (position.get() < nbElts) {
                            bufferWriter.write(",");
                            position.incrementAndGet();
                        }
                    } else {
                        withHeader.set(false);
                    }
                }
                bufferWriter.write("]");
            }
        }
    }
    private static String createJson(List<ColumnDefinition> colDefs, String[] columnsTableLine) throws Exception {
        StringBuilder json = new StringBuilder();
        System.out.println("----------------- colDefs.size() = " + colDefs.size());
        System.out.println("---------------- columnsTableLine.length = " + columnsTableLine.length);
        if (colDefs.size() != columnsTableLine.length) {
            throw new Exception("Existence des lignes mal formattées");
        }
        json.append("\t{\n");
        int i = 0;
        for (ColumnDefinition c : colDefs) {
            String str = "\"" + c.getName() + "\" : " + "\"" + columnsTableLine[i].trim() + "\"";
            if (i < colDefs.size() - 1) {
                str += ",";
            } else {
                str += "\n";
            }
            json.append(str);
            i++;
        }
        json.append("\t}\n");
        return json.toString();
    }
    private static String createJson(List<ColumnDefinition> colDefs, String line) {
        StringBuilder json = new StringBuilder();
        json.append("\t{");
        int i = 0;
        int count = 0;
        for (ColumnDefinition c : colDefs) {
            String str = "\"" + c.getName() + "\" : " + "\"" + line.substring(i, i + c.getTaille()).trim() + "\"";
            if (count < colDefs.size() - 1) {
                str += ",";
            }
            json.append(str);
            i += c.getTaille();
            count++;
        }
        json.append("\t}\n");
        return json.toString();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ImportData.java
New file
@@ -0,0 +1,1138 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.typefichier.validator.utilities.Constantes;
import com.megatim.fdxconvert.pojo.DataToImport;
import com.megatim.fdxconvert.pojo.FileToValidateDescription;
import com.megatim.fdxconvert.exceptions.AttributeFormatException;
import static com.megatim.typefichier.validator.utilities.Utilities.getCharset;
import com.megatim.fdxconvert.model.AlphaNumeriqueField;
import com.megatim.fdxconvert.model.TruncatedElement;
import com.megatim.fdxconvert.model.Validateur;
import com.megatim.fdxconvert.pojo.ResultFileParsing;
import com.megatim.fdxconvert.service.ConfigurationService;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.text.Normalizer;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 *
 * @author mela
 */
public class ImportData {
    /**
     * Méthode qui parse le fichier csv et en extrait les données
     *
     * @param <T>
     * @param datIm
     * @return
     * @throws java.lang.Exception
     */
    public static <T> List<T> importDataFromCsvFile(DataToImport<T> datIm) throws Exception {
//        FileReader reader = null;
        List<String[]> datas = new ArrayList<>();
        List<T> listeToReturn = new ArrayList<>();
        if (datIm != null) {
            try ( FileInputStream fis = new FileInputStream(datIm.getFile());  InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);  BufferedReader reader = new BufferedReader(isr)) {
                String line = "";
                while ((line = reader.readLine()) != null) {
                    String[] row = line.split(datIm.getRowDelimiter());
                    for (String r : row) {
                        String[] values = new String[datIm.getFields().size()];
                        String[] columns = r.split(datIm.getColumnDelimiter());
                        int ss = 0;
                        while (ss < datIm.getFields().size() && ss < columns.length) {
                            values[ss] = columns[ss];
                            ss++;
                        }
                        datas.add(values);
                    }
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            } catch (IOException ex) {
                Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            }
            if (!datas.isEmpty()) {
                //tous les champs du type paramétré
                Field[] fields = datIm.getType().getDeclaredFields();
                // mettre les champs du type paramétré dans une map afin de faciliter leur accès
                Map<String, Field> fieldsToMap = fieldsToMap(fields);
                datas.forEach(d -> {
                    try {
                        T obj = datIm.getType().newInstance();
                        Map<String, String> map = tabToMap(datIm.getFields(), d);
                        for (Field field : fields) {
                            String fieldName = field.getName();
                            if (map.containsKey(fieldName) && fieldsToMap.containsKey(fieldName)) {
                                try {
                                    Object converted = convertToPrimitive(field, map.get(fieldName));
                                    Method method = new PropertyDescriptor(fieldName, datIm.getType()).getWriteMethod();
                                    method.invoke(obj, converted);
                                } catch (IntrospectionException | IllegalAccessException | InvocationTargetException ex) {
                                    Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
                                } catch (IllegalArgumentException | ClassCastException ex) {
                                    throw new AttributeFormatException("Erreur de type sur le champ " + fieldName);
                                }
                            }
                        }
                        listeToReturn.add(obj);
                    } catch (InstantiationException | IllegalAccessException ex) {
                        Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
                    }
                });
            }
        }
        return listeToReturn;
    }
    /**
     * Méthode qui extrait les données d'un fichier csv et les normalise
     *
     * @param rawCsvData : objet contenant les informations de validationdonnées
     * @param validateur : Validateur du type fichier auquel appartient le
     * fichier à valider
     * @param outputFile : fichier texte généré en sortie
     * @param headerPresent : renseigne si le fichier a une ligne d'entête
     * @param alphaNumeriqueToBeTruncated : liste des champs à tronquer
     * @throws Exception
     */
    public static void parseCsvFile(FileToValidateDescription rawCsvData, Validateur validateur, File outputFile, boolean headerPresent, Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated) throws Exception {
        Map<Integer, Map> mapParams = ParserUtils.getValidateurElements(validateur);
        AtomicInteger numeroLigne = new AtomicInteger(0);
        AtomicBoolean columnTruncated = new AtomicBoolean();
        int lineNumber = 1;
        if (rawCsvData != null) {
            Charset charset = getCharset(rawCsvData.getFile());
            AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
            Path pathOfTruncatedElts = createTruncatedEltsPath(validateur, rawCsvData.getFile());
            try ( FileInputStream fis = new FileInputStream(rawCsvData.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);  BufferedWriter truncateWriter = Files.newBufferedWriter(pathOfTruncatedElts, StandardCharsets.UTF_8, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) {
                    CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder()
                            .setSkipHeaderRecord(headerPresent)
                            .setIgnoreSurroundingSpaces(true)
                            .setTrim(true)
                            .setDelimiter(StringEscapeUtils.unescapeJava(rawCsvData.getColumnDelimiter()))
                            .setRecordSeparator(StringEscapeUtils.unescapeJava(rawCsvData.getRowDelimiter()))
                            .build());
                    for (CSVRecord record : parser) {
                        String[] columnsTableLine = new String[record.size()];
                        AtomicInteger i = new AtomicInteger(0);
                        if (!withHeader.get()) {
                            record.forEach(column -> {
                                columnsTableLine[i.get()] = column != null ? column.replaceAll(" {2,}", " ").replaceAll("\r", "").replaceAll("\n", "").replaceAll("\t", "").trim() : "";
                                i.set(i.get() + 1);
                            });
                            //Nettoyage d'une colonne de chaque ligne
                            ResultFileParsing resultFileParsing = buildFinalColumnsTableLine(outputFile, columnsTableLine, mapParams, alphaNumeriqueToBeTruncated, numeroLigne.incrementAndGet(), truncateWriter);
                            String[] finalColumnsTableLine = resultFileParsing.getFinalColumnsTableLine();
                            columnTruncated.set(resultFileParsing.isColumnTruncated());
                            String[] encodedStrings = ParserUtils.encodeStrings(finalColumnsTableLine, charset);
                            ParserUtils.writeToFile(encodedStrings, bufferWriter);
                            lineNumber++;
                        } else {
                            withHeader.set(false);
                        }
                    }
                } catch (Exception e) {
                    Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, e.getMessage(), e);
                }
                //Si au moins une colonne a été tronqué, alors copier le fichier dont les lignes ont été tronqué dans le répertoire d'archivage
                if (columnTruncated.get()) {
                    Path originalFilePathInArchiveFolder = createOriginalFileInArchive(validateur, rawCsvData.getFile());
                    //Copie du fichier dont les colonnes ont été tronqués vers le répertoire archivage
                    if (rawCsvData.getFile().exists()) {
                        Files.copy(rawCsvData.getFile().toPath(), originalFilePathInArchiveFolder);
                    }
                } else {//Sinon supprimer le fichier des éléments tronqués, car il est vide
                    Files.deleteIfExists(pathOfTruncatedElts);
                }
            }
        }
    }
    /**
     * Méthode qui extrait les données dans un fichier txt en respectant
     * scrupuleusement la taille de chaque colonne
     *
     * @param rawCsvData : objet contenant les informations de validationdonnées
     * @param validateur : Validateur du type fichier auquel appartient le
     * fichier à valider
     * @param outputFile : fichier texte généré en sortie
     * @param headerPresent : renseigne si le fichier a une ligne d'entête
     * @throws Exception
     */
    public static void parseFileByFieldLength(FileToValidateDescription rawCsvData, Validateur validateur, File outputFile, boolean headerPresent) throws Exception {
        System.out.println("----------------------In parseFileByFieldLength------------------");
        Map<Integer, Map> mapParams = ParserUtils.getValidateurElements(validateur);
        //boolean result = true;
        int nbLine = 0;
        if (rawCsvData != null) {
            Charset charset = getCharset(rawCsvData.getFile());
            //Lecture des lignes du fichier et chargment dans une liste
            try ( FileInputStream fis = new FileInputStream(rawCsvData.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                try ( //Initialisation du write pour traiter chaque ligne du fichier
                         BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);) {
                    boolean withHeader = headerPresent;
                    StringBuilder line = new StringBuilder();
                    int c = 0;
                    boolean carriageReaded = false; //Indique si on a lu un retour chariot
                    char lastCharacter = '\u0000';
                    while ((c = reader.read()) != -1) {
                        char characterRead = (char) c;
                        if (characterRead == '\r') {
                            if (carriageReaded) { //On a lu le retour chariot deux fois consécutives donc on a pas de séparateur de ligne au sens windows
                                //On ajoute les deux caractère à la chaîne que nous construisons
                                line.append('\r').append(characterRead);
                                carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                            } else { // Première lecture du retour chariot
                                carriageReaded = true; // On marque que nous avons lu un retour chariot
                            }
                        } else {
                            if (carriageReaded) { // Le caractère précédemment lu c'est le retour chariot
                                if (characterRead == '\n') { // Si le nouveau caractère lu est un saut de ligne c'est que nous venons de lire une nouvelle ligne
                                    //On effectue les traitements propres à la ligne
                                    String newLine = line.toString();
                                    nbLine++;
                                    if (!withHeader) {
                                        parseLineUsingFieldLength(newLine, mapParams, rawCsvData.getColumnDelimiter(), bufferWriter, charset);
                                    } else {
                                        withHeader = false;
                                    }
                                    line = new StringBuilder(); //On réinitialise notre constructeur de ligne
                                    carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                                } else {
                                    line.append(' '); //On change le saut de ligne par un espace
                                }
                            } else {
                                if (characterRead == '\n') {
                                    if (lastCharacter != '\n') {
                                        line.append(' ');
                                    }
                                } else {
                                    line.append(characterRead);
                                }
                            }
                        }
                        lastCharacter = characterRead;
                    }
                } //Fermeture du writer
            }
        }
    }
    /**
     * Méthode qui parcours un fichier txt caractère par caractère afin d'en
     * extraire les données et de les normaliser
     *
     * @param rawCsvData : objet contenant les informations de validationdonnées
     * @param validateur : Validateur du type fichier auquel appartient le
     * fichier à valider
     * @param outputFile : fichier texte généré en sortie
     * @param headerPresent : renseigne si le fichier a une ligne d'entête
     * @param alphaNumeriqueToBeTruncated : liste des champs à tronquer
     * @throws Exception
     */
    public static void parseFileCharacterByCharacter(FileToValidateDescription rawCsvData, Validateur validateur, File outputFile, boolean headerPresent, Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated) throws Exception {
        Map<Integer, Map> mapParams = ParserUtils.getValidateurElements(validateur);
        AtomicInteger numeroLigne = new AtomicInteger(0);
        AtomicBoolean columnTruncated = new AtomicBoolean();
        if (rawCsvData != null) {
            Charset charset = getCharset(rawCsvData.getFile());
            Path pathOfTruncatedElts = createTruncatedEltsPath(validateur, rawCsvData.getFile());
            //Lecture des lignes du fichier et chargement dans une liste
            try ( FileInputStream fis = new FileInputStream(rawCsvData.getFile());  InputStreamReader isr = new InputStreamReader(fis, charset);  BufferedReader reader = new BufferedReader(isr)) {
                try ( //Initialisation du write pour traiter chaque ligne du fichier
                         BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);  BufferedWriter truncateWriter = Files.newBufferedWriter(pathOfTruncatedElts, StandardCharsets.UTF_8, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) {
                    boolean withHeader = headerPresent;
                    StringBuilder line = new StringBuilder();
                    int c = 0;
                    boolean carriageReaded = false; //Indique si on a lu un retour chariot
                    char lastCharacter = '\u0000';
                    while ((c = reader.read()) != -1) {
                        char characterRead = (char) c;
                        if (characterRead == '\r') {
                            if (carriageReaded) { //On a lu le retour chariot deux fois consécutives donc on a pas de séparateur de ligne au sens windows
                                //On ajoute les deux caractère à la chaîne que nous construisons
                                line.append('\r').append(characterRead);
                                carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                            } else { // Première lecture du retour chariot
                                carriageReaded = true; // On marque que nous avons lu un retour chariot
                            }
                        } else {
                            if (carriageReaded) { // Le caractère précédemment lu c'est le retour chariot
                                if (characterRead == '\n') { // Si le nouveau caractère lu est un saut de ligne c'est que nous venons de lire une nouvelle ligne
                                    //On effectue les traitements propres à la ligne
                                    String newLine = line.toString();
                                    if (ParserUtils.characterOfDelimiteur(rawCsvData.getColumnDelimiter()) != '\0') {
                                        newLine = newLine.replaceAll(" {2,}", " ");
                                    }
                                    if (!withHeader) {
                                        //Représente les colonnes extraites de chaque ligne du  fichier
                                        //String[] columnsTableLine = newLine.split(rawCsvData.getColumnDelimiter());
                                        String[] columnsTableLine;
                                        if (rawCsvData.getColumnDelimiter().equals("\\t")) {
                                            columnsTableLine = ParserUtils.splitIntoColumns(newLine, '\t');
                                            ResultFileParsing resultFileParsing = buildFinalColumnsTableLine(outputFile, columnsTableLine, mapParams, alphaNumeriqueToBeTruncated, numeroLigne.incrementAndGet(), truncateWriter);
                                            String[] finalColumnsTableLine = resultFileParsing.getFinalColumnsTableLine();
                                            columnTruncated.set(resultFileParsing.isColumnTruncated());
                                            String[] encodedStrings = ParserUtils.encodeStrings(finalColumnsTableLine, charset);
                                            ParserUtils.writeToFile(encodedStrings, bufferWriter);
                                        } else if (rawCsvData.getColumnDelimiter().isEmpty()) {
                                            parseLineUsingFieldLength(newLine, mapParams, rawCsvData.getColumnDelimiter(), bufferWriter, charset);
                                        } else {
                                            columnsTableLine = (newLine).split(rawCsvData.getColumnDelimiter());
                                            ResultFileParsing resultFileParsing = buildFinalColumnsTableLine(outputFile, columnsTableLine, mapParams, alphaNumeriqueToBeTruncated, numeroLigne.incrementAndGet(), truncateWriter);
                                            String[] finalColumnsTableLine = resultFileParsing.getFinalColumnsTableLine();
                                            if (!columnTruncated.get()) {
                                                columnTruncated.set(resultFileParsing.isColumnTruncated());
                                            }
                                            String[] encodedStrings = ParserUtils.encodeStrings(finalColumnsTableLine, charset);
                                            ParserUtils.writeToFile(encodedStrings, bufferWriter);
                                        }
                                        //Nettoyage d'une colonne de chaque ligne
                                    } else {
                                        withHeader = false;
                                    }
                                    line = new StringBuilder(); //On réinitialise notre constructeur de ligne
                                    carriageReaded = false; //On marque que la lecture d'une nouvelle ligne redémarre
                                } else {
                                    line.append(' '); //On change le saut de ligne par un espace
                                }
                            } else {
                                if (characterRead == '\n') {
                                    if (lastCharacter != '\n') {
                                        line.append(' ');
                                    }
                                } else {
                                    line.append(characterRead);
                                }
                            }
                        }
                        lastCharacter = characterRead;
                    }
                } //Fermeture du writer
            }
            //Si au moins une colonne a été tronqué, alors copier le fichier dont les lignes ont été tronqué dans le répertoire d'archivage
            if (columnTruncated.get()) {
                Path originalFilePathInArchiveFolder = createOriginalFileInArchive(validateur, rawCsvData.getFile());
                //Copie du fichier dont les colonnes ont été tronqués vers le répertoire archivage
                if (rawCsvData.getFile().exists()) {
                    Files.copy(rawCsvData.getFile().toPath(), originalFilePathInArchiveFolder);
                }
            } else {//Sinon supprimer le fichier des éléments tronqués, car il est vide
                Files.deleteIfExists(pathOfTruncatedElts);
            }
        }
    }
    /**
     * Méthode qui extrait les données d'un fichier xlsx et les normalise
     *
     * @param validateur : Validateur du type fichier auquel appartient le
     * fichier à valider
     * @param outputFile : fichier texte généré en sortie
     * @param headerPresent : renseigne si le fichier a une ligne d'entête
     * @param alphaNumeriqueToBeTruncated : liste des champs à tronquer
     * @param filePath : Fichier qui contient les données à extraire
     * @throws IOException
     * @throws Exception
     */
    public static void parseXlsxFile(String filePath, boolean headerPresent, File outputFile, Validateur validateur, Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated) throws Exception {
        AtomicBoolean columnTruncated = new AtomicBoolean();
        Path pathOfTruncatedElts = createTruncatedEltsPath(validateur, new File(filePath));
        try ( InputStream is = new FileInputStream(filePath);  Workbook wb = new XSSFWorkbook(is)) {
            parseExcelFile(filePath, wb, headerPresent, outputFile, validateur, alphaNumeriqueToBeTruncated, pathOfTruncatedElts);
        }
        treatTruncatedElements(filePath, pathOfTruncatedElts, validateur, columnTruncated);
    }
    public static void parseXlsFile(String filePath, boolean headerPresent, File outputFile, Validateur validateur, Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated) throws Exception {
        AtomicBoolean columnTruncated = new AtomicBoolean();
        Path pathOfTruncatedElts = createTruncatedEltsPath(validateur, new File(filePath));
        try ( InputStream is = new FileInputStream(filePath);  Workbook wb = new HSSFWorkbook(is)) {
            parseExcelFile(filePath, wb, headerPresent, outputFile, validateur, alphaNumeriqueToBeTruncated, pathOfTruncatedElts);
        }
        treatTruncatedElements(filePath, pathOfTruncatedElts, validateur, columnTruncated);
    }
    private static void parseExcelFile(String filePath, Workbook wb, boolean headerPresent, File outputFile, Validateur validateur, Set<AlphaNumeriqueField> alphaNumeriqueToBeTruncated, Path pathOfTruncatedElts) throws IOException, Exception {
        Map<Integer, Map> mapParams = ParserUtils.getValidateurElements(validateur);
        final int maxPosition = Collections.max(mapParams.keySet());
        AtomicInteger numeroLigne = new AtomicInteger(0);
        AtomicBoolean columnTruncated = new AtomicBoolean();
        Charset charset = getCharset(new File(filePath));
        try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);  BufferedWriter truncateWriter = Files.newBufferedWriter(pathOfTruncatedElts, Charset.defaultCharset(), StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) {
            for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                Sheet sheet = wb.getSheetAt(i);
                AtomicInteger numberOfColumns = new AtomicInteger(0);
                AtomicBoolean withHeader = new AtomicBoolean(headerPresent);
                AtomicInteger lineNumber = new AtomicInteger(1);
                for (org.apache.poi.ss.usermodel.Row r : sheet) {
                    if (!withHeader.get()) {
                        for (int cn = 0; cn < r.getLastCellNum(); cn++) {
                            numberOfColumns.incrementAndGet();
                        }
                        //Représente les colonnes extraites de chaque ligne du  fichier
                        String[] columnsTableLine = new String[numberOfColumns.get()];
                        AtomicInteger index = new AtomicInteger(0);
                        for (int cn = 0; cn < r.getLastCellNum(); cn++) {
                            if (cn < maxPosition) {
                                Map<String, String> map = mapParams.get(index.get() + 1);
                                //Prendre aussi les cellules vides en considération
                                org.apache.poi.ss.usermodel.Cell c = r.getCell(cn, org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                                String value = com.megatim.typefichier.validator.utilities.ParserUtils.getXlxsCellValue(c,
                                        wb,
                                        map.get(Constantes.LIBELLE_TYPE_DONNEE),
                                        map.get(Constantes.LIBELLE_FORMAT_DATE),
                                        map.get(Constantes.LIBELLE_SEPARATEUR_DATE),
                                        map.get(Constantes.ERROR_CODE));
                                columnsTableLine[index.get()] = value;
                                index.incrementAndGet();
                            } else {
                                break;
                            }
                        }
                        try {
                            //Nettoyage d'une colonne de chaque ligne
                            ResultFileParsing resultFileParsing = buildFinalColumnsTableLine(outputFile, columnsTableLine, mapParams, alphaNumeriqueToBeTruncated, numeroLigne.incrementAndGet(), truncateWriter);
                            String[] finalColumnsTableLine = resultFileParsing.getFinalColumnsTableLine();
                            columnTruncated.set(resultFileParsing.isColumnTruncated());
                            ParserUtils.writeToFile(finalColumnsTableLine, bufferWriter);
                        } catch (Exception ex) {
                            Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
                        }
                    } else {
                        withHeader.set(false);
                    }
                    lineNumber.incrementAndGet();
                }
            }
        }
    }
    private static void treatTruncatedElements(String filePath, Path pathOfTruncatedElts, Validateur validateur, AtomicBoolean columnTruncated) throws IOException {
        //Si au moins une colonne a été tronqué, alors copier le fichier dont les lignes ont été tronqué dans le répertoire d'archivage
        if (columnTruncated.get()) {
            Path pathoriginalFilePath = Paths.get(filePath);
            Path originalFilePathInArchiveFolder = createOriginalFileInArchive(validateur, new File(filePath));
            //Copie du fichier dont les colonnes ont été tronqués vers le répertoire archivage
            if (Files.exists(pathoriginalFilePath, LinkOption.NOFOLLOW_LINKS)) {
                Files.copy(pathoriginalFilePath, originalFilePathInArchiveFolder);
            }
        } else {//Sinon supprimer le fichier des éléments tronqués, car il est vide
            Files.deleteIfExists(pathOfTruncatedElts);
        }
    }
    /**
     * Méthode qui met les libellés des colonnes et leurs valeurs
     * correspondantes dans une map
     *
     * @param titles : ensemble des noms de colonnes
     * @param values : ensemble des données
     * @return : rentourne une map (clé,valeur) = (nom_de_la_colonne,
     * valeur_colonne)
     */
    private static Map<String, String> tabToMap(List<String> titles, String[] values) {
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < titles.size(); i++) {
            map.put(titles.get(i), values[i]);
        }
        return map;
    }
    /**
     * Méthode qui met un tableau de Field dans une
     * map<nom_du_champ,objet représentant_le_champ>
     * afin de faciliter leur accès
     *
     * @param fields
     * @return
     */
    private static Map<String, Field> fieldsToMap(Field[] fields) {
        Map<String, Field> map = new HashMap<>();
        for (Field f : fields) {
            map.put(f.getName(), f);
        }
        return map;
    }
    /**
     * Méthode qui fait la conversion de la donnée extraite vers un type
     * primitif
     *
     * @param field : objet contenant les informations sur le type auquel
     * appartient le champ de la donnée extraite
     * @param value : donnée à convertir
     * @return : retourne un String si le type du champ ne figure pas dans la
     * liste ci-dessus
     */
    private static Object convertToPrimitive(Field field, String value) {
        Object obj = value;
        if (field.getType().isAssignableFrom(Integer.class)
                || field.getType().isAssignableFrom(int.class)) {
            obj = Integer.valueOf(value);
        } else if (field.getType().isAssignableFrom(Double.class)
                || field.getType().isAssignableFrom(double.class)) {
            obj = Double.valueOf(value);
        } else if (field.getType().isAssignableFrom(java.math.BigDecimal.class)) {
            obj = new java.math.BigDecimal(value);
        } else if (field.getType().isAssignableFrom(Float.class)
                || field.getType().isAssignableFrom(float.class)) {
            obj = Float.valueOf(value);
        } else if (field.getType().isAssignableFrom(Long.class)
                || field.getType().isAssignableFrom(long.class)) {
            obj = Long.valueOf(value);
        } else if (field.getType().isAssignableFrom(Boolean.class)
                || field.getType().isAssignableFrom(boolean.class)) {
            Boolean.valueOf(value);
        }
        return obj;
    }
    /**
     * Méthode permettant de construire la donnée finale à écrire dans le
     * fichier texte
     *
     * @param outputFile
     * @param initialColumnsTableLine
     * @param mapParams
     * @param fieldsToBeTruncated
     * @param numeroLigne
     * @param truncateWriter
     * @return
     * @throws Exception
     */
    private static ResultFileParsing buildFinalColumnsTableLine(File outputFile, String[] initialColumnsTableLine, Map<Integer, Map> mapParams, Set<AlphaNumeriqueField> fieldsToBeTruncated, int numeroLigne, BufferedWriter truncateWriter) throws Exception {
        String[] finalColumnsTableLine = new String[mapParams.size() - 1];
        String[] columnsTableLine = new String[mapParams.size() - 1];
        //On copie les éléments à normaliser dans un nouveau tableau
        for (int j = 0; j < finalColumnsTableLine.length; j++) {
            //Arreter la copie si on atteint la fin du tableau initial
            if (j == initialColumnsTableLine.length) {
                j = finalColumnsTableLine.length;
            } else {
                final String result = initialColumnsTableLine[j] != null && !initialColumnsTableLine[j].isEmpty()
                        ? Normalizer
                                .normalize(initialColumnsTableLine[j], Normalizer.Form.NFD) //Retrait des caractères accentués
                                .replaceAll("\\p{M}+", "")
                        : "";
                columnsTableLine[j] = result;
            }
        }
        //Type de données utilisé pour retourner le résultat de la construction des lignes de données
        ResultFileParsing resultFileParsing = new ResultFileParsing();
        int index = 0;
        for (String str : columnsTableLine) {
            String columnTableLine = str != null ? str.trim() : "";
            if (index < mapParams.size() - 1) {
                Map<String, String> map = mapParams.get(index + 1);
                final int taille = Integer.parseInt(map.get(Constantes.LIBELLE_TAILLE));
                String typeDonnee = map.get(Constantes.LIBELLE_TYPE_DONNEE);
                //Traitement d'une donnée de type décimal
                if (typeDonnee.equalsIgnoreCase(Constantes.LIBELLE_DECIMAL)) {
                    finalColumnsTableLine[index] = normalizeDecimal(columnTableLine, map);
                    //Traitement d'une donnée de type DATE
                } else if (typeDonnee.equalsIgnoreCase(Constantes.LIBELLE_DATE)) {
                    if (columnTableLine.length() < taille) {
                        finalColumnsTableLine[index] = generateUnknown(taille - columnTableLine.length(), " ") + columnTableLine;
                    } else if (columnTableLine.length() == taille) {
                        finalColumnsTableLine[index] = columnTableLine;
                    } else {
                        finalColumnsTableLine[index] = columnTableLine.substring(0, taille);
                    }
                    //Traitement d'une donnée de type NUMERIQUE
                } else if (typeDonnee.equalsIgnoreCase(Constantes.LIBELLE_NUMERIQUE)) {
                    finalColumnsTableLine[index] = normalizeNumber(columnTableLine, taille);
//
                } else if (typeDonnee.equalsIgnoreCase(Constantes.LIBELLE_ALPHANUMERIQUE)) {   //Traitement d'une donnée de type ALPHANUMERIQUE
                    if (columnTableLine.length() < taille) {
                        finalColumnsTableLine[index] = generateUnknown(taille - columnTableLine.length(), " ") + columnTableLine;
                    } else if (columnTableLine.length() == taille) {
                        finalColumnsTableLine[index] = columnTableLine;
                    } else {
                        if (!fieldsToBeTruncated.isEmpty()) {
                            //Récupérer l'index de début du champ en cours de traitement
                            int indexDebutChamp = Integer.parseInt(map.get(Constantes.LIBELLE_INDEX));
                            //Mettre les champs à tronquer dans une liste afin d'y rechercher le champ en cours de traitement
                            List<AlphaNumeriqueField> liste = Arrays.asList(fieldsToBeTruncated.toArray(new AlphaNumeriqueField[0]))
                                    .stream().filter(a -> {
                                        // ici on vérifie si l'index de début du champ en cours de traitement correspond à l'index d'un des champs à tronquer
                                        //Car si 2 champs ont le même index, alors il s'agit d'un seul champ
                                        return a.getIndex() == indexDebutChamp;
                                    }).collect(Collectors.toList());
                            // Si on a trouvé un champ à tronquer qui a le même index que le champ courant alors, tronquer le champ
                            boolean found = (liste.size() == 1);
                            if (found) {
                                AlphaNumeriqueField alphaField = liste.get(0);
                                String finalData = columnTableLine.substring(0, taille);
                                TruncatedElement truncatedElement = new TruncatedElement(alphaField.getValidateur().getCodeTypeFichier(),
                                        alphaField.getCodeColonne(), columnTableLine, finalData,
                                        outputFile.getName(), LocalDateTime.now(), numeroLigne, taille, columnTableLine.length());
//                                Journalisation du champs tronqués
                                writeTruncatedElementsToFile(truncatedElement, truncateWriter);
                                resultFileParsing.setColumnTruncated(true);
                                finalColumnsTableLine[index] = finalData;
                            } else {
                                finalColumnsTableLine[index] = columnTableLine;
                            }
                        } else {
                            finalColumnsTableLine[index] = columnTableLine;
                        }
                    }
                } else {
                    finalColumnsTableLine[index] = columnTableLine;
                }
            }
            index++;
        }
        resultFileParsing.setFinalColumnsTableLine(finalColumnsTableLine);
        return resultFileParsing;
    }
    /**
     * Méthode qui normalise un nombre en ajoutant des zéros à gauche
     *
     * @param value
     * @param taille
     * @return
     */
    private static String normalizeNumber(String value, int taille) {
        String newValue = value
                .trim()
                .replaceAll("\\s+", "")
                .replaceAll("\\u00A0", "")//nbsp
                .replaceAll("&nbsp;", "")//nbsp
                .replaceAll("\\p{Z}", "")
                .replaceAll("\t", "")
                .replaceAll("\r", "")
                .replaceAll("\n", "");
        try {
            if (!newValue.matches("\\d+")) {
                newValue = new BigDecimal(newValue.replace(',', '.')).longValue() + "";//Remplacer la virgule par le point
            }
        } catch (Exception ex) {
        }
        return generateUnknown(taille - newValue.length(), " ") + newValue;
    }
    /**
     * Méthode qui normalise les nombres décimaux conformat aux tailles, en
     * ajoutant éventuellement des zéros à gauche de la partie entière et à
     * droite de la partie décimale renseignés dans le validateur
     *
     * @param value : chaîne à normaliser
     * @param map : map contenant les infos sur les parties entire et décimale
     * @return
     */
    private static String normalizeDecimal(String value, Map<String, String> map) {
        //Taille totale du nombre décimal
        int taille = Integer.parseInt(map.get(Constantes.LIBELLE_TAILLE));
        int taillePartieDecimale = Integer.parseInt(map.get(Constantes.LIBELLE_TAILLE_PARTIE_DECIMALE));
        String separateurDecimal = map.get(Constantes.LIBELLE_SEPARATEUR_DECIMAL);
        int tailleReelle = taille + taillePartieDecimale + separateurDecimal.trim().length();
        String newValue = value.trim()
                .replaceAll("\\s+", "")
                .replaceAll("\\u00A0", "")//nbsp
                .replaceAll("&nbsp;", "")//nbsp
                .replaceAll("\\p{Z}", "")
                .replaceAll("\t", "")
                .replaceAll("\r", "")
                .replaceAll("\n", "");
        if (newValue.length() >= tailleReelle) {
            return newValue;
        }
        if (newValue.matches("^\\d+[,.]?\\d+$")
                || newValue.matches("[-+]?\\d+(\\.\\d+)?[eE][-+]?\\d+")
                || newValue.matches("^\\d{1,3},\\d+E[+-]?\\d+$")) {//Notation scientifique
            try {
                newValue = new BigDecimal(newValue.replace(',', '.')).toPlainString();//Remplacer la virgule par le point
            } catch (Exception ex) {
            }
        }
        return generateUnknown(tailleReelle - newValue.length(), " ") + newValue;
    }
    /**
     * Méthode qui génère un nombre précis d'un quelconque caractère
     *
     * @param nbOfCharacter : nombre de fois à générer le caractère
     * @param character : caractère à générer
     * @return
     */
    private static String generateUnknown(int nbOfCharacter, String character) {
        String str = "";
        for (int i = 0; i < nbOfCharacter; i++) {
            str += character;
        }
        return str;
    }
    /**
     * Méthode qui extrait les données en se basant sur la taille des champs
     * définis dans le validateur
     */
    private static void parseLineUsingFieldLength(String line, Map<Integer, Map> mapParams, String delimiteurColonne, BufferedWriter bufferWriter, Charset charset) throws IOException {
        String[] columnsTableLine = new String[mapParams.size() - 1];
        try {
            int index = 0;
            int i = 1;
            while (i < mapParams.size()) {
                Map<String, String> map = mapParams.get(i);
                int taille = Integer.parseInt(map.get(Constantes.LIBELLE_TAILLE));
                if (i == mapParams.size() - 1) {
                    columnsTableLine[i - 1] = line.substring(index);
                } else {
                    columnsTableLine[i - 1] = line.substring(index, index + taille);
                }
                index = index + taille;
                //recupérer le charactère correspondant au delimiteur
                char character = ParserUtils.characterOfDelimiteur(delimiteurColonne);
                //Si le démimiteur n'est pas la chaîne vide
                if (character != '\0') {
                    //Si on ne trouve pas le délimiteur après avoir lu le champ précédent, on arrete le traitement de cette ligne car fichier mal formaté
                    if ((i < mapParams.size() - 1) && (line.charAt(index) != character)) {
                        //Interrompre l'extraction des données en remplissant la condition de sortie de laboucle
                        i = mapParams.size();
                    } else {
                        //Incrementer l'index un afin de traverser le séparateur
                        index = index + 1;
                    }
                }
                i++;
            }
            String[] encodedStrings = ParserUtils.encodeStrings(columnsTableLine, charset);
            ParserUtils.writeToFile(encodedStrings, bufferWriter);
        } catch (Exception ex) {
            Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    /**
     * Méthode qui écrit les informations sur les éléments tronqués dans un
     * fichier
     *
     * @param t
     * @param bufferWriter
     * @throws IOException
     */
    private static void writeTruncatedElementsToFile(TruncatedElement t, final BufferedWriter bufferWriter) throws IOException {
        //Ecriture dans le fichier output
        StringBuilder safeLineBuilder = new StringBuilder(0);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime date = t.getDateAction();
        safeLineBuilder.append("Fichier:").append(t.getFileName()).append("|");
        safeLineBuilder.append("Date:").append(date.format(formatter)).append("|");
        safeLineBuilder.append("Ligne:").append(t.getLineNumber()).append("|");
        safeLineBuilder.append("Colonne:").append(t.getCodeColonne()).append("|");
        safeLineBuilder.append("Taille attendue:").append(t.getTailleAttendue()).append("|");
        safeLineBuilder.append("Donnée finale:").append(t.getFinalData()).append("|");
        safeLineBuilder.append("Taille trouvée:").append(t.getTailleTrouvee()).append("|");
        safeLineBuilder.append("Donnée initiale:").append(t.getInitialData());
        String safeLine = safeLineBuilder.toString();
        if (safeLine.length() > 0) {
            bufferWriter.write(safeLine + System.lineSeparator());
        }
    }
    /**
     * Méthode qui retourne le nom fichier sans extension
     *
     * @param file
     * @return
     */
    private static String fileNameWithoutExtension(File file) {
        int index = file.getName().lastIndexOf(".");
        if (index > 0) {
            return file.getName().substring(0, index);
        } else {
            return file.getName();
        }
    }
    /**
     * Méthode qui construit le chemin du fichier qui va contenit les logs des
     * éléments tronqués
     *
     * @param validateur
     * @param outputFile
     * @return
     * @throws IOException
     */
    private static Path createTruncatedEltsPath(Validateur validateur, File outputFile) throws IOException {
        final String arhivageDirectory = ConfigurationService.getInstance().getCurrentConfig().getArchivesDir();
        final String today = LocalDate.now().toString();
        Path logDir = Paths.get(arhivageDirectory, today, validateur.getCodeTypeFichier(), "logs");
        if (!Files.exists(logDir, LinkOption.NOFOLLOW_LINKS)) {
            Files.createDirectories(logDir);
        }
        Path pathOfTruncatedElts = Paths.get(arhivageDirectory, today, validateur.getCodeTypeFichier(), "logs", fileNameWithoutExtension(outputFile) + "_truncated_elements.txt");
        return pathOfTruncatedElts;
    }
    /**
     * méthode permettant de construire le chemin du fichier d'origine dans le
     * répertoire d'archivages
     *
     * @param validateur
     * @param originalFile
     * @return
     * @throws IOException
     */
    private static Path createOriginalFileInArchive(Validateur validateur, File originalFile) throws IOException {
        final String arhivageDirectory = ConfigurationService.getInstance().getCurrentConfig().getArchivesDir();
        final String today = LocalDate.now().toString();
        Path originalFilesDir = Paths.get(arhivageDirectory, today, validateur.getCodeTypeFichier(), "fichiers");
        if (!Files.exists(originalFilesDir, LinkOption.NOFOLLOW_LINKS)) {
            Files.createDirectories(originalFilesDir);
        }
        Path originalFilePath = Paths.get(arhivageDirectory, today, validateur.getCodeTypeFichier(), "fichiers", originalFile.getName());
        final String fileNameWithoutExtension = fileNameWithoutExtension(originalFile);
        //Si le fichier existe dans le répertoire d'archivages, alors ajouter un numero d'ordre dans son nom
        if (Files.exists(originalFilePath, LinkOption.NOFOLLOW_LINKS)) {
            List<Path> existingFiles = Files.list(originalFilesDir).filter(p
                    -> p.toString().contains(fileNameWithoutExtension)).collect(Collectors.toList());
            int nbFiles = existingFiles.size();
            if (nbFiles > 0) {
                originalFilePath = Paths.get(arhivageDirectory, today, validateur.getCodeTypeFichier(), "fichiers",
                        fileNameWithoutExtension + "(" + nbFiles + ")" + getFileExtension(originalFile));
            }
        }
        return originalFilePath;
    }
    /**
     * Méthode qui retourne l'extension d'un fichier
     *
     * @param file
     * @return
     */
    private static String getFileExtension(File file) {
        int index = file.getName().lastIndexOf(".");
        if (index <= 0) {
            return "";
        } else {
            return file.getName().substring(index);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/JsonDataTypeUtil.java
New file
@@ -0,0 +1,102 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.dynamicjsonparser.pojo.JsonDataType;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.ModeleJson;
import com.megatim.fdxconvert.model.StructureChampJson;
import com.megatim.fdxconvert.model.SubObject;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 *
 * @author ASUS
 */
public class JsonDataTypeUtil {
    public static List<JsonDataType> constructJsonDataType(ModeleJson modeleJson) {
        List<JsonDataType> jsonDataTypes = new ArrayList<>();
        modeleJson.getListeStructureJson().forEach(s -> {
            if (s.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                jsonDataTypes.add(new JsonDataType(s.getLibelle(), contructSubJsonDataType(s.getTypeOfSubObject()), modeleJson.getObjectName(), s.isListe()));
            } else {
                JsonDataType json = new JsonDataType(s.getLibelle(), s.getTypeDonnee(), modeleJson.getObjectName(), s.isListe());
                if (s.getTypeDonnee().equals(TypeDonnee.DATE)) {
                    json.setFormatDate(s.getFormatDate());
                    json.setSeparateurDate(s.getCodeDelimiteurDate());
                }
                jsonDataTypes.add(json);
            }
        });
        return jsonDataTypes;
    }
    public static List<JsonDataType> constructJsonDataType(JsonStructure jsonStructure) {
        List<JsonDataType> jsonDataTypes = new ArrayList<>();
        jsonStructure.getFields().forEach(s -> {
            if (s.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                jsonDataTypes.add(new JsonDataType(s.getName(), constructJsonDataType(s), s.getName(), s.isRequired(), s.isCollection()));
            } else {
                JsonDataType json = new JsonDataType(s.getName(), s.getTypeDonnee(), jsonStructure.getName(), s.isRequired(), s.isCollection());
                if (s.getTypeDonnee().equals(TypeDonnee.DATE)) {
                    json.setFormatDate(s.getFormatDate());
                    json.setSeparateurDate(s.getCodeDelimiteurDate());
                }
                jsonDataTypes.add(json);
            }
        });
        return jsonDataTypes;
    }
    private static List<JsonDataType> contructSubJsonDataType(SubObject subObject) {
        List<JsonDataType> liste = new ArrayList<>();
        //Filtrer afin de ne garder que les champs des sous-objets
        List<StructureChampJson> structures = subObject.getListeStructureJson().stream().filter(s -> s.getModeleJson() == null).collect(Collectors.toList());
        structures.forEach(c -> {
            if (c.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                liste.add(new JsonDataType(c.getLibelle(), contructSubJsonDataType(c.getTypeOfSubObject()), c.getFieldOfSubObject().getSubObjectName(), c.isListe()));
            } else {
                JsonDataType json = new JsonDataType(c.getLibelle(), c.getTypeDonnee(), subObject.getSubObjectName(), c.isListe());
                if (c.getTypeDonnee().equals(TypeDonnee.DATE)) {
                    json.setFormatDate(c.getFormatDate());
                    json.setSeparateurDate(c.getCodeDelimiteurDate());
                }
                liste.add(json);
            }
        });
        return liste;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ParserUtils.java
New file
@@ -0,0 +1,246 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.typefichier.validator.model.enums.FileExtension;
import com.megatim.typefichier.validator.utilities.Constantes;
import com.megatim.fdxconvert.exceptions.ValidatorException;
import com.megatim.fdxconvert.model.Validateur;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
/**
 *
 * @author ASUS
 */
public class ParserUtils {
    private ParserUtils() {
    }
    public static boolean isConvertDataBeforeValidation(File file) throws Exception {
        String extension = null;
        boolean result = true;
        Document doc = intialize(file);
        NodeList entityList = doc.getElementsByTagName("entity"); //Liste des noeud <entity>
        //Le validateur XML doit avoir au moins deux balises <entity> pour être conforme
        if (entityList.getLength() >= 2) {
            NamedNodeMap attributes = entityList.item(1).getAttributes();
            for (int i = 0; i < attributes.getLength(); i++) {
                String assertionAttributeName = attributes.item(i).getNodeName();
                String assertionAttributeValue = attributes.item(i).getNodeValue();
                if (assertionAttributeName.equalsIgnoreCase(Constantes.EXTENSION)) {
                    extension = assertionAttributeValue;
                    if (extension != null
                            && (extension.equalsIgnoreCase(FileExtension.CSV.name())
                            || extension.equalsIgnoreCase(FileExtension.XLS.name())
                            || extension.equalsIgnoreCase(FileExtension.XLSX.name()))) {
                        result = false;
                        break;
                    }
                }
            }
        }
        return result;
    }
    /**
     * Méthode qui extrait les informations de validation d'un fichier xml et
     * les renvoie dans une map
     *
     * @param validateur : Validateur dont on veut extraire les infos
     * @return : retourne une map de la forme
     * <position_colonne_dans_une_ligne_de_donnee, informations_sur_la_colonne>
     * @throws Exception
     */
    public static Map<Integer, Map> getValidateurElements(Validateur validateur) throws Exception {
        return com.megatim.typefichier.validator.utilities.ParserUtils.getValidateurElements(validateur.getContent());
    }
    /**
     * Méthode qui retire le caractère retour charriot dans une chaîne
     *
     * @param str
     * @return
     */
//    public static String removeReturnCharriot(String str) {
//        String result = str;
//
//        if (str != null && !str.isEmpty()) {
//            String[] tab = str.split("\n");
//            result = "";
//
//            for (String s : tab) {
//                result += s;
//            }
//        }
//        return result;
//    }
    /**
     * Méthode utilitaire pour extraire les données dans un fichier xml
     *
     * @param array
     * @return
     * @throws Exception
     */
    private static Document intialize(byte[] array) throws Exception {
        /**
         * Défini un factory qui aide à obtenir un parseur qui produit un arbre
         * d'objets DOM à partir d'un docuent XML.
         */
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        /**
         * création d'un objet du builder pour parser le fichier XML.
         */
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new ByteArrayInputStream(array));
        doc.getDocumentElement().normalize();
        return doc;
    }
    private static Document intialize(File file) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(file);
        doc.getDocumentElement().normalize();
        return doc;
    }
    /**
     * Méthode pour obtenir l'objet de typr char correspondant à chaque
     * délimiteur
     *
     * @param delimiteur
     * @return
     */
    public static char characterOfDelimiteur(String delimiteur) {
        char character;
        switch (delimiteur) {
            case "\\t":
                character = '\t';
                break;
            case "\\n":
                character = '\n';
                break;
            case "":
                character = '\0';
                break;
            default:
                character = delimiteur.charAt(0);
        }
        return character;
    }
    /**
     * Méthode permettant d'encoder une chaîne de caractères
     *
     * @param datas : tableau de String à encoder
     * @param charset : encodage à utiliser
     * @return
     */
    public static String[] encodeStrings(String[] datas, Charset charset) {
        String[] encodedStrings = new String[datas.length];
        for (int i = 0; i < encodedStrings.length; i++) {
            byte[] bytesOfString = datas[i].getBytes();
            encodedStrings[i] = new String(bytesOfString, charset);
        }
        return encodedStrings;
    }
    /**
     * Méthode qui extrait une sous-chaîne dans une chaîne de caractères en
     * utilisant un délimiteur
     *
     * @param line : chaîne mère à séparer
     * @param character : délimiteur de chaîne
     * @return : retourne un tableau contenant les châines extraites
     */
    public static String[] splitIntoColumns(String line, char character) {
        int count = 0;
        for (int i = 0; i < line.length(); i++) {
            if (line.charAt(i) == character) {
                count++;
            }
        }
        String[] columns = new String[count + 1];
        StringBuilder builder = new StringBuilder(0);
        count = 0;
        for (int i = 0; i < line.length(); i++) {
            if (line.charAt(i) == character) {
                columns[count] = builder.toString();
                builder = new StringBuilder(0);
                count++;
            } else {
                builder.append(line.charAt(i));
            }
        }
        columns[count] = builder.toString();
        return columns;
    }
    /**
     * Méthode qui écrit dans un fichier
     *
     * @param finalColumnsTableLine : liste des châines à écrire dans le fichier
     * @param bufferWriter : ressource permettant d'écrire dans le fichier
     */
    public static void writeToFile(String[] finalColumnsTableLine, final BufferedWriter bufferWriter) throws IOException {
        //Ecriture dans le fichier output
        StringBuilder safeLineBuilder = new StringBuilder(0);
        for (String s : finalColumnsTableLine) {
            safeLineBuilder.append(s);
        }
        String safeLine = safeLineBuilder.toString();
        if (safeLine.length() > 0) {
            bufferWriter.write(safeLine + System.lineSeparator());
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/TypeFichierJsonConverter.java
New file
@@ -0,0 +1,83 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import static com.megatim.dynamicjsonparser.enums.TypeDonnee.ALPHANUMERIQUE;
import static com.megatim.dynamicjsonparser.enums.TypeDonnee.DATE;
import static com.megatim.dynamicjsonparser.enums.TypeDonnee.DECIMAL;
import static com.megatim.dynamicjsonparser.enums.TypeDonnee.NUMERIQUE;
import com.megatim.dynamicjsonparser.pojo.JsonField;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichierJson;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author ASUS
 */
public class TypeFichierJsonConverter {
    private final TypeFichierJson typeFichierJson;
    public TypeFichierJsonConverter(TypeFichierJson typeFichierJson) {
        this.typeFichierJson = typeFichierJson;
    }
    public List<JsonField> convert() {
        return convert(typeFichierJson.getJsonStructure().getFields());
    }
    private List<JsonField> convert(List<JsonStructure> jsonStructs) {
        List<JsonField> fields = new ArrayList<>();
        jsonStructs.forEach(j -> {
            if (j.getTypeDonnee() != null) {
                if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                    if (j.getFields() != null && !j.getFields().isEmpty()) {
                        fields.add(new JsonField(j.getName(), convert(j.getFields()), j.getName(),j.getLengthh(), j.isRequired(), j.isCollection()));
                    }
                } else {
                    fields.add(convert(j, j.getParent().getName()));
                }
            }
        });
        return fields;
    }
    private JsonField convert(JsonStructure js, String className) {
        Class<?> clazz;
        switch (js.getTypeDonnee()) {
            case ALPHANUMERIQUE:
                clazz = String.class;
                break;
            case NUMERIQUE:
                clazz = Long.class;
                break;
            case DATE:
                clazz = LocalDate.class;
                break;
            case DECIMAL:
                clazz = BigDecimal.class;
                break;
            default:
                clazz = String.class;
        }
        JsonField dynamicField = new JsonField(clazz, js.getName(), className, js.getLengthh(), js.isRequired(), js.isCollection());
        dynamicField.setFormatDate(js.getFormatDate());
        dynamicField.setSeparateurDate(js.getCodeDelimiteurDate());
        return dynamicField;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/TypeFichierJsonMarshaller.java
New file
@@ -0,0 +1,81 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.model.jaxb.TypeFichierJsonsList;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
 *
 * @author ASUS
 */
public class TypeFichierJsonMarshaller {
    public static void marshall(List<TypeFichierJson> typeFichierJsons, String destinationDir) throws JAXBException {
        if (typeFichierJsons == null) {
            typeFichierJsons = new ArrayList<>();
        }
        JAXBContext context = JAXBContext.newInstance(TypeFichierJsonsList.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String date = formatter.format(LocalDateTime.now());
        marshaller.marshal(new TypeFichierJsonsList(typeFichierJsons), new File(destinationDir, "typeFichierJsons" + date + ".xml"));
    }
    public static void marshall(String destinationDir, TypeFichierJson typeFichierJson) throws JAXBException {
        if (typeFichierJson == null) {
            return;
        }
        JAXBContext context = JAXBContext.newInstance(TypeFichierJson.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String date = formatter.format(LocalDateTime.now());
        marshaller.marshal(typeFichierJson, new File(destinationDir, typeFichierJson.getTypeFichier().getCode() + date + ".xml"));
    }
    public static TypeFichierJsonsList unMarshall(String filePath) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(TypeFichierJsonsList.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        TypeFichierJsonsList typeFichierJsonsList = (TypeFichierJsonsList) unmarshaller.unmarshal(new File(filePath));
        typeFichierJsonsList.getTypeFichierJson().forEach(t -> setParent(t.getJsonStructure()));
        return typeFichierJsonsList;
    }
    public static TypeFichierJson unMarshallOne(String filePath) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(TypeFichierJson.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        TypeFichierJson typeFichierJson = (TypeFichierJson) unmarshaller.unmarshal(new File(filePath));
        setParent(typeFichierJson.getJsonStructure());
        return typeFichierJson;
    }
    private static void setParent(JsonStructure jsonStruct) {
        jsonStruct.getFields().forEach(f -> {
            f.setParent(jsonStruct);
            setParent(f);
        });
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/Utilities.java
New file
@@ -0,0 +1,61 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.fdxconvert.App;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author ASUS
 */
public class Utilities {
    private Utilities() {
    }
    //Mots reservés de Java
    private final static Set<String> reservedWords = new HashSet<>(Arrays.asList("abstract", "assert", "boolean", "break", "byte", "case", "catch", "char",
            "class", "continue", "const", "default", "do", "double", "else", "enum", "exports", "extends", "final", "finally",
            "false", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "module", "native",
            "new", "null", "package", "private", "protected", "public", "requires", "return", "short", "static", "strictfp", "super", "switch",
            "synchronized", "this", "throw", "throws", "transient", "true", "try", "var", "void", "volatile", "while"));
    public static StringBuilder validateName(String name, String libelle) {
        StringBuilder message = new StringBuilder("");
        if (reservedWords.contains(name)) {
            message.append("\"").append(name).append("\"").append(" est un mot reservé\n");
        }
        if (!name.matches("^([a-zA-Z]|_|\\$)(\\w|\\$)*$")) {
            message.append(libelle).append(" doit commencer par une lettre [a-zA-Z], par le signe dollar( $ ) "
                    + "ou par un trait de soulignement( _ ) et ne doit pas contenir d'espace\n");
        }
        return message;
    }
    public static int getNbThreads() {
        Properties appProps = new Properties();
        int nbThreads = 1;
        try {
            appProps.load(new FileInputStream("./app.properties"));
            nbThreads = Integer.parseInt(appProps.getProperty("nbThreads"));
        } catch (Exception ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nbThreads;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/ValidateurParser.java
New file
@@ -0,0 +1,289 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.typefichier.validator.utilities.Constantes;
import com.megatim.fdxconvert.exceptions.ValidatorException;
import com.megatim.fdxconvert.pojo.ColumnDefinition;
import java.io.File;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
 *
 * @author ASUS
 */
public class ValidateurParser {
    /**
     * Méthode permettant d'extraire les éléments du validateur XML
     *
     * @param file : Fichier du validateur
     * @param codeTypeFichier
     * @return
     * @throws Exception
     */
    public static List<ColumnDefinition> retrieveFieldsFromValidator(File file, String codeTypeFichier) throws Exception {
        Document doc = intialize(file);
        NodeList entityList = doc.getElementsByTagName("entity"); //Liste des noeud <entity>
        //Map qui stocke le champ à une position, ainsi que les caractéristiques de champ(typeDonnee, taille, index de debut d'extraction)
        Map<Integer, Map<String, String>> mapParams = new HashMap<>();
        int position = 1;
        //Le validateur XML doit avoir au moins deux balises <entity> pour être conforme
        if (entityList.getLength() >= 2) {
            //Liste des noeud de type <validation> du deuxième Noeud <entity>
            NodeList entityFileLineChildren = entityList.item(1).getChildNodes();
            //Map qui contient champ set son nombe d'occurrence dans le fichier en cours de traitement
            Map<String, Integer> mapFieldName = new HashMap<>();
            //parcours de la balise <entity> pour récupérer ses enfants
            for (int i = 0; i < entityFileLineChildren.getLength(); i++) {
                if (entityFileLineChildren.item(i) != null && entityFileLineChildren.item(i).getAttributes() != null) {
                    //balise <validation>
                    Node validation = entityFileLineChildren.item(i);
                    if (validation != null) {
                        Map<String, String> mapAttributes = new HashMap<>();
                        //Liste des assertions de la balise <validation>
                        NodeList assertions = validation.getChildNodes();
                        for (int r = 0; r < assertions.getLength(); r++) {
                            Node assertion = assertions.item(r);
                            if (assertion != null && assertion.getAttributes() != null) {
                                NamedNodeMap assertionAttributes = assertion.getAttributes();
                                for (int q = 0; q < assertionAttributes.getLength(); q++) {
                                    String assertionAttributeName = assertionAttributes.item(q).getNodeName();
                                    String assertionAttributeValue = assertionAttributes.item(q).getNodeValue();
                                    if (assertionAttributeName.equalsIgnoreCase(Constantes.ERROR_CODE)) {
                                        String fieldName = constructFieldName(assertionAttributeValue, codeTypeFichier);
                                        //Stocker le nbre d'occurrences trouvés dans la map
                                        if (mapFieldName.containsKey(fieldName)) {
                                            Integer nbOccurrences = mapFieldName.get(fieldName);
                                            mapFieldName.replace(fieldName, nbOccurrences + 1);
                                        } else {
                                            mapFieldName.put(fieldName, 1);
                                        }
                                        Integer nbOccurrences = mapFieldName.get(fieldName);
                                        String finalFieldName = nbOccurrences == 1 ? fieldName : fieldName + (nbOccurrences - 1);
                                        mapAttributes.put(Constantes.FIELD_NAME, finalFieldName);
                                        break;
                                    }
                                }
                                //Liste des balises <param-value> de la balise <assertion>
                                NodeList params = assertion.getChildNodes();
                                for (int j = 0; j < params.getLength(); j++) {
                                    if (params.item(j) != null && params.item(j).getAttributes() != null) {
                                        //Les attributs de la balise <param-value>
                                        NamedNodeMap attributesParamValue = params.item(j).getAttributes();
                                        Integer positionAttribute = null;
                                        for (int k = 0; k < attributesParamValue.getLength(); k++) {
                                            String nodeValue = attributesParamValue.item(k).getNodeValue();
                                            String nextNodeValue = attributesParamValue.item(++k).getNodeValue();
                                            mapAttributes.put(nodeValue, nextNodeValue);
                                            if (nodeValue.equals(Constantes.LIBELLE_TAILLE) && !nextNodeValue.equalsIgnoreCase(Constantes.EQUAL_PARAM)) {
                                                mapAttributes.put(nodeValue, nextNodeValue);
                                            } else if (nodeValue.equals(Constantes.LIBELLE_TYPE_DONNEE)) {
                                                mapAttributes.put(nodeValue, nextNodeValue);
                                            } else if (nodeValue.equals(Constantes.LIBELLE_POSITION)) {
                                                positionAttribute = Integer.valueOf(nextNodeValue);
                                            }
                                        }
                                        mapParams.put(positionAttribute != null ? positionAttribute : position, mapAttributes);
                                    }
                                }
                            }
                        }
                    }
                    position++;
                }
            }
        }
//        mapParams.remove(mapParams.size());
        List<ColumnDefinition> columnsDefinition = getColumnsDefinition(mapParams);
        return columnsDefinition;
    }
    /**
     * Méthode utilitaire pour extraire les données dans un fichier xml
     *
     * @param array
     * @return
     * @throws Exception
     */
    private static Document intialize(File file) throws Exception {
        /**
         * Défini un factory qui aide à obtenir un parseur qui produit un arbre
         * d'objets DOM à partir d'un document XML.
         */
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        /**
         * création d'un objet du builder pour parser le fichier XML.
         */
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(file);
        doc.getDocumentElement().normalize();
        return doc;
    }
    /**
     * Méthode qui met les informations du validateur dans un ColumnDefinition
     * pour utilisation future
     *
     * @param mapStructure
     * @return
     */
    private static List<ColumnDefinition> getColumnsDefinition(Map<Integer, Map<String, String>> mapStructure) throws ValidatorException {
        List<ColumnDefinition> columns = new ArrayList<>();
        for (Integer key : mapStructure.keySet()) {
            ColumnDefinition column = new ColumnDefinition();
            Map<String, String> value = mapStructure.get(key);
            column.setPosition(key);
            if (value.get(Constantes.LIBELLE_TAILLE) != null) {
                column.setTaille(Integer.parseInt(value.get(Constantes.LIBELLE_TAILLE)));
            }
            column.setName(value.get(Constantes.FIELD_NAME));
            column.setTypeDonnee(TypeDonnee.fromValeur(value.get(Constantes.LIBELLE_TYPE_DONNEE)).getValue());
            if (column.getTypeDonnee().equalsIgnoreCase(TypeDonnee.DECIMAL.toString())) {
                if (value.get(Constantes.LIBELLE_TAILLE_PARTIE_DECIMALE) != null) {
                    column.setTaillePartieDecimale(Integer.parseInt(value.get(Constantes.LIBELLE_TAILLE_PARTIE_DECIMALE)));
                }
            } else if (column.getTypeDonnee().equalsIgnoreCase(TypeDonnee.DATE.toString())) {
                String separateurDate = value.get(Constantes.LIBELLE_SEPARATEUR_DATE);
                String formatDate = value.get(Constantes.LIBELLE_FORMAT_DATE);
                if (formatDate != null && !formatDate.isEmpty()) {
                    if (separateurDate != null && !separateurDate.isEmpty()) {
                        if (separateurDate.equals("-") || separateurDate.equals("/")) {
                            formatDate = addSeparateurToDateFormat(formatDate, separateurDate, column.getName());
                        } else {
                            throw new ValidatorException("Le séparateur de date du champ " + column.getName() + " ne peut être " + separateurDate);
                        }
                    }
                    column.setFormatDate(formatDate);
                    column.setSeparateurDate(separateurDate);
                } else {
                    throw new ValidatorException("Le format date du champ " + column.getName() + " est absent");
                }
            }
            columns.add(column);
        }
        return columns;
    }
    /**
     * Méthode qui ajoute le séparateur renseigné dans le validateur au format
     *
     * @param formatDate
     * @param separateurDate
     * @param columnName
     * @return
     */
    public static String addSeparateurToDateFormat(String formatDate, String separateurDate, String columnName) {
        StringBuilder dateValue = new StringBuilder();
        switch (formatDate) {
            case "ddMMyyyy":
                dateValue.append("dd").append(separateurDate).append("MM").append(separateurDate).append("yyyy");
                break;
            case "ddyyyyMM":
                dateValue.append("dd").append(separateurDate).append("yyyy").append(separateurDate).append("MM");
                break;
            case "MMddyyyy":
                dateValue.append("MM").append(separateurDate).append("dd").append(separateurDate).append("yyyy");
                break;
            case "MMyyyydd":
                dateValue.append("MM").append(separateurDate).append("yyyy").append(separateurDate).append("dd");
                break;
            case "yyyyddMM":
                dateValue.append("yyyy").append(separateurDate).append("dd").append(separateurDate).append("MM");
                break;
            case "yyyyMMdd":
                dateValue.append("yyyy").append(separateurDate).append("MM").append(separateurDate).append("dd");
                break;
            case "yyyy":
                dateValue.append("yyyy");
                break;
            case "yyyyMM":
                dateValue.append("yyyy").append(separateurDate).append("MM");
            case "MMyyyy":
                dateValue.append("MM").append(separateurDate).append("yyyy");
                break;
            default:
                throw new ValidatorException("Le format date " + formatDate + " du champ" + columnName + " n'est pas acceptable ");
        }
        return dateValue.toString();
    }
    private static String constructFieldName(String fieldName, String codeTypeFichier) {
        fieldName = fieldName.startsWith(codeTypeFichier)
                ? fieldName.substring(6)
                : fieldName;
        fieldName = fieldName.equalsIgnoreCase("int") ? "_" + fieldName : fieldName;
        return removeAccents(fieldName.replaceAll(" ", "_"));
    }
    private static String removeAccents(String input) {
        // Normalize to decomposed form (NFD): é → e + ´, è → e + `
        String normalized = Normalizer.normalize(input, Normalizer.Form.NFD);
        // Remove all diacritical marks (accents)
        return normalized.replaceAll("\\p{M}", "");
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/util/XmlUtils.java
New file
@@ -0,0 +1,34 @@
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconvert.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
/**
 *
 * @author ASUS
 */
public class XmlUtils {
    private XmlUtils() {
    }
    public static Object unMarshal(File xmlFile, Class<?> classe) throws JAXBException, FileNotFoundException, XMLStreamException {
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(xmlFile));
        JAXBContext jaxbContext = JAXBContext.newInstance(classe);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        return jaxbUnmarshaller.unmarshal(xmlStreamReader);
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureFormViewModel.java
New file
@@ -0,0 +1,115 @@
package com.megatim.fdxconvert.viewmodel;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatimfx.components.customdialogs.AlertMessageUtil;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.service.TypeFichierJsonService;
import com.megatim.fdxconvert.service.TypeFichierService;
import com.megatim.fdxconvert.views.jsonstructure.NestedJsonStructure;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import java.util.Set;
import java.util.stream.Collectors;
public class JsonStructureFormViewModel {
    private final ObservableList<TypeFichier> typeFichiers = FXCollections.observableArrayList();
    private final BooleanProperty loading = new SimpleBooleanProperty(false);
    private final ObjectProperty<TypeFichier> selectedTypeFichier;
    private final ObjectProperty<TypeFichierJson> result = new SimpleObjectProperty<>(null);
    private final TypeFichierJson typeFichierJson;
    public JsonStructureFormViewModel(TypeFichierJson typeFichierJson) {
        this.typeFichierJson = typeFichierJson != null ? typeFichierJson : new TypeFichierJson();
        selectedTypeFichier = new SimpleObjectProperty<>(typeFichierJson != null ? typeFichierJson.getTypeFichier() : null);
    }
    public void init() {
        loadTypeFichiersFromDB();
    }
    private void loadTypeFichiersFromDB() {
        Task<Set<TypeFichier>> task = new Task() {
            @Override
            protected Object call() throws Exception {
                return TypeFichierService.getInstance().getAll();
            }
        };
        task.setOnRunning(e -> loading.set(true));
        task.setOnSucceeded(e -> {
            loading.set(false);
            typeFichiers.clear();
            typeFichiers.setAll(task.getValue());
        });
        task.setOnFailed(e -> {
            loading.set(false);
            AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public void createTypeFichierJSON(NestedJsonStructure nestedJsonStructure) {
        Task<TypeFichierJson> task = new Task() {
            @Override
            protected TypeFichierJson call() throws Exception {
                typeFichierJson.setJsonStructure(jsonStructure(nestedJsonStructure, null));
                if(typeFichierJson.getId() == null) {
                    typeFichierJson.setTypeFichier(selectedTypeFichier.get());
                    return TypeFichierJsonService.getInstance().add(typeFichierJson);
                }
                return TypeFichierJsonService.getInstance().edit(typeFichierJson);
            }
        };
        task.setOnRunning(e -> loading.set(true));
        task.setOnSucceeded(e -> {
            loading.set(false);
            result.set(typeFichierJson);
        });
        task.setOnFailed(e -> {
            loading.set(false);
            AlertMessageUtil.showAlertException(task.getException(), "Une exception s'est produite pendant le traitement", "Erreur");
        });
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    private JsonStructure jsonStructure(NestedJsonStructure nestedJsonStructure, JsonStructure parent) {
        JsonStructure jsonStructure = new JsonStructure();
        jsonStructure.setName(nestedJsonStructure.name());
        jsonStructure.setFormatDate(nestedJsonStructure.format());
        jsonStructure.setTypeDonnee(nestedJsonStructure.typeDonnee());
        jsonStructure.setLengthh(nestedJsonStructure.taille());
        jsonStructure.setRequired(nestedJsonStructure.isRequired());
        jsonStructure.setCollection(nestedJsonStructure.isCollection());
        if (nestedJsonStructure.typeDonnee().equals(TypeDonnee.DATE)) {
            jsonStructure.setCodeDelimiteurDate(nestedJsonStructure.delimiteur().getCode());
        }
        jsonStructure.setParent(parent);
        jsonStructure.setFields(nestedJsonStructure.children().stream().map(nJ -> jsonStructure(nJ, jsonStructure)).collect(Collectors.toList()));
        return jsonStructure;
    }
    public ObjectProperty<TypeFichierJson> resultProperty() {
        return result;
    }
    public ObjectProperty<TypeFichier> selectedTypeFichierProperty() {
        return selectedTypeFichier;
    }
    public ObservableList<TypeFichier> getTypeFichiers() {
        return typeFichiers;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureTableViewModel.java
New file
@@ -0,0 +1,171 @@
package com.megatim.fdxconvert.viewmodel;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.dao.JsonStructureDAO;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.service.TypeFichierJsonService;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class JsonStructureTableViewModel {
    private final ObservableList<TypeFichierJson> data = FXCollections.observableArrayList();
    private final ObjectProperty<TypeFichierJson> selectedItem = new SimpleObjectProperty<>(null);
    private final BooleanProperty loading = new SimpleBooleanProperty(false);
    private final IntegerProperty pageNumber = new SimpleIntegerProperty(0);
    private final LongProperty totalElements = new SimpleLongProperty(0);
    private final LongProperty numberPerPage = new SimpleLongProperty(0);
    private final BooleanProperty last = new SimpleBooleanProperty(false);
    private final BooleanProperty first = new SimpleBooleanProperty(false);
    private final StringBinding paginationNumberInfo = Bindings.createStringBinding(() -> evalString(), pageNumber, numberPerPage, totalElements);
    public void init() {
        loadData(pageNumber.get());
        pageNumber.addListener((observable, oldValue, newValue) -> {
            loadData(newValue.intValue());
        });
    }
    public void reloadData() {
        loadData(pageNumber.get());
    }
    public void loadSelectedItemChildren(Consumer<TypeFichierJson> consumer) {
        Task<JsonStructure> task = new Task<JsonStructure>() {
            @Override
            protected JsonStructure call() throws Exception {
                loading.set(true);
                JsonStructure jsonStructure = JsonStructureDAO.loadSubJsonStructure(selectedItem.get().getJsonStructure());
                setDelimiteurDate(jsonStructure.getFields());
                return jsonStructure;
            }
        };
        task.setOnSucceeded(e -> {
            loading.set(false);
            selectedItem.get().setJsonStructure(task.getValue());
            consumer.accept(selectedItem.get());
        });
        task.setOnFailed(e -> loading.set(false));
        task.setOnCancelled(e -> loading.set(false));
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public void deleteSelectedItem() {
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                loading.set(true);
                TypeFichierJsonService.getInstance().delete(selectedItem.get());
                return null;
            }
        };
        task.setOnSucceeded(e -> {
            loading.set(false);
            pageNumber.set(0);
            loadData(pageNumber.get());
        });
        task.setOnFailed(e -> loading.set(false));
        task.setOnCancelled(e -> loading.set(false));
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public void nextPage() {
        if (!last.get()) {
            pageNumber.set(pageNumber.get() + 1);
        }
    }
    public void previousPage() {
        if (!first.get()) {
            pageNumber.set(pageNumber.get() - 1);
        }
    }
    private void setDelimiteurDate(List<JsonStructure> jsonStructures) {
        jsonStructures.stream().forEach(j -> {
            if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) {
                setDelimiteurDate(j.getFields());
            } else if (j.getTypeDonnee().equals(TypeDonnee.DATE) && j.getCodeDelimiteurDate() != null) {
                j.setDelimiteurDate(App.SEPARATEURS_DATE.get(j.getCodeDelimiteurDate()));
            }
        });
    }
    private void loadData(int page) {
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                loading.set(true);
                List<TypeFichierJson> typeFichierJsons = TypeFichierJsonService.getInstance().getAllByPage(page, Arrays.asList());
                Platform.runLater(() -> {
                    data.clear();
                    data.addAll(typeFichierJsons);
                    totalElements.set(TypeFichierJsonService.getInstance().getTotalElements());
                    numberPerPage.set(TypeFichierJsonService.getInstance().getNumberPerPage());
                    last.set(TypeFichierJsonService.getInstance().isLast());
                    first.set(TypeFichierJsonService.getInstance().isFirst());
                });
                return null;
            }
        };
        task.setOnSucceeded(e -> loading.set(false));
        task.setOnFailed(e -> loading.set(false));
        task.setOnCancelled(e -> loading.set(false));
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }
    public ObservableList<TypeFichierJson> getData() {
        return data;
    }
    public BooleanProperty getLoadingProperty() {
        return loading;
    }
    public StringBinding getPaginationNumberInfo() {
        return paginationNumberInfo;
    }
    public BooleanProperty getLastProperty() {
        return last;
    }
    public BooleanProperty getFirstProperty() {
        return first;
    }
    public ObjectProperty<TypeFichierJson> selectedItemProperty() {
        return selectedItem;
    }
    private String evalString() {
        long currentNumber = (pageNumber.get() + 1) * numberPerPage.get();
        return (currentNumber < totalElements.get() ? currentNumber : totalElements.get()) + "/" + totalElements.get();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/viewmodel/JsonStructureViewModel.java
New file
@@ -0,0 +1,177 @@
package com.megatim.fdxconvert.viewmodel;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.views.jsonstructure.DefaultNestedJsonStructure;
import com.megatim.fdxconvert.views.jsonstructure.NestedJsonStructure;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.util.UUID;
public class JsonStructureViewModel {
    private final String id;
    private final boolean root;
    private final int level;
    private final StringProperty name = new SimpleStringProperty();
    private final ObjectProperty<TypeDonnee> type = new SimpleObjectProperty(TypeDonnee.ALPHANUMERIQUE);
    private final StringProperty format = new SimpleStringProperty();
    private final ObjectProperty<Delimiteur> delimitor = new SimpleObjectProperty<>(null);
    private final IntegerProperty taille = new SimpleIntegerProperty(1);
    private final BooleanProperty required = new SimpleBooleanProperty(false);
    private final BooleanProperty collection = new SimpleBooleanProperty(false);
    private final BooleanProperty valid = new SimpleBooleanProperty(false);
    private final BooleanProperty validName = new SimpleBooleanProperty(false);
    private final BooleanProperty validType = new SimpleBooleanProperty(false);
    private final BooleanProperty validFormat = new SimpleBooleanProperty(false);
    private final BooleanProperty validDelimitor = new SimpleBooleanProperty(false);
    private final BooleanProperty validTaille = new SimpleBooleanProperty(false);
    private final BooleanProperty hasChild = new SimpleBooleanProperty(false);
    private final BooleanProperty hasDateType = new SimpleBooleanProperty(false);
    private final BooleanProperty hasSquareBracket = new SimpleBooleanProperty(false);
    private final BooleanProperty hasObjectSquareBracket = new SimpleBooleanProperty(false);
    private final ObservableList<JsonStructureViewModel> children = FXCollections.observableArrayList(vm -> new Observable[]{vm.validProperty()});
    public JsonStructureViewModel(boolean root, int level, NestedJsonStructure nestedJsonStructure) {
        this.root = root;
        this.level = level;
        id = UUID.randomUUID().toString();
        if (nestedJsonStructure != null) {
            name.set(nestedJsonStructure.name());
            type.set(nestedJsonStructure.typeDonnee());
            format.set(nestedJsonStructure.format());
            delimitor.set(nestedJsonStructure.delimiteur());
            taille.set(nestedJsonStructure.taille());
            required.set(nestedJsonStructure.isRequired());
            collection.set(nestedJsonStructure.isCollection());
            nestedJsonStructure.children().forEach(nS -> {
                children.add(new JsonStructureViewModel(false, level + 1, nS));
            });
        }
    }
    public void init() {
        hasChild.bind(Bindings.createBooleanBinding(() -> isObjectType(), type));
        hasDateType.bind(Bindings.createBooleanBinding(() -> isDateType(), type));
        hasSquareBracket.bind(Bindings.createBooleanBinding(() -> !isObjectType() && collection.get(), type, collection));
        hasObjectSquareBracket.bind(Bindings.createBooleanBinding(() -> isObjectType() && collection.get(), type, collection));
        if (root) {
            this.required.set(true);
            this.collection.set(true);
            this.type.set(TypeDonnee.OBJET);
        }
        validName.bind(Bindings.createBooleanBinding(() -> name.get() != null && name.get().length() > 0, name));
        validType.bind(Bindings.createBooleanBinding(() -> type.get() != null && (!root || type.get().equals(TypeDonnee.OBJET)), type));
        validFormat.bind(Bindings.createBooleanBinding(() -> !TypeDonnee.DATE.equals(type.get()) || (format.get() != null && format.get().length() > 0), type, format));
        validDelimitor.bind(Bindings.createBooleanBinding(() -> !TypeDonnee.DATE.equals(type.get()) || (delimitor.get() != null), type, delimitor));
        validTaille.bind(Bindings.createBooleanBinding(() -> TypeDonnee.OBJET.equals(type.get()) || taille.get() > 0, type, taille));
        valid.bind(Bindings.createBooleanBinding(() -> (validName.get() && validType.get() && validFormat.get() && validDelimitor.get() && validTaille.get()
                        && (!TypeDonnee.OBJET.equals(type.get()) || (!children.isEmpty() && children.stream().map(c -> c.validProperty()).allMatch(c -> c.get())))),
                validName, validType, validFormat, validDelimitor, validTaille, type, children)
        );
    }
    public NestedJsonStructure nestedJsonStructure() {
        return new DefaultNestedJsonStructure(this);
    }
    public void addNewChild() {
        JsonStructureViewModel newChild = new JsonStructureViewModel(false, level + 1, null);
        children.add(newChild);
    }
    public void removeChild(String id) {
        children.removeIf(item -> item.id == id);
    }
    public void removeAllChild() {
        children.removeIf(item -> true);
    }
    public ObservableList<JsonStructureViewModel> getChildren() {
        return children;
    }
    public StringProperty nameProperty() {
        return name;
    }
    public ObjectProperty<TypeDonnee> typeProperty() {
        return type;
    }
    public IntegerProperty tailleProperty() {
        return taille;
    }
    public StringProperty formatProperty() {
        return format;
    }
    public ObjectProperty<Delimiteur> delimitorProperty() {
        return delimitor;
    }
    public BooleanProperty requiredProperty() {
        return required;
    }
    public BooleanProperty collectionProperty() {
        return collection;
    }
    public BooleanProperty hasChildProperty() {
        return hasChild;
    }
    public BooleanProperty hasDateTypeProperty() {
        return hasDateType;
    }
    public BooleanProperty hasSquareBracketProperty() {
        return hasSquareBracket;
    }
    public BooleanProperty hasObjectSquareBracketProperty() {
        return hasObjectSquareBracket;
    }
    public BooleanProperty validProperty() {
        return valid;
    }
    public String getId() {
        return id;
    }
    public boolean isRoot() {
        return root;
    }
    public int getLevel() {
        return level;
    }
    private boolean isDateType() {
        return type.get() != null && type.get() == TypeDonnee.DATE;
    }
    private boolean isObjectType() {
        return type.get() != null && type.get() == TypeDonnee.OBJET;
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/JsonStructureFormController.java
New file
@@ -0,0 +1,133 @@
package com.megatim.fdxconvert.views;
import com.megatimfx.common.customcontrols.AbstractSelectionItem;
import com.megatim.fdxconvert.controller.table.TypeFichierTable;
import com.megatim.fdxconvert.model.TypeFichier;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.viewmodel.JsonStructureFormViewModel;
import com.megatim.fdxconvert.viewmodel.JsonStructureViewModel;
import com.megatim.fdxconvert.views.jsonstructure.JsonStructureController;
import com.megatim.fdxconvert.views.jsonstructure.NestedJsonStructure;
import com.megatim.fdxconvert.views.jsonstructure.NestedJsonStructureFromJsonStructure;
import javafx.application.Platform;
import javafx.beans.property.ObjectProperty;
import javafx.collections.ListChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Pair;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
public class JsonStructureFormController implements Initializable {
    @FXML
    private VBox mainContainer;
    @FXML
    private AbstractSelectionItem<TypeFichier> typeFichierField;
    @FXML
    private HBox bottomContainer;
    @FXML
    private Button cancelButton;
    @FXML
    private Button editButton;
    private final JsonStructureFormViewModel viewModel;
    private final JsonStructureController jsonStructureController;
    public JsonStructureFormController(TypeFichierJson typeFichierJson) {
        NestedJsonStructure nestedJsonStructure = (typeFichierJson != null) ? new NestedJsonStructureFromJsonStructure(typeFichierJson.getJsonStructure()) : null;
        jsonStructureController = new JsonStructureController(new JsonStructureViewModel(true, 1, nestedJsonStructure));
        viewModel = new JsonStructureFormViewModel(typeFichierJson);
    }
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        viewModel.init();
        //On ferme la fenêtre si un résultat vient d'être évalué
        viewModel.resultProperty().addListener((observable, oldValue, newValue) -> {
            if(newValue != null) {
                close();
            }
        });
        initTypeFichierField();
        loadRootJsonStructureView();
        editButton.disableProperty().bind(jsonStructureController.validProperty().not());
        editButton.setOnAction(event -> { viewModel.createTypeFichierJSON(jsonStructureController.nestedJsonStructure()); });
    }
    public ObjectProperty<TypeFichierJson> resultProperty() {
        return viewModel.resultProperty();
    }
    public void close() {
        ((Stage) mainContainer.getScene().getWindow()).close();
    }
    public void mouseDraggedTitleBar(MouseEvent mouseEvent) {
    }
    public void mousePressedTitleBar(MouseEvent mouseEvent) {
    }
    public void minimize(ActionEvent actionEvent) {
    }
    public void maximize(ActionEvent actionEvent) {
    }
    private void initTypeFichierField() {
        typeFichierField.setTitle("Choix du type de fichier de la tâche");
        typeFichierField.setColumns(Arrays.asList(TypeFichierTable.codeColumn(), TypeFichierTable.libelleColumn(), TypeFichierTable.participantColumn()));
        typeFichierField.setSearchFieldPairs(Arrays.asList(new Pair<>("code", "Code"), new Pair<>("libelle", "Libellé")));
        typeFichierField.setOldElement(viewModel.selectedTypeFichierProperty().get());
        typeFichierField.selectedElementProperty().bindBidirectional(viewModel.selectedTypeFichierProperty());
        typeFichierField.selectedElementProperty().addListener((observable, oldValue, newValue) -> {
            jsonStructureController.setRootStructureName((newValue != null) ? newValue.getCode() : "");
        });
        typeFichierField.setElements(viewModel.getTypeFichiers().stream().collect(Collectors.toSet()));
        viewModel.getTypeFichiers().addListener((ListChangeListener<TypeFichier>) c -> {
            while (c.next()) {
                Platform.runLater(() -> typeFichierField.setElements(viewModel.getTypeFichiers().stream().collect(Collectors.toSet())));
            }
        });
    }
    private void loadRootJsonStructureView() {
        try {
            FXMLLoader loader = new FXMLLoader(jsonStructureController.getClass().getResource("JsonStructureView.fxml"));
            loader.setController(jsonStructureController);
            Parent root = loader.load();
            mainContainer.getChildren().add(root);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/JsonStructureTableViewController.java
New file
@@ -0,0 +1,167 @@
package com.megatim.fdxconvert.views;
import com.megatim.fdxconvert.model.TypeFichierJson;
import com.megatim.fdxconvert.viewmodel.JsonStructureTableViewModel;
import javafx.beans.property.SimpleStringProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JsonStructureTableViewController implements Initializable {
    @FXML
    private BorderPane searchPane;
    @FXML
    private Button btnSearch;
    @FXML
    private Button btnReset;
    @FXML
    private CheckBox advancedCheckBox;
    @FXML
    private VBox normalSearchContainer;
    @FXML
    private VBox advancedSearchContainer;
    @FXML
    private HBox buttonContainer;
    @FXML
    private Button btnAdd;
    @FXML
    private Button btnEdit;
    @FXML
    private Button btnDelete;
    @FXML
    private TableView<TypeFichierJson> elementTable;
    @FXML
    private Button btnPrevious;
    @FXML
    private Button btnNext;
    @FXML
    private Label paginationNumberInfo;
    @FXML
    private Button btnClose;
    private final JsonStructureTableViewModel viewModel = new JsonStructureTableViewModel();
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        viewModel.init();
        initTable();
        btnNext.setOnAction(event -> viewModel.nextPage());
        btnPrevious.setOnAction(event -> viewModel.previousPage());
        btnAdd.setOnAction(event -> openFormDialog(null));
        btnEdit.setOnAction(event ->  viewModel.loadSelectedItemChildren(selectedItem -> openFormDialog(selectedItem)));
        btnDelete.setOnAction(event -> viewModel.deleteSelectedItem());
        viewModel.selectedItemProperty().bind(elementTable.getSelectionModel().selectedItemProperty());
        paginationNumberInfo.textProperty().bind(viewModel.getPaginationNumberInfo());
        btnEdit.disableProperty().bind(elementTable.getSelectionModel().selectedItemProperty().isNull());
        btnDelete.disableProperty().bind(elementTable.getSelectionModel().selectedItemProperty().isNull());
        btnNext.disableProperty().bind(viewModel.getLastProperty());
        btnPrevious.disableProperty().bind(viewModel.getFirstProperty());
    }
    private void initTable() {
        TableColumn<TypeFichierJson, String> codeTypeFichierColumn = new TableColumn("Code type fichier");
        codeTypeFichierColumn.setCellValueFactory(c -> {
            return new SimpleStringProperty(c.getValue().getTypeFichier() != null ? c.getValue().getTypeFichier().getCode() : "");
        });
        TableColumn<TypeFichierJson, String> libelleTypeFichierColumn = new TableColumn("Libellé type fichier");
        libelleTypeFichierColumn.setCellValueFactory(c -> {
            return new SimpleStringProperty(c.getValue().getTypeFichier() != null ? c.getValue().getTypeFichier().getLibelle() : "");
        });
        elementTable.getColumns().addAll(Arrays.asList(codeTypeFichierColumn, libelleTypeFichierColumn));
        this.elementTable.setPlaceholder(new Label("Pas de données"));
        elementTable.setItems(viewModel.getData());
    }
    @FXML
    public void close(ActionEvent event) {
        ((Stage) elementTable.getScene().getWindow()).close();
    }
    @FXML
    public void maximize(ActionEvent event) {
    }
    @FXML
    public void minimize(ActionEvent event) {
    }
    @FXML
    public void mouseDraggedTitleBar(MouseEvent event) {
    }
    @FXML
    public void mousePressedTitleBar(MouseEvent event) {
    }
    private void openFormDialog(TypeFichierJson typeFichierJson) {
        try {
            JsonStructureFormController jsonStructureFormController = new JsonStructureFormController(typeFichierJson);
            FXMLLoader loader = new FXMLLoader(JsonStructureFormController.class.getResource("JsonStructureFormView.fxml"));
            loader.setController(jsonStructureFormController);
            Parent root = loader.load();
            setStage(root);
            jsonStructureFormController.resultProperty().addListener((observable, oldValue, newValue) -> {
                viewModel.reloadData();
            });
        } catch (IOException ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
    private void setStage(Parent root) {
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/DefaultNestedJsonStructure.java
New file
@@ -0,0 +1,57 @@
package com.megatim.fdxconvert.views.jsonstructure;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.viewmodel.JsonStructureViewModel;
import java.util.List;
import java.util.stream.Collectors;
public class DefaultNestedJsonStructure implements NestedJsonStructure {
    private final JsonStructureViewModel viewModel;
    public DefaultNestedJsonStructure(JsonStructureViewModel viewModel) {
        this.viewModel = viewModel;
    }
    @Override
    public String name() {
        return viewModel.nameProperty().get();
    }
    @Override
    public TypeDonnee typeDonnee() {
        return viewModel.typeProperty().get();
    }
    @Override
    public String format() {
        return viewModel.formatProperty().get();
    }
    @Override
    public Delimiteur delimiteur() {
        return viewModel.delimitorProperty().get();
    }
    @Override
    public int taille() {
        return viewModel.tailleProperty().get();
    }
    @Override
    public boolean isRequired() {
        return viewModel.requiredProperty().get();
    }
    @Override
    public boolean isCollection() {
        return viewModel.collectionProperty().get();
    }
    @Override
    public List<NestedJsonStructure> children() {
        return viewModel.getChildren().stream().map(DefaultNestedJsonStructure::new).collect(Collectors.toList());
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/JsonStructureController.java
New file
@@ -0,0 +1,277 @@
package com.megatim.fdxconvert.views.jsonstructure;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.App;
import com.megatim.fdxconvert.pojo.Delimiteur;
import com.megatim.fdxconvert.viewmodel.JsonStructureViewModel;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.converter.NumberStringConverter;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
public class JsonStructureController implements Initializable {
    @FXML
    private VBox mainContainer;
    @FXML
    private HBox fieldContainer;
    @FXML
    private HBox formatFieldContainer;
    @FXML
    private HBox delimitorFieldContainer;
    @FXML
    private TextField nameField;
    @FXML
    private ComboBox<TypeDonnee> typeField;
    @FXML
    private ComboBox<String> formatField;
    @FXML
    private ComboBox<Delimiteur> delimitorField;
    @FXML
    private CheckBox requiredField;
    @FXML
    private CheckBox collectionField;
    @FXML
    private TextField tailleField;
    @FXML
    private Button removeBtn;
    @FXML
    private VBox objectContainer;
    @FXML
    private HBox objectContainerleft;
    @FXML
    private HBox objectContainerRight;
    @FXML
    private Label objectSquareBracketLeft;
    @FXML
    private Label objectSquareBracketRight;
    @FXML
    private HBox formFieldContainer;
    @FXML
    private Label squareBracketLeft;
    @FXML
    private Label squareBracketRight;
    @FXML
    private Button addButton;
    @FXML
    private VBox nestedContainer;
    private final JsonStructureViewModel viewModel;
    public JsonStructureController(JsonStructureViewModel viewModel) {
        this.viewModel = viewModel;
    }
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        viewModel.init();
        typeField.setItems(FXCollections.observableArrayList(TypeDonnee.values()));
        tailleField.textProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue.matches("\\d*")) {
                tailleField.setText(newValue.replaceAll("[^\\d]", ""));
            }
        });
        formatField.setPromptText("Sélectionnez le format de la date");
        formatField.setItems(FXCollections.observableArrayList(App.FORMATS_DATE));
        delimitorField.setPromptText("Sélectionnez le délimiteur de la date");
        delimitorField.setItems(FXCollections.observableArrayList(App.SEPARATEURS_DATE.values()));
        nameField.textProperty().bindBidirectional(viewModel.nameProperty());
        typeField.valueProperty().bindBidirectional(viewModel.typeProperty());
        formatField.valueProperty().bindBidirectional(viewModel.formatProperty());
        delimitorField.valueProperty().bindBidirectional(viewModel.delimitorProperty());
        requiredField.selectedProperty().bindBidirectional(viewModel.requiredProperty());
        collectionField.selectedProperty().bindBidirectional(viewModel.collectionProperty());
        tailleField.textProperty().bindBidirectional(viewModel.tailleProperty(), new NumberStringConverter());
        nameField.setDisable(viewModel.isRoot());
        tailleField.setDisable(viewModel.isRoot());
        collectionField.setDisable(viewModel.isRoot());
        requiredField.setDisable(viewModel.isRoot());
        typeField.setDisable(viewModel.isRoot());
        tailleField.disableProperty().bind(viewModel.hasChildProperty());
        toggleObjectContainer(viewModel.hasChildProperty().get());
        viewModel.hasChildProperty().addListener((observable, oldValue, newValue) -> {
            toggleObjectContainer(newValue);
        });
        toggleDateFieldContainers(viewModel.hasDateTypeProperty().get());
        viewModel.hasDateTypeProperty().addListener((observable, oldValue, newValue) -> {
            toggleDateFieldContainers(newValue);
        });
        toggleSquareBrackets(viewModel.hasSquareBracketProperty().get());
        viewModel.hasSquareBracketProperty().addListener((observable, oldValue, newValue) -> {
            toggleSquareBrackets(newValue);
        });
        toggleObjectSquareBrackets(viewModel.hasObjectSquareBracketProperty().get());
        viewModel.hasObjectSquareBracketProperty().addListener((observable, oldValue, newValue) -> {
            toggleObjectSquareBrackets(newValue);
        });
        addButton.setOnAction(event -> {
            viewModel.addNewChild();
        });
        addChildrenViews(viewModel.getChildren());
        viewModel.getChildren().addListener((ListChangeListener<JsonStructureViewModel>) c -> {
            while (c.next()) {
                if (c.wasAdded()) {
                    Platform.runLater(() -> {
                        addChildrenViews(c.getAddedSubList().stream().collect(Collectors.toList()));
                    });
                }
                if (c.wasRemoved()) {
                    Platform.runLater(() -> {
                        for (JsonStructureViewModel child : c.getRemoved()) {
                            nestedContainer.getChildren().removeIf(node -> node.getId().equals(child.getId()));
                        }
                    });
                }
            }
        });
    }
    public BooleanProperty validProperty() {
        return viewModel.validProperty();
    }
    public NestedJsonStructure nestedJsonStructure() {
        return viewModel.nestedJsonStructure();
    }
    public void setRootStructureName(String name) {
        if (viewModel.isRoot()) {
            viewModel.nameProperty().setValue(name);
        }
    }
    private void addChildrenViews(List<JsonStructureViewModel> children) {
        for (JsonStructureViewModel child : children) {
            addChildView(child);
        }
    }
    private void addChildView(JsonStructureViewModel child) {
        try {
            FXMLLoader loader = new FXMLLoader(JsonStructureController.class.getResource("JsonStructureView.fxml"));
            loader.setController(new JsonStructureController(child));
            Parent root = loader.load();
            Button removeButton = new Button("-");
            HBox hbox = new HBox(removeButton, root);
            hbox.setId(child.getId());
            hbox.setSpacing(15);
            hbox.setAlignment(Pos.TOP_LEFT);
            nestedContainer.getChildren().add(hbox);
            removeButton.setOnAction(event1 -> viewModel.removeChild(child.getId()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    private void toggleObjectContainer(Boolean hasChild) {
        if (hasChild) {
            if (!mainContainer.getChildren().contains(objectContainer)) {
                mainContainer.getChildren().add(objectContainer);
            }
        } else {
            viewModel.removeAllChild();
            mainContainer.getChildren().remove(objectContainer);
        }
    }
    private void toggleDateFieldContainers(Boolean hasDateType) {
        if (hasDateType) {
            if (!fieldContainer.getChildren().contains(formatFieldContainer)) {
                fieldContainer.getChildren().add(2, formatFieldContainer);
            }
            if (!fieldContainer.getChildren().contains(delimitorFieldContainer)) {
                fieldContainer.getChildren().add(3, delimitorFieldContainer);
            }
        } else {
            fieldContainer.getChildren().remove(formatFieldContainer);
            fieldContainer.getChildren().remove(delimitorFieldContainer);
        }
    }
    private void toggleSquareBrackets(Boolean hasSquareBracket) {
        if (hasSquareBracket) {
            if (!formFieldContainer.getChildren().contains(squareBracketLeft)) {
                formFieldContainer.getChildren().add(0, squareBracketLeft);
            }
            if (!formFieldContainer.getChildren().contains(squareBracketRight)) {
                formFieldContainer.getChildren().add(squareBracketRight);
            }
        } else {
            formFieldContainer.getChildren().remove(squareBracketLeft);
            formFieldContainer.getChildren().remove(squareBracketRight);
        }
    }
    private void toggleObjectSquareBrackets(Boolean hasObjectSquareBracket) {
        if (hasObjectSquareBracket) {
            if (!objectContainerleft.getChildren().contains(objectSquareBracketLeft)) {
                objectContainerleft.getChildren().add(0, objectSquareBracketLeft);
            }
            if (!objectContainerRight.getChildren().contains(objectSquareBracketRight)) {
                objectContainerRight.getChildren().add(objectSquareBracketRight);
            }
        } else {
            objectContainerleft.getChildren().remove(objectSquareBracketLeft);
            objectContainerRight.getChildren().remove(objectSquareBracketRight);
        }
    }
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/NestedJsonStructure.java
New file
@@ -0,0 +1,26 @@
package com.megatim.fdxconvert.views.jsonstructure;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.util.List;
public interface NestedJsonStructure {
    String name();
    TypeDonnee typeDonnee();
    String format();
    Delimiteur delimiteur();
    int taille();
    boolean isRequired();
    boolean isCollection();
    List<NestedJsonStructure> children();
}
fdx_convert/src/main/java/com/megatim/fdxconvert/views/jsonstructure/NestedJsonStructureFromJsonStructure.java
New file
@@ -0,0 +1,57 @@
package com.megatim.fdxconvert.views.jsonstructure;
import com.megatim.dynamicjsonparser.enums.TypeDonnee;
import com.megatim.fdxconvert.model.JsonStructure;
import com.megatim.fdxconvert.pojo.Delimiteur;
import java.util.List;
import java.util.stream.Collectors;
public class NestedJsonStructureFromJsonStructure implements NestedJsonStructure {
    private final JsonStructure jsonStructure;
    public NestedJsonStructureFromJsonStructure(JsonStructure jsonStructure) {
        this.jsonStructure = jsonStructure;
    }
    @Override
    public String name() {
        return jsonStructure.getName();
    }
    @Override
    public TypeDonnee typeDonnee() {
        return jsonStructure.getTypeDonnee();
    }
    @Override
    public String format() {
        return jsonStructure.getFormatDate();
    }
    @Override
    public Delimiteur delimiteur() {
        return jsonStructure.getDelimiteurDate();
    }
    @Override
    public int taille() {
        return jsonStructure.getLengthh();
    }
    @Override
    public boolean isRequired() {
        return jsonStructure.isRequired();
    }
    @Override
    public boolean isCollection() {
        return jsonStructure.isCollection();
    }
    @Override
    public List<NestedJsonStructure> children() {
        return jsonStructure.getFields().stream().map(NestedJsonStructureFromJsonStructure::new).collect(Collectors.toList());
    }
}
fdx_convert/src/main/resources/app.properties
New file
@@ -0,0 +1 @@
nbThreads = 10
fdx_convert/src/main/resources/fonts/LICENSE.txt
New file
@@ -0,0 +1,202 @@
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
   1. Definitions.
      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.
      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.
      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.
      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.
      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.
      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.
      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).
      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.
      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."
      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.
   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.
   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.
   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:
      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and
      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and
      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and
      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.
      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.
   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.
   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.
   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.
   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.
   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.
   END OF TERMS AND CONDITIONS
   APPENDIX: How to apply the Apache License to your work.
      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.
   Copyright [yyyy] [name of copyright owner]
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
       http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
fdx_convert/src/main/resources/fonts/Roboto-Black.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-BlackItalic.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Bold.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-BoldItalic.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Italic.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Light.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-LightItalic.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Medium.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-MediumItalic.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Regular.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-Thin.ttf
Binary files differ
fdx_convert/src/main/resources/fonts/Roboto-ThinItalic.ttf
Binary files differ
fdx_convert/src/main/resources/images/143-01.png
fdx_convert/src/main/resources/images/143-02.png
fdx_convert/src/main/resources/images/143-03.png
fdx_convert/src/main/resources/images/143-04.png
fdx_convert/src/main/resources/images/143-05.png
fdx_convert/src/main/resources/images/Accueil.png
fdx_convert/src/main/resources/images/Accuueil_agent.jpg
fdx_convert/src/main/resources/images/Apropos.png
fdx_convert/src/main/resources/images/Barre_outils_hover-01.png
fdx_convert/src/main/resources/images/Barre_outils_hover-02.png
fdx_convert/src/main/resources/images/Export.png
fdx_convert/src/main/resources/images/Fichier.png
fdx_convert/src/main/resources/images/Logo_FDX_Convert.png
fdx_convert/src/main/resources/images/Recherche.png
fdx_convert/src/main/resources/images/Reset.png
fdx_convert/src/main/resources/images/Search.png
fdx_convert/src/main/resources/images/add-disabled.png
fdx_convert/src/main/resources/images/add-new.png
fdx_convert/src/main/resources/images/add-subtype.png
fdx_convert/src/main/resources/images/add.png
fdx_convert/src/main/resources/images/agrandir.png
fdx_convert/src/main/resources/images/app_icon.png
fdx_convert/src/main/resources/images/custom_app_icon.png
fdx_convert/src/main/resources/images/custom_close_icon.png
fdx_convert/src/main/resources/images/delete-disabled.png
fdx_convert/src/main/resources/images/delete-new.png
fdx_convert/src/main/resources/images/delete-subtype.png
fdx_convert/src/main/resources/images/edit-disabled.png
fdx_convert/src/main/resources/images/edit-new.png
fdx_convert/src/main/resources/images/edit.png
fdx_convert/src/main/resources/images/error-icon.png
fdx_convert/src/main/resources/images/exporter.png
fdx_convert/src/main/resources/images/fermer.png
fdx_convert/src/main/resources/images/fichiers_generesx.png
fdx_convert/src/main/resources/images/icone_ins.png
fdx_convert/src/main/resources/images/intervalle_affichage.png
fdx_convert/src/main/resources/images/max-icon.png
fdx_convert/src/main/resources/images/max_icon.png
fdx_convert/src/main/resources/images/min-icon.png
fdx_convert/src/main/resources/images/motif-title-bar.jpg
fdx_convert/src/main/resources/images/next-img.png
fdx_convert/src/main/resources/images/oeil.png
fdx_convert/src/main/resources/images/previous-img.png
fdx_convert/src/main/resources/images/print-disabled.png
fdx_convert/src/main/resources/images/print-new.png
fdx_convert/src/main/resources/images/print.png
fdx_convert/src/main/resources/images/reduire.png
fdx_convert/src/main/resources/images/success-icon.png
fdx_convert/src/main/resources/images/table-plus.png
fdx_convert/src/main/resources/images/tache.png
fdx_convert/src/main/resources/images/tache_hover.png
fdx_convert/src/main/resources/images/trash.png
fdx_convert/src/main/resources/images/update-subtype.png
fdx_convert/src/main/resources/importation/validation/data/client/abstracts/AbstractEditDialog.fxml
New file
@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.URL?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<BorderPane style="-fx-border-color: #969696; -fx-background-color: transparent; -fx-border-width: 1;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.megatimfx.common.abstracts.AbstractEditDialogController">
   <top>
      <HBox onMouseDragged="#mouseDraggedTitleBar" onMousePressed="#mousePressedTitleBar" styleClass="title-bar" BorderPane.alignment="CENTER">
         <children>
            <HBox alignment="CENTER_LEFT" prefWidth="200.0" HBox.hgrow="ALWAYS">
               <children>
                  <Text fx:id="title" fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Titre de la fenêtre ici">
                     <font>
                        <Font name="Arial" size="15.0" />
                     </font>
                  </Text>
               </children>
               <padding>
                  <Insets left="20.0" />
               </padding></HBox>
            <HBox alignment="CENTER_RIGHT" prefWidth="200.0" HBox.hgrow="ALWAYS">
               <children>
                  <Button mnemonicParsing="false" onAction="#minimize" style="-fx-padding: 5 12 5 12;" styleClass="title-bar-button" visible="false">
                     <graphic>
                        <ImageView fitHeight="10.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../../../../images/reduire.png" />
                           </image>
                        </ImageView>
                     </graphic>
                  </Button>
                  <Button mnemonicParsing="false" onAction="#maximize" style="-fx-padding: 5 12 5 12;" styleClass="title-bar-button" visible="false">
                     <graphic>
                        <ImageView fitHeight="10.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../../../../images/agrandir.png" />
                           </image>
                        </ImageView>
                     </graphic>
                  </Button>
                  <Button mnemonicParsing="false" onAction="#close" style="-fx-padding: 3 10 3 10;" styleClass="title-bar-button">
                     <graphic>
                        <ImageView fitHeight="15.0" fitWidth="15.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../../../../images/fermer.png" />
                           </image>
                           <cursor>
                              <Cursor fx:constant="HAND" />
                           </cursor>
                        </ImageView>
                     </graphic>
                  </Button>
               </children></HBox>
         </children>
         <padding>
            <Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
         </padding>
      </HBox>
   </top>
   <center>
      <VBox BorderPane.alignment="CENTER">
         <children>
            <HBox alignment="CENTER_LEFT" style="-fx-background-color: transparent;" styleClass="banner">
               <children>
                  <ImageView fitHeight="20.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true">
                     <image>
                        <Image url="@../../../../../images/Logo_FDX_Convert.png" />
                     </image>
                  </ImageView>
               </children>
               <padding>
                  <Insets left="47.0" top="10.0" />
               </padding>
            </HBox>
            <BorderPane fx:id="formPanel" style="-fx-background-color: transparent;" VBox.vgrow="ALWAYS">
               <center>
                  <VBox BorderPane.alignment="CENTER">
                     <padding>
                        <Insets bottom="20.0" left="47.0" right="47.0" top="20.0" />
                     </padding>
                     <children>
                        <VBox fx:id="formContainer" style="-fx-background-color: #F8F8F8; -fx-border-color: #E9E9E9; -fx-border-width: 1;" />
                     </children>
                  </VBox>
               </center></BorderPane>
            <HBox fx:id="bottomContainer" alignment="TOP_RIGHT" prefHeight="31.0" prefWidth="404.0" spacing="5.0">
               <children>
                  <Button fx:id="cancelButton" mnemonicParsing="false" prefHeight="27.0" prefWidth="87.0" style="-fx-background-color: #949599; -fx-border-color: #9d9fa2; -fx-background-radius: 0;" text="Annuler" textFill="WHITE">
                     <font>
                        <Font name="System Bold" size="12.0" />
                     </font>
                     <cursor>
                        <Cursor fx:constant="HAND" />
                     </cursor>
                  </Button>
                  <Button fx:id="editButton" mnemonicParsing="false" prefHeight="27.0" prefWidth="87.0" style="-fx-background-color: #869447; -fx-background-radius: 0;" text="Enregistrer" textFill="WHITE">
                     <font>
                        <Font name="System Bold" size="12.0" />
                     </font>
                     <cursor>
                        <Cursor fx:constant="HAND" />
                     </cursor>
                  </Button>
               </children>
               <padding>
                  <Insets left="47.0" right="40.0" />
               </padding>
            </HBox>
         </children>
      </VBox>
   </center>
   <stylesheets>
      <URL value="@../../../../../styles/custom-title-bar.css" />
      <URL value="@../../../../styles/custom-main-style.css" />
   </stylesheets>
</BorderPane>
fdx_convert/src/main/resources/importation/validation/data/client/abstracts/AbstractMainDialog.fxml
New file
@@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.URL?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<BorderPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="500.0" minWidth="700.0" prefHeight="569.0" prefWidth="982.0" style="-fx-border-color: #969696; -fx-border-width: 1;" styleClass="mainFxmlClass" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.megatimfx.common.abstracts.AbstractMainDialogController">
   <center>
      <VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" BorderPane.alignment="CENTER">
         <children>
            <HBox alignment="CENTER_LEFT" styleClass="banner">
               <children>
                  <ImageView fitHeight="20.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true">
                     <image>
                        <Image url="@../../../../../images/Logo_FDX_Convert.png" />
                     </image>
                  </ImageView>
               </children>
               <padding>
                  <Insets left="30.0" right="30.0" top="20.0" />
               </padding>
            </HBox>
            <VBox spacing="12.0" style="-fx-background-color: #44507;" VBox.vgrow="ALWAYS">
               <children>
                  <VBox prefHeight="200.0" prefWidth="100.0" spacing="12.0" style="-fx-border-color: #D6D6D6; -fx-border-width: 1.5;" VBox.vgrow="ALWAYS">
                     <children>
                        <TitledPane collapsible="false" prefHeight="61.0" prefWidth="1223.0" text="Recherche">
                           <content>
                              <BorderPane fx:id="searchPane" prefHeight="43.0" prefWidth="1219.0" style="-fx-background-color: rgb(246, 247, 249);">
                                 <right>
                                    <HBox spacing="5.0" BorderPane.alignment="CENTER_LEFT">
                                       <BorderPane.margin>
                                          <Insets />
                                       </BorderPane.margin>
                                       <children>
                                          <Button fx:id="btnSearch" maxWidth="1.7976931348623157E308" mnemonicParsing="false" styleClass="search">
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor></Button>
                                          <Button fx:id="btnReset" maxWidth="1.7976931348623157E308" mnemonicParsing="false" styleClass="reset">
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor></Button>
                                          <CheckBox fx:id="advancedCheckBox" alignment="CENTER" maxHeight="-Infinity" maxWidth="1.7976931348623157E308" mnemonicParsing="false" prefHeight="25.0" text="Recherche avancées">
                                             <font>
                                                <Font name="Roboto" size="12.0" />
                                             </font>
                                          </CheckBox>
                                       </children>
                                       <padding>
                                          <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                                       </padding>
                                    </HBox>
                                 </right>
                                 <center>
                                    <VBox BorderPane.alignment="CENTER">
                                       <children>
                                          <VBox fx:id="normalSearchContainer" VBox.vgrow="ALWAYS">
                                             <padding>
                                                <Insets right="50.0" />
                                             </padding>
                                          </VBox>
                                          <VBox fx:id="advancedSearchContainer" VBox.vgrow="ALWAYS">
                                             <padding>
                                                <Insets right="50.0" />
                                             </padding>
                                          </VBox>
                                       </children>
                                       <BorderPane.margin>
                                          <Insets top="5.0" />
                                       </BorderPane.margin>
                                    </VBox>
                                 </center>
                              </BorderPane>
                           </content>
                        </TitledPane>
                        <VBox prefHeight="200.0" prefWidth="100.0" style="-fx-background-color: rgb(246, 247, 249);" VBox.vgrow="ALWAYS">
                           <children>
                              <HBox alignment="CENTER_LEFT" spacing="2.0">
                                 <children>
                                    <HBox fx:id="buttonContainer" alignment="BOTTOM_LEFT" spacing="2.0">
                                       <children>
                                          <Button fx:id="btnAdd" mnemonicParsing="false" onAction="#onAddDialog" styleClass="main-btn-add" textFill="#ebf0ee">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor>
                                          </Button>
                                          <Button fx:id="btnEdit" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#onEditDialog" styleClass="main-btn-edit" textFill="#f2eded">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor>
                                          </Button>
                                          <Button fx:id="btnPrint" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#onEditDialog" styleClass="main-btn-print" textFill="#f2eded">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor>
                                          </Button>
                                          <Button fx:id="btnDelete" mnemonicParsing="false" onAction="#removeElement" styleClass="main-btn-delete" textFill="#f2eded">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                             <cursor>
                                                <Cursor fx:constant="HAND" />
                                             </cursor>
                                          </Button>
                                       </children>
                                    </HBox>
                                 </children>
                                 <opaqueInsets>
                                    <Insets />
                                 </opaqueInsets>
                              </HBox>
                              <VBox prefHeight="200.0" prefWidth="100.0" VBox.vgrow="ALWAYS">
                                 <children>
                                    <TableView fx:id="elementTable" VBox.vgrow="ALWAYS">
                                       <columnResizePolicy>
                                          <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                                       </columnResizePolicy>
                                    </TableView>
                                    <HBox alignment="CENTER_LEFT" spacing="15.0" style="-fx-background-color: #CECECE;">
                                       <children>
                                          <HBox alignment="CENTER" spacing="2.0">
                                             <children>
                                                <HBox alignment="CENTER" spacing="5.0">
                                                   <children>
                                                      <Label text="précédent">
                                                         <font>
                                                            <Font name="Roboto" size="12.0" />
                                                         </font>
                                                      </Label>
                                                      <Button fx:id="btnPrevious" mnemonicParsing="false" styleClass="previous-btn">
                                                         <cursor>
                                                            <Cursor fx:constant="HAND" />
                                                         </cursor></Button>
                                                   </children>
                                                </HBox>
                                                <HBox alignment="CENTER" spacing="5.0">
                                                   <children>
                                                      <Button fx:id="btnNext" mnemonicParsing="false" styleClass="next-btn">
                                                         <cursor>
                                                            <Cursor fx:constant="HAND" />
                                                         </cursor></Button>
                                                      <Label text="suivant">
                                                         <font>
                                                            <Font name="Roboto" size="12.0" />
                                                         </font>
                                                      </Label>
                                                   </children>
                                                </HBox>
                                             </children>
                                          </HBox>
                                          <Label fx:id="paginationNumberInfo" text="(200/400)">
                                             <font>
                                                <Font name="Roboto" size="12.0" />
                                             </font>
                                          </Label>
                                       </children>
                                       <padding>
                                          <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                                       </padding>
                                    </HBox>
                                 </children>
                              </VBox>
                           </children>
                        </VBox>
                     </children>
                     <padding>
                        <Insets bottom="12.0" left="12.0" right="12.0" top="12.0" />
                     </padding>
                  </VBox>
                  <HBox alignment="CENTER_RIGHT">
                     <children>
                        <Button fx:id="btnClose" mnemonicParsing="false" style="-fx-background-color: #CACACA; -fx-border-color: #A8A8A8;" text="Quitter">
                           <cursor>
                              <Cursor fx:constant="HAND" />
                           </cursor></Button>
                     </children>
                  </HBox>
               </children>
               <padding>
                  <Insets bottom="12.0" left="30.0" right="30.0" top="20.0" />
               </padding>
            </VBox>
         </children>
      </VBox>
   </center>
   <top>
      <HBox alignment="CENTER" onMouseDragged="#mouseDraggedTitleBar" onMousePressed="#mousePressedTitleBar" styleClass="title-bar" BorderPane.alignment="CENTER">
         <children>
            <HBox alignment="CENTER_LEFT" prefWidth="200.0" HBox.hgrow="ALWAYS">
               <children>
                  <Text fx:id="title" fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Titre de la fenêtre">
                     <font>
                        <Font name="Roboto" size="15.0" />
                     </font>
                  </Text>
               </children>
               <padding>
                  <Insets left="30.0" />
               </padding></HBox>
            <HBox alignment="CENTER_RIGHT" prefWidth="200.0" HBox.hgrow="ALWAYS">
               <children>
                  <Button mnemonicParsing="false" onAction="#minimize" style="-fx-padding: 5 12 5 12;" styleClass="title-bar-button" visible="false" />
                  <Button mnemonicParsing="false" onAction="#maximize" style="-fx-padding: 5 12 5 12;" styleClass="title-bar-button" visible="false" />
                  <Button mnemonicParsing="false" onAction="#close" style="-fx-padding: 3 10 3 10;" styleClass="title-bar-button">
                     <graphic>
                        <ImageView fitHeight="15.0" fitWidth="15.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../../../../images/fermer.png" />
                           </image>
                           <cursor>
                              <Cursor fx:constant="HAND" />
                           </cursor>
                        </ImageView>
                     </graphic>
                  </Button>
               </children>
            </HBox>
         </children>
         <padding>
            <Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
         </padding>
      </HBox>
   </top>
   <stylesheets>
      <URL value="@../../../../../styles/custom-main-style.css" />
      <URL value="@../../../../../styles/custom-title-bar.css" />
   </stylesheets>
</BorderPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/main.fxml
New file
@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<VBox fx:id="mainContainer" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="600.0" prefWidth="1081.0" style="-fx-background-color: transparent;" stylesheets="@../../../../../styles/main_screen.css" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.MainController">
    <children>
        <HBox style="-fx-background-color: #f8f8f8;">
            <children>
                <HBox alignment="CENTER">
                    <children>
                        <ImageView fitHeight="48.0" fitWidth="190.0" pickOnBounds="true" preserveRatio="true">
                            <image>
                                <Image url="@../../../../../images/Logo_FDX_Convert.png" />
                            </image>
                        </ImageView>
                    </children>
                    <padding>
                        <Insets right="30.0" />
                    </padding>
                </HBox>
                <HBox fx:id="myMenuBar">
                    <children>
                        <MenuButton contentDisplay="TOP" mnemonicParsing="false" text="Fichier">
                            <graphic>
                                <ImageView fitHeight="20.0" fitWidth="20.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../../../../../images/Fichier.png" />
                                    </image>
                                </ImageView>
                            </graphic>
                            <items>
                                <MenuItem mnemonicParsing="false" onAction="#quit" text="Quitter" />
                            </items>
                        </MenuButton>
                        <MenuButton contentDisplay="TOP" mnemonicParsing="false" text="Paramètres">
                            <graphic>
                                <ImageView fitHeight="20.0" fitWidth="20.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../../../../../images/143-02.png" />
                                    </image>
                                </ImageView>
                            </graphic>
                            <items>
                                <Menu mnemonicParsing="false" text="Type Fichier">
                                    <items>
                                        <MenuItem mnemonicParsing="false" onAction="#openImportTypeFichierDialog" text="Importer" />
                                        <MenuItem mnemonicParsing="false" onAction="#openTypeFichierDialog" text="Consulter" />
                                    </items>
                                </Menu>
                                <MenuItem fx:id="configMenuItem" mnemonicParsing="false" onAction="#openConfigDialog" text="Configurer les répertoires" />
                        <Menu mnemonicParsing="false" text="Enregistrement des formats de validation">
                          <items>
                                      <MenuItem mnemonicParsing="false" onAction="#openValidateurDialog" text="Fichiers de données Texte" />
                            <!--<MenuItem mnemonicParsing="false" onAction="#openJsonToValidateDialog" text="Fichiers de données JSON" />-->
                          </items>
                        </Menu>
                        <!--<MenuItem fx:id="configMenuItem1" mnemonicParsing="false" onAction="#openJsonStructureView" text="Structures JSON" />-->
                            </items>
                        </MenuButton>
                        <MenuButton contentDisplay="TOP" mnemonicParsing="false" text="Conversion">
                            <graphic>
                                <ImageView fitHeight="20.0" fitWidth="20.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../../../../../images/143-03.png" />
                                    </image>
                                </ImageView>
                            </graphic>
                            <items>
                        <MenuItem fx:id="conversionModelMenuItem" mnemonicParsing="false" onAction="#openConversionModelDialog" text="Modèles de conversion" />
                                <MenuItem fx:id="validationManuelMenuItem" mnemonicParsing="false" onAction="#openFileToValidateDialog" text="Manuelle" />
                                <Menu mnemonicParsing="false" text="Automatique">
                                    <items>
                                        <MenuItem fx:id="paramAutomatiqueMenuItem" mnemonicParsing="false" onAction="#openTacheDialog" text="Tâches" />
                              <MenuItem fx:id="journalMenuItem" mnemonicParsing="false" onAction="#openJournalDialog" text="Journal des tâches" />
                                    </items>
                                </Menu>
                            </items>
                        </MenuButton>
                        <MenuButton contentDisplay="TOP" mnemonicParsing="false" text="Outils">
                            <graphic>
                                <ImageView fitHeight="20.0" fitWidth="20.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../../../../../images/143-04.png" />
                                    </image>
                                </ImageView>
                            </graphic>
                            <items>
                                <MenuItem mnemonicParsing="false" onAction="#openDecryptageAESSymDailog" text="Décryptage AES symétrique" />
                                <MenuItem fx:id="menuTableauDeBord" mnemonicParsing="false" onAction="#openTxtFileToValidateDialog" text="Vérifier format d'un fichier texte" />
                        <MenuItem fx:id="menuConversionJson" mnemonicParsing="false" onAction="#openTxtFileToJsonDialog" text="Convertir un fichier de données en Json" />
                            </items>
                        </MenuButton>
                        <MenuButton contentDisplay="TOP" disable="true" mnemonicParsing="false" text="Aide">
                            <graphic>
                                <ImageView disable="true" fitHeight="20.0" fitWidth="20.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../../../../../images/143-05.png" />
                                    </image>
                                </ImageView>
                            </graphic>
                            <items>
                                <MenuItem mnemonicParsing="false" onAction="#openAproposrDialog" text="A propos" />
                            </items>
                        </MenuButton>
                    </children>
                </HBox>
            </children>
            <padding>
                <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
            </padding>
        </HBox>
        <HBox spacing="10.0" style="-fx-background-color: #fff; -fx-border-color: #dedfe0;">
            <padding>
                <Insets bottom="5.0" left="15.0" right="5.0" top="5.0" />
            </padding>
            <children>
                <HBox prefWidth="200.0" spacing="10.0">
                    <children>
                        <Button fx:id="btnImportationFormatValidation" mnemonicParsing="false" onAction="#openValidateurDialog" styleClass="receive">
                            <cursor>
                                <Cursor fx:constant="HAND" />
                            </cursor>
                        </Button>
                        <Button fx:id="btnConvertionManuelle" mnemonicParsing="false" onAction="#openFileToValidateDialog" styleClass="generate">
                            <cursor>
                                <Cursor fx:constant="HAND" />
                            </cursor>
                        </Button>
                        <Button fx:id="btnGestionTachesConvertion" mnemonicParsing="false" onAction="#openTacheDialog" styleClass="treatment">
                            <cursor>
                                <Cursor fx:constant="HAND" />
                            </cursor>
                        </Button>
                    </children>
                </HBox>
                <HBox alignment="TOP_RIGHT" prefWidth="200.0" HBox.hgrow="ALWAYS" />
            </children>
        </HBox>
        <AnchorPane prefHeight="578.0" prefWidth="800.0" style="-fx-border-color: #F8F8F8; -fx-border-width: 0;" styleClass="main_screen" VBox.vgrow="ALWAYS" />
    </children>
</VBox>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ConversionModelAdvancedSearchForm.fxml
New file
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="81.0" prefWidth="468.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TypeFichierSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox fx:id="delimiteurLigneHBox" alignment="CENTER_LEFT" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="158.0" prefWidth="158.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Délimiteur de ligne" />
                  <StackPane prefHeight="150.0" prefWidth="200.0">
                     <children>
                        <TextField fx:id="codeDelimiteurLigneTextField" minWidth="300.0" prefWidth="300.0" visible="false" />
                        <ComboBox fx:id="delimiteurLigneComboBox" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                     </children>
                  </StackPane>
               </children>
            </HBox>
            <HBox fx:id="delimiteurColonneHBox" alignment="CENTER_LEFT" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="158.0" prefHeight="25.0" prefWidth="158.0" style="-fx-text-fill: black;" text="Délimiteur colonne" />
                  <StackPane prefHeight="150.0" prefWidth="200.0">
                     <children>
                        <TextField fx:id="codeDelimiteurColonneTextField" visible="false" />
                        <ComboBox fx:id="delimiteurColonneComboBox" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                     </children>
                  </StackPane>
               </children>
            </HBox>
         </children>
         <padding>
            <Insets top="10.0" />
         </padding>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ConversionModelSearchForm.fxml
New file
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="69.0" prefWidth="604.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.ConversionModelSearchController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox alignment="CENTER_LEFT" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="158.0" prefHeight="25.0" prefWidth="158.0" style="-fx-text-fill: black;" text="Type du fichier à valider" />
                  <AbstractSelectionItem fx:id="typeFichierAbstractSelectItem" minHeight="25.0" minWidth="418.0" prefHeight="25.0" prefWidth="418.0" />
               </children>
            </HBox>
            <HBox alignment="CENTER_LEFT" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="158.0" prefHeight="25.0" prefWidth="158.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Format du fichier de données" />
                  <ComboBox fx:id="dataTypeComboBox" minHeight="25.0" minWidth="418.0" prefHeight="25.0" prefWidth="418.0" style="-fx-background-radius: 0%;" />
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/JournalAdvancedSearchForm.fxml
New file
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="120.0" prefWidth="773.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TypeFichierAdvancedSearchFormController">
   <children>
      <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <GridPane hgap="110.0" vgap="20.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
              </columnConstraints>
              <rowConstraints>
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
               <children>
                  <HBox spacing="10.0">
                     <children>
                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="94.0" prefHeight="25.0" prefWidth="94.0" style="-fx-text-fill: black;" text="Statut de l'action" />
                        <ComboBox fx:id="statutActionComboBox" minHeight="25.0" minWidth="260.0" prefHeight="25.0" prefWidth="260.0" />
                     </children>
                     <GridPane.margin>
                        <Insets />
                     </GridPane.margin>
                     <padding>
                        <Insets bottom="5.0" top="5.0" />
                     </padding>
                  </HBox>
                  <HBox spacing="10.0" GridPane.rowIndex="1">
                     <children>
                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="94.0" prefHeight="25.0" prefWidth="94.0" style="-fx-text-fill: black;" text="Date de début" />
                        <DatePicker fx:id="dateDebutDatePicker" minHeight="25.0" minWidth="260.0" prefHeight="25.0" prefWidth="260.0" />
                     </children>
                     <GridPane.margin>
                        <Insets />
                     </GridPane.margin>
                     <padding>
                        <Insets bottom="5.0" top="5.0" />
                     </padding>
                  </HBox>
                  <HBox spacing="10.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
                     <children>
                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="115.0" prefHeight="25.0" prefWidth="115.0" style="-fx-text-fill: black;" text="Date de fin" />
                        <DatePicker fx:id="dateFinDatePicker" minHeight="25.0" minWidth="200.0" prefHeight="25.0" prefWidth="250.0" />
                     </children>
                     <GridPane.margin>
                        <Insets bottom="5.0" />
                     </GridPane.margin>
                     <padding>
                        <Insets bottom="5.0" />
                     </padding>
                  </HBox>
                  <HBox spacing="10.0" GridPane.rowIndex="2">
                     <children>
                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="94.0" prefHeight="25.0" prefWidth="94.0" style="-fx-text-fill: black;" text="Fichier Source" />
                        <TextField fx:id="sourceFileNameTextField" minWidth="260.0" prefHeight="25.0" prefWidth="260.0" />
                     </children>
                     <GridPane.margin>
                        <Insets bottom="5.0" />
                     </GridPane.margin>
                     <padding>
                        <Insets top="5.0" />
                     </padding>
                  </HBox>
                  <HBox spacing="10.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
                     <children>
                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="115.0" prefHeight="25.0" prefWidth="115.0" style="-fx-text-fill: black;" text="Fichier Destination" />
                        <TextField fx:id="destinationFileNameTextField" minWidth="200.0" prefHeight="25.0" prefWidth="200.0" />
                     </children>
                     <GridPane.margin>
                        <Insets bottom="5.0" />
                     </GridPane.margin>
                  </HBox>
               </children>
               <padding>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </padding>
               <VBox.margin>
                  <Insets />
               </VBox.margin>
            </GridPane>
         </children>
      </VBox>
   </children>
   <padding>
      <Insets top="5.0" />
   </padding>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/JournalSearchForm.fxml
New file
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="31.0" prefWidth="346.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TypeFichierSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox prefHeight="25.0" prefWidth="395.0" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="104.0" prefHeight="25.0" prefWidth="104.0" style="-fx-text-fill: black;" text="Type Fichier" />
                  <StackPane minHeight="25.0" minWidth="260.0" prefHeight="25.0" prefWidth="260.0">
                     <children>
                        <TextField fx:id="typeFichierTextField" editable="false" minHeight="25.0" minWidth="250.0" prefHeight="25.0" prefWidth="250.0" style="-fx-background-color: #ffff;" visible="false" />
                        <AbstractSelectionItem fx:id="typeFichierAbstractSelectionItem" minHeight="25.0" minWidth="250.0" prefHeight="25.0" prefWidth="250.0" />
                     </children>
                  </StackPane>
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TacheSearchForm.fxml
New file
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane id="AnchorPane" prefHeight="25.0" prefWidth="326.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TacheSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox alignment="CENTER" prefHeight="25.0" prefWidth="315.0" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" contentDisplay="CENTER" minWidth="96.0" prefHeight="18.0" prefWidth="96.0" style="-fx-text-fill: black;" text="Type de Fichier">
                     <font>
                        <Font size="14.0" />
                     </font>
                  </Label>
                  <AbstractSelectionItem fx:id="typeFichierAbstractSelectItem" minWidth="100.0" prefHeight="25.0" prefWidth="207.0" HBox.hgrow="ALWAYS" />
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TruncatedElementAdvancedSearchForm.fxml
New file
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="67.0" prefWidth="352.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TruncatedElementAdvancedSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox prefHeight="25.0" prefWidth="395.0" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minWidth="106.0" prefHeight="15.0" prefWidth="106.0" text="Code de la colonne" />
                  <TextField fx:id="codeColonneTextfield" minHeight="25.0" minWidth="229.0" prefHeight="25.0" prefWidth="229.0" style="-fx-background-radius: 0%;" />
               </children>
            </HBox>
            <HBox spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="106.0" prefHeight="25.0" prefWidth="106.0" text="Date de l'action" />
                  <DatePicker fx:id="dateActionDatePicker" minWidth="229.0" prefHeight="25.0" prefWidth="229.0" />
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TruncatedElementSearchForm.fxml
New file
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="25.0" prefWidth="364.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TruncatedElementSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox prefHeight="25.0" prefWidth="395.0" spacing="10.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="106.0" prefHeight="25.0" prefWidth="106.0" text="Type du fichier" />
                  <StackPane prefHeight="150.0" prefWidth="200.0">
                     <children>
                        <TextField fx:id="codeTypeFichierTextfield" editable="false" minHeight="25.0" minWidth="229.0" prefHeight="25.0" prefWidth="229.0" style="-fx-background-radius: 0%;" visible="false" />
                        <AbstractSelectionItem fx:id="typeFichierAbstractSelectionItem" minWidth="229.0" prefWidth="229.0" />
                     </children>
                  </StackPane>
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
   <padding>
      <Insets bottom="10.0" />
   </padding>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TypeFichierAdvancedSearchForm.fxml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="30.0" prefWidth="600.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TypeFichierAdvancedSearchFormController">
   <children>
      <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox layoutX="10.0" layoutY="45.0" prefHeight="25.0" prefWidth="353.0" spacing="5.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minWidth="58.0" prefWidth="58.0" style="-fx-text-fill: black;" text="Participant">
                     <HBox.margin>
                        <Insets />
                     </HBox.margin></Label>
                  <TextField fx:id="participant" prefHeight="25.0" prefWidth="120.0" style="-fx-background-radius: 0%;" />
               </children>
            </HBox>
            <HBox spacing="5.0">
               <children>
                  <Label alignment="CENTER_RIGHT" prefWidth="57.0" style="-fx-text-fill: black;" text="Libelle" />
                  <TextField fx:id="libelle" style="-fx-background-radius: 0%;" HBox.hgrow="ALWAYS" />
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
   <padding>
      <Insets top="10.0" />
   </padding>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/TypeFichierSearchForm.fxml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="25.0" prefWidth="251.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.TypeFichierSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox prefHeight="25.0" prefWidth="395.0" spacing="5.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minWidth="42.0" prefWidth="57.0" style="-fx-text-fill: black;" text="Code" />
                  <TextField fx:id="code" prefWidth="120.0" style="-fx-background-radius: 0%;" />
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/controller/search/ValidateurSearchForm.fxml
New file
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="25.0" prefWidth="358.0" stylesheets="@../../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.controller.search.ValidateurSearchFormController">
   <children>
      <VBox layoutX="10.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox prefHeight="25.0" prefWidth="323.0" spacing="5.0">
               <children>
                  <Label alignment="CENTER_RIGHT" minWidth="42.0" prefHeight="17.0" prefWidth="89.0" style="-fx-text-fill: black;" text="Type du Fichier" />
                  <StackPane prefHeight="25.0" prefWidth="264.0">
                     <children>
                        <TextField fx:id="codeTypeFichierTextfield" editable="false" minWidth="229.0" prefHeight="25.0" prefWidth="229.0" style="-fx-background-radius: 0%;" visible="false" />
                        <AbstractSelectionItem fx:id="typeFichierAbstractSelectionItem" minWidth="229.0" prefWidth="229.0" />
                     </children>
                  </StackPane>
               </children>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/About.fxml
New file
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.URL?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<BorderPane style="-fx-border-color: #969696; -fx-background-color: transparent; -fx-border-width: 1;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.forms.AproposEditFormController">
   <center>
      <VBox BorderPane.alignment="CENTER">
         <children>
            <BorderPane fx:id="formPanel" style="-fx-background-color: transparent;" VBox.vgrow="ALWAYS">
               <center>
                  <VBox BorderPane.alignment="CENTER">
                     <padding>
                        <Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
                     </padding>
                     <children>
                        <VBox fx:id="formContainer" spacing="15.0" style="-fx-border-color: #E9E9E9; -fx-border-width: 1;" VBox.vgrow="ALWAYS">
                           <children>
                              <VBox>
                                 <children>
                                    <HBox>
                                       <children>
                                          <Label text="Sirius-Sygma">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                       </children>
                                       <padding>
                                          <Insets bottom="5.0" />
                                       </padding>
                                    </HBox>
                                    <HBox spacing="5.0">
                                       <children>
                                          <Label text="Version :">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                          <Label text="1.0.2" />
                                       </children>
                                    </HBox>
                                    <HBox spacing="5.0">
                                       <children>
                                          <Label text="Build time :">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                          <Label text="02 septembre 2022" />
                                       </children>
                                    </HBox>
                                    <HBox spacing="5.0">
                                       <children>
                                          <Label text="Auteur :  ">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                          <Label text="Megatim Ltd (www.megatimgroup.com)" />
                                       </children>
                                    </HBox>
                                    <HBox spacing="5.0">
                                       <children>
                                          <Label text="Mail :">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                          <Label text="contact@megatimgroup.com" />
                                       </children>
                                    </HBox>
                                    <HBox spacing="5.0">
                                       <children>
                                          <Label text="Licence d'utilisateur octroyée à la société :">
                                             <font>
                                                <Font name="System Bold" size="12.0" />
                                             </font>
                                          </Label>
                                          <Label text="UBA Cameroon SA" />
                                       </children>
                                    </HBox>
                                 </children>
                              </VBox>
                              <VBox spacing="10.0">
                                 <children>
                                    <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Le logiciel Sirius-Sygma est un intergiciel qui assiste la génération des messages financiers MT103 et MT202, dans le cadre des l'intercommunication du Système d'information et leRTGS de la zone CEMAC dénommé SYGMA." wrappingWidth="496.13671875" />
                                    <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Il s'agit d'une application ergonomique, facile de prise en main et développée en langage Java avec des technologies éprouvées." wrappingWidth="498.13671875" />
                                 </children>
                              </VBox>
                           </children>
                           <padding>
                              <Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
                           </padding></VBox>
                     </children>
                  </VBox>
               </center>
            </BorderPane>
            <HBox fx:id="bottomContainer" alignment="TOP_RIGHT" prefHeight="0.0" prefWidth="621.0" spacing="5.0">
               <padding>
                  <Insets bottom="20.0" left="30.0" right="30.0" />
               </padding>
            </HBox>
         </children>
      </VBox>
   </center>
   <stylesheets>
      <URL value="@../styles/main-style.css" />
      <URL value="@../styles/title-bar.css" />
   </stylesheets>
</BorderPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/AlphaNumeriqueFieldEditForm.fxml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="105.0" prefWidth="706.0" styleClass="mainForm" stylesheets="@../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.MetaAlphaNumeriqueFieldEditFormController">
    <children>
        <VBox prefHeight="400.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <TitledPane collapsible="false" style="-fx-text-fill: #FFFFFF; -fx-background-color: #FFFFFF;" text="Champs à tronquer">
                    <content>
                        <VBox spacing="20.0" style="-fx-background-color: #FFFFFF;">
                            <children>
                                <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="115.0" spacing="5.0">
                                    <children>
                                        <Label alignment="CENTER_RIGHT" minWidth="205.0" prefWidth="212.0" text="Code du champ à tronquer" />
                              <AbstractSelectionItem fx:id="alphaNumeriqueFieldAbstractSelectItem" prefWidth="427.0" />
                                    </children>
                                </HBox>
                            </children>
                        </VBox>
                    </content>
               <VBox.margin>
                  <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
               </VBox.margin>
                </TitledPane>
            </children>
        </VBox>
    </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/ConfigEditForm.fxml
New file
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.CustomDirectoryChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="215.0" prefWidth="708.0" styleClass="mainForm" stylesheets="@../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.ConfigEditFormController">
    <children>
        <VBox prefHeight="400.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <TitledPane collapsible="false" style="-fx-text-fill: #FFFFFF; -fx-background-color: #FFFFFF;" text="Informations sur les répertoires">
                    <content>
                        <VBox spacing="20.0" style="-fx-background-color: #FFFFFF;">
                            <children>
                                <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="115.0" spacing="10.0">
                                    <children>
                                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="212.0" prefHeight="25.0" prefWidth="212.0" style="-fx-text-fill: black;" text="Répertoire des fichiers de données" />
                              <CustomDirectoryChooser fx:id="datasDirectoryChooser" minWidth="420.0" prefWidth="420.0" style="-fx-text-fill: black;" />
                                    </children>
                                </HBox>
                                <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="115.0" spacing="10.0">
                                    <children>
                                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="212.0" prefHeight="25.0" prefWidth="212.0" style="-fx-text-fill: black;" text="Répertoire d'exportation des validateurs" />
                              <CustomDirectoryChooser fx:id="validatorsDirectoryChooser" minHeight="25.0" minWidth="420.0" prefWidth="420.0" style="-fx-text-fill: black;" />
                                    </children>
                                </HBox>
                                <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="115.0" spacing="10.0">
                                    <children>
                                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="212.0" prefHeight="25.0" prefWidth="212.0" style="-fx-text-fill: black;" text="Répertoire des erreurs" />
                              <CustomDirectoryChooser fx:id="errorDirectoryChooser" minHeight="25.0" minWidth="420.0" prefWidth="420.0" style="-fx-text-fill: black;" />
                                    </children>
                                </HBox>
                        <HBox alignment="CENTER_LEFT" layoutX="20.0" layoutY="116.0" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="212.0" prefHeight="25.0" prefWidth="212.0" style="-fx-text-fill: black;" text="Répertoire de sortie" />
                              <CustomDirectoryChooser fx:id="outputDirectoryChooser" minWidth="420.0" prefWidth="420.0" style="-fx-text-fill: black;" />
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" layoutX="20.0" layoutY="155.0" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="212.0" prefHeight="25.0" prefWidth="212.0" style="-fx-text-fill: black;" text="Répertoire d'archivage" />
                              <CustomDirectoryChooser fx:id="archivesDirectoryChooser" minWidth="420.0" prefWidth="420.0" style="-fx-text-fill: black;" />
                           </children>
                        </HBox>
                            </children>
                        </VBox>
                    </content>
               <VBox.margin>
                  <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
               </VBox.margin>
                </TitledPane>
            </children>
        </VBox>
    </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/ConversionModelEditForm.fxml
New file
@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractNestedEntityTable?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import com.megatimfx.common.customcontrols.CustomDirectoryChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="562.0" prefWidth="678.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.ConversionModelEditFormController">
   <children>
      <VBox prefHeight="697.0" prefWidth="678.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <TabPane fx:id="tabPane" prefHeight="553.0" prefWidth="702.0" stylesheets="@../../../../../styles/CustomFormComponents.css" tabClosingPolicy="UNAVAILABLE">
              <tabs>
                <Tab text="Description du fichier de données">
                     <content>
                        <VBox prefHeight="574.0" prefWidth="687.0" spacing="15.0">
                           <children>
                              <TitledPane collapsible="false" prefHeight="659.0" prefWidth="647.0" style="-fx-text-fill: #fff;" text="Informations générales">
                                 <content>
                                    <VBox prefHeight="534.0" prefWidth="643.0" spacing="20.0" style="-fx-background-color: #fff;">
                                       <children>
                                          <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="25.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" maxWidth="213.0" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-text-fill: black;" text="Libellé du modèle" />
                                                <TextField fx:id="libelleTextField" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" maxWidth="213.0" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-text-fill: black;" text="Type du fichier à valider" />
                                                <AbstractSelectionItem fx:id="typeFichierAbstractSelectItem" minWidth="418.0" prefHeight="25.0" prefWidth="418.0" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="sourceHBox" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Répertoire source">
                                                   <font>
                                                      <Font size="14.0" />
                                                   </font>
                                                </Label>
                                                <CustomDirectoryChooser fx:id="repertoireSource" minWidth="418.0" prefWidth="418.0" HBox.hgrow="ALWAYS" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="sourceHBox1" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Répertoire destination">
                                                   <font>
                                                      <Font size="14.0" />
                                                   </font>
                                                </Label>
                                                <CustomDirectoryChooser fx:id="repertoireDestination" minWidth="418.0" prefWidth="418.0" HBox.hgrow="ALWAYS" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="sourceHBox11" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Répertoire d'erreur">
                                                   <font>
                                                      <Font size="14.0" />
                                                   </font>
                                                </Label>
                                                <CustomDirectoryChooser fx:id="repertoireErreur" minWidth="418.0" prefWidth="418.0" HBox.hgrow="ALWAYS" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="169.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Format du fichier de données" />
                                                <ComboBox fx:id="dataTypeComboBox" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="delimiteurLigneHBox" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-font-size: 12; -fx-text-fill: black;" text="Délimiteur de ligne" />
                                                <ComboBox fx:id="delimiteurLigne" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="delimiteurColonneHBox" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-text-fill: black;" text="Délimiteur colonne" />
                                                <ComboBox fx:id="delimiteurColonne" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-text-fill: black;" text="Fichier contient ligne d'entête ?" />
                                                <CheckBox fx:id="headerPresentCheckbox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                                             </children>
                                          </HBox>
                                          <HBox layoutX="25.0" layoutY="244.0" prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="176.0" prefHeight="25.0" prefWidth="176.0" style="-fx-text-fill: black;" text="Validation stricte des données ?" />
                                                <CheckBox fx:id="strictValidationCheckbox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                                             </children>
                                          </HBox>
                                       </children>
                                       <padding>
                                          <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                       </padding>
                                    </VBox>
                                 </content>
                              </TitledPane>
                           </children>
                           <padding>
                              <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
                           </padding>
                        </VBox>
                     </content>
                </Tab>
                <Tab text="Champs à tronquer">
                     <content>
                        <VBox prefHeight="581.0" prefWidth="678.0" spacing="15.0">
                           <children>
                              <TitledPane animated="false" collapsible="false" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Informations sur les champs">
                                 <content>
                                    <VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0">
                                       <children>
                                          <HBox alignment="CENTER_RIGHT">
                                             <children>
                                                <CheckBox fx:id="saisieAlphaNumeriqueFieldChecBox" mnemonicParsing="false" styleClass="square-border" stylesheets="@../../../../../../../../../generation-validateur-typefichier/src/main/resources/styles/style.css" text="Sélectionner les champs à tronquer" />
                                             </children>
                                          </HBox>
                                          <AbstractNestedEntityTable fx:id="metaAlphaNumeriqueFieldAbstractTable" prefHeight="252.0" prefWidth="526.0" VBox.vgrow="ALWAYS" />
                                       </children>
                                       <padding>
                                          <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                       </padding>
                                    </VBox>
                                 </content>
                              </TitledPane>
                           </children>
                           <padding>
                              <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
                           </padding>
                        </VBox>
                     </content>
                </Tab>
              </tabs>
            </TabPane>
         </children>
      </VBox>
   </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/DataFileToJsonEditForm.fxml
New file
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import com.megatimfx.common.customcontrols.CustomFileChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="330.0" prefWidth="624.0" style="-fx-background-color: #fff;" styleClass="mainForm" stylesheets="@../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.DataFileToJsonFormController">
    <children>
        <VBox fillWidth="false" layoutX="-23.0" layoutY="40.0" prefHeight="226.0" prefWidth="698.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <TitledPane collapsible="false" style="-fx-text-fill: #ffffff;" text="Informations sur le fichier à convertir">
               <content>
                  <VBox prefHeight="275.0" prefWidth="614.0" spacing="20.0" style="-fx-background-color: #fff;">
                     <children>
                        <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="25.0" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="TypeFichier" />
                              <AbstractSelectionItem fx:id="typeFichierAbstractSelectItem" minHeight="25.0" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" />
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Validateur XML" />
                              <CustomFileChooser fx:id="validateurFileChooser" minHeight="25.0" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" />
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Fichier à convertir" />
                              <CustomFileChooser fx:id="fileToConvertFileChooser" minWidth="390.0" prefWidth="390.0" />
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="169.0" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Format du fichier de données" />
                              <ComboBox fx:id="dataTypeComboBox" minHeight="25.0" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" style="-fx-background-radius: 0%;" />
                           </children>
                        </HBox>
                        <HBox fx:id="delimiteurLigneHBox" alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Délimiteur de ligne" />
                              <ComboBox fx:id="delimiteurLigne" minHeight="25.0" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" style="-fx-background-radius: 0%;" />
                           </children>
                        </HBox>
                        <HBox fx:id="delimiteurColonneHBox" alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Délimiteur colonne" />
                              <ComboBox fx:id="delimiteurColonne" minHeight="25.0" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" style="-fx-background-radius: 0%;" />
                           </children>
                        </HBox>
                        <HBox prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="170.0" prefHeight="25.0" prefWidth="170.0" style="-fx-text-fill: black;" text="Fichier contient ligne d'entête ?" />
                              <CheckBox fx:id="headerPresentCheckbox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                           </children>
                        </HBox>
                     </children>
                     <padding>
                        <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                     </padding>
                  </VBox>
               </content>
                </TitledPane>
            </children>
         <padding>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
         </padding>
        </VBox>
    </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/DecryptageAESEditForm.fxml
New file
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.CustomDirectoryChooser?>
<?import com.megatimfx.common.customcontrols.CustomFileChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<AnchorPane id="AnchorPane" prefHeight="235.0" prefWidth="657.0" style="-fx-background-color: #fff;" styleClass="mainForm" stylesheets="@../../../../../styles/CustomFormComponents.css" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.DecryptageAESEditFormController">
    <children>
        <VBox fillWidth="false" layoutX="-23.0" layoutY="40.0" prefHeight="226.0" prefWidth="698.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <TitledPane collapsible="false" style="-fx-text-fill: #ffffff;" text="Informations sur le fichier à décrypter">
                    <content>
                        <VBox spacing="20.0" style="-fx-background-color: #ffffff;">
                            <children>
                                <HBox alignment="CENTER_LEFT" spacing="10.0">
                                    <children>
                                        <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="210.0" prefHeight="25.0" prefWidth="210.0" style="-fx-text-fill: black;" text="Fichier à décrypter" />
                              <CustomFileChooser fx:id="fileToDecrypt" minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0" />
                                    </children>
                                </HBox>
                        <HBox alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="210.0" prefHeight="25.0" prefWidth="210.0" style="-fx-text-fill: black;" text="Repertoire de dépôt du fichier décrypté" />
                              <CustomDirectoryChooser fx:id="outputDir" minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0" />
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="210.0" prefHeight="25.0" prefWidth="210.0" style="-fx-text-fill: black;" text="Clé de décryptage" />
                              <StackPane minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0">
                                 <children>
                                    <PasswordField fx:id="keyToDecryptField" minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0" />
                                    <TextField fx:id="showKeyTextField" minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0" />
                                    <ImageView fx:id="eyeImageView" fitHeight="15.0" fitWidth="15.0" onMousePressed="#eyeOnMousePressed" pickOnBounds="true" preserveRatio="true" StackPane.alignment="CENTER_RIGHT">
                                       <image>
                                          <Image url="@../../../../../images/oeil.png" />
                                       </image>
                                       <StackPane.margin>
                                          <Insets right="5.0" />
                                       </StackPane.margin>
                                    </ImageView>
                                 </children>
                                 <HBox.margin>
                                    <Insets />
                                 </HBox.margin>
                              </StackPane>
                           </children>
                        </HBox>
                        <HBox alignment="CENTER_LEFT" spacing="10.0">
                           <children>
                              <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="210.0" prefHeight="25.0" prefWidth="210.0" style="-fx-text-fill: black;" text="Confirmation de la clé" />
                              <PasswordField fx:id="keyConfirmationField" minHeight="25.0" minWidth="370.0" prefHeight="25.0" prefWidth="370.0">
                                 <HBox.margin>
                                    <Insets />
                                 </HBox.margin>
                              </PasswordField>
                           </children>
                        </HBox>
                            </children>
                        </VBox>
                    </content>
                </TitledPane>
            </children>
         <padding>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
         </padding>
        </VBox>
    </children>
</AnchorPane>
fdx_convert/src/main/resources/importation/validation/data/client/forms/FileToValidateEditForm.fxml
New file
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.megatimfx.common.customcontrols.AbstractNestedEntityTable?>
<?import com.megatimfx.common.customcontrols.AbstractSelectionItem?>
<?import com.megatimfx.common.customcontrols.CustomFileChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="503.0" prefWidth="705.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="importation.validation.data.client.forms.FileToValidateEditFormController">
   <children>
      <VBox prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <TabPane fx:id="tabPane" prefHeight="553.0" prefWidth="702.0" stylesheets="@../../../../../styles/CustomFormComponents.css" tabClosingPolicy="UNAVAILABLE">
              <tabs>
                <Tab text="Fichier à valider">
                     <content>
                        <VBox prefHeight="518.0" prefWidth="645.0" spacing="15.0">
                           <children>
                              <TitledPane collapsible="false" prefHeight="496.0" prefWidth="702.0" style="-fx-text-fill: #fff;" text="Informations sur le fichier à valider">
                                 <content>
                                    <VBox prefHeight="275.0" prefWidth="614.0" spacing="20.0" style="-fx-background-color: #fff;">
                                       <children>
                                          <HBox layoutX="25.0" layoutY="358.0" prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Utiliser un modèle de conversion existant" />
                                                <CheckBox fx:id="useExistingConversionModelCheckBox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="25.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" maxWidth="213.0" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Modèle de conversion" />
                                                <AbstractSelectionItem fx:id="conversionModelAbstractSelectItem" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" maxWidth="213.0" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Type du fichier à valider" />
                                                <AbstractSelectionItem fx:id="typeFichierAbstractSelectItem" minWidth="390.0" prefHeight="25.0" prefWidth="390.0" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Fichier à valider" />
                                                <CustomFileChooser fx:id="fileToValidateFileChooser" minWidth="390.0" prefWidth="390.0" />
                                             </children>
                                          </HBox>
                                          <HBox alignment="CENTER_LEFT" layoutX="25.0" layoutY="169.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Format du fichier de données" />
                                                <ComboBox fx:id="dataTypeComboBox" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="delimiteurLigneHBox" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Délimiteur de ligne" />
                                                <ComboBox fx:id="delimiteurLigne" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox fx:id="delimiteurColonneHBox" alignment="CENTER_LEFT" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Délimiteur colonne" />
                                                <ComboBox fx:id="delimiteurColonne" minHeight="25.0" minWidth="300.0" prefHeight="25.0" prefWidth="300.0" style="-fx-background-radius: 0%;" />
                                             </children>
                                          </HBox>
                                          <HBox prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Fichier contient ligne d'entête ?" />
                                                <CheckBox fx:id="headerPresentCheckbox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                                             </children>
                                          </HBox>
                                          <HBox layoutX="25.0" layoutY="244.0" prefHeight="43.0" prefWidth="637.0" spacing="10.0">
                                             <children>
                                                <Label alignment="CENTER_RIGHT" minHeight="25.0" minWidth="225.0" prefHeight="25.0" prefWidth="225.0" style="-fx-text-fill: black;" text="Validation stricte des données ?" />
                                                <CheckBox fx:id="strictValidationCheckbox" minHeight="25.0" mnemonicParsing="false" prefHeight="25.0" text="Oui" />
                                             </children>
                                          </HBox>
                                       </children>
                                       <padding>
                                          <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                       </padding>
                                    </VBox>
                                 </content>
                              </TitledPane>
                           </children>
                           <padding>
                              <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
                           </padding>
                        </VBox>
                     </content>
                </Tab>
                <Tab text="Champs à tronquer">
                     <content>
                        <VBox prefHeight="200.0" prefWidth="100.0" spacing="15.0">
                           <children>
                              <TitledPane animated="false" collapsible="false" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Informations sur les champs">
                                 <content>
                                    <VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0">
                                       <children>
                                          <HBox alignment="CENTER_RIGHT">
                                             <children>
                                                <CheckBox fx:id="saisieAlphaNumeriqueFieldChecBox" mnemonicParsing="false" styleClass="square-border" stylesheets="@../../../../../../../../../generation-validateur-typefichier/src/main/resources/styles/style.css" text="Sélectionner les champs à tronquer" />
                                             </children>
                                          </HBox>
                                          <AbstractNestedEntityTable fx:id="metaAlphaNumeriqueFieldAbstractTable" prefHeight="252.0" prefWidth="526.0" VBox.vgrow="ALWAYS" />
                                       </children>
                                       <padding>
                                          <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                       </padding>
                                    </VBox>
                                 </content>
                              </TitledPane>
                           </children>
                           <padding>
                              <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
                           </padding>
                        </VBox>
                     </content>
                </Tab>
              </tabs>
            </TabPane>
         </children>
      </VBox>
   </children>
</AnchorPane>
Diff truncated after the above file
fdx_convert/src/main/resources/importation/validation/data/client/forms/ImportRawCsvDataEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/ImportTypeFichierEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/JournalEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/ModeleJsonEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/StructureChampJsonEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/SubObjectEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/TacheEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/TruncatedElementEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/TxtFileToValidateEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/TypeFichierEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/ValidateurEditForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/forms/ValidateurListForm.fxml fdx_convert/src/main/resources/importation/validation/data/client/views/JsonStructureFormView.fxml fdx_convert/src/main/resources/importation/validation/data/client/views/JsonStructureTableView.fxml fdx_convert/src/main/resources/importation/validation/data/client/views/jsonstructure/JsonStructureView.fxml fdx_convert/src/main/resources/log4j.properties fdx_convert/src/main/resources/predicatelogic-engine.xml fdx_convert/src/main/resources/styles/CustomFormComponents.css fdx_convert/src/main/resources/styles/FormComponents1.css fdx_convert/src/main/resources/styles/app-theme.css fdx_convert/src/main/resources/styles/custom-main-style.css fdx_convert/src/main/resources/styles/custom-title-bar.css fdx_convert/src/main/resources/styles/main_screen.css fdx_convert/src/main/resources/styles/style.css fdx_convert/target/classes/.netbeans_automatic_build fdx_convert/target/classes/app.properties fdx_convert/target/classes/fonts/LICENSE.txt fdx_convert/target/classes/fonts/Roboto-Black.ttf fdx_convert/target/classes/fonts/Roboto-BlackItalic.ttf fdx_convert/target/classes/fonts/Roboto-Bold.ttf fdx_convert/target/classes/fonts/Roboto-BoldItalic.ttf fdx_convert/target/classes/fonts/Roboto-Italic.ttf fdx_convert/target/classes/fonts/Roboto-Light.ttf fdx_convert/target/classes/fonts/Roboto-LightItalic.ttf fdx_convert/target/classes/fonts/Roboto-Medium.ttf fdx_convert/target/classes/fonts/Roboto-MediumItalic.ttf fdx_convert/target/classes/fonts/Roboto-Regular.ttf fdx_convert/target/classes/fonts/Roboto-Thin.ttf fdx_convert/target/classes/fonts/Roboto-ThinItalic.ttf fdx_convert/target/classes/images/143-01.png fdx_convert/target/classes/images/143-02.png fdx_convert/target/classes/images/143-03.png fdx_convert/target/classes/images/143-04.png fdx_convert/target/classes/images/143-05.png fdx_convert/target/classes/images/Accueil.png fdx_convert/target/classes/images/Accuueil_agent.jpg fdx_convert/target/classes/images/Apropos.png fdx_convert/target/classes/images/Barre_outils_hover-01.png fdx_convert/target/classes/images/Barre_outils_hover-02.png fdx_convert/target/classes/images/Export.png fdx_convert/target/classes/images/Fichier.png fdx_convert/target/classes/images/Logo_FDX_Convert.png fdx_convert/target/classes/images/Recherche.png fdx_convert/target/classes/images/Reset.png fdx_convert/target/classes/images/Search.png fdx_convert/target/classes/images/add-disabled.png fdx_convert/target/classes/images/add-new.png fdx_convert/target/classes/images/add-subtype.png fdx_convert/target/classes/images/add.png fdx_convert/target/classes/images/agrandir.png fdx_convert/target/classes/images/app_icon.png fdx_convert/target/classes/images/custom_app_icon.png fdx_convert/target/classes/images/custom_close_icon.png fdx_convert/target/classes/images/delete-disabled.png fdx_convert/target/classes/images/delete-new.png fdx_convert/target/classes/images/delete-subtype.png fdx_convert/target/classes/images/edit-disabled.png fdx_convert/target/classes/images/edit-new.png fdx_convert/target/classes/images/edit.png fdx_convert/target/classes/images/error-icon.png fdx_convert/target/classes/images/exporter.png fdx_convert/target/classes/images/fermer.png fdx_convert/target/classes/images/fichiers_generesx.png fdx_convert/target/classes/images/icone_ins.png fdx_convert/target/classes/images/intervalle_affichage.png fdx_convert/target/classes/images/max-icon.png fdx_convert/target/classes/images/max_icon.png fdx_convert/target/classes/images/min-icon.png fdx_convert/target/classes/images/motif-title-bar.jpg fdx_convert/target/classes/images/next-img.png fdx_convert/target/classes/images/oeil.png fdx_convert/target/classes/images/previous-img.png fdx_convert/target/classes/images/print-disabled.png fdx_convert/target/classes/images/print-new.png fdx_convert/target/classes/images/print.png fdx_convert/target/classes/images/reduire.png fdx_convert/target/classes/images/success-icon.png fdx_convert/target/classes/images/table-plus.png fdx_convert/target/classes/images/tache.png fdx_convert/target/classes/images/tache_hover.png fdx_convert/target/classes/images/trash.png fdx_convert/target/classes/images/update-subtype.png fdx_convert/target/classes/importation/validation/data/client/abstracts/AbstractEditDialog.fxml fdx_convert/target/classes/importation/validation/data/client/abstracts/AbstractMainDialog.fxml fdx_convert/target/classes/importation/validation/data/client/controller/main.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/ConversionModelAdvancedSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/ConversionModelSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/JournalAdvancedSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/JournalSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/TacheSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/TruncatedElementAdvancedSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/TruncatedElementSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/TypeFichierAdvancedSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/TypeFichierSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/controller/search/ValidateurSearchForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/About.fxml fdx_convert/target/classes/importation/validation/data/client/forms/AlphaNumeriqueFieldEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ConfigEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ConversionModelEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/DataFileToJsonEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/DecryptageAESEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/FileToValidateEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ImportRawCsvDataEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ImportTypeFichierEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/JournalEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ModeleJsonEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/StructureChampJsonEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/SubObjectEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/TacheEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/TruncatedElementEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/TxtFileToValidateEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/TypeFichierEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ValidateurEditForm.fxml fdx_convert/target/classes/importation/validation/data/client/forms/ValidateurListForm.fxml fdx_convert/target/classes/importation/validation/data/client/views/JsonStructureFormView.fxml fdx_convert/target/classes/importation/validation/data/client/views/JsonStructureTableView.fxml fdx_convert/target/classes/importation/validation/data/client/views/jsonstructure/JsonStructureView.fxml fdx_convert/target/classes/log4j.properties fdx_convert/target/classes/predicatelogic-engine.xml fdx_convert/target/classes/styles/CustomFormComponents.css fdx_convert/target/classes/styles/FormComponents1.css fdx_convert/target/classes/styles/app-theme.css fdx_convert/target/classes/styles/custom-main-style.css fdx_convert/target/classes/styles/custom-title-bar.css fdx_convert/target/classes/styles/main_screen.css fdx_convert/target/classes/styles/style.css fdx_convert/target/maven-archiver/pom.properties fdx_convert/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst fdx_convert/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst fdx_convert/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst fdx_convert/target/test-classes/.netbeans_automatic_build