# Gestionar turnos y sesiones

Esta guía explica cómo gestionar los turnos operativos y las sesiones utilizando `ShiftRepository` y `SessionRepository`. Estas operaciones permiten segmentar los periodos de transacciones y liquidar los lotes con el host.

## Abrir un turno

Los turnos son periodos operativos locales que permiten agrupar transacciones (p. ej., por empleado o momento del día). Para iniciar un nuevo turno, utiliza `openShift`.

**Repositorio**: `ShiftRepository`  
**Función**: `openShift`

**Parámetros**:
* `number`: Un entero que representa el número de turno.
* `date`: El objeto `Date` que indica cuándo se abre el turno.

**Ejemplo**:

```kotlin
suspend fun startShift(shiftNumber: Int) {
    val result = shiftRepository.openShift(
        number = shiftNumber,
        date = Date() // Current time
    )

    when (result) {
        is RepositoryResult.Success -> {
            val isSuccess = result.data
            if (isSuccess) {
                println("✅ Shift $shiftNumber opened successfully")
            } else {
                println("❌ Failed to open shift")
            }
        }
        is RepositoryResult.ConnectionError -> println("❌ Connection Error")
        is RepositoryResult.ProtocolError -> println("❌ Error: ${result.type}")
        else -> {}
    }
}
```

## Cierre de sesión

Cerrar una sesión (a menudo llamado "Fin de Día" o "Cierre de Lote") finaliza el periodo actual y liquida las transacciones con el host de Getnet. **Esta es una operación crítica**: asegura que los pagos se procesen y los fondos se depositen correctamente.

**Repositorio**: `SessionRepository`  
**Función**: `closeSession`

**Parámetros**:
* `wantBrandDetails` (Opcional, por defecto `true`): Si es `true`, el resultado incluirá un desglose de los totales por marca de tarjeta (Visa, Mastercard, etc.).

### Interpretar CloseSessionResult

La operación devuelve una interfaz sellada `CloseSessionResult`:

1. **Exitoso (`CloseSessionResult.Successful`)**: La sesión se cerró correctamente. La propiedad `data` contiene un `TotalsCommonModel` con el resumen de la sesión cerrada (importes, recuento de transacciones, etc.).
2. **Rechazado (`CloseSessionResult.Rejected`)**: El host rechazó la solicitud de cierre.

**Ejemplo**:

```kotlin
suspend fun closeDailySession() {
    val result = sessionRepository.closeSession(wantBrandDetails = true)

    when (result) {
        is RepositoryResult.Success -> {
            when (val sessionOutcome = result.data) {
                is CloseSessionResult.Successful -> {
                    val totals = sessionOutcome.data
                    println("✅ Session Closed. Total: ${totals.totalAmount}")
                }
                is CloseSessionResult.Rejected -> {
                    println("❌ Session Close Rejected by Host")
                }
            }
        }
        is RepositoryResult.ConnectionError -> println("❌ Connection Error")
        is RepositoryResult.ProtocolError -> println("❌ Error: ${result.type}")
        else -> {}
    }
}
```

## Próximos pasos

* [**Ver Totales e Informes**](/es/get-smart/get-smart-sdk/integration-guides/business-management/view-totals-and-reports): Consulta de totales acumulados para sesiones o turnos específicos.