📊 Descripción General
El DTO CajaAperturaRequest representa la solicitud para abrir una caja en el sistema RestMaster. Este DTO contiene toda la información necesaria para iniciar una sesión de caja, incluyendo el cajero responsable, el importe inicial y el desglose detallado de monedas y billetes.
🎯 Propósito del DTO
- Apertura de Caja: Inicio de sesión de caja
- Control de Efectivo: Importe inicial y desglose
- Identificación: Cajero y caja responsable
- Auditoría: Trazabilidad de aperturas
- Validación: Verificación de datos de entrada
📋 DTO Relacionado: CajaDesgloseRequest
🎯 Propósito del DTO Relacionado
El DTO CajaDesgloseRequest proporciona el desglose detallado de monedas y billetes utilizados en la apertura de caja.
Codigo
string
Código de la moneda o billete (ej: "2EUR", "0.50EUR") (requerido, máx. 20 caracteres)
Cantidad
double
Cantidad contada (requerido, ≥ 0)
💡 Ejemplo de Uso
// Crear solicitud de apertura de caja
var aperturaRequest = new CajaAperturaRequest
{
CajeroId = 1,
ImporteInicial = 100.00,
NombreCaja = "CAJA_01",
FechaApertura = DateTime.Now,
DesgloseMonedas = new List<CajaDesgloseRequest>
{
new CajaDesgloseRequest
{
Codigo = "2EUR",
Cantidad = 10
},
new CajaDesgloseRequest
{
Codigo = "1EUR",
Cantidad = 20
},
new CajaDesgloseRequest
{
Codigo = "0.50EUR",
Cantidad = 40
},
new CajaDesgloseRequest
{
Codigo = "0.20EUR",
Cantidad = 50
},
new CajaDesgloseRequest
{
Codigo = "0.10EUR",
Cantidad = 100
}
}
};
// Validar el DTO
var validationResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(aperturaRequest,
new ValidationContext(aperturaRequest), validationResults, true);
if (!isValid)
{
foreach (var error in validationResults)
{
Console.WriteLine($"Error: {error.ErrorMessage}");
}
}
// Calcular total del desglose
var totalDesglose = aperturaRequest.DesgloseMonedas?
.Sum(d => d.Cantidad * ParseMoneda(d.Codigo)) ?? 0;
// Verificar que coincida con el importe inicial
if (Math.Abs(totalDesglose - aperturaRequest.ImporteInicial) > 0.01)
{
throw new ValidationException("El desglose no coincide con el importe inicial");
}
// Serializar a JSON
var jsonRequest = JsonSerializer.Serialize(aperturaRequest, new JsonSerializerOptions
{
WriteIndented = true
});
// Enviar solicitud a la API
var response = await httpClient.PostAsJsonAsync("/api/caja/apertura", aperturaRequest);
// Función auxiliar para parsear monedas
double ParseMoneda(string codigo)
{
return codigo switch
{
"2EUR" => 2.0,
"1EUR" => 1.0,
"0.50EUR" => 0.50,
"0.20EUR" => 0.20,
"0.10EUR" => 0.10,
"0.05EUR" => 0.05,
"0.02EUR" => 0.02,
"0.01EUR" => 0.01,
_ => 0.0
};
}