From a1589fb25483680674722a30a6373192752227f8 Mon Sep 17 00:00:00 2001 From: Ramon Ramirez Date: Thu, 15 Jan 2026 17:35:44 -0400 Subject: [PATCH] update signature generation & add BOL response --- pom.xml | 4 + .../helper/SerializationHelper.java | 51 ++- .../config/RestClientConfig.java | 4 +- .../document/domain/model/Document.java | 2 + .../instruction/domain/model/Instruction.java | 38 ++- .../domain/model/InstructionDateTime.java | 14 + .../domain/model/InstructionInvolvement.java | 15 + .../dto/request/PaymentOrderRequest.java | 1 - .../payment_order/domain/model/Operation.java | 2 + .../domain/model/PaymentOrderBol.java | 23 ++ ...aymentOrder.java => PaymentOrderBole.java} | 2 +- .../client/PaymentOrderClient.java | 25 +- .../ServiceOrderPaymentSearchService.java | 4 +- .../ServiceOrderPaymentSearchRequest.java | 40 ++- .../domain/model/ServicingOrderProcedure.java | 8 +- .../adapter/ApiPrivateAdapter.java | 41 ++- .../mapper/ServicingOrderMapper.java | 136 ++++++-- .../ServiceOrderPaymentSearchResource.java | 302 ++++++++++++++---- .../domain/model/FinancialTransaction.java | 19 ++ .../transaction/domain/model/Transaction.java | 14 +- .../domain/model/TransactionDateTime.java | 2 +- .../domain/model/TransactionDetails.java | 4 +- .../domain/model/TransactionInvolvement.java | 17 + .../domain/model/TransactionStatus.java | 12 +- .../domain/model/TransactionStatusType.java | 2 + src/main/resources/application-dev.yml | 2 +- 26 files changed, 648 insertions(+), 136 deletions(-) create mode 100644 src/main/java/com/banesco/module/instruction/domain/model/InstructionDateTime.java create mode 100644 src/main/java/com/banesco/module/instruction/domain/model/InstructionInvolvement.java create mode 100644 src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBol.java rename src/main/java/com/banesco/module/payment_order/domain/model/{PaymentOrder.java => PaymentOrderBole.java} (93%) create mode 100644 src/main/java/com/banesco/module/transaction/domain/model/FinancialTransaction.java create mode 100644 src/main/java/com/banesco/module/transaction/domain/model/TransactionInvolvement.java diff --git a/pom.xml b/pom.xml index bc30ef1..a866cfe 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,10 @@ io.quarkus quarkus-smallrye-health + + commons-codec + commons-codec + org.projectlombok lombok diff --git a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java index 326c341..cf1036b 100644 --- a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java +++ b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java @@ -1,12 +1,15 @@ package com.banesco.common.application.helper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.quarkus.runtime.annotations.RegisterForReflection; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; -import java.util.Base64; +import java.util.*; @Slf4j @ApplicationScoped @@ -44,4 +47,50 @@ public class SerializationHelper { return null; } } + + public String encodeSha256(String json) { + return DigestUtils.sha256Hex(json); + } + + public String toJsonString(T element) { + if (element == null) { + return ""; + } + + try { + return objectMapper.writeValueAsString(element); + } catch (JsonProcessingException e) { + log.error("Error al convertir objeto a Json String: {}", e.getMessage()); + return ""; + } + } + + public Map toMap(T element) { + return toMap(element, null); + } + + public Map toMap( + T element, + List excludedFields + ) { + if (element == null) { + return new HashMap<>(); + } + + try { + Map map = objectMapper.convertValue( + element, new TypeReference<>() {} + ); + + if (excludedFields != null && !excludedFields.isEmpty()) { + Set excludedSet = new HashSet<>(excludedFields); + excludedSet.forEach(map::remove); + } + + return map; + } catch (Exception e) { + log.error("Error al convertir objeto a Map: {}", e.getMessage()); + return new HashMap<>(); + } + } } diff --git a/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java b/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java index f0d94ba..06d07c3 100644 --- a/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java +++ b/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java @@ -21,7 +21,7 @@ public class RestClientConfig { private final ObjectMapper objectMapper; private static final String API_BASE = "api.rest-client."; - private static final String API_PAYMENT_STATUS_BY_ID_NAME = "payment-status-by-id"; + private static final String API_PAYMENT_ORDER_BY_PARAMETERS_NAME = "payment-order-by-parameters"; @Inject public RestClientConfig( @@ -33,7 +33,7 @@ public class RestClientConfig { } public PaymentOrderConfig getPaymentOrderConfig() { - return getConfig(API_PAYMENT_STATUS_BY_ID_NAME, PaymentOrderConfig.class); + return getConfig(API_PAYMENT_ORDER_BY_PARAMETERS_NAME, PaymentOrderConfig.class); } private T getConfig( diff --git a/src/main/java/com/banesco/module/document/domain/model/Document.java b/src/main/java/com/banesco/module/document/domain/model/Document.java index 559cdd2..d7710f6 100644 --- a/src/main/java/com/banesco/module/document/domain/model/Document.java +++ b/src/main/java/com/banesco/module/document/domain/model/Document.java @@ -1,5 +1,6 @@ package com.banesco.module.document.domain.model; +import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -9,6 +10,7 @@ import lombok.*; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public class Document { private String documentName; // fileName } diff --git a/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java b/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java index 0e741e0..8c1f700 100644 --- a/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java +++ b/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java @@ -2,11 +2,14 @@ package com.banesco.module.instruction.domain.model; import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.common.domain.model.Identifier; +import com.banesco.module.party.domain.model.Party; +import com.banesco.module.party.domain.model.PartyIdentification; import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; import java.util.Arrays; +import java.util.List; import java.util.Objects; @Getter @@ -17,14 +20,16 @@ import java.util.Objects; @RegisterForReflection @JsonInclude(JsonInclude.Include.NON_NULL) public class Instruction { - private InstructionIdentification instructionIdentifier; // Request JSON: "recipientId" - private String instructionDescription; // Request JSON: "signature" + private InstructionInvolvement instructionInvolvement; // Request JSON: "recipientId" + private List instructionDate; // Request JSON: "dateCreate" + private InstructionIdentification instructionIdentifier; // Request JSON: "id" private InstructionPurposeType instructionPurposeType; // Request JSON: "channelOrigin" (BOLE) public static Instruction fromResource( String partyReferenceId, - String channelCode, - String signatureIdentifier + String initiatedDate, + String instructionRequestId, + String channelCode ) { boolean isChannelCodeValid = (Arrays.stream( InstructionPurposeType.values() @@ -35,18 +40,39 @@ public class Instruction { } return Instruction.builder() + .instructionInvolvement( + InstructionInvolvement.builder() + .partyReference( + Party.builder() + .partyIdentification(List.of( + PartyIdentification.builder() + .partyIdentification( + Identifier.builder() + .identifierValue(Objects.toString(partyReferenceId, "")) + .build() + ) + .build() + )) + .build() + ) + .build() + ) .instructionIdentifier( InstructionIdentification.builder() .identification( Identifier.builder() - .identifierValue(partyReferenceId) + .identifierValue(Objects.toString(instructionRequestId, "")) .build() ) .identificationType(InstructionIdentificationType.INSTRUCTION_NUMBER) .build() ) + .instructionDate(List.of( + InstructionDateTime.builder() + .date(Objects.toString(initiatedDate, "")) + .build() + )) .instructionPurposeType(InstructionPurposeType.valueOf(channelCode)) - .instructionDescription(signatureIdentifier) .build(); } } diff --git a/src/main/java/com/banesco/module/instruction/domain/model/InstructionDateTime.java b/src/main/java/com/banesco/module/instruction/domain/model/InstructionDateTime.java new file mode 100644 index 0000000..b9ac89f --- /dev/null +++ b/src/main/java/com/banesco/module/instruction/domain/model/InstructionDateTime.java @@ -0,0 +1,14 @@ +package com.banesco.module.instruction.domain.model; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +public class InstructionDateTime { + private String date; +} diff --git a/src/main/java/com/banesco/module/instruction/domain/model/InstructionInvolvement.java b/src/main/java/com/banesco/module/instruction/domain/model/InstructionInvolvement.java new file mode 100644 index 0000000..618f96e --- /dev/null +++ b/src/main/java/com/banesco/module/instruction/domain/model/InstructionInvolvement.java @@ -0,0 +1,15 @@ +package com.banesco.module.instruction.domain.model; + +import com.banesco.module.party.domain.model.Party; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +public class InstructionInvolvement { + private Party partyReference; +} diff --git a/src/main/java/com/banesco/module/payment_order/domain/dto/request/PaymentOrderRequest.java b/src/main/java/com/banesco/module/payment_order/domain/dto/request/PaymentOrderRequest.java index b9fe252..9767efb 100644 --- a/src/main/java/com/banesco/module/payment_order/domain/dto/request/PaymentOrderRequest.java +++ b/src/main/java/com/banesco/module/payment_order/domain/dto/request/PaymentOrderRequest.java @@ -14,6 +14,5 @@ public class PaymentOrderRequest { private Operation operation; private String channelId; private String signature; - private String fintechId; } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/payment_order/domain/model/Operation.java b/src/main/java/com/banesco/module/payment_order/domain/model/Operation.java index 342da67..ba0df0a 100644 --- a/src/main/java/com/banesco/module/payment_order/domain/model/Operation.java +++ b/src/main/java/com/banesco/module/payment_order/domain/model/Operation.java @@ -11,4 +11,6 @@ import lombok.*; @RegisterForReflection public class Operation { private String recipientId; + private String dateCreate; + private Long id; } diff --git a/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBol.java b/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBol.java new file mode 100644 index 0000000..e64f085 --- /dev/null +++ b/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBol.java @@ -0,0 +1,23 @@ +package com.banesco.module.payment_order.domain.model; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +import java.math.BigDecimal; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +public class PaymentOrderBol { + private Long id; + private String requestType; + private String emitterReceptor; + private String status; + private BigDecimal amount; + private String currency; + private String concept; + private String dateCreate; +} \ No newline at end of file diff --git a/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrder.java b/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBole.java similarity index 93% rename from src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrder.java rename to src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBole.java index e6c2f9b..58d2477 100644 --- a/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrder.java +++ b/src/main/java/com/banesco/module/payment_order/domain/model/PaymentOrderBole.java @@ -11,7 +11,7 @@ import java.math.BigDecimal; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection -public class PaymentOrder { +public class PaymentOrderBole { private Long nroRequest; private String dispatchDate; private String fileName; diff --git a/src/main/java/com/banesco/module/payment_order/infrastructure/client/PaymentOrderClient.java b/src/main/java/com/banesco/module/payment_order/infrastructure/client/PaymentOrderClient.java index 47f6897..8e256b2 100644 --- a/src/main/java/com/banesco/module/payment_order/infrastructure/client/PaymentOrderClient.java +++ b/src/main/java/com/banesco/module/payment_order/infrastructure/client/PaymentOrderClient.java @@ -38,7 +38,8 @@ public class PaymentOrderClient implements PaymentOrderUseCase { PaymentOrderRequest params, Class responseType ) { - String signatureIdentifier = serializationHelper.encodeBase64(params); + String fintechId = params.getFintechId(); + String signatureIdentifier = getSignatureIdentifier(params); HttpRequest request = HttpRequest.forApiPrivateResponseList( paymentOrderConfig.getUrl(), paymentOrderConfig.getStatusSuccess(), @@ -46,7 +47,7 @@ public class PaymentOrderClient implements PaymentOrderUseCase { responseType ) .withPathParams(Map.of("signatureIdentifier", signatureIdentifier)) - .withHeaders(Map.of("fintechId", params.getFintechId())) + .withHeaders(Map.of("fintechId", fintechId)) .withTimeout( paymentOrderConfig.getTimeout().getConnect(), paymentOrderConfig.getTimeout().getResponse() @@ -106,4 +107,24 @@ public class PaymentOrderClient implements PaymentOrderUseCase { throw HttpStatusCodeException.serviceUnavailable("503"); } } + + private String getSignatureIdentifier(PaymentOrderRequest params) { + Map paymentOrderRequest = serializationHelper.toMap(params); + String signature = serializationHelper.encodeSha256( + serializationHelper.toJsonString(paymentOrderRequest.get("operation")) + + serializationHelper.encodeBase64(params.getChannelId()) + ); + + paymentOrderRequest.put("signature", signature); + + paymentOrderRequest.remove("fintechId"); + + String signatureIdentifier = serializationHelper.encodeBase64(paymentOrderRequest); + + log.info("1. Firma generada: {}", signature); + log.info("2. Parametros de la solicitud: {}", paymentOrderRequest); + log.info("3. Solicitud codificada: {}", signatureIdentifier); + + return signatureIdentifier; + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java b/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java index 234687e..01fcc35 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java @@ -31,7 +31,7 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear public ApiResponse execute( ServiceOrderPaymentSearchRequest request ) { - log.info("Iniciando ejecucion para el id: {}", request.getId()); + log.info("Iniciando ejecucion para el id: {}", request.getPartyId()); try { return apiPrivate(request); @@ -54,7 +54,7 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear private ApiResponse apiPrivate( ServiceOrderPaymentSearchRequest request ) { - log.info("Ejecutando llamada al api privada: {}", request.getId()); + log.info("Ejecutando llamada al api privada: {}", request.getPartyId()); return new ApiResponse<>( ServiceOrderPaymentSearchResponse.builder() diff --git a/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java b/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java index 51f3b8b..97881c1 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java @@ -1,6 +1,7 @@ package com.banesco.module.service_order_payment_search.domain.dto.request; import com.banesco.module.instruction.domain.model.Instruction; +import com.banesco.module.instruction.domain.model.InstructionPurposeType; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -23,22 +24,51 @@ public class ServiceOrderPaymentSearchRequest { @NonNull private Instruction procedureRequest; - public String getId() { - return getProcedureRequest().getInstructionIdentifier().getIdentification().getIdentifierValue(); + public String getPartyId() { + return getProcedureRequest() + .getInstructionInvolvement() + .getPartyReference() + .getPartyIdentification() + .get(0) + .getPartyIdentification() + .getIdentifierValue(); + } + + public String getInitiatedDate() { + return getProcedureRequest() + .getInstructionDate() + .get(0) + .getDate(); + } + + public String getPaymentRequestId() { + return getProcedureRequest() + .getInstructionIdentifier() + .getIdentification() + .getIdentifierValue(); } public String getChannelCode() { return getProcedureRequest().getInstructionPurposeType().name(); } - public String getSignatureIdentifier() { - return getProcedureRequest().getInstructionDescription(); + public boolean isBole() { + return getProcedureRequest().getInstructionPurposeType() == InstructionPurposeType.BOLE; + } + + public Map toParams() { + return Map.ofEntries( + entry("partyReferenceId", Objects.toString(getPartyId(), "")), + entry("channelCode", Objects.toString(getChannelCode(), "")) + ); } public Map toQueryString() { return Map.ofEntries( entry("appId", Objects.toString(getAppId(), "")), - entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), "")) + entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), "")), + entry("initiatedDate", Objects.toString(getInitiatedDate(), "")), + entry("paymentRequestId", Objects.toString(getPaymentRequestId(), "")) ); } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/service_order_payment_search/domain/model/ServicingOrderProcedure.java b/src/main/java/com/banesco/module/service_order_payment_search/domain/model/ServicingOrderProcedure.java index 65a58e4..40710f0 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/domain/model/ServicingOrderProcedure.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/domain/model/ServicingOrderProcedure.java @@ -2,6 +2,7 @@ package com.banesco.module.service_order_payment_search.domain.model; import com.banesco.module.document.domain.model.Document; import com.banesco.module.transaction.domain.model.Transaction; +import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -11,7 +12,10 @@ import lombok.*; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public class ServicingOrderProcedure { - private Document document; // fileName - private Transaction transaction; // status, accepted, rejected, expired + private Document document; // BOLE: fileName + // BOLE: nroRequest, status, accepted, rejected, expired, dispatchDate, quantity + // BOL: id, requestType, emitterReceptor, status, amount, currency, concept, dateCreate + private Transaction transaction; } diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java index 40a7478..fb871b8 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java @@ -2,7 +2,8 @@ package com.banesco.module.service_order_payment_search.infrastructure.adapter; import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.module.payment_order.application.usecase.PaymentOrderUseCase; -import com.banesco.module.payment_order.domain.model.PaymentOrder; +import com.banesco.module.payment_order.domain.model.PaymentOrderBol; +import com.banesco.module.payment_order.domain.model.PaymentOrderBole; import com.banesco.module.service_order_payment_search.application.repository.ApiPrivateRepository; import com.banesco.module.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; import com.banesco.module.service_order_payment_search.domain.model.ServicingOrderProcedure; @@ -29,16 +30,42 @@ public class ApiPrivateAdapter implements ApiPrivateRepository { public List execute( ServiceOrderPaymentSearchRequest request ) { - List response = paymentOrderUseCase.execute( - ServicingOrderMapper.toPaymentRequest(request), PaymentOrder.class + return request.isBole() ? executeBole(request) : executeBol(request); + } + + private List executeBole( + ServiceOrderPaymentSearchRequest request + ) { + List response = paymentOrderUseCase.execute( + ServicingOrderMapper.toPaymentRequest(request), + PaymentOrderBole.class ); - log.info("Resultado de las transacciones obtenidas: {}", response.size()); + log.info("Resultado de las transacciones obtenidas (BOLE): {}", response.size()); - if(response.isEmpty()) { + validateResponseNotEmpty(response); + + return ServicingOrderMapper.toBoleModel(response); + } + + private List executeBol( + ServiceOrderPaymentSearchRequest request + ) { + List response = paymentOrderUseCase.execute( + ServicingOrderMapper.toPaymentRequest(request), + PaymentOrderBol.class + ); + + log.info("Resultado de las transacciones obtenidas (BOL): {}", response.size()); + + validateResponseNotEmpty(response); + + return ServicingOrderMapper.toBolModel(response); + } + + private void validateResponseNotEmpty(List response) { + if (response.isEmpty()) { throw HttpStatusCodeException.badRequest("400"); } - - return ServicingOrderMapper.toModel(response); } } diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java index 96c7494..bee24ec 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java @@ -1,13 +1,17 @@ package com.banesco.module.service_order_payment_search.infrastructure.mapper; import com.banesco.module.document.domain.model.Document; +import com.banesco.module.party.domain.model.Party; +import com.banesco.module.party.domain.model.PartyIdentification; import com.banesco.module.payment_order.domain.dto.request.PaymentOrderRequest; import com.banesco.module.payment_order.domain.model.Operation; -import com.banesco.module.payment_order.domain.model.PaymentOrder; +import com.banesco.module.payment_order.domain.model.PaymentOrderBol; +import com.banesco.module.payment_order.domain.model.PaymentOrderBole; import com.banesco.module.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; import com.banesco.module.service_order_payment_search.domain.model.ServicingOrderProcedure; import com.banesco.common.domain.model.Identifier; import com.banesco.module.transaction.domain.model.*; +import io.netty.util.internal.StringUtil; import java.util.List; @@ -20,61 +24,135 @@ public class ServicingOrderMapper { ) { return PaymentOrderRequest.builder() .fintechId(request.getCustomerReferenceFintechId()) - .operation(Operation.builder() - .recipientId(request.getId()) - .build()) - .channelId(request.getProcedureRequest().getInstructionPurposeType().name()) - .signature(request.getProcedureRequest().getInstructionDescription()) + .operation( + Operation.builder() + .recipientId(request.getPartyId()) + .dateCreate((!StringUtil.isNullOrEmpty(request.getInitiatedDate())) + ? request.getInitiatedDate() + : null + ) + .id((!StringUtil.isNullOrEmpty(request.getPaymentRequestId())) + ? Long.valueOf(request.getPaymentRequestId()) + : null + ) + .build() + ) + .channelId(request.getChannelCode()) .build(); } - public static List toModel(List response) { - return response.stream().map(paymentOrder -> + public static List toBoleModel(List response) { + return response.stream().map(paymentOrderBole -> ServicingOrderProcedure.builder() - .document(buildDocumentProduct(paymentOrder)) - .transaction(buildTransaction(paymentOrder)) + .document(buildDocumentProduct(paymentOrderBole)) + .transaction(buildBoleTransaction(paymentOrderBole)) .build() ).toList(); } - private static Document buildDocumentProduct(PaymentOrder paymentOrder) { + public static List toBolModel(List response) { + return response.stream().map(paymentOrderBole -> + ServicingOrderProcedure.builder() + .transaction(buildBolTransaction(paymentOrderBole)) + .build() + ).toList(); + } + + private static Document buildDocumentProduct(PaymentOrderBole paymentOrderBole) { return Document.builder() - .documentName(paymentOrder.getFileName()) + .documentName(paymentOrderBole.getFileName()) .build(); } - private static Transaction buildTransaction(PaymentOrder paymentOrder) { + private static Transaction buildBoleTransaction(PaymentOrderBole paymentOrderBole) { return Transaction.builder() .transactionIdentification(Identifier.builder() - .identifierValue(String.valueOf(paymentOrder.getNroRequest())) + .identifierValue(String.valueOf(paymentOrderBole.getNroRequest())) .build()) - .transactionStatus(buildTransactionStatus(paymentOrder)) - .transactionDate(buildTransactionDateTimeList(paymentOrder)) + .transactionStatus(buildBoleTransactionStatus(paymentOrderBole)) + .transactionDate(buildBoleTransactionDateTimeList(paymentOrderBole)) .transactionDetails(TransactionDetails.builder() - .transactionQuantity(paymentOrder.getQuantity()) + .transactionQuantity(paymentOrderBole.getQuantity()) .build()) .build(); } - private static TransactionStatus buildTransactionStatus(PaymentOrder paymentOrder) { - return TransactionStatus.builder() - .statusType(mapTransactionStatusType(paymentOrder.getStatus())) - .statusName(paymentOrder.getStatus()) - .statusAccepted(paymentOrder.getAccepted()) - .statusRejected(paymentOrder.getRejected()) - .statusExpired(paymentOrder.getExpired()) + private static Transaction buildBolTransaction(PaymentOrderBol paymentOrderBol) { + return Transaction.builder() + .transactionIdentification(Identifier.builder() + .identifierValue(String.valueOf(paymentOrderBol.getId())) + .build()) + .transactionStatus(buildBolTransactionStatus(paymentOrderBol)) + .transactionDate(buildBolTransactionDateTimeList(paymentOrderBol)) + .transactionInvolvement(buildBolTransactionInvolvement(paymentOrderBol)) + .financialTransaction(buildBolFinancialTransaction(paymentOrderBol)) + .name(paymentOrderBol.getRequestType()) + .description(paymentOrderBol.getConcept()) .build(); } - private static List buildTransactionDateTimeList(PaymentOrder paymentOrder) { + private static TransactionStatus buildBoleTransactionStatus(PaymentOrderBole paymentOrderBole) { + return TransactionStatus.builder() + .statusType(mapTransactionStatusType(paymentOrderBole.getStatus())) + .statusName(paymentOrderBole.getStatus()) + .statusAccepted(paymentOrderBole.getAccepted()) + .statusRejected(paymentOrderBole.getRejected()) + .statusExpired(paymentOrderBole.getExpired()) + .build(); + } + + private static TransactionStatus buildBolTransactionStatus(PaymentOrderBol paymentOrderBol) { + return TransactionStatus.builder() + .statusType(mapTransactionStatusType(paymentOrderBol.getStatus())) + .statusName(paymentOrderBol.getStatus()) + .build(); + } + + private static List buildBoleTransactionDateTimeList(PaymentOrderBole paymentOrderBole) { return List.of( TransactionDateTime.builder() .dateType(TransactionDateTimeType.EXECUTED_DATE) - .date(paymentOrder.getDispatchDate()) + .date(paymentOrderBole.getDispatchDate()) .build() ); } + private static List buildBolTransactionDateTimeList(PaymentOrderBol paymentOrderBol) { + return List.of( + TransactionDateTime.builder() + .dateType(TransactionDateTimeType.INITIATED_DATE) + .date(paymentOrderBol.getDateCreate()) + .build() + ); + } + + private static List buildBolTransactionInvolvement(PaymentOrderBol paymentOrderBol) { + return List.of( + TransactionInvolvement.builder() + .partyReference( + Party.builder() + .partyIdentification(List.of( + PartyIdentification.builder() + .partyIdentification( + Identifier.builder() + .identifierValue(paymentOrderBol.getEmitterReceptor()) + .build() + ) + .build() + )) + .build() + ) + .build() + ); + } + + private static FinancialTransaction buildBolFinancialTransaction(PaymentOrderBol paymentOrderBol) { + return FinancialTransaction.builder() + .amount(paymentOrderBol.getAmount()) + .currencyCode(paymentOrderBol.getCurrency()) + .build(); + } + private static TransactionStatusType mapTransactionStatusType(String codeStatusRequest) { if (codeStatusRequest == null) { return TransactionStatusType.PENDING; @@ -83,7 +161,8 @@ public class ServicingOrderMapper { return switch (codeStatusRequest.toUpperCase()) { case "PENDIENTE" -> TransactionStatusType.PENDING; case "EXITO", "EXITOSA", "COMPLETADO", "FINALIZADO" -> TransactionStatusType.COMPLETED; - case "APROBADO", "CONFIRMADO" -> TransactionStatusType.CONFIRMED; + case "APROBADO", "APROBADA" -> TransactionStatusType.APPROVED; + case "CONFIRMADO", "CONFIRMADA" -> TransactionStatusType.CONFIRMED; case "INICIADO" -> TransactionStatusType.INITIATED; case "EN_PROCESO", "PROCESANDO", "EN CURSO" -> TransactionStatusType.IN_PROGRESS; case "RECHAZADO", "FALLIDO" -> TransactionStatusType.REJECTED; @@ -93,7 +172,8 @@ public class ServicingOrderMapper { case "CONTABILIZADO" -> TransactionStatusType.BOOKED; case "EJECUTADO" -> TransactionStatusType.EXECUTED; case "EXP" -> TransactionStatusType.EXPIRED; - case "ENVIADO" -> TransactionStatusType.SENT; + case "ENVIADO", "ENVIADA" -> TransactionStatusType.SENT; + case "RECIBIDO", "RECIBIDA" -> TransactionStatusType.RECEIVED; default -> TransactionStatusType.DEFAULT; }; } diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java index e294384..9b3cb1f 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java @@ -43,7 +43,7 @@ public class ServiceOrderPaymentSearchResource { } @GET - @Path("/retrieve/{partyReferenceId}/{channelCode}/{signatureIdentifier}") + @Path("/retrieve/{partyReferenceId}/{channelCode}") @Operation( summary = "Recuperar informacion de la transaccion", description = "Consulta de una trasanccion de pago por id de archivo" @@ -67,73 +67,234 @@ public class ServiceOrderPaymentSearchResource { ) } ), - examples = @ExampleObject( - name = "Ejemplo exitoso", - value = """ - { - "data": { - "servicingOrderProcedure": [ - { - "document": { - "documentName": "TESTING.CSV" - }, - "transaction": { - "transactionIdentification": { - "identifierValue": "2" + examples = { + @ExampleObject( + name = "Ejemplo exitoso (BOLE)", + value = """ + { + "data": { + "servicingOrderProcedure": [ + { + "document": { + "documentName": "TESTING.CSV" }, - "transactionStatus": { - "statusType": "PENDING", - "statusName": "PENDIENTE", - "statusAccepted": 0, - "statusRejected": 0, - "statusExpired": 2 - }, - "transactionDate": [ - { - "dateType": "EXECUTED_DATE", - "date": "2026-01-05 14:35:45.0372395" + "transaction": { + "transactionIdentification": { + "identifierValue": "2" + }, + "transactionStatus": { + "statusType": "PENDING", + "statusName": "PENDIENTE", + "statusAccepted": 0, + "statusRejected": 0, + "statusExpired": 2 + }, + "transactionDate": [ + { + "dateType": "EXECUTED_DATE", + "date": "2026-01-05 14:35:45.0372395" + } + ], + "transactionDetails": { + "transactionQuantity": 1000 + } + } + }, + { + "document": { + "documentName": "TESTING.CSV" + }, + "transaction": { + "transactionIdentification": { + "identifierValue": "3" + }, + "transactionStatus": { + "statusType": "IN_PROGRESS", + "statusName": "EN CURSO", + "statusAccepted": 0, + "statusRejected": 0, + "statusExpired": 5 + }, + "transactionDate": [ + { + "dateType": "EXECUTED_DATE", + "date": "2026-01-05 14:39:52.3840159" + } + ], + "transactionDetails": { + "transactionQuantity": 1000 } - ], - "transactionDetails": { - "transactionQuantity": 1000 } } - }, - { - "document": { - "documentName": "TESTING.CSV" + ] + }, + "statusResponse": { + "statusCode": "200", + "message": "Operacion exitosa" + } + } + """ + ), + @ExampleObject( + name = "Ejemplo exitoso (BOL)", + value = """ + { + "data": { + "servicingOrderProcedure": [ + { + "transaction": { + "transactionIdentification": { + "identifierValue": "1" + }, + "transactionStatus": { + "statusType": "APPROVED", + "statusName": "Aprobada" + }, + "transactionDate": [ + { + "dateType": "INITIATED_DATE", + "date": "2024-06-15T10:30:00Z" + } + ], + "transactionInvolvement": [ + { + "partyReference": { + "partyIdentification": [ + { + "partyIdentification": { + "identifierValue": "V20132859" + } + } + ] + } + } + ], + "financialTransaction": { + "amount": 150.75, + "currencyCode": "VES" + }, + "name": "Enviada", + "description": "cobro a pepito" + } }, - "transaction": { - "transactionIdentification": { - "identifierValue": "3" - }, - "transactionStatus": { - "statusType": "IN_PROGRESS", - "statusName": "EN CURSO", - "statusAccepted": 0, - "statusRejected": 0, - "statusExpired": 5 - }, - "transactionDate": [ - { - "dateType": "EXECUTED_DATE", - "date": "2026-01-05 14:39:52.3840159" - } - ], - "transactionDetails": { - "transactionQuantity": 1000 + { + "transaction": { + "transactionIdentification": { + "identifierValue": "2" + }, + "transactionStatus": { + "statusType": "PENDING", + "statusName": "Pendiente" + }, + "transactionDate": [ + { + "dateType": "INITIATED_DATE", + "date": "2024-06-16T14:49:00Z" + } + ], + "transactionInvolvement": [ + { + "partyReference": { + "partyIdentification": [ + { + "partyIdentification": { + "identifierValue": "V20132859" + } + } + ] + } + } + ], + "financialTransaction": { + "amount": 350.0, + "currencyCode": "VES" + }, + "name": "Recibida", + "description": "pago a proveedor" + } + }, + { + "transaction": { + "transactionIdentification": { + "identifierValue": "3" + }, + "transactionStatus": { + "statusType": "REJECTED", + "statusName": "Rechazado" + }, + "transactionDate": [ + { + "dateType": "INITIATED_DATE", + "date": "2024-06-17T09:15:00Z" + } + ], + "transactionInvolvement": [ + { + "partyReference": { + "partyIdentification": [ + { + "partyIdentification": { + "identifierValue": "V20132859" + } + } + ] + } + } + ], + "financialTransaction": { + "amount": 200.0, + "currencyCode": "VES" + }, + "name": "Enviada", + "description": "cobro a cliente" + } + }, + { + "transaction": { + "transactionIdentification": { + "identifierValue": "4" + }, + "transactionStatus": { + "statusType": "APPROVED", + "statusName": "Aprobada" + }, + "transactionDate": [ + { + "dateType": "INITIATED_DATE", + "date": "2024-06-18T11:20:00Z" + } + ], + "transactionInvolvement": [ + { + "partyReference": { + "partyIdentification": [ + { + "partyIdentification": { + "identifierValue": "V20132859" + } + } + ] + } + } + ], + "financialTransaction": { + "amount": 750.0, + "currencyCode": "VES" + }, + "name": "Recibida", + "description": "pago a proveedor" } } - } - ] - }, - "statusResponse": { - "statusCode": "200", - "message": "Operacion exitosa" - } - } - """ - ) + ] + }, + "statusResponse": { + "statusCode": "200", + "message": "Operacion exitosa" + } + } + """ + ) + } ) ), @APIResponse( @@ -272,17 +433,21 @@ public class ServiceOrderPaymentSearchResource { @Parameter(description = "Codigo del canal (BOL, BOLE)", required = true, example = "BOLE") String channelCode, - @PathParam("signatureIdentifier") - @Parameter(description = "Firma del archivo", required = true, example = "f8c226f844339c55bf898162c5d7de5d8116cee6028e1b357414dcc686b3ea85") - String signatureIdentifier, - @QueryParam("customerReferenceFintechId") @Parameter(description = "ID de la fintech", example = "pranical-test") String customerReferenceFintechId, @QueryParam("appId") @Parameter(description = "ID de la aplicacion", example = "DANIAPP") - String appId + String appId, + + @QueryParam("initiatedDate") + @Parameter(description = "Fecha de creación", example = "2024-06-15T10:30:00Z") + String initiatedDate, + + @QueryParam("instructionRequestId") + @Parameter(description = "ID de la peticion de pago", example = "1") + String instructionRequestId ) { log.info("Iniciando consulta para instruccion de archivo id: {}", partyReferenceId); @@ -292,7 +457,10 @@ public class ServiceOrderPaymentSearchResource { .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) .appId(Objects.toString(appId, "")) .procedureRequest(Instruction.fromResource( - partyReferenceId, channelCode, signatureIdentifier + partyReferenceId, + initiatedDate, + instructionRequestId, + channelCode )) .build() )).build(); diff --git a/src/main/java/com/banesco/module/transaction/domain/model/FinancialTransaction.java b/src/main/java/com/banesco/module/transaction/domain/model/FinancialTransaction.java new file mode 100644 index 0000000..3b2c285 --- /dev/null +++ b/src/main/java/com/banesco/module/transaction/domain/model/FinancialTransaction.java @@ -0,0 +1,19 @@ +package com.banesco.module.transaction.domain.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +import java.math.BigDecimal; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) +public class FinancialTransaction { + private BigDecimal amount; // BOL: amount + private String currencyCode; // BOL: currency +} diff --git a/src/main/java/com/banesco/module/transaction/domain/model/Transaction.java b/src/main/java/com/banesco/module/transaction/domain/model/Transaction.java index cf0b0b4..b43875b 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/Transaction.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/Transaction.java @@ -1,6 +1,7 @@ package com.banesco.module.transaction.domain.model; import com.banesco.common.domain.model.Identifier; +import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -12,9 +13,14 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public class Transaction { - private Identifier transactionIdentification; // nroRequest - private TransactionStatus transactionStatus; // status, accepted, rejected, expired - private List transactionDate; // dispatchDate - private TransactionDetails transactionDetails; // quantity + private Identifier transactionIdentification; // BOLE: nroRequest | BOL: id + private TransactionStatus transactionStatus; // BOLE: status, accepted, rejected, expired | BOL: status + private List transactionDate; // BOLE: dispatchDate | BOL: dateCreate + private TransactionDetails transactionDetails; // BOLE: quantity + private List transactionInvolvement; // BOL: emitterReceptor + private FinancialTransaction financialTransaction; // BOL: amount, currency + private String name; // BOL: requestType + private String description; // BOL: concept } diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTime.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTime.java index 3381fef..6ff6115 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTime.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTime.java @@ -11,5 +11,5 @@ import lombok.*; @RegisterForReflection public class TransactionDateTime { private TransactionDateTimeType dateType; - private String date; + private String date; // BOLE: dispatchDate | BOL: dateCreate } diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionDetails.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionDetails.java index 1db29f0..4c0633e 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/TransactionDetails.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionDetails.java @@ -1,5 +1,6 @@ package com.banesco.module.transaction.domain.model; +import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -11,6 +12,7 @@ import java.math.BigDecimal; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public class TransactionDetails { - private BigDecimal transactionQuantity; // quantity + private BigDecimal transactionQuantity; // BOLE: quantity } diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionInvolvement.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionInvolvement.java new file mode 100644 index 0000000..b7a859b --- /dev/null +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionInvolvement.java @@ -0,0 +1,17 @@ +package com.banesco.module.transaction.domain.model; + +import com.banesco.module.party.domain.model.Party; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TransactionInvolvement { + private Party partyReference; // BOL: emitterReceptor +} diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatus.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatus.java index 7cbd2d3..2f007d9 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatus.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatus.java @@ -1,5 +1,6 @@ package com.banesco.module.transaction.domain.model; +import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -9,10 +10,11 @@ import lombok.*; @NoArgsConstructor @AllArgsConstructor @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public class TransactionStatus { - private TransactionStatusType statusType; // status - private String statusName; // status - private Long statusAccepted; // accepted - private Long statusRejected; // rejected - private Long statusExpired; // expired + private TransactionStatusType statusType; // BOLE: status | BOL: status + private String statusName; // BOLE: status | BOL: status + private Long statusAccepted; // BOLE: accepted + private Long statusRejected; // BOLE: rejected + private Long statusExpired; // BOLE: expired } diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java index 6680ba4..1ed587d 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java @@ -7,6 +7,7 @@ public enum TransactionStatusType { EXECUTED, CANCELLED, CONFIRMED, + APPROVED, SUSPENDED, PENDING, COMPLETED, @@ -15,4 +16,5 @@ public enum TransactionStatusType { REJECTED, EXPIRED, SENT, + RECEIVED, } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7096d88..9835db0 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -15,4 +15,4 @@ api: key: 'dom-service-order-payment-search' content: '[{"backendCode":"200","httpCode":200,"statusCode":"200","description":"Operacion exitosa"},{"backendCode":"R404","httpCode":404,"statusCode":"404","description":"Datos de validacion no encontrado."},{"backendCode":"503","httpCode":503,"statusCode":"503","description":"Uso interno"},{"backendCode":"422","httpCode":422,"statusCode":"422","description":"Uso interno"},{"backendCode":"500","httpCode":500,"statusCode":"500","description":"Uso interno"},{"backendCode":"100","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-382505","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-380002","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"ERROR","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"400","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"401","httpCode":401,"statusCode":"401","description":"Uso interno"},{"backendCode":"403","httpCode":403,"statusCode":"403","description":"Uso interno"},{"backendCode":"404","httpCode":404,"statusCode":"404","description":"Uso interno"},{"backendCode":"default","httpCode":409,"statusCode":"409","description":"Conflicto"},{"backendCode":"424","httpCode":424,"statusCode":"424","description":"Error de dependencia"},{"backendCode":"VDE01","httpCode":400,"statusCode":"VDE01","description":"VDE01 - Error en dato de entrada obligatorio: %s"},{"backendCode":"VDE02","httpCode":400,"statusCode":"VDE02","description":"VDE02 - Error en valor permitido para campo: %s"},{"backend_code":"204","http_code":"200","status_code":"200","description":"Cliente sin productos","status":"ok"}]' rest-client: - payment-status-by-id: '{"url":"http://10.135.193.156:8080/RequestPayment/notificationRequestPayment/v1/querys/getGeneralRequestPayByParams/{signatureIdentifier}","timeout":{"connect":10000,"response":10000},"statusSuccess":"00"}' \ No newline at end of file + payment-order-by-parameters: '{"url":"http://10.135.193.156:8080/RequestPayment/notificationRequestPayment/v1/querys/getGeneralRequestPayByParams/{signatureIdentifier}","timeout":{"connect":10000,"response":10000},"statusSuccess":"00"}' \ No newline at end of file