# Historial de transacciones

Esta guía explica cómo buscar transacciones pasadas utilizando el `TransactionRepository`. Esta funcionalidad te permite recuperar listas detalladas de operaciones basadas en rangos de fechas y criterios específicos como marca de tarjeta, importe o estado del resultado.

Antes de buscar, asegúrate de que el TPV esté [**inicializado**](/es/get-smart/get-smart-sdk/integration-guides/payment-operations/initialize-the-tpv).

## Búsqueda básica por fecha

Para recuperar transacciones, utiliza el método `getTransactions`. Debes proporcionar una fecha de inicio y una fecha de fin.

<Callout type="note">

El rango entre `initDate` y `endDate` no puede exceder los **15 días**.

</Callout>

```kotlin
suspend fun searchTransactions(start: Date, end: Date) {
    val result = transactionRepository.getTransactions(
        initDate = start,
        endDate = end
    )
    handleTransactionResult(result)
}
```

## Filtrado avanzado

Puedes refinar tu búsqueda utilizando el objeto `TransactionFilter`. Todas las propiedades en este filtro son opcionales, solo necesitas establecer los criterios que quieres aplicar.

### Propiedades del filtro

* `operationNumber`: Busca un ID de transacción específico (Int).  
* `type`: Una lista de OperationType (por ejemplo, PAYMENT, REFUND).  
* `result`: El estado de OperationResult (por ejemplo, AUTHORIZED, DENIED).  
* `lastCardDigits`: Los últimos 4 dígitos de la tarjeta (Int).  
* `rangeAmountMinMax`: Un Pair de objetos Money que define el importe mínimo y máximo.  
* `cardBrand`: La CardBrand (por ejemplo, VISA, MASTERCARD).

### Ejemplo: Filtrado por marca de tarjeta e importe

```kotlin
suspend fun searchVisaHighValue(start: Date, end: Date) {
    // Define the filter
    val myFilter = TransactionFilter(
        cardBrand = CardBrand.VISA,
        rangeAmountMinMax = Pair(
            Money(BigDecimal("50.00"), Currency.getInstance("EUR")),
            Money(BigDecimal("500.00"), Currency.getInstance("EUR"))
        ),
        result = OperationResult.AUTHORIZED
    )

    // Execute search
    val result = transactionRepository.getTransactions(
        initDate = start,
        endDate = end,
        filter = myFilter
    )

    handleTransactionResult(result)
}
```

## Paginación y límites

Para gestionar grandes conjuntos de datos, utiliza el `TransactionResultsFilter`.

* `maxOperations`: Limita el número de transacciones devueltas.  
* `offset`: Omite el número especificado de transacciones (útil para la paginación).

```kotlin
val pagingFilter = TransactionResultsFilter(
    maxOperations = 20,
    offset = 0
)

val result = transactionRepository.getTransactions(
    initDate = start,
    endDate = end,
    resultsFilter = pagingFilter
)
```

## Interpretando el resultado

El repositorio devuelve un `RepositoryResult<GetTransactionsResult>`.

La data class `GetTransactionsResult` contiene:

* `transactionList`: Una `List<Transaction>` que contiene las operaciones encontradas.  
* `hasMoreTransactions`: Un `Boolean` que indica si hay más transacciones disponibles que coincidan con tus criterios (útil para la paginación).

### Ejemplo de lógica de gestión

```kotlin
fun handleTransactionResult(result: RepositoryResult<GetTransactionsResult>) {
    when (result) {
        is RepositoryResult.Success -> {
            val searchData = result.data
            val transactions = searchData.transactionList

            if (transactions.isEmpty()) {
                println("No transactions found.")
            } else {
                println("Found ${transactions.size} transactions.")
                transactions.forEach { txn ->
                    println("ID: ${txn.operationInfo.number} - Amount: ${txn.amount}")
                }
            }

            if (searchData.hasMoreTransactions) {
                println("⚠️ There are more transactions available. Load next page.")
            }
        }
        is RepositoryResult.ConnectionError -> println("❌ Connection Error")
        is RepositoryResult.ProtocolError -> println("❌ Error: ${result.type}")
        else -> {}
    }
}
```

## Próximos pasos

* [**Emitir Recibos Digitales**](/es/get-smart/get-smart-sdk/integration-guides/peripherals-and-receipts/issue-digital-receipts): Aprende cómo recuperar copias digitales de los recibos de estas transacciones.  
* [**Controlar la Impresora del Dispositivo**](/es/get-smart/get-smart-sdk/integration-guides/peripherals-and-receipts/control-the-device-printer): Controla la impresora para reimprimir tickets.