Skip to main content
The TarifaTemporada entity defines pricing for room categories during specific seasons. It enables dynamic pricing strategies based on demand, holidays, and seasonal variations.

Overview

TarifaTemporada associates a room category with a season and a specific price point. This allows flexible pricing where the same room category can have different rates during high season, low season, holidays, etc. Namespace: SGRH.Domain.Entities.Habitaciones Source: ~/workspace/source/SGRH.Domain/Entities/Habitaciones/TarifaTemporada.cs

Properties

TarifaTemporadaId
int
required
Unique identifier for the seasonal rate (primary key).
CategoriaHabitacionId
int
required
Reference to the room category (e.g., Standard, Deluxe, Suite).
TemporadaId
int
required
Reference to the season (e.g., High Season, Low Season, Holidays).
Precio
decimal
required
Price per night for this category during this season. Must be > 0.

Constructor

public TarifaTemporada(int categoriaHabitacionId, int temporadaId, decimal precio)
Creates a new seasonal rate.

Parameters

  • categoriaHabitacionId: Valid room category ID (must be > 0)
  • temporadaId: Valid season ID (must be > 0)
  • precio: Price per night (must be > 0)

Validations

  • All IDs must be greater than 0 (Guard.AgainstOutOfRange)
  • Price must be greater than 0

Example

var tarifaAltaTemporada = new TarifaTemporada(
    categoriaHabitacionId: 1,  // Standard room
    temporadaId: 2,            // High Season
    precio: 150.00m            // $150/night
);

Methods

ActualizarPrecio

public void ActualizarPrecio(decimal nuevoPrecio)
Updates the seasonal rate. Parameters:
  • nuevoPrecio: New price (must be > 0)
Validation:
  • Price must be greater than 0
Example:
tarifaAltaTemporada.ActualizarPrecio(175.00m); // Price increase
Price updates only affect future reservations. Existing reservations maintain their captured price snapshots.

Pricing Strategy

Multi-dimensional Pricing

TarifaTemporada enables flexible pricing based on two dimensions:
  1. Room Category: Different room types (Standard, Deluxe, Suite)
  2. Season: Different time periods (High, Low, Holidays)

Example Pricing Matrix

CategoryLow SeasonHigh SeasonHolidays
Standard$100$150$200
Deluxe$150$225$300
Suite$250$375$500

Implementation

// Low Season - Standard
new TarifaTemporada(categoriaId: 1, temporadaId: 1, precio: 100m);

// High Season - Standard  
new TarifaTemporada(categoriaId: 1, temporadaId: 2, precio: 150m);

// Holidays - Standard
new TarifaTemporada(categoriaId: 1, temporadaId: 3, precio: 200m);

// ... repeat for other categories

Usage in Reservations

Price Determination

When a reservation is created or dates are changed:
  1. System determines the season based on check-in date
  2. Retrieves TarifaTemporada for each room’s category + season
  3. Captures price as snapshot in DetalleReserva.TarifaAplicada

Policy Integration

The IReservaDomainPolicy.GetTarifaAplicada() method:
decimal GetTarifaAplicada(int habitacionId, DateTime fechaEntrada);
Implementation flow:
  1. Get room’s CategoriaHabitacionId
  2. Determine TemporadaId from fechaEntrada
  3. Query TarifaTemporada by category + season
  4. Return Precio

Snapshot Pattern

Prices are captured at reservation time:
// When adding a room to a reservation
var tarifa = policy.GetTarifaAplicada(habitacionId, FechaEntrada);
_habitaciones.Add(new DetalleReserva(ReservaId, habitacionId, tarifa));
This ensures:
  • Reservations aren’t affected by future price changes
  • Historical accuracy for reporting
  • Price consistency for guests

Business Rules

  • Prices must always be greater than zero
  • Negative or zero prices are rejected with ValidationException
  • Ensures revenue integrity
While not enforced at the entity level, the database ensures:
  • One price per category per season (unique constraint)
  • Prevents pricing conflicts
  • Enforced by EF Core configuration
If no TarifaTemporada exists for a category/season combination:
  • System can fall back to CategoriaHabitacion.PrecioBase
  • Implementation depends on application layer policy
  • Prevents reservation failures due to missing rates

Common Scenarios

Scenario: Increase high season rates by 10%
var tarifasAltaTemporada = await repository
    .GetTarifasPorTemporada(temporadaId: 2);

foreach (var tarifa in tarifasAltaTemporada)
{
    var nuevoPrecio = tarifa.Precio * 1.10m;
    tarifa.ActualizarPrecio(nuevoPrecio);
}

await repository.SaveChangesAsync();
Scenario: Create rates for a new Holiday season
var categorias = await repository.GetAllCategorias();
var holidaySeasonId = 4;

foreach (var categoria in categorias)
{
    // 50% premium over high season
    var precioBase = categoria.PrecioBase;
    var precioHoliday = precioBase * 1.50m;
    
    var tarifa = new TarifaTemporada(
        categoria.CategoriaHabitacionId,
        holidaySeasonId,
        precioHoliday
    );
    
    await repository.AddAsync(tarifa);
}
Scenario: Show guest price differences by date
var categoria = await repository.GetCategoria(categoriaId);
var temporadas = await repository.GetTemporadasActivas();

foreach (var temporada in temporadas)
{
    var tarifa = await repository.GetTarifaTemporada(
        categoria.CategoriaHabitacionId,
        temporada.TemporadaId
    );
    
    Console.WriteLine($"{temporada.NombreTemporada}: ${tarifa.Precio}/night");
}

CategoriaHabitacion

Defines the room category:
public sealed class CategoriaHabitacion
{
    public int CategoriaHabitacionId { get; private set; }
    public string NombreCategoria { get; private set; } // "Standard", "Deluxe", etc.
    public int Capacidad { get; private set; }
    public string Descripcion { get; private set; }
    public decimal PrecioBase { get; private set; } // Fallback price
}

Temporada

Defines the season period:
public sealed class Temporada
{
    public int TemporadaId { get; private set; }
    public string NombreTemporada { get; private set; } // "Alta Temporada"
    public DateTime FechaInicio { get; private set; }
    public DateTime FechaFin { get; private set; }
}
See related documentation for Temporada entity details.

Build docs developers (and LLMs) love