From fa74201b4efef4d2501a4098ba2450ed3d98139e Mon Sep 17 00:00:00 2001 From: devArm <67116310+ArmLE@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:51:20 -0500 Subject: [PATCH 1/7] Initial commit --- LICENSE | 21 +++++++++++++++++++++ README.md | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b9b4d36 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 devArm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 668a6a2..2fe8001 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # Reto Técnico: Procesamiento de Transacciones Bancarias (CLI) ## Objetivo: @@ -64,3 +65,6 @@ Desarrolla una aplicación de línea de comandos (CLI) que procese un archivo CS 6. **Documentación y Calidad del Código:** - Código bien documentado y fácil de leer. - Comentarios explicando pasos clave y lógica del programa. + +# retotecnico-cobol +# cd20e34 (Initial commit) From f28e13ca0ba0fda7e7f93e1ddf37669368abc292 Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 14:04:53 -0500 Subject: [PATCH 2/7] feat: Processing of Bank Transactions --- .gitignore | 42 +++++++++++++ .idea/.gitignore | 8 +++ .idea/gradle.xml | 17 ++++++ .idea/misc.xml | 10 +++ .idea/vcs.xml | 6 ++ build.gradle | 21 +++++++ settings.gradle | 2 + .../java/org/cli/ComparableTransaccion.java | 6 ++ src/main/java/org/cli/Main.java | 61 +++++++++++++++++++ src/main/java/org/cli/Transaccion.java | 28 +++++++++ src/main/resources/input.csv | 6 ++ 11 files changed, 207 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 build.gradle create mode 100644 settings.gradle create mode 100644 src/main/java/org/cli/ComparableTransaccion.java create mode 100644 src/main/java/org/cli/Main.java create mode 100644 src/main/java/org/cli/Transaccion.java create mode 100644 src/main/resources/input.csv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..1c2fda5 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..2a00f5d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..9448234 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..9661ac7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d2dd1b1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' +} + +group = 'org.example' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/com.univocity/univocity-parsers + implementation("com.univocity:univocity-parsers:2.9.1") + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..5b54dc2 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'retotecnico-cobol' + diff --git a/src/main/java/org/cli/ComparableTransaccion.java b/src/main/java/org/cli/ComparableTransaccion.java new file mode 100644 index 0000000..3ce98e2 --- /dev/null +++ b/src/main/java/org/cli/ComparableTransaccion.java @@ -0,0 +1,6 @@ +package org.cli; + +public interface ComparableTransaccion extends Comparable { + @Override + int compareTo(Transaccion t); +} diff --git a/src/main/java/org/cli/Main.java b/src/main/java/org/cli/Main.java new file mode 100644 index 0000000..0d95ad5 --- /dev/null +++ b/src/main/java/org/cli/Main.java @@ -0,0 +1,61 @@ +package org.cli; + +import com.univocity.parsers.annotations.Parsed; +import com.univocity.parsers.common.processor.BeanListProcessor; +import com.univocity.parsers.csv.CsvParserSettings; +import com.univocity.parsers.csv.CsvRoutines; + +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class Main { + public static void main(String[] args) throws FileNotFoundException{ + + List transactions = getTransaccions(); + + Transaccion biggest = transactions.stream().max(Transaccion::compareTo).get(); + + Map tipoCount = transactions.stream() + .collect(Collectors.groupingBy(t -> t.tipo, Collectors.counting())); + + BigDecimal balance = getBalance(transactions); + + print(balance, tipoCount, biggest); + + } + + private static void print(BigDecimal balance, Map tipoCount, Transaccion biggest) { + System.out.println("Reporte de Transacciones"); + System.out.println("---------------------------------------------"); + System.out.println("Balance Final: " + balance); + System.out.println("Transacción de Mayor Monto: " + biggest); + System.out.println("Conteo de Transacciones: " + tipoCount.toString().replaceAll("[^\\p{L}\\p{N}\\s=,]","")); + + } + + private static BigDecimal getBalance(List transactions) { + return transactions.stream() + .map(t -> + switch (t.tipo){ + case "Débito" -> t.monto.negate(); + case "Crédito" -> t.monto; + default -> throw new IllegalStateException("Unexpected value: " + t.tipo); + }) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + private static List getTransaccions() { + CsvParserSettings settings = new CsvParserSettings(); + settings.setHeaderExtractionEnabled(true); + + CsvRoutines routines = new CsvRoutines(settings); + + InputStream resource = Main.class.getClassLoader().getResourceAsStream("input.csv"); + + return routines.parseAll(Transaccion.class, resource); + } +} \ No newline at end of file diff --git a/src/main/java/org/cli/Transaccion.java b/src/main/java/org/cli/Transaccion.java new file mode 100644 index 0000000..5ca2ce8 --- /dev/null +++ b/src/main/java/org/cli/Transaccion.java @@ -0,0 +1,28 @@ +package org.cli; + +import com.univocity.parsers.annotations.Parsed; +import com.univocity.parsers.annotations.Trim; +import com.univocity.parsers.annotations.UpperCase; + +import java.math.BigDecimal; + +public class Transaccion implements ComparableTransaccion{ + @Parsed(field = "id") + private BigDecimal id; + @Trim + @Parsed(field = "tipo") + public String tipo; + @Parsed(field = "monto") + public BigDecimal monto; + + @Override + public String toString() { + return "ID " + id +" - " + monto; + } + + @Override + public int compareTo(Transaccion t) { + return monto.compareTo(t.monto); + } +} + diff --git a/src/main/resources/input.csv b/src/main/resources/input.csv new file mode 100644 index 0000000..ac0c3bd --- /dev/null +++ b/src/main/resources/input.csv @@ -0,0 +1,6 @@ +id,tipo,monto +1,Crédito,100.00 +2,Débito,50.00 +3,Crédito,200.00 +4,Débito,75.00 +5,Crédito,150.00 \ No newline at end of file From eb2de8a22e156c0fc50791d976bee51bc7d4f51d Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 14:51:08 -0500 Subject: [PATCH 3/7] fix: hexagonal architecture --- src/main/java/org/cli/Main.java | 31 +++++++------------ .../java/org/cli/adapter/out/FileAdapter.java | 24 ++++++++++++++ .../domain/model}/ComparableTransaccion.java | 2 +- .../domain/model}/Transaccion.java | 3 +- .../service/LoadTransaccionService.java | 17 ++++++++++ .../port/out/LoadTransaccionPort.java | 9 ++++++ 6 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 src/main/java/org/cli/adapter/out/FileAdapter.java rename src/main/java/org/cli/{ => application/domain/model}/ComparableTransaccion.java (72%) rename src/main/java/org/cli/{ => application/domain/model}/Transaccion.java (85%) create mode 100644 src/main/java/org/cli/application/domain/service/LoadTransaccionService.java create mode 100644 src/main/java/org/cli/application/port/out/LoadTransaccionPort.java diff --git a/src/main/java/org/cli/Main.java b/src/main/java/org/cli/Main.java index 0d95ad5..fec455d 100644 --- a/src/main/java/org/cli/Main.java +++ b/src/main/java/org/cli/Main.java @@ -1,13 +1,13 @@ package org.cli; -import com.univocity.parsers.annotations.Parsed; -import com.univocity.parsers.common.processor.BeanListProcessor; import com.univocity.parsers.csv.CsvParserSettings; import com.univocity.parsers.csv.CsvRoutines; +import org.cli.adapter.out.FileAdapter; +import org.cli.application.domain.model.Transaccion; +import org.cli.application.domain.service.LoadTransaccionService; import java.io.*; import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -15,25 +15,27 @@ public class Main { public static void main(String[] args) throws FileNotFoundException{ - List transactions = getTransaccions(); + LoadTransaccionService service = new LoadTransaccionService(new FileAdapter()); - Transaccion biggest = transactions.stream().max(Transaccion::compareTo).get(); + List transactions = service.loadCsv("input.csv"); - Map tipoCount = transactions.stream() + Transaccion biggest = transactions.stream().max(Transaccion::compareTo).orElse(null); + + Map kindCount = transactions.stream() .collect(Collectors.groupingBy(t -> t.tipo, Collectors.counting())); BigDecimal balance = getBalance(transactions); - print(balance, tipoCount, biggest); + print(balance, kindCount, biggest); } - private static void print(BigDecimal balance, Map tipoCount, Transaccion biggest) { + private static void print(BigDecimal balance, Map kindCount, Transaccion biggest) { System.out.println("Reporte de Transacciones"); System.out.println("---------------------------------------------"); System.out.println("Balance Final: " + balance); System.out.println("Transacción de Mayor Monto: " + biggest); - System.out.println("Conteo de Transacciones: " + tipoCount.toString().replaceAll("[^\\p{L}\\p{N}\\s=,]","")); + System.out.println("Conteo de Transacciones: " + kindCount.toString().replaceAll("[^\\p{L}\\p{N}\\s=,]","")); } @@ -47,15 +49,4 @@ private static BigDecimal getBalance(List transactions) { }) .reduce(BigDecimal.ZERO, BigDecimal::add); } - - private static List getTransaccions() { - CsvParserSettings settings = new CsvParserSettings(); - settings.setHeaderExtractionEnabled(true); - - CsvRoutines routines = new CsvRoutines(settings); - - InputStream resource = Main.class.getClassLoader().getResourceAsStream("input.csv"); - - return routines.parseAll(Transaccion.class, resource); - } } \ No newline at end of file diff --git a/src/main/java/org/cli/adapter/out/FileAdapter.java b/src/main/java/org/cli/adapter/out/FileAdapter.java new file mode 100644 index 0000000..0fb3094 --- /dev/null +++ b/src/main/java/org/cli/adapter/out/FileAdapter.java @@ -0,0 +1,24 @@ +package org.cli.adapter.out; + +import com.univocity.parsers.csv.CsvParserSettings; +import com.univocity.parsers.csv.CsvRoutines; +import org.cli.Main; +import org.cli.application.domain.model.Transaccion; +import org.cli.application.port.out.LoadTransaccionPort; + +import java.io.InputStream; +import java.util.List; + +public class FileAdapter implements LoadTransaccionPort { + @Override + public List loadFromLocal(String filename) { + CsvParserSettings settings = new CsvParserSettings(); + settings.setHeaderExtractionEnabled(true); + + CsvRoutines routines = new CsvRoutines(settings); + + InputStream resource = Main.class.getClassLoader().getResourceAsStream(filename); + + return routines.parseAll(Transaccion.class, resource); + } +} diff --git a/src/main/java/org/cli/ComparableTransaccion.java b/src/main/java/org/cli/application/domain/model/ComparableTransaccion.java similarity index 72% rename from src/main/java/org/cli/ComparableTransaccion.java rename to src/main/java/org/cli/application/domain/model/ComparableTransaccion.java index 3ce98e2..91fe41e 100644 --- a/src/main/java/org/cli/ComparableTransaccion.java +++ b/src/main/java/org/cli/application/domain/model/ComparableTransaccion.java @@ -1,4 +1,4 @@ -package org.cli; +package org.cli.application.domain.model; public interface ComparableTransaccion extends Comparable { @Override diff --git a/src/main/java/org/cli/Transaccion.java b/src/main/java/org/cli/application/domain/model/Transaccion.java similarity index 85% rename from src/main/java/org/cli/Transaccion.java rename to src/main/java/org/cli/application/domain/model/Transaccion.java index 5ca2ce8..21c2e7a 100644 --- a/src/main/java/org/cli/Transaccion.java +++ b/src/main/java/org/cli/application/domain/model/Transaccion.java @@ -1,8 +1,7 @@ -package org.cli; +package org.cli.application.domain.model; import com.univocity.parsers.annotations.Parsed; import com.univocity.parsers.annotations.Trim; -import com.univocity.parsers.annotations.UpperCase; import java.math.BigDecimal; diff --git a/src/main/java/org/cli/application/domain/service/LoadTransaccionService.java b/src/main/java/org/cli/application/domain/service/LoadTransaccionService.java new file mode 100644 index 0000000..1fe77c0 --- /dev/null +++ b/src/main/java/org/cli/application/domain/service/LoadTransaccionService.java @@ -0,0 +1,17 @@ +package org.cli.application.domain.service; + +import org.cli.application.domain.model.Transaccion; +import org.cli.application.port.out.LoadTransaccionPort; + +import java.util.List; + +public class LoadTransaccionService { + private final LoadTransaccionPort loadTransaccionPort; + + public LoadTransaccionService(LoadTransaccionPort loadTransaccionPort) { + this.loadTransaccionPort = loadTransaccionPort; + } + public List loadCsv(String filename) { + return loadTransaccionPort.loadFromLocal(filename); + } +} diff --git a/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java b/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java new file mode 100644 index 0000000..eab136a --- /dev/null +++ b/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java @@ -0,0 +1,9 @@ +package org.cli.application.port.out; + +import org.cli.application.domain.model.Transaccion; + +import java.util.List; + +public interface LoadTransaccionPort { + List loadFromLocal(String filename); +} From f89ae0e81659ab531c909e85c17d42d2d5abae4e Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 15:31:59 -0500 Subject: [PATCH 4/7] chore: build with shadowJar --- build.gradle | 22 ++++++++++++++++++- .../java/org/cli/adapter/out/FileAdapter.java | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d2dd1b1..49f2171 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'com.github.johnrengelman.shadow' version '7.0.0' } group = 'org.example' @@ -11,11 +12,30 @@ repositories { dependencies { // https://mvnrepository.com/artifact/com.univocity/univocity-parsers - implementation("com.univocity:univocity-parsers:2.9.1") + implementation 'com.univocity:univocity-parsers:2.8.4' testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' } +jar { + manifest { + attributes( + 'Main-Class': 'org.cli.Main' + ) + } + from('src/main/resources') { + into('resources') + } +} + +shadowJar { + archiveBaseName.set('retotecnico-cobol') + archiveVersion.set('1.0-SNAPSHOT') + mergeServiceFiles() +} + +build.dependsOn shadowJar + test { useJUnitPlatform() } \ No newline at end of file diff --git a/src/main/java/org/cli/adapter/out/FileAdapter.java b/src/main/java/org/cli/adapter/out/FileAdapter.java index 0fb3094..26a02d1 100644 --- a/src/main/java/org/cli/adapter/out/FileAdapter.java +++ b/src/main/java/org/cli/adapter/out/FileAdapter.java @@ -17,7 +17,7 @@ public List loadFromLocal(String filename) { CsvRoutines routines = new CsvRoutines(settings); - InputStream resource = Main.class.getClassLoader().getResourceAsStream(filename); + InputStream resource = getClass().getClassLoader().getResourceAsStream(filename); return routines.parseAll(Transaccion.class, resource); } From e6e242bb1d8951caab4dedf560a67bf754bf912e Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 16:29:50 -0500 Subject: [PATCH 5/7] fix: manage InputStream external and internal --- src/main/java/org/cli/Main.java | 22 ++++++++++--------- .../java/org/cli/adapter/out/FileAdapter.java | 19 +++++++++++----- ...rvice.java => LoadTransactionService.java} | 5 +++-- .../port/out/LoadTransaccionPort.java | 1 + 4 files changed, 30 insertions(+), 17 deletions(-) rename src/main/java/org/cli/application/domain/service/{LoadTransaccionService.java => LoadTransactionService.java} (73%) diff --git a/src/main/java/org/cli/Main.java b/src/main/java/org/cli/Main.java index fec455d..7e30e8c 100644 --- a/src/main/java/org/cli/Main.java +++ b/src/main/java/org/cli/Main.java @@ -1,29 +1,27 @@ package org.cli; -import com.univocity.parsers.csv.CsvParserSettings; -import com.univocity.parsers.csv.CsvRoutines; import org.cli.adapter.out.FileAdapter; import org.cli.application.domain.model.Transaccion; -import org.cli.application.domain.service.LoadTransaccionService; +import org.cli.application.domain.service.LoadTransactionService; import java.io.*; import java.math.BigDecimal; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; public class Main { - public static void main(String[] args) throws FileNotFoundException{ + public static void main(String[] args) { - LoadTransaccionService service = new LoadTransaccionService(new FileAdapter()); + LoadTransactionService service = new LoadTransactionService(new FileAdapter()); + Optional filePath = getFilePath(args); - List transactions = service.loadCsv("input.csv"); + List transactions = service.loadCsv(filePath.orElse("input.csv")); Transaccion biggest = transactions.stream().max(Transaccion::compareTo).orElse(null); - - Map kindCount = transactions.stream() - .collect(Collectors.groupingBy(t -> t.tipo, Collectors.counting())); - + Map kindCount = transactions.stream().collect( + Collectors.groupingBy(t -> t.tipo, Collectors.counting())); BigDecimal balance = getBalance(transactions); print(balance, kindCount, biggest); @@ -49,4 +47,8 @@ private static BigDecimal getBalance(List transactions) { }) .reduce(BigDecimal.ZERO, BigDecimal::add); } + + private static Optional getFilePath(String[] args) { + return args.length > 0 ? Optional.of(args[0]) : Optional.empty(); + } } \ No newline at end of file diff --git a/src/main/java/org/cli/adapter/out/FileAdapter.java b/src/main/java/org/cli/adapter/out/FileAdapter.java index 26a02d1..b9395d7 100644 --- a/src/main/java/org/cli/adapter/out/FileAdapter.java +++ b/src/main/java/org/cli/adapter/out/FileAdapter.java @@ -2,23 +2,32 @@ import com.univocity.parsers.csv.CsvParserSettings; import com.univocity.parsers.csv.CsvRoutines; -import org.cli.Main; import org.cli.application.domain.model.Transaccion; import org.cli.application.port.out.LoadTransaccionPort; +import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import java.util.List; public class FileAdapter implements LoadTransaccionPort { @Override public List loadFromLocal(String filename) { + CsvParserSettings settings = new CsvParserSettings(); settings.setHeaderExtractionEnabled(true); - CsvRoutines routines = new CsvRoutines(settings); - InputStream resource = getClass().getClassLoader().getResourceAsStream(filename); - - return routines.parseAll(Transaccion.class, resource); + return routines.parseAll(Transaccion.class, loadFromFileSystem(filename)); + } + private InputStream loadFromFileSystem(String filename) { + try { + return new FileInputStream(filename); + } catch (IOException e) { + System.err.println("File not found in the filesystem: " + filename); + System.out.println("Using a internal file input.csv of own resources "); + System.out.println(); + return getClass().getClassLoader().getResourceAsStream("input.csv"); + } } } diff --git a/src/main/java/org/cli/application/domain/service/LoadTransaccionService.java b/src/main/java/org/cli/application/domain/service/LoadTransactionService.java similarity index 73% rename from src/main/java/org/cli/application/domain/service/LoadTransaccionService.java rename to src/main/java/org/cli/application/domain/service/LoadTransactionService.java index 1fe77c0..4bf66ab 100644 --- a/src/main/java/org/cli/application/domain/service/LoadTransaccionService.java +++ b/src/main/java/org/cli/application/domain/service/LoadTransactionService.java @@ -3,12 +3,13 @@ import org.cli.application.domain.model.Transaccion; import org.cli.application.port.out.LoadTransaccionPort; +import java.io.FileNotFoundException; import java.util.List; -public class LoadTransaccionService { +public class LoadTransactionService { private final LoadTransaccionPort loadTransaccionPort; - public LoadTransaccionService(LoadTransaccionPort loadTransaccionPort) { + public LoadTransactionService(LoadTransaccionPort loadTransaccionPort) { this.loadTransaccionPort = loadTransaccionPort; } public List loadCsv(String filename) { diff --git a/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java b/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java index eab136a..36cd15b 100644 --- a/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java +++ b/src/main/java/org/cli/application/port/out/LoadTransaccionPort.java @@ -2,6 +2,7 @@ import org.cli.application.domain.model.Transaccion; +import java.io.FileNotFoundException; import java.util.List; public interface LoadTransaccionPort { From 0552efe4c52dec20a4aebf8f0d04ac367e6bc9df Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 17:15:29 -0500 Subject: [PATCH 6/7] fix: noPath or noFile use internalFile --- src/main/java/org/cli/Main.java | 2 +- src/main/java/org/cli/adapter/out/FileAdapter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cli/Main.java b/src/main/java/org/cli/Main.java index 7e30e8c..5d98de0 100644 --- a/src/main/java/org/cli/Main.java +++ b/src/main/java/org/cli/Main.java @@ -17,7 +17,7 @@ public static void main(String[] args) { LoadTransactionService service = new LoadTransactionService(new FileAdapter()); Optional filePath = getFilePath(args); - List transactions = service.loadCsv(filePath.orElse("input.csv")); + List transactions = service.loadCsv(filePath.orElse(null)); Transaccion biggest = transactions.stream().max(Transaccion::compareTo).orElse(null); Map kindCount = transactions.stream().collect( diff --git a/src/main/java/org/cli/adapter/out/FileAdapter.java b/src/main/java/org/cli/adapter/out/FileAdapter.java index b9395d7..b461501 100644 --- a/src/main/java/org/cli/adapter/out/FileAdapter.java +++ b/src/main/java/org/cli/adapter/out/FileAdapter.java @@ -23,7 +23,7 @@ public List loadFromLocal(String filename) { private InputStream loadFromFileSystem(String filename) { try { return new FileInputStream(filename); - } catch (IOException e) { + } catch (IOException | NullPointerException e) { System.err.println("File not found in the filesystem: " + filename); System.out.println("Using a internal file input.csv of own resources "); System.out.println(); From aad3bd1dc4191ab4495fd4d5af326451327ccc34 Mon Sep 17 00:00:00 2001 From: Armando Jorge Lopez Espinoza Date: Sat, 5 Apr 2025 17:25:05 -0500 Subject: [PATCH 7/7] chore: details of execution --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 2fe8001..bd9dd96 100644 --- a/README.md +++ b/README.md @@ -67,4 +67,33 @@ Desarrolla una aplicación de línea de comandos (CLI) que procese un archivo CS - Comentarios explicando pasos clave y lógica del programa. # retotecnico-cobol + +## Introducción: + +El procesamiento de archivos en plataformas windows y linux puede ser un desafio, inclusive el paradigma de programación y la cantidad de datos a procesar. +En esta oportunidad procesamos archivos csv con ayuda de un complemento univocity y el uso de streams. Aunque sin un enfoque reactivo de momento. + +## Instrucciones de Ejecución: +- **Dependencias**: Agregar com.univocity:univocity-parsers:2.9.1 en el archivo build.gradle +- **Ejeción**: +Genera un jar en la carpeta build +```bash +gradle shadowJar +java -jar .\build\libs\retotecnico-cobol-1.0-SNAPSHOT-all.jar .\src\NotFound +java -jar .\build\libs\retotecnico-cobol-1.0-SNAPSHOT-all.jar +java -jar .\build\libs\retotecnico-cobol-1.0-SNAPSHOT-all.jar .\external.csv +``` + +## Enfoque y Solución: + +- **Lógica**: Leer el archivo y procesarlo por medio del uso de streams. +- **Diseño**: Maximo de filas en el archivo 2^31, por el uso de List. Programación bloqueante, en caso decidir reactiva +precisaria que todo el ecosistema sea reactivo. Sin emabrgo en JAVA 24, se pueden usar los virtual threats. +En caso no se le proporcione una ruta o el destino no existe, usara un documento que se encuentre en los recursos del jar. + +## Estructura del Proyecto: + +- **Arquitectura**: Hexagonal, reference Get Your Hands Dirty on Clean Architecture +- **Package**: Adapters, Ports and Domain + # cd20e34 (Initial commit)