diff --git a/src/main/java/com/banesco/domain/model/FieldValidateResult.java b/src/main/java/com/banesco/domain/model/FieldValidateResult.java new file mode 100644 index 0000000..ca9a205 --- /dev/null +++ b/src/main/java/com/banesco/domain/model/FieldValidateResult.java @@ -0,0 +1,66 @@ +package com.banesco.domain.model; + +public class FieldValidateResult { + + private String backendCode; + private String field; + + public FieldValidateResult() { + } + + public FieldValidateResult(String backendCode, String field) { + this.backendCode = backendCode; + this.field = field; + } + + private FieldValidateResult(Builder builder) { + this.backendCode = builder.backendCode; + this.field = builder.field; + } + + public String getBackendCode() { + return backendCode; + } + + public String getField() { + return field; + } + + public static class Builder { + + private String backendCode; + private String field; + + public Builder() { + } + + public Builder backendCode(String backendCode) { + this.backendCode = backendCode; + return this; + } + + public Builder field(String field) { + this.field = field; + return this; + } + + public FieldValidateResult build() { + // Validaciones de ser necesario + // if (attr == null || attr.isEmpty()) { + // throw new IllegalStateException("El atributo1 no puede estar vacío"); + // } + return new FieldValidateResult(this); + } + + } + + public static Builder builder() { + return new Builder(); + } + + @Override + public String toString() { + return "FieldValidateResult [backendCode=" + backendCode + ", field=" + field + "]"; + } + +} diff --git a/src/main/java/com/banesco/domain/model/RequestBase.java b/src/main/java/com/banesco/domain/model/RequestBase.java new file mode 100644 index 0000000..f4438ff --- /dev/null +++ b/src/main/java/com/banesco/domain/model/RequestBase.java @@ -0,0 +1,223 @@ +package com.banesco.domain.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class RequestBase { + + @JsonProperty("MsgRqHdr") + public MsgRqHdr msgRqHdr; + + public static class NetworkTrnInfo { + + @JsonProperty("TransactionConsecutive") + public String transactionConsecutive; + @JsonProperty("RegisterNumber") + public String registerNumber; + @JsonProperty("OperationType") + public String operationType; + @JsonProperty("TransactionType") + public String transactionType; + @JsonProperty("TransactionCode") + public String transactionCode; + @JsonProperty("TransactionDate") + public String transactionDate; + @JsonProperty("TransactionTime") + public String transactionTime; + @JsonProperty("BankId") + public String bankId; + @JsonProperty("AgencyCode") + public String agencyCode; + @JsonProperty("ChannelId") + public String channelId; + + public String getTransactionConsecutive() { + return transactionConsecutive; + } + + public void setTransactionConsecutive(String transactionConsecutive) { + this.transactionConsecutive = transactionConsecutive; + } + + public String getRegisterNumber() { + return registerNumber; + } + + public void setRegisterNumber(String registerNumber) { + this.registerNumber = registerNumber; + } + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public String getTransactionCode() { + return transactionCode; + } + + public void setTransactionCode(String transactionCode) { + this.transactionCode = transactionCode; + } + + public String getTransactionDate() { + return transactionDate; + } + + public void setTransactionDate(String transactionDate) { + this.transactionDate = transactionDate; + } + + public String getTransactionTime() { + return transactionTime; + } + + public void setTransactionTime(String transactionTime) { + this.transactionTime = transactionTime; + } + + public String getBankId() { + return bankId; + } + + public void setBankId(String bankId) { + this.bankId = bankId; + } + + public String getAgencyCode() { + return agencyCode; + } + + public void setAgencyCode(String agencyCode) { + this.agencyCode = agencyCode; + } + + public String getChannelId() { + return channelId; + } + + public void setChannelId(String channelId) { + this.channelId = channelId; + } + + } + + public static class ApplicantData { + + @JsonProperty("Application") + public String application; + } + + public static class VBProtocol { + + @JsonProperty("VBProtocolInd") + public String vBProtocolInd; + @JsonProperty("TransactionInd") + public String transactionInd; + } + + public static class MsgRqHdr { + + @JsonProperty("MessageDate") + public String messageDate; + @JsonProperty("MessageTime") + public String messageTime; + @JsonProperty("RequestId") + public String requestId; + @JsonProperty("SourceChannelCode") + public String sourceChannelCode; + @JsonProperty("SupervisorCode") + public String supervisorCode; + @JsonProperty("OperatorCode") + public String operatorCode; + @JsonProperty("NetworkTrnInfo") + public NetworkTrnInfo networkTrnInfo; + @JsonProperty("ApplicantData") + public ApplicantData applicantData; + @JsonProperty("VBProtocol") + public VBProtocol vBProtocol; + + public String getMessageDate() { + return messageDate; + } + + public void setMessageDate(String messageDate) { + this.messageDate = messageDate; + } + + public String getMessageTime() { + return messageTime; + } + + public void setMessageTime(String messageTime) { + this.messageTime = messageTime; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getSourceChannelCode() { + return sourceChannelCode; + } + + public void setSourceChannelCode(String sourceChannelCode) { + this.sourceChannelCode = sourceChannelCode; + } + + public String getSupervisorCode() { + return supervisorCode; + } + + public void setSupervisorCode(String supervisorCode) { + this.supervisorCode = supervisorCode; + } + + public String getOperatorCode() { + return operatorCode; + } + + public void setOperatorCode(String operatorCode) { + this.operatorCode = operatorCode; + } + + public NetworkTrnInfo getNetworkTrnInfo() { + return networkTrnInfo; + } + + public void setNetworkTrnInfo(NetworkTrnInfo networkTrnInfo) { + this.networkTrnInfo = networkTrnInfo; + } + + public ApplicantData getApplicantData() { + return applicantData; + } + + public void setApplicantData(ApplicantData applicantData) { + this.applicantData = applicantData; + } + + public VBProtocol getvBProtocol() { + return vBProtocol; + } + + public void setvBProtocol(VBProtocol vBProtocol) { + this.vBProtocol = vBProtocol; + } + + } +} diff --git a/src/main/java/com/banesco/domain/model/ResponseBase.java b/src/main/java/com/banesco/domain/model/ResponseBase.java new file mode 100644 index 0000000..43e5ca8 --- /dev/null +++ b/src/main/java/com/banesco/domain/model/ResponseBase.java @@ -0,0 +1,298 @@ +package com.banesco.domain.model; + +import java.util.ArrayList; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ResponseBase { + + @JsonProperty("MsgRsHdr") + public ArrayList msgRsHdr; + + @JsonProperty("Status") + public ArrayList status; + + public ResponseBase() { + } + + public ResponseBase(ArrayList msgRsHdr, ArrayList status) { + this.msgRsHdr = msgRsHdr; + this.status = status; + } + + public ResponseBase(Builder builder) { + this.msgRsHdr = builder.msgRsHdr; + this.status = builder.status; + } + + public ArrayList getMsgRsHdr() { + return msgRsHdr; + } + + public void setMsgRsHdr(ArrayList msgRsHdr) { + this.msgRsHdr = msgRsHdr; + } + + public ArrayList getStatus() { + return status; + } + + public void setStatus(ArrayList status) { + this.status = status; + } + + public static class Builder { + + private ArrayList msgRsHdr; + private ArrayList status; + + public Builder msgRsHdr(ArrayList msgRsHdr) { + this.msgRsHdr = msgRsHdr; + return this; + } + + public Builder status(ArrayList status) { + this.status = status; + return this; + } + + public ResponseBase build() { + return new ResponseBase(msgRsHdr, status); + } + } + + public static class MsgRsHdr { + + @JsonProperty("FinalStatusRequest") + public String finalStatusRequest; + @JsonProperty("CountDataOut") + public String countDataOut; + @JsonProperty("TransactionCode") + public String transactionCode; + @JsonProperty("SupervisorCode") + public String supervisorCode; + @JsonProperty("OperationType") + public String operationType; + @JsonProperty("TransactionConsecutive") + public String transactionConsecutive; + @JsonProperty("DetailReg") + public String detailReg; + @JsonProperty("RegisterNumber") + public ArrayList registerNumber; + @JsonProperty("TransactionType") + public String transactionType; + @JsonProperty("RequestId") + public String requestId; + @JsonProperty("AppName") + public String appName; + + public MsgRsHdr() { + } + + public String getFinalStatusRequest() { + return finalStatusRequest; + } + + public void setFinalStatusRequest(String finalStatusRequest) { + this.finalStatusRequest = finalStatusRequest; + } + + public String getCountDataOut() { + return countDataOut; + } + + public void setCountDataOut(String countDataOut) { + this.countDataOut = countDataOut; + } + + public String getTransactionCode() { + return transactionCode; + } + + public void setTransactionCode(String transactionCode) { + this.transactionCode = transactionCode; + } + + public String getSupervisorCode() { + return supervisorCode; + } + + public void setSupervisorCode(String supervisorCode) { + this.supervisorCode = supervisorCode; + } + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + public String getTransactionConsecutive() { + return transactionConsecutive; + } + + public void setTransactionConsecutive(String transactionConsecutive) { + this.transactionConsecutive = transactionConsecutive; + } + + public String getDetailReg() { + return detailReg; + } + + public void setDetailReg(String detailReg) { + this.detailReg = detailReg; + } + + public ArrayList getRegisterNumber() { + return registerNumber; + } + + public void setRegisterNumber(ArrayList registerNumber) { + this.registerNumber = registerNumber; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String toString() { + return "MsgRsHdr [finalStatusRequest=" + finalStatusRequest + ", countDataOut=" + countDataOut + + ", transactionCode=" + transactionCode + ", supervisorCode=" + supervisorCode + ", operationType=" + + operationType + ", transactionConsecutive=" + transactionConsecutive + ", detailReg=" + detailReg + + ", registerNumber=" + registerNumber + ", transactionType=" + transactionType + ", requestId=" + + requestId + ", appName=" + appName + "]"; + } + + } + + public static class AdditionalStatus { + + @JsonProperty("StatusCode") + public String statusCode; + @JsonProperty("StatusDesc") + public String statusDesc; + @JsonProperty("Severity") + public String severity; + + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public String getStatusDesc() { + return statusDesc; + } + + public void setStatusDesc(String statusDesc) { + this.statusDesc = statusDesc; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + @Override + public String toString() { + return "AdditionalStatus [statusCode=" + statusCode + ", statusDesc=" + statusDesc + ", severity=" + + severity + "]"; + } + + } + + public static class Status { + + @JsonProperty("StatusCode") + public String statusCode; + @JsonProperty("StatusDesc") + public String statusDesc; + @JsonProperty("ApplicationName") + public String applicationName; + @JsonProperty("LineNumber") + public int lineNumber; + @JsonProperty("AdditionalStatus") + public ArrayList additionalStatus; + + public String getStatusCode() { + + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public String getStatusDesc() { + return statusDesc; + } + + public void setStatusDesc(String statusDesc) { + this.statusDesc = statusDesc; + } + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + public int getLineNumber() { + return lineNumber; + } + + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + public ArrayList getAdditionalStatus() { + return additionalStatus; + } + + public void setAdditionalStatus(ArrayList additionalStatus) { + this.additionalStatus = additionalStatus; + } + + @Override + public String toString() { + return "Status [statusCode=" + statusCode + ", statusDesc=" + statusDesc + ", applicationName=" + + applicationName + ", lineNumber=" + lineNumber + ", additionalStatus=" + additionalStatus + "]"; + } + + } + + @Override + public String toString() { + return "ResponseBase [msgRsHdr=" + msgRsHdr + ", status=" + status + "]"; + } + +} diff --git a/src/main/java/com/banesco/infraestructure/config/ApiConfig.java b/src/main/java/com/banesco/infraestructure/config/ApiConfig.java index b95abbf..84af947 100644 --- a/src/main/java/com/banesco/infraestructure/config/ApiConfig.java +++ b/src/main/java/com/banesco/infraestructure/config/ApiConfig.java @@ -2,13 +2,21 @@ package com.banesco.infraestructure.config; import java.util.Map; +/** + * Clase de configuración para APIs. Almacena la información necesaria para + * conectarse a un servicio API externo, incluyendo URL, path, configuración de + * timeout y parámetros adicionales. Diseñada para ser utilizada como objeto de + * configuración en clientes de API y servicios de integración. + */ public class ApiConfig { + private String url; private String path; private Timeout timeout; private Map config; - public ApiConfig() {} + public ApiConfig() { + } public ApiConfig(String url, String path, Timeout timeout, Map config) { this.url = url; @@ -49,6 +57,12 @@ public class ApiConfig { this.config = config; } + /** + * Clase interna que representa la configuración de tiempos de espera + * (timeout) para conexiones a APIs. Define los tiempos máximos de espera + * para establecer la conexión y para recibir una respuesta, especificados + * en milisegundos. + */ public static class Timeout { private int connect = 15000; diff --git a/src/main/java/com/banesco/infraestructure/config/RestClient.java b/src/main/java/com/banesco/infraestructure/config/RestClient.java new file mode 100644 index 0000000..2ec3580 --- /dev/null +++ b/src/main/java/com/banesco/infraestructure/config/RestClient.java @@ -0,0 +1,91 @@ +package com.banesco.infraestructure.config; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.logging.Logger; + +import com.banesco.domain.model.RequestBase; +import com.banesco.infraestructure.helpers.RequestHelper; +import com.banesco.infraestructure.repository.SoapHeadersRepository; + +public class RestClient { + private static final Logger logger = Logger.getLogger(RestClient.class.getName()); + + private final String headerUrl; + private final String idGeneratorUrl; + private final String instanceIdPath; + private final String requestIdPath; + private String instanceId; + private final RequestHelper requestHelper; + + // Constructor que recibe las URLs y la instancia de RequestHelper + public RestClient(String headerUrl, String idGeneratorUrl, String instanceIdPath, String requestIdPath, RequestHelper requestHelper) { + this.headerUrl = headerUrl; + this.idGeneratorUrl = idGeneratorUrl; + this.instanceIdPath = instanceIdPath; + this.requestIdPath = requestIdPath; + this.requestHelper = requestHelper; + this.init(); + } + + // Inicializa el Instance ID si no se está ejecutando localmente. + private void init() { + if (!idGeneratorUrl.contains("localhost")) { + System.out.println("Request to getInstanceId"); + this.instanceId = getInstanceId(); // Obtiene Instance ID + System.out.println("Response to getInstanceId: " + this.instanceId); + } + } + + public RequestBase.MsgRqHdr getHeader(String headerName) { + // Siempre usa SoapHeadersRepository independientemente de si es local o no + return SoapHeadersRepository.getHeader(headerName); + } + + public String getRequestId() { + if (idGeneratorUrl.contains("localhost")) { + return requestHelper.getRequestId(instanceId); // Lógica local + } else { + try { + String result = getHttpResponse(idGeneratorUrl + requestIdPath + instanceId); // Reutiliza función HTTP. + System.out.println("Response to getRequestId: " + result); + return result; + } catch (IOException e) { + System.err.println("Error getting request ID: " + e.getMessage()); + return null; // Manejo de error. + } + } + } + + public String getInstanceId() { + if (idGeneratorUrl.contains("localhost")) { + return requestHelper.getInstanceId(); // Usa el método de RequestHelper + } else { + try { + return getHttpResponse(idGeneratorUrl + instanceIdPath); // Reutiliza función HTTP. + } catch (IOException e) { + System.err.println("Error getting instance ID: " + e.getMessage()); + return null; // Manejo de error. + } + } + } + + // Función reutilizable para realizar llamadas HTTP GET. + private String getHttpResponse(String urlStr) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java b/src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java new file mode 100644 index 0000000..6d1e29e --- /dev/null +++ b/src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java @@ -0,0 +1,22 @@ +package com.banesco.infraestructure.helpers; + + +/** + * Clase utilitaria para operaciones relacionadas con cuentas bancarias. + * Proporciona métodos para manipular y formatear información de cuentas. + */ +public class AccountHelper { + + /** + * Enmascara un número de cuenta, mostrando solo los primeros 4 + * y últimos 4 Los dígitos intermedios son reemplazados por asteriscos para proteger la + * información sensible del cliente. + * + * @param clearAccountId El número de cuenta completo sin enmascarar + * @return El número de cuenta enmascarado en formato "XXXX************YYYY" + */ + public static String getMaskedAccountId(String clearAccountId) { + return clearAccountId.substring(0, 4) + "************" + clearAccountId.substring(clearAccountId.length() - 4); + + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java b/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java index a250150..ae35bf7 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java +++ b/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java @@ -3,10 +3,17 @@ package com.banesco.infraestructure.helpers; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Clase utilitaria para operaciones relacionadas con fechas y horas. + * Proporciona métodos para validar, comparar y calcular períodos entre fechas. + */ public class DateHelper { private static final Logger logger = Logger.getLogger(DateHelper.class.getName()); @@ -14,13 +21,15 @@ public class DateHelper { /** * Verifica si la hora actual está dentro del rango de horas proporcionado. - * Si las horas de inicio y fin son iguales, devuelve false. + * Si las horas de inicio y fin son iguales, devuelve false. Maneja + * correctamente los rangos que cruzan la medianoche. * - * @param inputHourOne Hora de inicio (formato HH:mm). - * @param inputHourTwo Hora de fin (formato HH:mm). - * @return true si la hora actual está dentro del rango, false de lo - * contrario. - * @throws ParseException Si ocurre un error al analizar las horas. + * @param inputHourOne Hora de inicio en formato HH:mm + * @param inputHourTwo Hora de fin en formato HH:mm + * @return true si la hora actual está dentro del rango, false en caso + * contrario + * @throws ParseException Si ocurre un error al analizar las horas + * proporcionadas */ public static boolean isTimeInRange(String inputHourOne, String inputHourTwo) throws ParseException { if (inputHourOne.equals(inputHourTwo)) { @@ -52,4 +61,33 @@ public class DateHelper { return isInRange; } + + /** + * Calcula el número de días entre dos fechas. + * + * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) + * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) + * @return El número de días entre las fechas o -1 si ocurre un error al + * procesar las fechas + */ + public long daysBetweenTwoDates(String startDate, String endDate) { + try { + return ChronoUnit.DAYS.between(LocalDate.parse(startDate), LocalDate.parse(endDate)); + } catch (DateTimeException dte) { + return -1L; + } + } + + /** + * Verifica si la fecha de inicio es anterior o igual a la fecha de fin. + * + * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) + * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) + * @return true si startDate es anterior o igual a endDate, false en caso + * contrario + */ + public boolean isStartDateBeforeEndDate(String startDate, String endDate) { + return LocalDate.parse(startDate).isBefore(LocalDate.parse(endDate)) + || LocalDate.parse(startDate).isEqual(LocalDate.parse(endDate)); + } } diff --git a/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java b/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java index 13602fa..9d26c6d 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java +++ b/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java @@ -1,5 +1,12 @@ package com.banesco.infraestructure.helpers; +/** + * Clase utilitaria para la generación de mensajes de registro (logging). + * Facilita la creación de cadenas formateadas para registrar información de + * solicitudes y respuestas, tanto públicas como privadas, así como mensajes de + * error. Utiliza un formato estandarizado para mejorar la legibilidad y + * facilitar el análisis de los registros del sistema. + */ public class LoggerHelper { /** diff --git a/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java b/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java index 80aaa4c..69b90f6 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java +++ b/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java @@ -7,9 +7,20 @@ import org.apache.commons.lang3.StringUtils; import com.banesco.domain.model.Device; +/** + * Clase utilitaria para operaciones relacionadas con solicitudes HTTP y + * generación de identificadores. Proporciona métodos para generar IDs únicos, + * obtener información del cliente y gestionar información del dispositivo. + */ public class RequestHelper { private final boolean readDeviceFromRequest; + + /** + * Nombres de cabeceras HTTP que pueden contener la dirección IP del + * cliente. Se revisan en orden para encontrar la IP real considerando + * proxies y balanceadores. + */ private static final String[] IP_HEADER_NAMES = { "X-Forwarded-For", "Proxy-Client-IP", @@ -25,8 +36,9 @@ public class RequestHelper { }; /** - * Constructor de RequestHelper. Lee la propiedad de configuracion - * 'api.server-request.read-device' de las propiedades del sistema + * Constructor de RequestHelper. Inicializa la configuración para la lectura + * de información del dispositivo. Lee la propiedad de configuración + * 'api.server-request.read-device' del sistema. */ public RequestHelper() { // Lee la propiedad del sistema. Si no existe, asume false por defecto. @@ -35,39 +47,92 @@ public class RequestHelper { } /** - * Genera un ID de instancia único. + * Genera un ID de instancia único con un prefijo específico. Útil para + * identificar instancias del servidor o aplicación. * - * @return Un ID de instancia con el prefijo "INST". + * @return Un ID de instancia con el prefijo "INST" seguido de 10 caracteres + * alfanuméricos aleatorios */ public String getInstanceId() { return "INST" + RandomStringUtils.randomAlphanumeric(10); } /** - * Genera un ID de solicitud único basado en el ID de instancia. + * Genera un ID de solicitud único basado en el ID de instancia. Combina el + * ID de instancia con caracteres aleatorios para crear un identificador + * único. * - * @param instanceId El ID de la instancia. - * @return Un ID de solicitud con el prefijo "REQ". + * @param instanceId El ID de la instancia a incluir en el ID de solicitud + * @return Un ID de solicitud en formato [instanceId]REQ[20 caracteres + * aleatorios] */ public String getRequestId(String instanceId) { return instanceId + "REQ" + RandomStringUtils.randomAlphanumeric(20); } /** - * Genera un ID de solicitud único. + * Genera un ID de solicitud único sin necesidad de proporcionar un ID de + * instancia. Crea un nuevo ID de instancia y lo utiliza para generar el ID + * de solicitud. * - * @return Un ID de solicitud con el prefijo "REQ". + * @return Un ID de solicitud completo con instancia generada + * automáticamente */ public String getRequestId() { return getInstanceId() + "REQ" + RandomStringUtils.randomAlphanumeric(20); } /** - * Obtiene la dirección IP remota del cliente a partir de la solicitud HTTP. + * Genera un identificador de sesión (SID) aleatorio. * - * @param request La solicitud HTTP. + * @return Un string de 20 caracteres alfanuméricos aleatorios + */ + public String getSid() { + return RandomStringUtils.randomAlphanumeric(20); + } + + /** + * Genera un ID de transacción numérico de 11 dígitos. + * + * @return Un string de 11 caracteres numéricos aleatorios + */ + public String getTransactionId() { + return RandomStringUtils.randomNumeric(11); + } + + /** + * Genera un ID de transacción numérico con el número de dígitos + * especificado. + * + * @param numDigitos El número de dígitos que debe tener el ID generado + * @return Un string de caracteres numéricos aleatorios con la longitud + * especificada + */ + public String getTransactionId(Integer numDigitos) { + return RandomStringUtils.randomNumeric(numDigitos); + } + + /** + * Genera una referencia Banesco alfanumérica con el número de dígitos + * especificado. + * + * @param numDigitos El número de dígitos que debe tener la referencia + * generada + * @return Un string de caracteres alfanuméricos aleatorios con la longitud + * especificada + */ + public String getRefBanesco(Integer numDigitos) { + return RandomStringUtils.randomAlphanumeric(numDigitos); + } + + /** + * Obtiene la dirección IP remota del cliente a partir de la solicitud HTTP. + * Revisa varias cabeceras HTTP que podrían contener la IP real del cliente + * considerando proxies y balanceadores de carga. + * + * @param request La solicitud HTTP * @return La dirección IP remota del cliente, o "0.0.0.0" si la solicitud - * es nula. + * es nula */ public String getRemoteIP(HttpServletRequest request) { if (request == null) { @@ -86,11 +151,14 @@ public class RequestHelper { /** * Llena la información del dispositivo remoto del cliente en el objeto - * Device. + * Device. Si se configura readDeviceFromRequest como true, siempre se + * obtendrá la información del dispositivo desde la solicitud HTTP, + * independientemente de si ya existe. * - * @param servletRequest La solicitud HTTP. - * @param device El objeto Device a llenar. - * @return El objeto Device llenado con la información del cliente. + * @param servletRequest La solicitud HTTP + * @param device El objeto Device existente a actualizar o null para crear + * uno nuevo + * @return El objeto Device con la información del cliente actualizada */ public Device fillRemoteDevice(HttpServletRequest servletRequest, Device device) { Device.Builder deviceBuilder = (device == null) ? Device.builder() : Device.builder() diff --git a/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java b/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java index 1bea2ae..8d47791 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java +++ b/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java @@ -2,6 +2,12 @@ package com.banesco.infraestructure.helpers; import org.apache.commons.lang3.StringUtils; +/** + * Clase utilitaria para operaciones con cadenas de texto (strings). Proporciona + * métodos para validar, manipular y formatear cadenas de texto. Incluye + * funcionalidades como verificación de tipos numéricos, validación de cadenas + * no vacías y funciones de formato como relleno de caracteres. + */ public class StringHelper { /** diff --git a/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java b/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java new file mode 100644 index 0000000..a7e8deb --- /dev/null +++ b/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java @@ -0,0 +1,53 @@ +package com.banesco.infraestructure.repository; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.banesco.domain.model.RequestBase; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SoapHeadersRepository { + + private static final Logger logger = Logger.getLogger(MessageRepository.class.getName()); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + public static final DateTimeFormatter DATE_TIME_YYYY_MM_dd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final DateTimeFormatter DATE_TIME_HH_mm_ss = DateTimeFormatter.ofPattern("HH:mm:ss"); + + public static RequestBase.MsgRqHdr getHeader(String headerName) { + RequestBase.MsgRqHdr msgRqHdr = null; + + try { + InputStream in = Thread.currentThread().getContextClassLoader() + .getResourceAsStream("headers/" + headerName + ".json"); + msgRqHdr = OBJECT_MAPPER.readValue(Objects.requireNonNull(in), RequestBase.MsgRqHdr.class); + } catch (IOException e) { + logger.log(Level.WARNING, String.format("ERROR: Path /headers/%s", headerName)); + // o lanzar una excepcion. + return null; + } + + if (msgRqHdr != null) { + Timestamp dateHour = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("America/Caracas"))); + + String date = new SimpleDateFormat("yyyy-MM-dd").format(dateHour); + String hour = new SimpleDateFormat("HH:mm:ss").format(dateHour); + + msgRqHdr.setMessageTime(hour); + msgRqHdr.getNetworkTrnInfo().setTransactionDate(date); + msgRqHdr.getNetworkTrnInfo().setTransactionTime(hour); + + return msgRqHdr; + } else { + return msgRqHdr; + } + } +} diff --git a/src/main/java/com/banesco/infraestructure/utils/DateValidator.java b/src/main/java/com/banesco/infraestructure/utils/DateValidator.java index 683d92c..0b7040d 100644 --- a/src/main/java/com/banesco/infraestructure/utils/DateValidator.java +++ b/src/main/java/com/banesco/infraestructure/utils/DateValidator.java @@ -5,7 +5,15 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.regex.Pattern; +/** + * Clase para validación de fechas con configuración flexible. Permite validar + * fechas en diferentes formatos, comprobar rangos de años y verificar la + * correcta formación de componentes de fecha (año, mes, día). Implementa el + * patrón Builder para facilitar la configuración personalizada de los + * parámetros de validación. + */ public class DateValidator { + private final DateTimeFormatter dateFormatter; private final Pattern datePattern; private final int minYear; @@ -19,6 +27,7 @@ public class DateValidator { } public static class Builder { + private DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); private String dateFormatRegex = "(\\d{4})/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])"; private int minYear = 1900; diff --git a/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java b/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java index bf86d28..9e2a691 100644 --- a/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java +++ b/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java @@ -2,6 +2,12 @@ package com.banesco.infraestructure.utils; import java.util.regex.Pattern; +/** + * Clase para validar números telefónicos según patrones específicos. Utiliza + * expresiones regulares para verificar que los números telefónicos cumplan con + * el formato esperado, permitiendo diferentes configuraciones según los + * requisitos regionales o de formato de la aplicación. + */ public class PhoneNumberValidator { private final Pattern pattern;