From f35d350605feebabba7af54900fcbef9dc2f74fb Mon Sep 17 00:00:00 2001 From: pcrisostomo Date: Tue, 22 Apr 2025 14:25:25 -0500 Subject: [PATCH 1/7] create Transaction.java --- reto-ibk/pom.xml | 16 +++++++ .../src/main/java/com/mycompany/Main.java | 7 +++ reto-ibk/src/main/java/model/Transaction.java | 42 ++++++++++++++++++ .../target/classes/com/mycompany/Main.class | Bin 0 -> 544 bytes .../target/classes/model/Transaction.class | Bin 0 -> 1505 bytes 5 files changed, 65 insertions(+) create mode 100644 reto-ibk/pom.xml create mode 100644 reto-ibk/src/main/java/com/mycompany/Main.java create mode 100644 reto-ibk/src/main/java/model/Transaction.java create mode 100644 reto-ibk/target/classes/com/mycompany/Main.class create mode 100644 reto-ibk/target/classes/model/Transaction.class diff --git a/reto-ibk/pom.xml b/reto-ibk/pom.xml new file mode 100644 index 0000000..e48ae7c --- /dev/null +++ b/reto-ibk/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + com.mycompany + reto-ibk + 1.0-SNAPSHOT + + + 17 + 17 + + + \ No newline at end of file diff --git a/reto-ibk/src/main/java/com/mycompany/Main.java b/reto-ibk/src/main/java/com/mycompany/Main.java new file mode 100644 index 0000000..f710792 --- /dev/null +++ b/reto-ibk/src/main/java/com/mycompany/Main.java @@ -0,0 +1,7 @@ +package com.mycompany; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/reto-ibk/src/main/java/model/Transaction.java b/reto-ibk/src/main/java/model/Transaction.java new file mode 100644 index 0000000..7dd6c81 --- /dev/null +++ b/reto-ibk/src/main/java/model/Transaction.java @@ -0,0 +1,42 @@ +package model; + +public class Transaction { + + private int id; + private String type; + private double amount; + + /** + * Constructor para crear una nueva transacción. + * @param id Identificador único de la transacción. + * @param type Tipo de transacción: "Crédito" o "Débito". + * @param amount Monto de la transacción, debe ser positivo. + */ + + public Transaction(int id, String type, double amount) { + // Restricción en caso el tipo de transacción sea inválido + if (!type.equalsIgnoreCase("Crédito") && !type.equalsIgnoreCase("Débito")) { + throw new IllegalArgumentException("Tipo de transacción inválido: " + type + "!"); + } + // Restricción en caso el monto sea inválido + if (amount < 0) { + throw new IllegalArgumentException("El monto no puede ser negativo"); + } + this.id = id; + this.type = type; + this.amount = amount; + } + + // Métodos getters + public int getId() { + return id; + } + + public String getType() { + return type; + } + + public double getAmount() { + return amount; + } +} diff --git a/reto-ibk/target/classes/com/mycompany/Main.class b/reto-ibk/target/classes/com/mycompany/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..51a6192457ad8141398cd7d1c686819ac09dff11 GIT binary patch literal 544 zcmZvZOHaa35QWd>Ra&bcFW(BTz=d79K;4)a7x+jpY+PO71~2J@l%nBh=|U41{s4cJ z@f1vmkDTwiCx9~?8b}BfdV%M7Q^t|>r_Qz1zJZiLekh-$<4S+v+;)em z7YSrewXdUdfn>eW5lCGGePtmD(?%K@fm}=b>Sp3~Rd_GEuA+G>=t;LDLmk(@%~bTL z#{#9+|IJOhdL$62)E`<4f_4;Yf6#1nOsu15pzw#UJsn5Nvr$5sY{7)6<+)e~&K;Ez z^-6lpEH(t}E9JUD^*IRLe$B!bb_{F_6ldH13T*6RPrw+(9xkcM^<_|mmf?V(R9wO= zV6}ru*i)A}zK9tg_&DB$8c54O0VMdu3o;t49A?3sK6*#?Wj3}L<1r{$VYKHjFt4&Q ov4$KwvG`LeMpq5@HDYU&Lry@vpbH; zKS5Pr`WOibDhNm*wGZi2e^kqzwMCrR@UT1gj?TUJ+s(OiGkT-No z5t=QNb4w~|?l7FmReHh8`Ay1Irt&GoF_Ok9j55S?`OPFU49RkExL=b-r!avj2b0H0 zwF{Aq1LlL-&2pYMkhrsY<8Uq-#Rz3{}No!qBV+bjRku|BrkFCa* z2sZeZA1zB)xxdK+Y5mS+!fZ>TKEBqY0ovs7y5ZH`hrHPV57dRJkOF8yqydM#jYtL) zxqNS%3_}E1>S%#NNDZlV-3qE=Ra!oyU4mP*JD{t3TAR=Wy!lX=ZCwjfDB-q)TMXHw zElIVfcSW(i|Mn(UNw+$9YF9*Bd)B>(4!WK20arC&gxNK%cU#R;FYB(GV}Z8OKJdp~ z`1T_yb&sNxqRf4NT^dmu8N|&bmPm6OvZ-BKDfMa}T~!{wQZB&{|L|o^-*nkLL%O1r z2+BSWLlHWl`CaN6Lcg{gtde{_52csco&n}bG;z{*95JgVvSLNAJDdgHV*c;^>1V%V*xqHb*7s%)u;3LA zkn{2f@cyJcaTMskK&k~sDR%}_7)O@=9zE@^F^%srgFEzS%9z6yLV1Lu`dCDfPHS1- zEV3-~SY%o5aa<)kgV_I+FyVkP2NTrn2%)dxdZ(izoi=*FdyR$XWW*v$?UZg*(l$?k zPDzHZh**0Z-NCt+CxWwmgTKMIAA@5bD|;_a1n2q$$MIc+xycAhw Jtl&PTKLEp1Sl<8u literal 0 HcmV?d00001 From 4909594abf0db5a66d14b63886d02426fdffffa7 Mon Sep 17 00:00:00 2001 From: pcrisostomo Date: Tue, 22 Apr 2025 15:12:37 -0500 Subject: [PATCH 2/7] Implement TransactionService.java and business logic --- reto-ibk/src/main/java/model/Transaction.java | 30 ++++--- .../main/java/service/TransactionService.java | 83 ++++++++++++++++++ .../target/classes/model/Transaction.class | Bin 1505 -> 1512 bytes .../classes/service/TransactionService.class | Bin 0 -> 1821 bytes 4 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 reto-ibk/src/main/java/service/TransactionService.java create mode 100644 reto-ibk/target/classes/service/TransactionService.class diff --git a/reto-ibk/src/main/java/model/Transaction.java b/reto-ibk/src/main/java/model/Transaction.java index 7dd6c81..8ac8685 100644 --- a/reto-ibk/src/main/java/model/Transaction.java +++ b/reto-ibk/src/main/java/model/Transaction.java @@ -1,30 +1,34 @@ package model; +/** + * Clase para representar una transacción bancaria con id, tipo y monto. + */ + public class Transaction { private int id; - private String type; - private double amount; + private String tipo; + private double monto; /** * Constructor para crear una nueva transacción. * @param id Identificador único de la transacción. - * @param type Tipo de transacción: "Crédito" o "Débito". - * @param amount Monto de la transacción, debe ser positivo. + * @param tipo Tipo de transacción: "Crédito" o "Débito". + * @param monto Monto de la transacción, debe ser positivo. */ - public Transaction(int id, String type, double amount) { + public Transaction(int id, String tipo, double amount) { // Restricción en caso el tipo de transacción sea inválido - if (!type.equalsIgnoreCase("Crédito") && !type.equalsIgnoreCase("Débito")) { - throw new IllegalArgumentException("Tipo de transacción inválido: " + type + "!"); + if (!tipo.equalsIgnoreCase("Crédito") && !tipo.equalsIgnoreCase("Débito")) { + throw new IllegalArgumentException("Tipo de transacción inválido: " + tipo + "!"); } // Restricción en caso el monto sea inválido if (amount < 0) { throw new IllegalArgumentException("El monto no puede ser negativo"); } this.id = id; - this.type = type; - this.amount = amount; + this.tipo = tipo; + this.monto = amount; } // Métodos getters @@ -32,11 +36,11 @@ public int getId() { return id; } - public String getType() { - return type; + public String getTipo() { + return tipo; } - public double getAmount() { - return amount; + public double getMonto() { + return monto; } } diff --git a/reto-ibk/src/main/java/service/TransactionService.java b/reto-ibk/src/main/java/service/TransactionService.java new file mode 100644 index 0000000..23ba6a2 --- /dev/null +++ b/reto-ibk/src/main/java/service/TransactionService.java @@ -0,0 +1,83 @@ +package service; +import model.Transaction; +import java.util.List; + +/** + * Clase para la lógica del negocio. + */ + +public class TransactionService { + + /** + * @param transactions lista con los datos de transacción: id, tipo, monto. + */ + + private List transactions; + + /** + * Constructor para recibir como parámetro una lista de objetos @param transactions . + */ + + public TransactionService(List transactions) { + this.transactions = transactions; + } + + /** + * Método para calcular el balance final: suma de Créditos - suma de Débitos. + */ + + public double calcularBalanceFinal() { + // Variables de conteo de montos + double credito = 0.0; + double debito = 0.0; + + for (Transaction t : transactions) { + if (t.getTipo().equalsIgnoreCase("Crédito")) { + credito += t.getMonto(); + } else if (t.getTipo().equalsIgnoreCase("Débito")) { + debito += t.getMonto(); + } + } + + return credito - debito; + } + + /** + * Método para retornar la transacción con el monto más alto. + */ + + public Transaction obtenerTransaccionMayorMonto() { + // Variable que guardará la transacción más alta + Transaction mayor = null; + + for (Transaction t : transactions) { + if (mayor == null || t.getMonto() > mayor.getMonto()) { + mayor = t; + } + } + + return mayor; + } + + /** + * Método para contar la cantidad total de transacciones por tipo. + * @return Arreglo con [créditos, débitos] + */ + public int[] contarTransaccionesTipo() { + // Variables que guardarán el conteo de transacciones por tipo + int credito = 0; + int debito = 0; + + for (Transaction t : transactions) { + if (t.getTipo().equalsIgnoreCase("Crédito")) { + credito++; + } else if (t.getTipo().equalsIgnoreCase("Débito")) { + debito++; + } + } + + // Se retorna un arreglo con los contadores + return new int[]{credito, debito}; + } + +} diff --git a/reto-ibk/target/classes/model/Transaction.class b/reto-ibk/target/classes/model/Transaction.class index 3a83acbf53882bcf60fb1cbc25ee3cbc5b66ca9b..5defb45a5270e1a1520f45c095b8f6b01957fa2f 100644 GIT binary patch delta 278 zcmWkpJ4*v$5S;IoJ1M@m0Tm7r1P8ikKBR56Y^Ca?|STin~60QMHx!#)n- F{sHSfI8y)s delta 305 zcmZvX%}&Bl5QWd}y=|c^YHG!xhDfN2umA;7si25|i|%}aCXz;@6-_nz1jePA#P}L6 zbwNVh`4;Yc3U$KT#hjeUeCH(do%zaGpFi(I0BsySS*^nTpfBJAXW?yFJrCokdYoLJ z#*r^zgcp}Laq@cdA*iMm7ssSqTKS)6olO{0sgJZ=4aIv%7(i;zg44zUTdTp7(iA{`mLjUjf|2rizHb zaLsfdT83FDySiP|4bO7y-N2umi2=wLH3j!L$B`Xt|jfz8TIa4fi$IbLURy68W-MyuAe1>_)vh}JDX0;Q;7*TOqAa#Cr8eYd0fw<+FuI@Q5 z%V)AJd27-D^5*m7*oiDQ9?R$o3jU^7YnT@8!i_|^M*ZQJKbmG99u zTvGxP5UX6OLsKTu;2?T0*gSztyPj@*zNH_Bs*gAao@sM4f+aWj9=7yHj_bpan6np_ zi5W_Iow_SGLhjz+t1s`m)D+`fS%ptkAR_mczbdT= z;)wE`K$7Rc(+Q0?pVE%-H<^2eOS$|{=>CD0f*yXS{7U`I9AM@kdg&VoqS1$bTFeW( z4DhV6L*R+?M35Nbx9su{YsjwqsrA%m?niV#M_OR9qk*M#$8(Gdyuid_EFF7_sh<2( z%zTa1l(c4z^#+Cl|Ge+-%m)5VnfQ*tHzzNqvX$>xJODjOsK6*;jSkVFk+b}h1oNB5AT!Y2aKG9a>B{PR0u^Op)ufu z%kQ&WqCN7`7W2ooNnXEB`yXrb(PrnEmQo#HLHU^LhT2 z|DKrv%VA0ja*A-})0pSuTOi9DL|F8hjrr2epE8@nDp?4|_V|1vKA#22rwdW?A^Ikv zbklLhh$Cr@VWHc&6H@w{gkl6!R+f~Tr=%964HVMRCavw6Gi4Kxg=nD1_XL`DJdOw% z>(l%*_DgbKxxBL<9oab}9LTy#!nfIPjemLTB)x%YY?AU_%C$z%hb^*}Psx8oS=Wd* o%6l0XVfMH`2BlqAA>YfGly$@xQOLoBo>b@wB3N&otRvX?4{=*>n*aa+ literal 0 HcmV?d00001 From ab6805ce3cea374a1422a774e7d4befc05beedcd Mon Sep 17 00:00:00 2001 From: pcrisostomo Date: Tue, 22 Apr 2025 15:33:48 -0500 Subject: [PATCH 3/7] implement csv reader --- .vscode/settings.json | 3 + reto-ibk/src/main/java/reader/CSVReader.java | 62 ++++++++++++++++++ .../main/java/service/TransactionService.java | 1 + .../target/classes/reader/CSVReader.class | Bin 0 -> 2800 bytes .../classes/service/TransactionService.class | Bin 1821 -> 1821 bytes 5 files changed, 66 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 reto-ibk/src/main/java/reader/CSVReader.java create mode 100644 reto-ibk/target/classes/reader/CSVReader.class diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c5f3f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/reto-ibk/src/main/java/reader/CSVReader.java b/reto-ibk/src/main/java/reader/CSVReader.java new file mode 100644 index 0000000..1042a42 --- /dev/null +++ b/reto-ibk/src/main/java/reader/CSVReader.java @@ -0,0 +1,62 @@ +package reader; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import model.Transaction; + +/** + * Clase para leer un archivo CSV y convertirlo en una lista de transacciones. + */ + +public class CSVReader { + + /** + * Método para leer el archivo CSV y retorna una lista de objetos Transaction. + * @param fileName nombre del archivo (data.csv) + */ + public static List leerCSV(String fileName) { + + // Creación de lista vacía donde se guardarán las transacciones + List transactions = new ArrayList<>(); + + try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { + String linea; + boolean esPrimeraLinea = true; + + while ((linea = br.readLine()) != null) { + if (esPrimeraLinea) { + esPrimeraLinea = false; // omitir encabezado + continue; + } + + // Divide la línea usando la coma como separador, lo que genera un arreglo con los 3 valores esperados: id, tipo y monto. + String[] fila = linea.split(","); + + if (fila.length != 3) continue; // línea inválida + + try { + int id = Integer.parseInt(fila[0].trim()); // en un entero (id) + String tipo = fila[1].trim(); // en un string (tipo) + double monto = Double.parseDouble(fila[2].trim()); // en un número decimal (monto) + + // Crea un objeto Transaction con los datos leídos y lo agrega a la lista. + Transaction t = new Transaction(id, tipo, monto); + transactions.add(t); + + } catch (Exception e) { + System.err.println("Línea inválida: " + linea + " → " + e.getMessage()); + // Continúa con la siguiente línea + } + } + } catch (IOException e) { + System.err.println("Error al leer el archivo: " + e.getMessage()); + } + + return transactions; + } + +} diff --git a/reto-ibk/src/main/java/service/TransactionService.java b/reto-ibk/src/main/java/service/TransactionService.java index 23ba6a2..8733a3b 100644 --- a/reto-ibk/src/main/java/service/TransactionService.java +++ b/reto-ibk/src/main/java/service/TransactionService.java @@ -63,6 +63,7 @@ public Transaction obtenerTransaccionMayorMonto() { * Método para contar la cantidad total de transacciones por tipo. * @return Arreglo con [créditos, débitos] */ + public int[] contarTransaccionesTipo() { // Variables que guardarán el conteo de transacciones por tipo int credito = 0; diff --git a/reto-ibk/target/classes/reader/CSVReader.class b/reto-ibk/target/classes/reader/CSVReader.class new file mode 100644 index 0000000000000000000000000000000000000000..2d27670659fd744b5d0cb1277dcdb8cbac47437d GIT binary patch literal 2800 zcma)8+iw(A82_E^ZfAEGF18f9D6rh5r7f$VT)Kcl0jcg5W$R+`I^8{OhtAF{v$KVQ ziWfx1JDRA8iSfY@A57GTqLAo=i6%y0eKJ1yXBcDsotc()>1s@ynRCALo$vDdecw0x z)8E&=1+W+IX^03c^Q2jlUb-(|I2NolL@7OKPMB%ibVk!hhfm6)FVMWlax8zJKvPF& zK_J@amZXj*Bn-sREU+|dIdY&@9+uvqIc!UTmaJPe?Sko9YCj{4`eRmAo!#s=BcRz* zdJIHhV@Gx_g1qlp&S<7H6xDpoPG_yE&kKpXHR_mt&7-&7|KrM@Y?)Ep=|RtQs%Fu* zTqmBQrdO4e z{Y#SlI=1014cqIYKj_w24F>MU4uM61iBR+}Rt{>|#UK_Cr(-926@sjTl^y*HGdZIT|cy z!X20Ckd3g~4|62D-lXFB6@d@t^E{&+8a!e;C0kZEW?gr@R>>^vfO(R-i-XL*f%<%g zX8V7ki9XY|^Oi3&OPg^aj@JZ|+3!Cm-6{I`{uA3OnY}5I`s3o|l!)UEfm;uGp6jJd zJEgvBDQTxnuQ+B+xKv~H^*au~cDBjJsA_myVABF{8l|h@vcQ`ER^`_^#0KlwI8B@_ zK!huPsQJ{mOY<%Gj%~S$_?N-4&ZjyCmSPc~MySB|V(t=HLU{zsxQ^f!Wh62|eRcNx zb+im!#qzAkiGk~A8@i5_Lo}Sciradl(H+fKaH_5OLnNBiawHjRSv!Swy;@THw)taF zluv3++orJjYjo|1C$*?r_a>5BEEL|kTfdH-Lv8V7qFuj=-MvOv()b2@A~=2pD|_Q# z;XpE$j8EanHROOPJd})1p)k}N`*HeGGWrAdsr}Fu?8vEIJlJ)AH_-hf;yt-5Slr$7 zDdOEdQ+TZVyBw``Pht2PWMHc63q-LWXYmY2`f7ZH&jM_w=mv=6XZ{tbq0l>q<$ShN zx{8{&A%!*AfVJr0s*6-?T& h44I)gARi?gEfN>gB?)JgCTJ8O12UJzX=FC delta 45 zcmbQsHI~gARiigEfOUgB?)JgCSt@O12UJzDx)* From 4ec9f08e03a7061d2a8201a3be2b8c027ccad6a2 Mon Sep 17 00:00:00 2001 From: pcrisostomo Date: Tue, 22 Apr 2025 16:01:00 -0500 Subject: [PATCH 4/7] add main and README --- README.md | 155 +++++++++++------- .../src/main/java/com/mycompany/Main.java | 33 +++- reto-ibk/src/main/resources/Data.csv | 0 reto-ibk/target/classes/Data.csv | 0 .../target/classes/com/mycompany/Main.class | Bin 544 -> 1982 bytes 5 files changed, 129 insertions(+), 59 deletions(-) create mode 100644 reto-ibk/src/main/resources/Data.csv create mode 100644 reto-ibk/target/classes/Data.csv diff --git a/README.md b/README.md index 668a6a2..2bb39a7 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,105 @@ -# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI) +# 🏦 Reto IBK: Procesador de Transacciones en Java -## Objetivo: +Este proyecto Java permite leer un archivo CSV con transacciones bancarias, contar cuántas son de tipo **Crédito** y **Débito**, y generar un pequeño reporte por consola. -Desarrolla una aplicación de línea de comandos (CLI) que procese un archivo CSV con transacciones bancarias y genere un reporte que incluya: +--- + +## 📁 Estructura del proyecto + +``` +reto-ibk/ +├── src/ +│ └── main/ +│ ├── java/ +│ │ └── com/ +│ │ └── mycompany/ +│ │ ├── Main.java +│ │ ├── model/ +│ │ │ └── Transaction.java +│ │ ├── reader/ +│ │ │ └── CSVReader.java +│ │ └── service/ +│ │ └── TransactionService.java +│ └── resources/ +│ └── data.csv +├── README.md +└── pom.xml +``` -- **Balance Final:** - Suma de los montos de las transacciones de tipo "Crédito" menos la suma de los montos de las transacciones de tipo "Débito". +--- -- **Transacción de Mayor Monto:** - Identificar el ID y el monto de la transacción con el valor más alto. +## 🧠 ¿Qué hace el programa? -- **Conteo de Transacciones:** - Número total de transacciones para cada tipo ("Crédito" y "Débito"). +1. Lee el archivo `data.csv` desde `src/main/resources/`. +2. Procesa las transacciones con los campos: + - `id`: identificador numérico + - `tipo`: `"Crédito"` o `"Débito"` + - `monto`: cantidad en formato decimal +3. Cuenta cuántas transacciones hay de cada tipo. +4. Muestra los resultados por consola. --- -## Instrucciones - -1. **Repositorio Base:** - Clona o haz un fork del repositorio base disponible en: - `https://github.com/codeableorg/interbank-academy-25` - -2. **Entrada de Datos:** - La aplicación deberá leer un archivo CSV. Ejemplo de contenido: - - ``` - 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 - ``` - -3. **Salida del Programa:** - La aplicación debe mostrar el reporte final en la terminal. - Ejemplo de salida: - - ``` - Reporte de Transacciones - --------------------------------------------- - Balance Final: 325.00 - Transacción de Mayor Monto: ID 3 - 200.00 - Conteo de Transacciones: Crédito: 3 Débito: 2 - ``` - -4. **Lenguaje de Programación:** - Utiliza el lenguaje de tu preferencia. Opciones recomendadas: - - - Python - - Java - - C# - - JavaScript (Node.js) - -5. **README del Proyecto:** - Incluye un archivo `README.md` con la siguiente estructura: - - - **Introducción:** Breve descripción del reto y su propósito. - - **Instrucciones de Ejecución:** Cómo instalar dependencias y ejecutar la aplicación. - - **Enfoque y Solución:** Lógica implementada y decisiones de diseño. - - **Estructura del Proyecto:** Archivos y carpetas principales. - -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. +## 💻 Ejemplo de uso + +Archivo `data.csv`: + +``` +id,tipo,monto +1,Crédito,500.00 +2,Débito,200.00 +3,Crédito,300.00 +``` + +Salida esperada en consola: + +``` +Créditos: 2 +Débitos: 1 +``` + +--- + +## ⚙️ Tecnologías utilizadas + +- Java 11+ +- Maven +- VS Code (u otro IDE) + +--- + +## 🚀 Cómo ejecutar el proyecto + +1. Clona el repositorio: + +```bash +git clone https://github.com/tu-usuario/reto-ibk.git +cd reto-ibk +``` + +2. Compila el proyecto: + +```bash +mvn clean compile +``` + +3. Ejecuta el proyecto: + +```bash +mvn exec:java -Dexec.mainClass="com.mycompany.Main" +``` + +> Asegúrate de que el archivo `data.csv` esté en `src/main/resources/`. + +--- + +## 📌 Notas adicionales + +- El código omite líneas inválidas del CSV y muestra errores por consola. +- Se puede adaptar fácilmente para procesar otros tipos de datos financieros. + +--- + +## ✍️ Autor + +Proyecto desarrollado como parte del programa **INTERBANK ACADEMY 2025**. diff --git a/reto-ibk/src/main/java/com/mycompany/Main.java b/reto-ibk/src/main/java/com/mycompany/Main.java index f710792..5c268bc 100644 --- a/reto-ibk/src/main/java/com/mycompany/Main.java +++ b/reto-ibk/src/main/java/com/mycompany/Main.java @@ -1,7 +1,38 @@ package com.mycompany; +import model.Transaction; +import service.TransactionService; +import reader.CSVReader; + +import java.util.List; + +/** + * Clase principal del programa: ejecuta el flujo de carga y reporte. + */ public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + String nombreArchivo = "data.csv"; + + // Leer transacciones desde el archivo CSV + List transacciones = CSVReader.leerCSV(nombreArchivo); + + if (transacciones.isEmpty()) { + System.out.println("No se encontraron transacciones válidas."); + return; + } + + // Procesar con TransactionService + TransactionService servicio = new TransactionService(transacciones); + + double balance = servicio.calcularBalanceFinal(); + Transaction mayor = servicio.obtenerTransaccionMayorMonto(); + int[] conteo = servicio.contarTransaccionesTipo(); + + // Mostrar reporte + System.out.println("Reporte de Transacciones"); + System.out.println("---------------------------------------------"); + System.out.printf("Balance Final: %.2f\n", balance); + System.out.printf("Transacción de Mayor Monto: ID %d - %.2f\n", mayor.getId(), mayor.getMonto()); + System.out.printf("Conteo de Transacciones: Crédito: %d Débito: %d\n", conteo[0], conteo[1]); } } \ No newline at end of file diff --git a/reto-ibk/src/main/resources/Data.csv b/reto-ibk/src/main/resources/Data.csv new file mode 100644 index 0000000..e69de29 diff --git a/reto-ibk/target/classes/Data.csv b/reto-ibk/target/classes/Data.csv new file mode 100644 index 0000000..e69de29 diff --git a/reto-ibk/target/classes/com/mycompany/Main.class b/reto-ibk/target/classes/com/mycompany/Main.class index 51a6192457ad8141398cd7d1c686819ac09dff11..1984006698be38f32a877f28d40c26e964066fed 100644 GIT binary patch literal 1982 zcmb7F-BTM?6#rck*btVM&z4fEi-08*vWlWMp=e8}jV6EuQvpAEv$=$&`w@3HnaPa) z9gZ`O9UuExouR0sFTD9b>3HrYg{0tvc{um(z2}~De!ugPzyA5{PXKoiDClAsGF)4? z8zigTY3O-wItro;1BblMb&ER{eWP?JjDVqM*>uccg&{JVC^AG>-Li-yf?gHf=wY~= zGaa#BvrEF;<|Rvz@tkXLtH?c5ezy*z!GY;BjO5OHPLoxeB4D^OyO%qQpb&VbQ%NU^ zF$^-q$~@pn!>`9Nj8O$66s;$CS$O(tp|}<9R9wMT2E`J>qeF)2*$eD7k7|Kw={eI6 z(tWsw>k7shE``odZ&Xa+2AMPcHM<%#LJD?!@hT=2XdPq~8h#*b6|Z56wA>o;HrjM! zy80%;2ndYeb~=U`hQzw7`9c$p;W~lGJ=f7_aeQtVrt1h_tDpR2nPu)L1}j2v6qd33UX{qR9!C+T3Kjqj)Wh>2Mi1U z>led40@nhig{V^6OmcBQ9!CcE6|8mSJLA@!*QzM>yC14!exjT+?pqw zQjXzXIn|RgftUm(mc~EOMLQbXBo+G7X=Su_&pk)%S$G{MDX#$)eW45$=&PT;dT|Mt zn~&KeG7+P*Cqo0dTgMp6&;N=shVP;Nj8}%HkMR1l-!Z>4{~XEng(JLqJ4$jX)kE@j zN|8EuNJp;kx7NGSKM>i8j75*JS~x=Xp}fp@hlkgCj<9izPYXLyx!rA7`J$zwM3OBH zB^vIe4GAj>32TKy2LXs+kOChjIYN_v6yqePa2*L6_d0H12^#%TPGXJ5`7Ygji)s9b znUIbLA#YFc6&{hT2z~%Zi3o||I~XVvzf<@I0{e8AKphnvkarzbm^dV2mqVp3-ZG7?I delta 225 zcmYj~y$-=(6o%hZrTQuAzkW)&0i!|e28qFFs%RQgBqhXUNN>O`ATb!&U4q$lh{M$7 zeNLW}^PYS9D2wOkb_dWy>mV+ciVSiJvIKo@Z|$~cFWvTNzuq_t4S5uTIax-Dp!FTk zTUoo6?@gNmWmFYZf(IFq8qDBDEt4SIzPl#m#)DAR#-Aws?hcVktpz3g+)9j##KfMI8 Date: Tue, 22 Apr 2025 16:09:00 -0500 Subject: [PATCH 5/7] add README.md --- README.md | 32 +++++++++++++++++----------- reto-ibk/src/main/resources/Data.csv | 0 reto-ibk/target/classes/Data.csv | 0 3 files changed, 20 insertions(+), 12 deletions(-) delete mode 100644 reto-ibk/src/main/resources/Data.csv delete mode 100644 reto-ibk/target/classes/Data.csv diff --git a/README.md b/README.md index 2bb39a7..c28c57e 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ reto-ibk/ ├── src/ │ └── main/ │ ├── java/ -│ │ └── com/ -│ │ └── mycompany/ -│ │ ├── Main.java -│ │ ├── model/ -│ │ │ └── Transaction.java -│ │ ├── reader/ -│ │ │ └── CSVReader.java -│ │ └── service/ -│ │ └── TransactionService.java +│ │ ├── com/ +│ │ │ └── mycompany/ +│ │ │ ├── Main.java +│ │ ├── model/ +│ │ │ └── Transaction.java +│ │ ├── reader/ +│ │ │ └── CSVReader.java +│ │ └─── service/ +│ │ └── TransactionService.java │ └── resources/ │ └── data.csv ├── README.md @@ -73,8 +73,9 @@ Débitos: 1 1. Clona el repositorio: ```bash -git clone https://github.com/tu-usuario/reto-ibk.git -cd reto-ibk +git clone https://github.com/pcrisho/interbank-academy-25.git + +cd interbank-academy-25 ``` 2. Compila el proyecto: @@ -89,7 +90,7 @@ mvn clean compile mvn exec:java -Dexec.mainClass="com.mycompany.Main" ``` -> Asegúrate de que el archivo `data.csv` esté en `src/main/resources/`. +> Asegúrate de que el archivo `data.csv` exista. --- @@ -100,6 +101,13 @@ mvn exec:java -Dexec.mainClass="com.mycompany.Main" --- +## Puntos por mejorar + +- Pueden aplicarse validaciones más estrictas +- Se puede adaptar fácilmente para procesar otros tipos de datos financieros. + +--- + ## ✍️ Autor Proyecto desarrollado como parte del programa **INTERBANK ACADEMY 2025**. diff --git a/reto-ibk/src/main/resources/Data.csv b/reto-ibk/src/main/resources/Data.csv deleted file mode 100644 index e69de29..0000000 diff --git a/reto-ibk/target/classes/Data.csv b/reto-ibk/target/classes/Data.csv deleted file mode 100644 index e69de29..0000000 From f07716db7923a66ec859549c3e749f114d8865ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paolo=20Cris=C3=B3stomo?= <98828531+pcrisho@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:17:04 -0500 Subject: [PATCH 6/7] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c28c57e..349d501 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,11 @@ id,tipo,monto Salida esperada en consola: ``` -Créditos: 2 -Débitos: 1 +Reporte de Transacciones +--------------------------------------------- +Balance Final: 600 +Transacción de Mayor Monto: ID 3 - 300.00 +Conteo de Transacciones: Crédito: 2 Débito: 1 ``` --- From 3424129ee77a4b856f5955911a987f4ce905907c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paolo=20Cris=C3=B3stomo?= <98828531+pcrisho@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:29:12 -0500 Subject: [PATCH 7/7] Update README.md --- README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 349d501..c6d72d0 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,18 @@ Este proyecto Java permite leer un archivo CSV con transacciones bancarias, cont reto-ibk/ ├── src/ │ └── main/ -│ ├── java/ -│ │ ├── com/ -│ │ │ └── mycompany/ -│ │ │ ├── Main.java -│ │ ├── model/ -│ │ │ └── Transaction.java -│ │ ├── reader/ -│ │ │ └── CSVReader.java -│ │ └─── service/ -│ │ └── TransactionService.java -│ └── resources/ -│ └── data.csv +│ └── java/ +│ ├── com/ +│ │ └── mycompany/ +│ │ ├── Main.java +│ ├── model/ +│ │ └── Transaction.java +│ ├── reader/ +│ │ └── CSVReader.java +│ └─── service/ +│ └── TransactionService.java ├── README.md +├── data.csv └── pom.xml ```