# Reembolsos

Esta API proporciona endpoints para gestionar los reembolsos relacionados con pagos. Incluye la capacidad de crear, recuperar y listar reembolsos.

## 1. Listar Reembolsos

#### \[GET] /refunds

Retorna una lista de reembolsos basados en los parámetros de consulta. Soporta filtrado, paginación y ordenación.

**Solicitud:**

```
const query = {
  page: number,  // Número de página para paginación
  limit: number, // Número de elementos por página
  query: object  // Condiciones de filtrado opcionales
};
```

**Parámetros de Consulta:**

* `page`: El número de página para paginación (opcional, por defecto es 1).
* `limit`: El número de reembolsos para recuperar por página (opcional, por defecto es 10).
* `query`: Una lista separada por comas de pares clave-valor para filtrar resultados. Las claves serán los campos de reembolso y los valores se utilizarán para hacer coincidir los campos correspondientes (opcional).

Respuesta:

```
{
  "refunds": [ /* Array de objetos de reembolsos */ ],
  "page": 1,
  "pageSize": 10,
  "totalPages": 5
}
```

Ejemplo de Objeto de Reembolso:

```
{
  "_id": "string",
  "paymentIntentId": "string",
  "paymentId": "string",
  "userId": "string",
  "receiverId": "string",
  "refundTo": "string",
  "amount": 100,
  "status": "PROCESSING",
  "createdAt": "timestamp",
  "updatedAt": "timestamp"
}
```

## 2. Obtener reembolso por ID

\[GET] /refunds/:id

Retorna un reembolso específico por su ID.

**Solicitud:**

* **Parámetro de URL:**
  * `id`: El ID del reembolso.

Respuesta:

```
{
  "_id": "string",
  "paymentIntentId": "string",
  "paymentId": "string",
  "userId": "string",
  "receiverId": "string",
  "refundTo": "string",
  "amount": 100,
  "status": "PROCESSING",
  "createdAt": "timestamp",
  "updatedAt": "timestamp"
}
```

## 3. Crear reembolso

\[POST] /refunds

Crea un nuevo reembolso para un pago existente.

**Solicitud:**

```
{
  "paymentId": "string", // El ID del pago a reembolsar
  "refundTo": "string" // La dirección a la que se enviará el reembolso (debe ser una dirección válida)
}
```

Respuesta:

```
{
  "_id": "string",
  "paymentIntentId": "string",
  "paymentId": "string",
  "userId": "string",
  "receiverId": "string",
  "refundTo": "string",
  "amount": 100,
  "status": "PROCESSING",
  "createdAt": "timestamp",
  "updatedAt": "timestamp"
}
```

**Validación:**

* La solicitud debe incluir un `paymentId` y una dirección `refundTo` válidos.
* El `paymentId` debe corresponder a un pago confirmado.
* La dirección `refundTo` debe ser una dirección Ethereum válida (comienza con "0x" y tiene una longitud de 42 caracteres).
* El monto del reembolso no debe exceder los fondos disponibles en la cuenta del receptor.
* No se pueden procesar reembolsos si el pago ha sido retirado.

**Respuestas de Error:**

* **400 Bad Request**: Campos requeridos faltantes o datos inválidos (por ejemplo, dirección inválida, fondos insuficientes).
* **401 Unauthorized**: Si el usuario no está autenticado.
* **404 Not Found**: Si el pago o el reembolso no existen.
* **500 Internal Server Error**: Si ocurre un error inesperado.

## 4. Crear reembolso parcial

\[POST] /refunds/partial

Crea un nuevo reembolso parcial para un pago existente.

**Solicitud:**

```
{
  "paymentId": "string",// El ID del pago a reembolsar
  "refundTo": "string",// La dirección a la que se enviará el reembolso (debe ser una dirección válida)
  "amount": "number" // La cantidad solicitada en el reembolso
}
```

Respuesta:

```
{
  "_id": "string",
  "paymentIntentId": "string",
  "paymentId": "string",
  "userId": "string",
  "receiverId": "string",
  "refundTo": "string",
  "amount": 100,
  "status": "PROCESSING",
  "createdAt": "timestamp",
  "updatedAt": "timestamp"
}
```

**Validación:**

* La solicitud debe incluir un `paymentId` y una dirección `refundTo` válidos.
* El `paymentId` debe corresponder a un pago confirmado.
* La dirección `refundTo` debe ser una dirección Ethereum válida (comienza con "0x" y tiene una longitud de 42 caracteres).
* El monto del reembolso no debe exceder los fondos disponibles en la cuenta del receptor.
* No se pueden procesar reembolsos si el pago ha sido retirado.

**Respuestas de Error:**

* **400 Bad Request**: Campos requeridos faltantes o datos inválidos (por ejemplo, dirección inválida, fondos insuficientes).
* **401 Unauthorized**: Si el usuario no está autenticado.
* **404 Not Found**: Si el pago o el reembolso no existen.
* **500 Internal Server Error**: Si ocurre un error inesperado.
