ADD - rest of files (helpers, utils, models, etc)

This commit is contained in:
atravieso 2025-04-03 14:04:53 -04:00
parent c36f2dccb5
commit c8b9ee92cd
13 changed files with 924 additions and 23 deletions

View File

@ -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 + "]";
}
}

View File

@ -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;
}
}
}

View File

@ -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> msgRsHdr;
@JsonProperty("Status")
public ArrayList<Status> status;
public ResponseBase() {
}
public ResponseBase(ArrayList<MsgRsHdr> msgRsHdr, ArrayList<Status> status) {
this.msgRsHdr = msgRsHdr;
this.status = status;
}
public ResponseBase(Builder builder) {
this.msgRsHdr = builder.msgRsHdr;
this.status = builder.status;
}
public ArrayList<MsgRsHdr> getMsgRsHdr() {
return msgRsHdr;
}
public void setMsgRsHdr(ArrayList<MsgRsHdr> msgRsHdr) {
this.msgRsHdr = msgRsHdr;
}
public ArrayList<Status> getStatus() {
return status;
}
public void setStatus(ArrayList<Status> status) {
this.status = status;
}
public static class Builder {
private ArrayList<MsgRsHdr> msgRsHdr;
private ArrayList<Status> status;
public Builder msgRsHdr(ArrayList<MsgRsHdr> msgRsHdr) {
this.msgRsHdr = msgRsHdr;
return this;
}
public Builder status(ArrayList<Status> 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<String> 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<String> getRegisterNumber() {
return registerNumber;
}
public void setRegisterNumber(ArrayList<String> 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> 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<AdditionalStatus> getAdditionalStatus() {
return additionalStatus;
}
public void setAdditionalStatus(ArrayList<AdditionalStatus> 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 + "]";
}
}

View File

@ -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<String, String> config;
public ApiConfig() {}
public ApiConfig() {
}
public ApiConfig(String url, String path, Timeout timeout, Map<String, String> 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;

View File

@ -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();
}
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -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 {
/**

View File

@ -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()

View File

@ -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 {
/**

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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;