diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..e7f9026
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,20 @@
+version: "2.2"
+services:
+  mongo:
+    image: mongo:5.0
+    container_name: mongo
+    restart: unless-stopped
+    ports:
+      - "27017:27017"
+
+  mongo-express:
+    image: mongo-express:latest
+    container_name: mongo-express
+    environment:
+      - ME_CONFIG_MONGODB_URL=mongodb://mongo:27017/?authSource=admin
+      - ME_CONFIG_BASICAUTH_USERNAME=admin
+      - ME_CONFIG_BASICAUTH_PASSWORD=pass
+    links:
+      - mongo
+    ports:
+      - "8081:8081"
diff --git a/pom.xml b/pom.xml
index 1d1ae9f..cd7beab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.4.4</version>
+        <version>3.2.1</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>com.springbatch.excel</groupId>
@@ -14,8 +14,8 @@
     <name>tutorial</name>
     <description>Demo project for Spring Boot</description>
     <properties>
-        <java.version>1.8</java.version>
-        <poi.version>4.1.2</poi.version>
+        <java.version>21</java.version>
+        <poi.version>5.2.4</poi.version>
     </properties>
     <dependencies>
         <dependency>
@@ -43,6 +43,8 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
+            <version>1.18.30</version>
+            <scope>provided</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
@@ -51,29 +53,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.springframework.batch</groupId>
-            <artifactId>spring-batch-test</artifactId>
-            <scope>test</scope>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <!-- <scope>test</scope> -->
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
     </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
 
 </project>
diff --git a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
index 60266aa..dd18e4d 100644
--- a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
+++ b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
@@ -2,11 +2,10 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 @EnableScheduling
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication
 public class TutorialApplication {
 
     public static void main(String[] args) {
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
index 4932ad7..a009015 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
@@ -4,14 +4,15 @@
 import com.springbatch.excel.tutorial.batch.processors.EmployeeItemProcessor;
 import com.springbatch.excel.tutorial.batch.validators.EmployeeJobParametersValidator;
 import com.springbatch.excel.tutorial.domain.Employee;
+import lombok.RequiredArgsConstructor;
 import org.springframework.batch.core.Job;
 import org.springframework.batch.core.JobParametersValidator;
 import org.springframework.batch.core.Step;
-import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
-import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
-import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
 import org.springframework.batch.core.job.CompositeJobParametersValidator;
+import org.springframework.batch.core.job.builder.JobBuilder;
 import org.springframework.batch.core.launch.support.RunIdIncrementer;
+import org.springframework.batch.core.repository.JobRepository;
+import org.springframework.batch.core.step.builder.StepBuilder;
 import org.springframework.batch.item.ItemProcessor;
 import org.springframework.batch.item.ItemReader;
 import org.springframework.batch.item.data.MongoItemWriter;
@@ -19,24 +20,21 @@
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.PlatformTransactionManager;
 
 import java.util.Collections;
 
 /**
  * Configuration for batch
  */
-@EnableBatchProcessing
 @Configuration
+@RequiredArgsConstructor
 public class BatchConfiguration {
 
-    public final JobBuilderFactory jobBuilderFactory;
+    public final JobRepository jobRepository;
+    public final MongoTemplate mongoTemplate;
+    public final PlatformTransactionManager transactionManager;
 
-    public final StepBuilderFactory stepBuilderFactory;
-
-    public BatchConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
-        this.jobBuilderFactory = jobBuilderFactory;
-        this.stepBuilderFactory = stepBuilderFactory;
-    }
 
     @Bean
     public JobParametersValidator jobParametersValidator() {
@@ -61,39 +59,41 @@ public ItemReader<Employee> itemReader() {
     }
 
     @Bean
-    public MongoItemWriter<Employee> writer(MongoTemplate mongoTemplate) {
-        return new MongoItemWriterBuilder<Employee>().template(mongoTemplate).collection("employee")
+    public MongoItemWriter<Employee> writerMongo() {
+        return new MongoItemWriterBuilder<Employee>()
+                .template(mongoTemplate)
+                .collection("employee")
                 .build();
     }
 
 
-    /**
-     * step declaration
-     * @return {@link Step}
-     */
     @Bean
-    public Step employeeStep(MongoItemWriter<Employee> itemWriter) {
-        return stepBuilderFactory.get("employeeStep")
-                .<Employee, Employee>chunk(50)
+    public Step employeeStep() {
+        return new StepBuilder("employeeStep", jobRepository)
+                .<Employee, Employee>chunk(50, transactionManager)
                 .reader(itemReader())
                 .processor(itemProcessor())
-                .writer(itemWriter)
+                .writer(writerMongo())
                 .build();
     }
 
+    @Bean
+    public JobCompletionListener listener() {
+        return new JobCompletionListener();
+    }
 
 
     /**
      * job declaration
-     * @param listener {@link JobCompletionListener}
+     *
      * @return {@link Job}
      */
     @Bean
-    public Job employeeJob(JobCompletionListener listener, Step employeeStep) {
-        return jobBuilderFactory.get("employeeJob")
+    public Job employeeJob() {
+        return new JobBuilder("employeeJob", jobRepository)
                 .incrementer(new RunIdIncrementer())
-                .listener(listener)
-                .flow(employeeStep)
+                .listener(listener())
+                .flow(employeeStep())
                 .end()
                 .validator(compositeJobParametersValidator())
                 .build();
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
index 8e7715c..350bc4e 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
@@ -3,9 +3,8 @@
 import com.springbatch.excel.tutorial.batch.mappers.EmployeeItemRowMapper;
 import com.springbatch.excel.tutorial.domain.Employee;
 import com.springbatch.excel.tutorial.support.poi.AbstractExcelPoi;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.eval.NotImplementedException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.batch.core.ExitStatus;
 import org.springframework.batch.core.StepExecution;
 import org.springframework.batch.core.StepExecutionListener;
@@ -15,10 +14,9 @@
 
 import java.util.List;
 
+@Slf4j
 @Component
-public class EmployeeItemReader extends AbstractExcelPoi<Employee> implements ItemReader<Employee> , StepExecutionListener {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemReader.class);
+public class EmployeeItemReader extends AbstractExcelPoi<Employee> implements ItemReader<Employee>, StepExecutionListener {
 
     private int employeeIndex = 0;
 
@@ -40,7 +38,7 @@ public Employee read() {
             // read data in file
             employeeList = read(path, new EmployeeItemRowMapper());
 
-            if(!employeeList.isEmpty()) {
+            if (!employeeList.isEmpty()) {
 
                 if (employeeIndex < employeeList.size()) {
                     employee = employeeList.get(employeeIndex);
@@ -50,14 +48,14 @@ public Employee read() {
                 }
             }
         } catch (Exception e) {
-            LOGGER.warn("Cannot read the excel file: {}", e.getMessage());
+            log.warn("Cannot read the excel file: {}", e.getMessage());
         }
 
         return employee;
     }
 
     @Override
-    public void write(String filePath , List<Employee> aList) {
+    public void write(String filePath, List<Employee> aList) {
         throw new NotImplementedException("No need to implement this method in the context");
     }
 
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
index 7b118c5..4dd19f6 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
@@ -1,7 +1,7 @@
 package com.springbatch.excel.tutorial.batch;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.batch.core.Job;
 import org.springframework.batch.core.JobParameters;
 import org.springframework.batch.core.JobParametersBuilder;
@@ -19,11 +19,11 @@
 /**
  * @author aek
  */
+@Slf4j
 @Component
+@RequiredArgsConstructor
 public class EmployeeJobLauncher {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeJobLauncher.class);
-
     private final Job job;
 
     private final JobLauncher jobLauncher;
@@ -31,26 +31,21 @@ public class EmployeeJobLauncher {
     @Value("${employee.excel.processingfolder}")
     private String processingDir;
 
-    EmployeeJobLauncher(Job job, JobLauncher jobLauncher) {
-        this.job = job;
-        this.jobLauncher = jobLauncher;
-    }
-
     // run every 2 min
     @Scheduled(fixedRate = 120000)
     void launchFileToJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException, JobRestartException {
-        LOGGER.info("Starting job");
+        log.info("Starting job");
         String excelFilePath = String.format("%s/employee.xlsx", processingDir);
 
         JobParameters params = new JobParametersBuilder()
-                .addLong("jobId",System.currentTimeMillis())
-                .addDate("currentTime",new Date())
-                .addString("excelPath",excelFilePath)
+                .addLong("jobId", System.currentTimeMillis())
+                .addDate("currentTime", new Date())
+                .addString("excelPath", excelFilePath)
                 .toJobParameters();
 
         jobLauncher.run(job, params);
 
-        LOGGER.info("Stopping job");
+        log.info("Stopping job");
     }
 
 }
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
index 6e0b779..5499a86 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
@@ -1,40 +1,38 @@
 package com.springbatch.excel.tutorial.batch.listeners;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.batch.core.BatchStatus;
 import org.springframework.batch.core.JobExecution;
 import org.springframework.batch.core.listener.JobExecutionListenerSupport;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
+import java.time.LocalDateTime;
 
+@Slf4j
 @Component
 public class JobCompletionListener extends JobExecutionListenerSupport {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(JobCompletionListener.class);
-
     @Override
     public void afterJob(JobExecution jobExecution) {
 
-        String jobId = jobExecution.getJobParameters().getString("jobId");
+        String jobId = jobExecution.getJobParameters().getParameter("jobId").toString();
         String excelFilePath = jobExecution.getJobParameters().getString("excelPath");
 
-         // get job's start time
-        Date start = jobExecution.getCreateTime();
+        // get job's start time
+        LocalDateTime start = jobExecution.getCreateTime();
         //  get job's end time
-        Date end = jobExecution.getEndTime();
+        LocalDateTime end = jobExecution.getEndTime();
 
-        if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
+        if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
 
-            LOGGER.info("==========JOB FINISHED=======");
-            LOGGER.info("JobId      : {}",jobId);
-            LOGGER.info("excel Path      : {}",excelFilePath);
-            LOGGER.info("Start Date: {}", start);
-            LOGGER.info("End Date: {}", end);
-            LOGGER.info("==============================");
+            log.info("==========JOB FINISHED=======");
+            log.info("JobId      : {}", jobId);
+            log.info("excel Path      : {}", excelFilePath);
+            log.info("Start Date: {}", start);
+            log.info("End Date: {}", end);
+            log.info("==============================");
         }
 
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
index 85419c3..382f7bc 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
@@ -10,15 +10,12 @@ public class EmployeeItemRowMapper extends CellFactory implements RowMapper<Empl
 
     @Override
     public Employee transformerRow(Row row) {
-        Employee employee = new Employee();
-
-        employee.setFirstName((String) getCellValue(row.getCell(0)));
-        employee.setLastName((String) getCellValue(row.getCell(1)));
-        employee.setNumber((String) getCellValue(row.getCell(2)));
-        employee.setEmail((String) getCellValue(row.getCell(3)));
-        employee.setDepartment((String) getCellValue(row.getCell(4)));
-        employee.setSalary((Double) getCellValue(row.getCell(5)));
-
-        return employee;
+        return new Employee(null,
+                (String) getCellValue(row.getCell(0)),
+                (String) getCellValue(row.getCell(1)),
+                (String) getCellValue(row.getCell(2)),
+                (String) getCellValue(row.getCell(3)),
+                (String) getCellValue(row.getCell(4)),
+                (Double) getCellValue(row.getCell(5)));
     }
 }
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/processors/EmployeeItemProcessor.java b/src/main/java/com/springbatch/excel/tutorial/batch/processors/EmployeeItemProcessor.java
index bb344ff..87f8a00 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/processors/EmployeeItemProcessor.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/processors/EmployeeItemProcessor.java
@@ -3,11 +3,9 @@
 import com.springbatch.excel.tutorial.domain.Employee;
 import com.springbatch.excel.tutorial.repository.EmployeeRepository;
 import com.springbatch.excel.tutorial.support.poi.AbstractExcelPoi;
-import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.batch.core.BatchStatus;
 import org.springframework.batch.core.ExitStatus;
 import org.springframework.batch.core.StepExecution;
@@ -28,9 +26,8 @@
 /**
  * @author Eric KOUAME
  */
-public class EmployeeItemProcessor extends AbstractExcelPoi<Employee>  implements ItemProcessor<Employee, Employee>, StepExecutionListener {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemProcessor.class);
+@Slf4j
+public class EmployeeItemProcessor extends AbstractExcelPoi<Employee> implements ItemProcessor<Employee, Employee>, StepExecutionListener {
 
     private static final List<Employee> existingEmployees = new ArrayList<>();
 
@@ -46,9 +43,8 @@ public class EmployeeItemProcessor extends AbstractExcelPoi<Employee>  implement
     @Override
     public Employee process(Employee item) {
 
-        if(repository.findByNumber(item.getNumber()).isPresent()){
+        if (repository.findByNumber(item.number()).isPresent()) {
             existingEmployees.add(item);
-
             return null;
         }
 
@@ -60,25 +56,32 @@ public void beforeStep(StepExecution stepExecution) {
         /* Nothing to do before */
     }
 
-    @SneakyThrows
+    // @SneakyThrows
     @Override
     public ExitStatus afterStep(StepExecution stepExecution) {
-        String jobId = stepExecution.getJobParameters().getString("jobId");
+        String jobId = stepExecution.getJobParameters().getParameter("jobId").getValue().toString();
 
-        if(stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) {
+        if (stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) {
             // create log file. if completed
-            String path = new ClassPathResource(resultsfolder).getFile().getPath();
-            write(String.format("%s/employe-result-%s.xlsx", path, jobId),existingEmployees);
+            String path = null;
+            try {
+                path = new ClassPathResource(resultsfolder).getFile().getPath();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            write(String.format("%s/employe-result-%s.xlsx", path, jobId), existingEmployees);
         }
         return null;
     }
+
     /**
      * Create and write results file. employee duplicate entries
+     *
      * @param filePath file path
      * @param aList    list of employee
      */
     @Override
-    public void write(String filePath , List<Employee> aList) {
+    public void write(String filePath, List<Employee> aList) {
         try (XSSFWorkbook workbook = new XSSFWorkbook()) {
             // Create a Sheet
             Sheet sheet = workbook.createSheet("RESULTS");
@@ -96,28 +99,27 @@ public void write(String filePath , List<Employee> aList) {
                     "Email",
                     "Number"
             );
-            createHeaderRow(sheet, headers,cellStyle);
+            createHeaderRow(sheet, headers, cellStyle);
 
             // Create Other rows and cells with BeneficiaryExtraction data
             int rowNum = 1;
-            for(Employee employee: aList) {
+            for (Employee employee : aList) {
                 Row row = sheet.createRow(rowNum++);
 
-                createCell(row, 0, employee.getFirstName(), null);
-                createCell(row, 1, employee.getLastName(), null);
-                createCell(row, 2, employee.getEmail(), null);
-                createCell(row, 3, employee.getNumber(), null);
+                createCell(row, 0, employee.firstName(), null);
+                createCell(row, 1, employee.lastName(), null);
+                createCell(row, 2, employee.email(), null);
+                createCell(row, 3, employee.number(), null);
             }
 
             //lets write the excel data to file now
             try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
                 workbook.write(outputStream);
-                LOGGER.info("Results File written successfully");
+                log.info("Results File written successfully");
             }
-        }
-        catch (IOException e) {
-            LOGGER.warn("Cannot write results file: {}", e.getMessage());
-        }finally {
+        } catch (IOException e) {
+            log.warn("Cannot write results file: {}", e.getMessage());
+        } finally {
             existingEmployees.clear();
         }
     }
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
index dc10653..aa781c5 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
@@ -6,13 +6,13 @@
 
 public class EmployeeJobParametersValidator implements org.springframework.batch.core.JobParametersValidator {
 
-	@Override
-	public void validate(final JobParameters jobParameters) throws JobParametersInvalidException {
-		String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null;
+    @Override
+    public void validate(final JobParameters jobParameters) throws JobParametersInvalidException {
+        String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null;
 
-		if (fileName !=null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) {
-			throw new JobParametersInvalidException("The file type must be in xlsx format");
-		}
-	}
+        if (fileName != null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) {
+            throw new JobParametersInvalidException("The file type must be in xlsx format");
+        }
+    }
 
 }
diff --git a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
index 15f5ae2..ec88f9d 100644
--- a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
+++ b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
@@ -1,37 +1,21 @@
 package com.springbatch.excel.tutorial.domain;
 
-import com.sun.istack.internal.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.index.IndexDirection;
 import org.springframework.data.mongodb.core.index.Indexed;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Accessors(chain = true)
 @Document(collection = "employee")
-public class Employee  {
-
-    @Id
-    private String id;
-
-    private String firstName;
-
-    private String lastName;
-
-    @NotNull
-    @Indexed(unique = true, direction = IndexDirection.DESCENDING)
-    private String number;
-
-    private String email;
-
-    private String department;
-
-    private double salary;
-}
\ No newline at end of file
+public record Employee(
+        @Id
+        String id,
+        String firstName,
+        String lastName,
+        @Indexed(unique = true, direction = IndexDirection.DESCENDING)
+        String number,
+        String email,
+        String department,
+        double salary
+) {
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
index a36f647..6c17797 100644
--- a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
+++ b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
@@ -1,7 +1,6 @@
 package com.springbatch.excel.tutorial.service;
 
 
-
 import com.springbatch.excel.tutorial.domain.Employee;
 
 import java.util.Optional;
@@ -13,4 +12,4 @@ public interface EmployeeService {
      * @return Optional employee
      */
     Optional<Employee> getByNumber(String number);
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
index d871704..0489ab8 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
@@ -1,5 +1,6 @@
 package com.springbatch.excel.tutorial.support.poi;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
@@ -9,26 +10,23 @@
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * @param <T> generic Class
  * @author aek
  */
+@Slf4j
 public abstract class AbstractExcelPoi<T> {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractExcelPoi.class.getName());
-
     /**
      * @param filePath file path
-     * @param aList list of object
+     * @param aList    list of object
      */
     public abstract void write(String filePath, List<T> aList);
 
     /**
      * @param filePathStr file path location
-     * @param rowMapper RowMapper object
+     * @param rowMapper   RowMapper object
      * @return list of <T>
      */
     public List<T> read(String filePathStr, final RowMapper<T> rowMapper) {
@@ -38,20 +36,20 @@ public List<T> read(String filePathStr, final RowMapper<T> rowMapper) {
 
             Sheet sheet = workbook.getSheetAt(0);
 
-                sheet.forEach(row -> {
-                    // skip header
-                    if (row.getRowNum() != 0){
-                        try {
-                            bookList.add(rowMapper.transformerRow(row));
-                        } catch (ParseException exception) {
-                            LOGGER.log(Level.WARNING, "RowMapper Parse exception");
-                        }
+            sheet.forEach(row -> {
+                // skip header
+                if (row.getRowNum() != 0) {
+                    try {
+                        bookList.add(rowMapper.transformerRow(row));
+                    } catch (ParseException exception) {
+                        log.warn("RowMapper Parse exception");
                     }
-                });
+                }
+            });
 
             return bookList;
         } catch (IOException e) {
-            throw new ExcelFileException(String.format("Cannot read the file: %s",e.getMessage()));
+            throw new ExcelFileException(String.format("Cannot read the file: %s", e.getMessage()));
         }
     }
 
@@ -62,7 +60,7 @@ public List<T> read(String filePathStr, final RowMapper<T> rowMapper) {
     private Workbook getWorkbook(String filePathStr) {
         Workbook workbook;
 
-        try{
+        try {
             try (FileInputStream inputStream = new FileInputStream(new File(filePathStr))) {
                 if (filePathStr.endsWith("xlsx")) {
                     workbook = new XSSFWorkbook(inputStream);
@@ -70,7 +68,7 @@ private Workbook getWorkbook(String filePathStr) {
                     throw new ExcelFileException("The specified file is not Excel file");
                 }
             }
-        }catch(SecurityException | IOException e){
+        } catch (SecurityException | IOException e) {
             throw new ExcelFileException("The specified file is not Excel file");
         }
 
@@ -78,17 +76,16 @@ private Workbook getWorkbook(String filePathStr) {
     }
 
 
-
-
     /**
      * Create header of file
-     * @param sheet excel sheet
-     * @param headers list string of header
+     *
+     * @param sheet    excel sheet
+     * @param headers  list string of header
      * @param rowStyle style of header row
      */
     public void createHeaderRow(Sheet sheet, List<String> headers, CellStyle rowStyle) {
 
-        if(!headers.isEmpty()){
+        if (!headers.isEmpty()) {
             // Create a Row
             Row row = sheet.createRow(0);
             // Create cells
@@ -101,10 +98,10 @@ public void createHeaderRow(Sheet sheet, List<String> headers, CellStyle rowStyl
     }
 
     /**
-     * @param row file row
+     * @param row         file row
      * @param columnCount index of column
-     * @param value the value to will set
-     * @param style cel row
+     * @param value       the value to will set
+     * @param style       cel row
      * @return Cell value
      */
     public Cell createCell(Row row, int columnCount, Object value, CellStyle style) {
@@ -113,14 +110,14 @@ public Cell createCell(Row row, int columnCount, Object value, CellStyle style)
             cell.setCellValue((Integer) value);
         } else if (value instanceof Boolean) {
             cell.setCellValue((Boolean) value);
-        }else if (value instanceof Double) {
+        } else if (value instanceof Double) {
             cell.setCellValue((Double) value);
         } else {
             cell.setCellValue((String) value);
         }
 
 
-        if(style != null){
+        if (style != null) {
             cell.setCellStyle(style);
         }
 
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
index 584f69a..dc1d271 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
@@ -9,11 +9,12 @@
 
 /**
  * Extract cell value
+ *
  * @author aek
  */
 public class CellFactory {
 
-    private static final EnumMap<CellType, Function<Cell,Object>>
+    private static final EnumMap<CellType, Function<Cell, Object>>
             EXCEL_CELL_VALUE = new EnumMap<>(CellType.class);
 
     static {
@@ -37,13 +38,13 @@ public class CellFactory {
      * @return Object row
      */
     public Object getCellValue(Cell cell) {
-        try{
-            if(cell == null){
+        try {
+            if (cell == null) {
                 return null;
             }
             return EXCEL_CELL_VALUE.get(cell.getCellType()).apply(cell);
-        }catch (Exception e){
-            throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )",cell.getCellType()));
+        } catch (Exception e) {
+            throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )", cell.getCellType()));
         }
     }
 
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
index 4e12456..1ac6d11 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
@@ -1,5 +1,6 @@
 /**
  * Core package for the Apache POI library.
+ *
  * @author aek
  */
-package com.springbatch.excel.tutorial.support.poi;
\ No newline at end of file
+package com.springbatch.excel.tutorial.support.poi;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 7fe2c8b..a7b8a04 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,11 +1,23 @@
 spring:
+  h2:
+    console:
+      enabled: true
+  datasource:
+    url: jdbc:h2:mem:batch-sample;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1
+    driverClassName: org.h2.Driver
+    username: sa
+    password: qaz@123
+  jpa:
+    database-platform: org.hibernate.dialect.H2Dialect
+
   data:
     mongodb:
       host: localhost
       port: 27017
-      database: <<databasename>>
-      username: <<databaseuser>>
-      password: <<databasepassword>>      
+      database: spring_batch_excel_mongodb_db
+#      username: admin
+#      password: pass
+      auto-index-creation: true
 
   jackson:
     default-property-inclusion: NON_NULL
@@ -13,6 +25,9 @@ spring:
   batch:
     job:
       enabled: false
+      initialize-schema: never
+      initializer:
+        enabled: false
 
 # Enable Logging mongo queries
 logging:
@@ -23,3 +38,5 @@ employee:
   excel:
     processingfolder: data/processing/
     resultsfolder: data/results/
+file:
+  input: countries.csv
diff --git a/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java
new file mode 100644
index 0000000..130a434
--- /dev/null
+++ b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java
@@ -0,0 +1,61 @@
+package com.springbatch.excel.tutorial;
+import com.springbatch.excel.tutorial.batch.BatchConfiguration;
+import com.springbatch.excel.tutorial.batch.listeners.JobCompletionListener;
+import com.springbatch.excel.tutorial.domain.Employee;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobParameter;
+import org.springframework.batch.core.JobParameters;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.util.*;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+
+
+@ExtendWith(SpringExtension.class)
+@EnableBatchProcessing
+@ComponentScan(basePackages = "com.springbatch.excel.tutorial")
+@SpringBootTest(classes = {BatchConfiguration.class, JobCompletionListener.class})
+class BatchIntegrationTest {
+
+    @Autowired
+    private  JobLauncher jobLauncher;
+
+    @Autowired
+    private  Job jsonFileProcessingJob;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Test
+    void testBatchJob() throws Exception {
+        String absolutePath = Objects.requireNonNull(getClass().getResource("/data/processing/employee.xlsx")).getPath();
+
+        // Créez les paramètres du job
+        Map<String, JobParameter> jobParameters = new HashMap<>();
+        jobParameters.put("filePath", new JobParameter(absolutePath));
+        jobParameters.put("currentTime", new JobParameter(new Date()));
+
+        // Lancez le job avec les paramètres
+        JobExecution jobExecution = jobLauncher.run(jsonFileProcessingJob,new JobParameters(jobParameters));
+
+        // Vérifiez que le job s'est terminé avec succès
+        assertThat(jobExecution.getExitStatus().getExitCode()).isEqualTo("COMPLETED");
+
+        List<Employee> couponOffers = mongoTemplate.findAll(Employee.class);
+        assertThat(couponOffers.size()).isEqualTo(100);
+
+    }
+}
+
+
diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml
new file mode 100644
index 0000000..a0fd8c1
--- /dev/null
+++ b/src/test/resources/application.yml
@@ -0,0 +1,26 @@
+spring:
+  data:
+    mongodb:
+      host: localhost
+      port: 27017
+      database: spring_batch_excel_mongodb_db
+#      username: admin
+#      password: pass
+      auto-index-creation: true
+
+  jackson:
+    default-property-inclusion: NON_NULL
+#disabled job run at startup
+  batch:
+    job:
+      enabled: false
+
+# Enable Logging mongo queries
+logging:
+  level:
+    org.springframework.data.mongodb.core.MongoTemplate: DEBUG
+
+employee:
+  excel:
+    processingfolder: data/processing/
+    resultsfolder: data/results/
diff --git a/src/test/resources/data/processing/employee.txt b/src/test/resources/data/processing/employee.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/test/resources/data/processing/employee.xlsx b/src/test/resources/data/processing/employee.xlsx
new file mode 100644
index 0000000..312ae9a
Binary files /dev/null and b/src/test/resources/data/processing/employee.xlsx differ
diff --git a/src/test/resources/data/results/readme.txt b/src/test/resources/data/results/readme.txt
new file mode 100644
index 0000000..e69de29