From eb288b079284f51d82bce5a91698f88ab5299c6b Mon Sep 17 00:00:00 2001 From: Gilmar Gutierrez Date: Mon, 2 Mar 2026 18:12:41 -0500 Subject: [PATCH] feat: Create services transaction Spring Boot Java --- .idea/.gitignore | 10 + .idea/app-nodejs-codechallenge.iml | 9 + .idea/compiler.xml | 27 ++ .idea/encodings.xml | 6 + .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 14 ++ .idea/modules.xml | 9 + .idea/vcs.xml | 6 + README.md | 231 ++++++++++++++---- transaction-service.iml | 8 + transaction-service/pom.xml | 88 +++++++ .../TransactionServiceApplication.java | 11 + .../controller/TransactionController.java | 44 ++++ .../dto/request/CreateTransactionRequest.java | 15 ++ .../dto/response/TransactionResponse.java | 19 ++ .../ValidateAntiFraudTransactionResponse.java | 12 + .../entity/Transaction.java | 33 +++ .../entity/TransactionStatus.java | 13 + .../entity/TransactionType.java | 13 + .../repository/TransactionRepository.java | 10 + .../TransactionStatusRepository.java | 8 + .../repository/TransactionTypeRepository.java | 8 + .../service/TransactionService.java | 15 ++ .../service/impl/TransactionServiceImpl.java | 112 +++++++++ .../src/main/resources/application.yaml | 25 ++ .../src/main/resources/data.sql | 6 + .../src/main/resources/schema.sql | 18 ++ .../target/classes/application.yaml | 25 ++ .../TransactionServiceApplication.class | Bin 0 -> 797 bytes .../controller/TransactionController.class | Bin 0 -> 3426 bytes .../request/CreateTransactionRequest.class | Bin 0 -> 3884 bytes .../dto/response/TransactionResponse.class | Bin 0 -> 4672 bytes ...ValidateAntiFraudTransactionResponse.class | Bin 0 -> 2611 bytes .../entity/Transaction.class | Bin 0 -> 6253 bytes .../entity/TransactionStatus.class | Bin 0 -> 2536 bytes .../entity/TransactionType.class | Bin 0 -> 2528 bytes .../repository/TransactionRepository.class | Bin 0 -> 471 bytes .../TransactionStatusRepository.class | Bin 0 -> 403 bytes .../TransactionTypeRepository.class | Bin 0 -> 397 bytes .../service/TransactionService.class | Bin 0 -> 629 bytes .../service/impl/TransactionServiceImpl.class | Bin 0 -> 6718 bytes transaction-service/target/classes/data.sql | 6 + transaction-service/target/classes/schema.sql | 18 ++ .../compile/default-compile/createdFiles.lst | 13 + .../compile/default-compile/inputFiles.lst | 13 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 47 files changed, 819 insertions(+), 46 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/app-nodejs-codechallenge.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 transaction-service.iml create mode 100644 transaction-service/pom.xml create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/TransactionServiceApplication.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/controller/TransactionController.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/dto/request/CreateTransactionRequest.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/dto/response/TransactionResponse.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/entity/Transaction.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionStatus.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionType.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionRepository.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionStatusRepository.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionTypeRepository.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/service/TransactionService.java create mode 100644 transaction-service/src/main/java/com/yape/transactionservice/service/impl/TransactionServiceImpl.java create mode 100644 transaction-service/src/main/resources/application.yaml create mode 100644 transaction-service/src/main/resources/data.sql create mode 100644 transaction-service/src/main/resources/schema.sql create mode 100644 transaction-service/target/classes/application.yaml create mode 100644 transaction-service/target/classes/com/yape/transactionservice/TransactionServiceApplication.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/controller/TransactionController.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/dto/request/CreateTransactionRequest.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/dto/response/TransactionResponse.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/entity/Transaction.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/entity/TransactionStatus.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/entity/TransactionType.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/repository/TransactionRepository.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/repository/TransactionStatusRepository.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/repository/TransactionTypeRepository.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/service/TransactionService.class create mode 100644 transaction-service/target/classes/com/yape/transactionservice/service/impl/TransactionServiceImpl.class create mode 100644 transaction-service/target/classes/data.sql create mode 100644 transaction-service/target/classes/schema.sql create mode 100644 transaction-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 transaction-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 transaction-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 transaction-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..ab1f4164ed --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/app-nodejs-codechallenge.iml b/.idea/app-nodejs-codechallenge.iml new file mode 100644 index 0000000000..d6ebd48059 --- /dev/null +++ b/.idea/app-nodejs-codechallenge.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000000..9d5f3a8f2e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000..53e8190f2a --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000000..712ab9d985 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..40a3abc8f4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..aedd251311 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index b067a71026..aeb5571bc6 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,221 @@ -# Yape Code Challenge :rocket: +# Transaction Service -Our code challenge will let you marvel us with your Jedi coding skills :smile:. +Microservicio desarrollado con Spring Boot para la gestión de transacciones financieras y validación antifraude. -Don't forget that the proper way to submit your work is to fork the repo and create a PR :wink: ... have fun !! +--- -- [Problem](#problem) -- [Tech Stack](#tech_stack) -- [Send us your challenge](#send_us_your_challenge) +## 🚀 Tecnologías Utilizadas -# Problem +- Java 21 +- Spring Boot 3.2.5 +- Spring Data JPA +- H2 Database (Base de datos en memoria) +- Maven +- Lombok +- OpenAPI / Swagger -Every time a financial transaction is created it must be validated by our anti-fraud microservice and then the same service sends a message back to update the transaction status. -For now, we have only three transaction statuses: +--- -
    -
  1. pending
  2. -
  3. approved
  4. -
  5. rejected
  6. -
+## 🏗 Arquitectura -Every transaction with a value greater than 1000 should be rejected. +El proyecto sigue una arquitectura en capas: -```mermaid - flowchart LR - Transaction -- Save Transaction with pending Status --> transactionDatabase[(Database)] - Transaction --Send transaction Created event--> Anti-Fraud - Anti-Fraud -- Send transaction Status Approved event--> Transaction - Anti-Fraud -- Send transaction Status Rejected event--> Transaction - Transaction -- Update transaction Status event--> transactionDatabase[(Database)] ``` +controller → service → repository → entity → dto +``` + +Estructura principal: + +``` +src + └─ main + ├─ java + │ └─ com.yape.transactionservice + │ ├─ controller + │ ├─ service + │ ├─ repository + │ ├─ entity + │ └─ dto + └─ resources +``` + +--- + +## ▶️ Cómo Ejecutar el Proyecto + +### 1️⃣ Compilar el proyecto + +```bash +mvn clean install +``` + +### 2️⃣ Ejecutar la aplicación + +```bash +mvn spring-boot:run +``` + +La aplicación se ejecutará en: + +``` +http://localhost:8081/api +``` + +--- + +## 🗄 Base de Datos -# Tech Stack +Se utiliza H2 en memoria. -
    -
  1. Node. You can use any framework you want (i.e. Nestjs with an ORM like TypeOrm or Prisma)
  2. -
  3. Any database
  4. -
  5. Kafka
  6. -
+### Consola H2 -We do provide a `Dockerfile` to help you get started with a dev environment. +``` +http://localhost:8081/api/h2-console +``` + +Credenciales: + +``` +JDBC URL: jdbc:h2:mem:transactiondb +User: sa +Password: (vacío) +``` + +La base de datos se reinicia cada vez que la aplicación se detiene. + +--- -You must have two resources: +## 📚 Documentación Swagger -1. Resource to create a transaction that must containt: +Una vez levantada la aplicación: + +``` +http://localhost:8081/api/swagger-ui/index.html +``` + +Swagger permite: +- Visualizar endpoints +- Probar requests +- Ver modelos de request y response + +--- + +# 📌 Endpoints + +## 🔹 1. Crear Transacción + +**POST** `/api/transactions` + +### Request ```json { - "accountExternalIdDebit": "Guid", - "accountExternalIdCredit": "Guid", + "accountExternalIdDebit": 1001, + "accountExternalIdCredit": 2001, "tranferTypeId": 1, - "value": 120 + "amount": 120.50 } ``` -2. Resource to retrieve a transaction +### Response ```json { - "transactionExternalId": "Guid", + "transactionExternalId": 1, "transactionType": { - "name": "" + "id": 1, + "name": "TRANSFER" }, "transactionStatus": { - "name": "" + "id": 1, + "name": "PENDING" }, - "value": 120, - "createdAt": "Date" + "amount": 120.50, + "createdAt": "2026-03-02T17:00:00" } ``` -## Optional +--- + +## 🔹 2. Obtener Transacción + +**GET** `/api/transactions/{id}` + +### Ejemplo + +``` +GET /api/transactions/1 +``` + +### Response + +```json +{ + "transactionExternalId": 1, + "transactionType": { + "id": 1, + "name": "TRANSFER" + }, + "transactionStatus": { + "id": 2, + "name": "APPROVED" + }, + "amount": 120.50, + "createdAt": "2026-03-02T17:00:00" +} +``` + +--- + +## 🔹 3. Validar Transacción (AntiFraud) + +**POST** `/api/transactions/validate/{id}` + +### Ejemplo + +``` +POST /api/transactions/validate/1 +``` + +### Response + +```json +{ + "transactionId": 1, + "status": "APPROVED" +} +``` + +--- + +# 🛡 Reglas de Negocio (Ejemplo AntiFraude) + +- La aprobación o rechazo producto de la validación es aleatoria para efectos de éste reto técnico +- El estado inicial de una transacción es PENDING + +--- + +# 🧪 Testing + +Para ejecutar pruebas (si existen): + +```bash +mvn test +``` + +--- + +# 📈 Mejoras Futuras -You can use any approach to store transaction data but you should consider that we may deal with high volume scenarios where we have a huge amount of writes and reads for the same data at the same time. How would you tackle this requirement? +- Migración a PostgreSQL +- Implementación de Docker +- Manejo global de excepciones (@ControllerAdvice) +- Logs estructurados +- Pruebas unitarias y de integración -You can use Graphql; +--- -# Send us your challenge +# 👨‍💻 Autor -When you finish your challenge, after forking a repository, you **must** open a pull request to our repository. There are no limitations to the implementation, you can follow the programming paradigm, modularization, and style that you feel is the most appropriate solution. +Proyecto desarrollado como parte de un reto técnico backend. -If you have any questions, please let us know. diff --git a/transaction-service.iml b/transaction-service.iml new file mode 100644 index 0000000000..ce57a28691 --- /dev/null +++ b/transaction-service.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/transaction-service/pom.xml b/transaction-service/pom.xml new file mode 100644 index 0000000000..efe54e8b0b --- /dev/null +++ b/transaction-service/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + com.yape.ms + transaction-service + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 21 + 21 + + + + org.projectlombok + lombok + 1.18.34 + + + + + + + + + \ No newline at end of file diff --git a/transaction-service/src/main/java/com/yape/transactionservice/TransactionServiceApplication.java b/transaction-service/src/main/java/com/yape/transactionservice/TransactionServiceApplication.java new file mode 100644 index 0000000000..cf2aa202b5 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/TransactionServiceApplication.java @@ -0,0 +1,11 @@ +package com.yape.transactionservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TransactionServiceApplication { + public static void main(String[] args) { + SpringApplication.run(TransactionServiceApplication.class, args); + } +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/controller/TransactionController.java b/transaction-service/src/main/java/com/yape/transactionservice/controller/TransactionController.java new file mode 100644 index 0000000000..71981fab70 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/controller/TransactionController.java @@ -0,0 +1,44 @@ +package com.yape.transactionservice.controller; + +import com.yape.transactionservice.dto.request.CreateTransactionRequest; +import com.yape.transactionservice.dto.response.TransactionResponse; +import com.yape.transactionservice.dto.response.ValidateAntiFraudTransactionResponse; +import com.yape.transactionservice.service.TransactionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.math.BigInteger; + +@RestController +@RequestMapping("/transactions") +@RequiredArgsConstructor +@Tag(name = "Transactions", description = "Operaciones realizadas en la tabla Transacciones") +public class TransactionController { + + private final TransactionService transactionService; + + @GetMapping("/{id}") + @Operation(summary = "Obtener una transacción por ID") + public ResponseEntity getTransaction(@PathVariable BigInteger id){ + TransactionResponse response = transactionService.getTransaction(id); + return ResponseEntity.ok(response); + } + + @PostMapping + @Operation(summary = "Crear una transacción") + public ResponseEntity saveTransaction(@RequestBody CreateTransactionRequest request){ + TransactionResponse response = transactionService.saveTransaction(request); + return ResponseEntity.ok(response); + } + + @PostMapping("/validate/{id}") + @Operation(summary = "Validate si una transacción es Fraudulenta") + public ResponseEntity validateAntiFraudTransaction(@PathVariable BigInteger id){ + ValidateAntiFraudTransactionResponse response = transactionService.validateTransaction(id); + return ResponseEntity.ok(response); + } + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/dto/request/CreateTransactionRequest.java b/transaction-service/src/main/java/com/yape/transactionservice/dto/request/CreateTransactionRequest.java new file mode 100644 index 0000000000..33347fd212 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/dto/request/CreateTransactionRequest.java @@ -0,0 +1,15 @@ +package com.yape.transactionservice.dto.request; + +import lombok.Data; + +import java.math.BigInteger; + +@Data +public class CreateTransactionRequest { + + private BigInteger accountExternalIdDebit; + private BigInteger accountExternalIdCredit; + private Long tranferTypeId; + private Double amount; + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/dto/response/TransactionResponse.java b/transaction-service/src/main/java/com/yape/transactionservice/dto/response/TransactionResponse.java new file mode 100644 index 0000000000..ce582881c3 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/dto/response/TransactionResponse.java @@ -0,0 +1,19 @@ +package com.yape.transactionservice.dto.response; + +import com.yape.transactionservice.entity.TransactionStatus; +import com.yape.transactionservice.entity.TransactionType; +import lombok.Data; + +import java.math.BigInteger; +import java.time.LocalDateTime; + +@Data +public class TransactionResponse { + + private Long transactionExternalId; + private TransactionType transactionType; + private TransactionStatus transactionStatus; + private Double amount; + private LocalDateTime createdAt; + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.java b/transaction-service/src/main/java/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.java new file mode 100644 index 0000000000..6f6ede5d71 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.java @@ -0,0 +1,12 @@ +package com.yape.transactionservice.dto.response; + +import com.yape.transactionservice.entity.Transaction; +import lombok.Data; + +@Data +public class ValidateAntiFraudTransactionResponse { + + private boolean success; + private Transaction transaction; + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/entity/Transaction.java b/transaction-service/src/main/java/com/yape/transactionservice/entity/Transaction.java new file mode 100644 index 0000000000..e160596f07 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/entity/Transaction.java @@ -0,0 +1,33 @@ +package com.yape.transactionservice.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.math.BigInteger; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Data +public class Transaction { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long transactionExternalId; + + private BigInteger accountExternalIdDebit; + + private BigInteger accountExternalIdCredit; + + @ManyToOne + @JoinColumn(name = "transfer_type_id") + private TransactionType transactionType; + + @ManyToOne + @JoinColumn(name = "status_id") + private TransactionStatus transactionStatus; + + + private Double amount; + + private LocalDateTime createdAt; +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionStatus.java b/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionStatus.java new file mode 100644 index 0000000000..b7810f6f10 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionStatus.java @@ -0,0 +1,13 @@ +package com.yape.transactionservice.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Data; + +@Entity +@Data +public class TransactionStatus { + @Id + private Long id; + private String name; +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionType.java b/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionType.java new file mode 100644 index 0000000000..f2438e5298 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/entity/TransactionType.java @@ -0,0 +1,13 @@ +package com.yape.transactionservice.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Data; + +@Entity +@Data +public class TransactionType { + @Id + private Long id; + private String name; +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionRepository.java b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionRepository.java new file mode 100644 index 0000000000..3704294929 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionRepository.java @@ -0,0 +1,10 @@ +package com.yape.transactionservice.repository; + +import com.yape.transactionservice.entity.Transaction; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TransactionRepository extends JpaRepository { + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionStatusRepository.java b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionStatusRepository.java new file mode 100644 index 0000000000..2e1bf8d2cd --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionStatusRepository.java @@ -0,0 +1,8 @@ +package com.yape.transactionservice.repository; + +import com.yape.transactionservice.entity.Transaction; +import com.yape.transactionservice.entity.TransactionStatus; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TransactionStatusRepository extends JpaRepository { +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionTypeRepository.java b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionTypeRepository.java new file mode 100644 index 0000000000..d354248680 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/repository/TransactionTypeRepository.java @@ -0,0 +1,8 @@ +package com.yape.transactionservice.repository; + +import com.yape.transactionservice.entity.Transaction; +import com.yape.transactionservice.entity.TransactionType; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TransactionTypeRepository extends JpaRepository { +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/service/TransactionService.java b/transaction-service/src/main/java/com/yape/transactionservice/service/TransactionService.java new file mode 100644 index 0000000000..21b6627c2e --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/service/TransactionService.java @@ -0,0 +1,15 @@ +package com.yape.transactionservice.service; + +import com.yape.transactionservice.dto.request.CreateTransactionRequest; +import com.yape.transactionservice.dto.response.TransactionResponse; +import com.yape.transactionservice.dto.response.ValidateAntiFraudTransactionResponse; + +import java.math.BigInteger; + +public interface TransactionService { + + public TransactionResponse getTransaction(BigInteger id); + public TransactionResponse saveTransaction(CreateTransactionRequest request); + public ValidateAntiFraudTransactionResponse validateTransaction(BigInteger id); + +} diff --git a/transaction-service/src/main/java/com/yape/transactionservice/service/impl/TransactionServiceImpl.java b/transaction-service/src/main/java/com/yape/transactionservice/service/impl/TransactionServiceImpl.java new file mode 100644 index 0000000000..f8c8ee7fa2 --- /dev/null +++ b/transaction-service/src/main/java/com/yape/transactionservice/service/impl/TransactionServiceImpl.java @@ -0,0 +1,112 @@ +package com.yape.transactionservice.service.impl; + +import com.yape.transactionservice.dto.request.CreateTransactionRequest; +import com.yape.transactionservice.dto.response.TransactionResponse; +import com.yape.transactionservice.dto.response.ValidateAntiFraudTransactionResponse; +import com.yape.transactionservice.entity.Transaction; +import com.yape.transactionservice.entity.TransactionStatus; +import com.yape.transactionservice.entity.TransactionType; +import com.yape.transactionservice.repository.TransactionRepository; +import com.yape.transactionservice.repository.TransactionStatusRepository; +import com.yape.transactionservice.repository.TransactionTypeRepository; +import com.yape.transactionservice.service.TransactionService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigInteger; +import java.time.LocalDateTime; +import java.util.concurrent.ThreadLocalRandom; + +@Service +@RequiredArgsConstructor +public class TransactionServiceImpl implements TransactionService { + + private final TransactionRepository transactionRepository; + private final TransactionTypeRepository transactionTypeRepository; + private final TransactionStatusRepository transactionStatusRepository; + + TransactionType transactionType; + TransactionStatus transactionStatus; + + + @Override + public TransactionResponse getTransaction(BigInteger id) { + Transaction transaction = new Transaction(); + transaction = transactionRepository + .findById(id.longValue()) + .orElseThrow(() -> new RuntimeException("Transaction not found")); + transactionType = transactionTypeRepository + .findById(transaction.getTransactionType().getId()) + .orElseThrow(() -> new RuntimeException("TransactionType not found")); + transactionStatus = transactionStatusRepository + .findById(transaction.getTransactionStatus().getId()) + .orElseThrow(() -> new RuntimeException("TransactionType not found")); + + TransactionResponse response = new TransactionResponse(); + response.setTransactionExternalId(transaction.getTransactionExternalId()); + response.setTransactionType(transactionType); + response.setTransactionStatus(transactionStatus); + response.setAmount(transaction.getAmount()); + response.setCreatedAt(transaction.getCreatedAt()); + + return response; + } + + @Override + public TransactionResponse saveTransaction(CreateTransactionRequest request) { + + Transaction transaction = new Transaction(); + transaction.setAccountExternalIdDebit(request.getAccountExternalIdDebit()); + transaction.setAccountExternalIdCredit(request.getAccountExternalIdCredit()); + + transactionType = transactionTypeRepository + .findById(request.getTranferTypeId()) + .orElseThrow(() -> new RuntimeException("TransactionType not found")); + transaction.setTransactionType(transactionType); + + transactionStatus = transactionStatusRepository + .findById(1L) + .orElseThrow(() -> new RuntimeException("TransactionStatus not found")); + transaction.setTransactionStatus(transactionStatus); + + transaction.setAmount(request.getAmount()); + transaction.setCreatedAt(LocalDateTime.now()); + + transactionRepository.save(transaction); + + + TransactionResponse response = new TransactionResponse(); + response.setTransactionExternalId(transaction.getTransactionExternalId()); + response.setTransactionType(transactionType); + response.setTransactionStatus(transactionStatus); + response.setAmount(transaction.getAmount()); + response.setCreatedAt(transaction.getCreatedAt()); + + return response; + } + + @Override + public ValidateAntiFraudTransactionResponse validateTransaction(BigInteger id) { + + Transaction transaction = transactionRepository + .findById(id.longValue()) + .orElseThrow(() -> new RuntimeException("Transaction not found")); + + // Permutación de estados (Aprobado o Rechazado) + Long statusId = (long) ThreadLocalRandom.current().nextInt(2, 4); + + TransactionStatus status = transactionStatusRepository + .findById(statusId) + .orElseThrow(); + + transaction.setTransactionStatus(status); + + transactionRepository.save(transaction); + + ValidateAntiFraudTransactionResponse response = new ValidateAntiFraudTransactionResponse(); + response.setSuccess(statusId == 2); + response.setTransaction(transaction); + + return response; + } +} diff --git a/transaction-service/src/main/resources/application.yaml b/transaction-service/src/main/resources/application.yaml new file mode 100644 index 0000000000..37fcc05747 --- /dev/null +++ b/transaction-service/src/main/resources/application.yaml @@ -0,0 +1,25 @@ +server: + port: 8081 + servlet: + context-path: /api + +spring: + application: + name: transaction-service + + datasource: + url: jdbc:h2:mem:transactiondb + driverClassName: org.h2.Driver + username: sa + password: + + jpa: + database-platform: org.hibernate.dialect.H2Dialect + hibernate: + ddl-auto: update + show-sql: true + + h2: + console: + enabled: true + path: /h2-console \ No newline at end of file diff --git a/transaction-service/src/main/resources/data.sql b/transaction-service/src/main/resources/data.sql new file mode 100644 index 0000000000..24bf3d7cf4 --- /dev/null +++ b/transaction-service/src/main/resources/data.sql @@ -0,0 +1,6 @@ +INSERT INTO TRANSACTION_TYPE (id, name) VALUES (1, 'PAGOS'); +INSERT INTO TRANSACTION_TYPE (id, name) VALUES (2, 'EXTORNOS'); + +INSERT INTO TRANSACTION_STATUS (id, name) VALUES (1, 'PENDIENTE'); +INSERT INTO TRANSACTION_STATUS (id, name) VALUES (2, 'APROBADO'); +INSERT INTO TRANSACTION_STATUS (id, name) VALUES (3, 'RECHAZADO'); \ No newline at end of file diff --git a/transaction-service/src/main/resources/schema.sql b/transaction-service/src/main/resources/schema.sql new file mode 100644 index 0000000000..bad5f6d0ef --- /dev/null +++ b/transaction-service/src/main/resources/schema.sql @@ -0,0 +1,18 @@ +CREATE TABLE transaction ( + transaction_external_id BIGINT AUTO_INCREMENT PRIMARY KEY, + account_external_id_debit BIGINT, + account_external_id_credit BIGINT, + transfer_type_id INT, + amount DOUBLE, + created_at TIMESTAMP +); + +CREATE TABLE transaction_type ( + id INT PRIMARY KEY, + name VARCHAR(50) +); + +CREATE TABLE transaction_status ( + id INT PRIMARY KEY, + name VARCHAR(50) +); \ No newline at end of file diff --git a/transaction-service/target/classes/application.yaml b/transaction-service/target/classes/application.yaml new file mode 100644 index 0000000000..37fcc05747 --- /dev/null +++ b/transaction-service/target/classes/application.yaml @@ -0,0 +1,25 @@ +server: + port: 8081 + servlet: + context-path: /api + +spring: + application: + name: transaction-service + + datasource: + url: jdbc:h2:mem:transactiondb + driverClassName: org.h2.Driver + username: sa + password: + + jpa: + database-platform: org.hibernate.dialect.H2Dialect + hibernate: + ddl-auto: update + show-sql: true + + h2: + console: + enabled: true + path: /h2-console \ No newline at end of file diff --git a/transaction-service/target/classes/com/yape/transactionservice/TransactionServiceApplication.class b/transaction-service/target/classes/com/yape/transactionservice/TransactionServiceApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..0d5cbdb906145ca467aa9da9509d206a8528fd35 GIT binary patch literal 797 zcmbVKO>fgc5Ph2_bsEyI6bc1;pru#}kqxHJ9KZ_HH z13!Qtg_vt>J4Q{C6nN zSx|w!PqhuE)KgO#7RFi^nxPTf@lrjTNvS$G61EXk-_Gp~jc`HO7|#&Vp7Ga$;7udD zNhe8OknfCsKzwh)TVy#5D%mF6ze&IVJ9JvZeLNr%EY(NI{x;>D*)&KRa7=fpXau+Zg$ z{sjMrYw1##mj_?^=8tl@&&f%0vYN|Ly84jJ<;>pm&Axnl|NYOOe*sv>{wRiUDT(1U z5*T4vE4meaE~=6nEgVl2jdC4N>bfdQUUVI!-EvuKe$@WD)!Jp4ibx$cq!?E7{ggJ9 zM>K|#*)d$kXcDP3#*k)M`G0B{#!J#f)H57s@=ruv@QN@ed{dQn93x9oXBYb-wT;WQ z^s2r=q6Rn!_p&LBVEd2F4)t!3VYjuY*%2!=jZSWw!)r;rp2j>ZhRGllB35S@ zSyPTOIfhG_#bbtzp1|UIhhccjwI#VGuN?WfRw+n*BnoBPnaaCGQ9c%0`Rj0V*qkVj zA=lSygVHfefu(GQ>F&YKaJd=HgKioa`DDdiX--^wU-*%3q$c#EhpOZVQ`7XyZ!c=X zwZ5hp2rx&+xPDNhu&Bsm6$pSAZ$L6ASmOqkaS5&K%)TA;& zfn1~KCHU9M{)S;OuUzh(i4w61uixda@FKDv->XU;TuHJ?uU4rDP3b?sS1{6%+NwFi zG7V-es;56YR@K$k&I5*pPUtNwcf4UG_8azz_nHw$NGi{T9pdLgQa31tVKatT2hbA3 z4=)n_bBM$H@%`j_kzkwlsrlI;VTi9Vb}I$< zlt_o@f$F7AcvFXNO&8_1@~g*8q`jIoXZWs5Y9mI9>8zM1urvbK;eb z){!AIfD?@AEW&Q7HDi}e%Hf2+^3I8MynN?Flyu8?*Z;=4{$dK+(Hj%q|A3$YUwx3E-n8G_7kldjvOIPpzhpv;&kIw%ZaHVI9Stl3G(U#I_8T!3>0h! c|BnJ#egu3%>zx*~Pw^Qk%zN0yV-I`(0t<~5r2qf` literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/dto/request/CreateTransactionRequest.class b/transaction-service/target/classes/com/yape/transactionservice/dto/request/CreateTransactionRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..d8d0d7a6233e36619aa70b0e2807545614e0605a GIT binary patch literal 3884 zcmbtW+jA3D9R5zSo86>aS_-`c3W6>4l9nhcNlu>keaP$Rd{F_AloxQZ1WGl=#)8<@$-}%n(e)g|_9{mPj26r+@ zAgMsoAS1=ldt2Yq^EKVv$X{8z&C4!B>WpC;?wbtB@rl(mRHPMTG;~2@I9s;r`MY|9 z=UrPj9lh)tmg#VN%P8}F#kKM_ztiN7o1e3}?(%Cppk-gcFrb&qR?~FnKXJKj>a|kk zJYO^D-ho9=m%8p&^RvcA$#nS!w~Io9JsNt%^@AN}>7I(=3d~*&eb~p)Ei_x__O-hW zUaF9VKCNfsqGfJ)g#8)@Fi5uQb)gGGUj%jDYOd9IF+-$T4F_r%`CX#c3 za{F6ON7NhFFo8*itN`!g)}iolyJN*|QyQiP!GSme-?u`~yoQ(XGP$9uJJmU>!oB1u zW$+4KRq&dIQ+T~4msVWcFgF;KExp#{SJoMh$GI)y6aPf9kFxZ%h60Kd?Yh3n=Pa|V zyVnhu?lm1(H(iI}MwBc#*~t~z@jM<`2R@7jC7@xDd;@zH4U=DP*4HSNbjk;jBUV|j zt?ITR*1@LaRt?fbG2!x{FWjXvh6C_!;`qa% zM-J_BI+S;>xO#bWNpA#+B41rDEzOhhC8~FuJIxxkojvX5D5Ih7gQFeIE@+fPos#fU z)wROXYi%0a*_~Ojns%8l7$Tz&(Ye?*eL}Qiiu$Z&xempl;irqEf;wt-w^QTs8qct) zBOMZ7VJ^1N@E-zFC5L9*<-3|~ic zGXVM~T-41&>W%bFdLzAnGWacnfD~buN(3(#XVX)IszUlpjc#ps$aR zDDzArdX-{`y4#7mo=HS6atu*#JCXKGB6^i$i1xP=bw8764(E~doLwM75v0^)?q?|R z-X8D~fwzSNMK~Ge>72}H(c2b+g?Rez=cN}}vQ6L9L4N@kq{;B* zDf%f$(|@8XD?P^Ed(ft{(nA~x5hDeeAR~oTRu-7lWAxoacUI1(BA~H?LZGpNnpFfy z4M0j(jev56G=Xx3Og1e*nE;f|W z^f-kcMg1Fl6sS)ypddkiDtm$qY%-)6ry zq0mh!v!JTzNZ1h78 z0U<_e-3nl-2y6%0z8ip*R`3o!MnFf}de=wz*pCmTphWfq!xVzCUvZL#oIi-2kw_bW%PMU;+B_2I@V}ZiJ#MdnS2cLFQdda(LnZJ`@tz} literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/dto/response/TransactionResponse.class b/transaction-service/target/classes/com/yape/transactionservice/dto/response/TransactionResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..59d70c10c801e9d670fcce5a36dd22a604e2cae0 GIT binary patch literal 4672 zcmbVPYjYdb8GeqW)vn}qe2MK?INTaTkhEChG!!Qi+0cQ9E{DAT^p!7L=k&dK|opi?XdCxh|`|NqI zd-kjUe)I`|Gk7bH6w*2}CNyLP`fpgfR;g;a8>K62H|&ZpkUj0Vj(=7lU7Wa>(3<=ojcylvek4Y=N1@{f=R~zT@wy2as9;<)Def7!nvz zC|7*TZ`1`&-Xm$K7toHFID%1n&f4}GE?qdN*mKTntX0Fu-)CYBM+I_~nr->^`W&H! z5b8VIc4^V8Sk-gfS>>CD~kL)=-;vWS9gWH}M!sw7dPu zVYE(C>;H(CSZ#q2V*?r@GP}`uh$Cg=EtceA8*QqjteoM6Qq(fWnIO;G0n&)rY zHG%tNOvjZ5s`i($0CcC_o7{m3EPI&CjBV7vd&Y?g>>Aig+ zR9WdIwz9Qk?L-NzU0q&SV*QB)Hb=hO8dbLJkvrL^kH^OJtB~-(gX&Uzr2M$@aKrcF zX3^eho7I&jb_!aw@3>JF)@&5#PmbT zhBTmKDKtPXh9*m?Y04Qf(U-+;9!xqhE`m%-1VwmA7Avmt;Wu*lBAJ?l$AC`dHw|W^9nwGkt$0O#k^Imt~kEUo?p9Y%Dd_-BakFdB-vgT=VOp6v*7Mt+<{IdqD)1zlT4 zSGq)PmZ3|+^3|Fy(dY>2lBj&Icd!fjp+OqvHa01x7^t`4(C#$fG@H0VDTA{N_ZB6MzsDJH8FruF z)Z3KwAc+4#{(CNDbQnS~a1i2qQncnNxiAbZ2E>?5`%(nUDzFx^b2S3%?cf$ZVIxv8 zx>Q#RbMrput}qzvV1X>34VozenMJYgqO* literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.class b/transaction-service/target/classes/com/yape/transactionservice/dto/response/ValidateAntiFraudTransactionResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..e6bf9ff9e6cb66889e735fc6636a64f5fb1c8ca9 GIT binary patch literal 2611 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 literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/entity/TransactionType.class b/transaction-service/target/classes/com/yape/transactionservice/entity/TransactionType.class new file mode 100644 index 0000000000000000000000000000000000000000..bb299c2cd3250d40c94f2472bdf4e0180f192887 GIT binary patch literal 2528 zcmb7FU31$+6g_K8w&E(On>J}o)6zl;`K+OolG;t74f$|!($a)5121fxomh<{1xd+F z{t3empf7!Z87MP-VCYMk;WzLzc%+oGlAI`xhr%S*?q1zJd+xdSu73af=`R3guvS0@ z**pvzCUOGBhjLGrThiSu-&=pE8lgb$rsF!{ErIOl*jf)P^yE>naRRo$)rPlS-j_S7 z9Qx7?WFvGuH&Fhb(@FyJcV$apU^L|#6R(bap`8b9oW+oUxv9b$&+Q)_OSwiT zYYASnaZY3Alm-m+&hs`d;B|pKcP>YK&K%i$z$k-DHr~LSWYm;FbJp7+cZyZ(r^J_S zyoI*~&Th*sHS4(z8Gi1BbaI1Gx?v!2JfMlIEP41WFHfsqnU1a{_0*rEa^f z7s@CB0z<^ul71-5JIW87AXF|hQroCf+?e3Wy5p+l-R*VduS#y$a(fNgT9dw`*NM>x zn+{1{tN;H@^Q?0T#hSaj~DG;9Jg-zuXLI*jb%hHN0(X=Nr#+6uz&GDjlC6tY= zCApJGWZr*JTbkoBHP(->g54IoCL3XxBk>k1^kO~&g%xktZ>V`kOMa%KIj-oY5E$;7 zy}78LC{gi_=Y;_~ZYNeFu)w3wcVLY=8#7|^q9!mS#!lw&Nda{%<*}?w@}9uRVFxa`P4vkz!a`2S_?*`xdU*UBQ1QK|?II1V__5}Vo4@>VZFd$9vS{y;su7{Y0rT$*E@tU^oKMN<_3?~X*IPXnsvI+V%Bk1 z+ZC&8cbXgy(5E}lh5jfKM)$)X98HduV)dpm6Nx)qtTrjFRh)Q){L~X%{7T!0D~5hi zGLkoz7M!n!y9;?OMoomwlFluBNJ=K_=_AfED6pk&)1D=lv$(^V5s7ve#!DIuiY5ew zf)Fq1bhyrF!vM^-L)*tVYNA_5vCSUz+_Z*e)O|W&9o$pq6`jqOz7G1jTn7eAL8oKx c;NF?%dVxQS=y&;B#C@&`oPEjy`V6Ii02M>*SpWb4 literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionRepository.class b/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..992e1705872450b23649b054378a17013da6e2f2 GIT binary patch literal 471 zcmbV}!AiqG5QhJ)+Ssb#)xLt@o;;-rUOY%ZXvO<9j$vc68)i3^JcDoK!3Xf6#BC3z zO7YOc%q%JQ!y^%hKemg&XHhaMJ0AzB~K* zO|Y+UTGEnqMYhoQi<0w@V5o5Eq|m+*V~b~@nqQr~=qC!K%Z4_=cMbJGh0)v;mO?A6 z@Rt2Wr`b-}Y4)E=w!ws73e%0jnX^TDohppyu9ci`O%+$0Z1v+}wXee2tc}Q;AB{JQ yif^oSf!4k%oNra&0}H#*#WVC~q|ru&y%-1aV2H0I<^c{dTGug-Vjaf*G4Kt-2Am-P literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionStatusRepository.class b/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionStatusRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..9d00077308a4d62ac1e6b6ff1dfacfc6768ebed1 GIT binary patch literal 403 zcmbV|Jx&8L5QU$^&yvt^1Wv$IR0|Xo6lf(RmJ1BVSY8s_8c%|946Z}L0XP)Gq#zNB zQc%oH@ucs~d!JwL9{?_K++bvIZPSdFoE@ofENnHTSez_^btEpQ5;Vz@9@c8Ftn+gJ zt2Nj+I2m}sH09{&?s0Hd8yp&(C-GFWgy^4zXYMu03q7$i4VgFbx0%;KgK-~xtS;gV z-nzf&w)+?MqT7|#MGd+oXS-qFrRdwM)?m`7xmb4-ruD(o9o?M${9cPN*sF6;iw8z% LR{IF!)t!6;)L)0k literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionTypeRepository.class b/transaction-service/target/classes/com/yape/transactionservice/repository/TransactionTypeRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..3184a37ef40a65a55f17257aea58e6bd012e2128 GIT binary patch literal 397 zcmbV|K~4fe5Ji8ZGJ+dVz!9jGt5L&>g_*=exIo#KogSgPQ`2DP6yC>$2k=mafrSta zE?iXA;wP{E|DRv)9{_G}QJ`lqv2jT)C!wqy8n)TT(1@X^)Kvo^;c2}+2>y=%Y)}t46eK_4TiJ0QY%xx=E^7f9O$9g K?Q;xvcenu=9fcbJ literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/service/TransactionService.class b/transaction-service/target/classes/com/yape/transactionservice/service/TransactionService.class new file mode 100644 index 0000000000000000000000000000000000000000..8ef5ff9aa3991ca2a583f656ab53c8c04a5b6aee GIT binary patch literal 629 zcmbtS!A`Xy(SYGTwv)01THG#8y!u%l`~W`6xGgoT z7h}R@C-dgbyve-Xe0_WZxJEBTK)8ysrF!F)C~G*)IkGxSb1{XEME%6)U1_o{g*YJe z=3KB^aGI#cm$^ii&`HF4Y{IlZs#r_5Gj*$z`_xJzW^gh3OE|WfGLo;#Rg^bxTw?<# z{vdXi#ZPQ_DOOBQ2y{&7=3I!^LU`~0L+f=dxm9;Y*!taLsS5kA8=CDT!dbx!9siag zB>UfKTF<>ntsWX)$KDmZ!?h>b+C(zc3n83)oZ8yU(ytbQ&~X0*XgH^vXt_LeS(9*x Y()=T|chGSKo#1o_IhIR0?hVlW1}}=pQ~&?~ literal 0 HcmV?d00001 diff --git a/transaction-service/target/classes/com/yape/transactionservice/service/impl/TransactionServiceImpl.class b/transaction-service/target/classes/com/yape/transactionservice/service/impl/TransactionServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..336bed3b8e1e7f68009bde046b51415c2a563ee9 GIT binary patch literal 6718 zcmbtY2YeIP8UH_7=8QP7qL>7OLntxSHa22~B!~dUhG6PJY;Zyn+MK1ceOT5B>10Mn zTH17^=}PGc-6=F3v`tzpR-4k9mZme^GwI&x-VOb~yOVXYWyJ*le%9T)?|a{S-~XHM zoqO{1LjbN9ssf+D(x^Ec-mfL~u$9shX)S6QW+JVpMvSN)))SUt?GJCyQvwk1t0>1b zfoW@vgkh}{D66aQosJ4jR}fG!1FFFKQet!Bjp1b6E4;^9wvC?!W_$M2ttZX2VVSA@ z0_)mKiB64idIjg_M*^6IN(Dg`mmnliwObp}!o!+17~W_Mv?VNkKu-xwkDG~sUM-%{ zZSA%OP=(nFE>m$i<_OHPXT`O|K)9WZ0?LTw?dlh}v~FvCdm%Y819LG?L5+$lFkfKp z#V8<9(QhPT8~3-x1nTNMOLg__)}vO$T|HwN@o-mCT2qThLbUh-70NB8Q0$0{~ z8T&H{+wkF@Ofnfa^b~Qb#UcfZRXh`Q0wG(a0-*vk%+#iMTHijHGWQBBcQ<1*O%&)w z#oem(nFbY0&?r#tG57ZUNj+~efsIeY}>@CumZA79J+7n&DnLh*1lE!MM!~Gb-o4A4Zn=3UKKY<$DdPZicR}0J;lV+7L%MiRosGG$&@Y# zygZXko1RQ2b84i%S5Dof;@Nl(W211Y6SLRUU7-GU$U1^G6@7@(hYAJfeCWCh745o^ z6fU5v=m*QfbfVHcY-SQnxK#zw-D+m~;xc`7!%(psLuBSoa?G>6aJamV=wTHJm;x$A zx1@B<(qqk(J})QTGKO^)rKlEfC2c!L_9A;!q>$z`F5;P1;nsL z$qeK;%$|&%w!)5lPloN*Z32_L#3LG&faHzes`nYxU`|ehamCn<_~)v49-dDD5~E23 zRJ*#2pYJGghl&?UE#?;60(TrUENQueDqbuXnp%X^sTm7 z2xV9x1?>vK@4RUeM_qn10(doEqu{kFUMFpMxm{EzV$T|#F!#zCdt~cyNW~lQM)qB4 zZG@F-vDY^Wi@ser+)p7kY23-ZIIQ3;D&C5>acaJbN6kbulS(m1gjv6JEoS>nx0Z;R z!|Z2Vnm|L&EOuEhHH(J27w=Hu=6Jxs7jOct3X(|3WrJ?nJ4btyutwU{wRL}j~? z&^t53eT+hlX_e)|_U2wKWyrDn(QgeJG<9>yRdb4!IGb=`pTU0ZGN)vX&o}Igt^9#W zU|GraCKhRmugKNjr#kLT0i$4tZVj5TZCXkj)>)N_K&4D19z>b;N;~&dvO5nRr5t7o zJ5^G-I#IgepVDsFQt(V>=ZFGL2QJZ55z}@DEIa$)_~wR(XNM}#HFemgxbRFy zdvvHnOS*plaB1Tf??>~Ed!*zBi_ezn-h_lrLvSTr@Jcj7Qv^k-AoOH(@9w* z`eioQYo><6Y32mov}mxfo587daHDBjX{NEHlReTw9I2d!-v@Zu`-6&~ zB(EpAC5szQVXGu}xa2LP=sbgNuCTqci7Y#^xVee!kt}YL&(17vm)~Pq49aIbi)7OS z+?NlZPl)Al70I-D5u16S@tAsF`0{=s2zD;vLP+ zg#LD3stgidleZ%W&`ChM2|_w;(~i{Jh+eA z;C>U|a>3mo@22@JEw!co9#4Fe3z6tJi8q%kS-kyD;@3&W^-Z?JWpUqGY+2)Pto9SV z0=SOS_wHX)UR_S-eQy=scjzz_|NZcnW$}UPa=P4ytIMUsmDvurnr;T%%B|c+w05C} zDAd!nmLiIkh!MGdA~lG1I?E0W@i&en&-K#5);ZfB!yxTCSPd^)90#k%R(u=Z;aU-1 z4}O<8`YB~To$h;F@%xk!f$uz*n5LjY!7K$rL6w3n3ePuuJ$jxj#b`d#M4{J~;|E-a zp-xSFw%1lQoWMsLmW)DaXdFd-L(?eMKS;V0YSU;fQ0IK8RE=p;Wv3WPud z#tD^~Wn>7F6eKu7{E%cR?ngi{AS(sm