Skip to main content

Overview

Business configuration allows restaurant owners to customize operational rules that govern reservations, including business hours, cancellation policies, and table timing.

Business Entity Structure

The Negocio (Business) entity stores all configuration:
class Negocio {
  final String id;
  final String nombre;                    // Restaurant name
  final String nombreResponsable;         // Owner name
  final String email;                     // Contact email
  final String telefono;                  // Contact phone
  final String direccion;                 // Physical address
  final String descripcion;               // Description
  final String especialidad;              // Specialty/cuisine
  final String icono;                     // Icon identifier
  
  // Business Rules Configuration
  final int minHorasParaCancelar;         // Cancellation notice hours
  final int maxDiasAnticipacionReserva;   // Max days to book ahead
  final int duracionPromedioMinutos;      // Default reservation duration
  
  // Zones and Status
  final List<String> zonas;               // Table zones
  final bool telefonoVerificado;          // Phone verification status
}
Implementation: source/lib/dominio/entidades/negocio.dart

Default Configuration

Every new business starts with sensible defaults:
Negocio({
  minHorasParaCancelar: 24,              // 24 hours notice
  maxDiasAnticipacionReserva: 14,        // 2 weeks advance booking
  duracionPromedioMinutos: 60,           // 1 hour per reservation
  zonas: const ['Salón', 'Terraza'],     // Default zones
  telefonoVerificado: false,
  // ...
});
Implementation reference: source/lib/dominio/entidades/negocio.dart:21-36

Reservation Duration Settings

Control how long tables are reserved for each booking.

Configuring Default Duration

final cubit = context.read<PantallaDuenoCubit>();

final success = await cubit.actualizarConfiguracionReglas(
  negocio,
  duracionPromedioMinutos: 90,  // 1.5 hours
  minHorasParaCancelar: 24,
  maxDiasAnticipacionReserva: 14,
);
Implementation reference: source/lib/presentacion/pantalla_dueno/pantalla_dueno_cubit.dart:229-255

Duration Recommendations

45-60 minutesSuitable for:
  • Casual dining
  • Lunch service
  • Fast-casual restaurants
  • Cafés
duracionPromedioMinutos: 45
Reservation duration affects table turnover and availability. Longer durations mean fewer reservations per table per day.

Cancellation Policy

Set minimum notice required for cancellations.

Minimum Cancellation Hours

final success = await cubit.actualizarConfiguracionReglas(
  negocio,
  duracionPromedioMinutos: 60,
  minHorasParaCancelar: 48,  // 48 hours notice
  maxDiasAnticipacionReserva: 14,
);

Common Policies

Notice PeriodUse CaseDescription
2 hoursLenientAllows last-minute cancellations
24 hoursStandard (default)Industry standard policy
48 hoursStrictFor high-demand restaurants
72 hoursVery strictFor special events or tasting menus
Customer Experience: Stricter cancellation policies may improve no-show rates but could discourage bookings. Balance is important.

Enforcement

The cancellation policy is enforced in the reservation cancellation flow:
// Customer attempting to cancel
final horasDeAnticipacion = reserva.fechaHora
  .difference(DateTime.now())
  .inHours;

if (horasDeAnticipacion < negocio.minHorasParaCancelar) {
  throw Exception(
    'Debe cancelar con al menos ${negocio.minHorasParaCancelar} '
    'horas de anticipación'
  );
}
Business owners can cancel reservations at any time regardless of the policy, but customer cancellations respect the configured minimum notice.

Advance Booking Window

Control how far in advance customers can make reservations.

Maximum Days Ahead

final success = await cubit.actualizarConfiguracionReglas(
  negocio,
  duracionPromedioMinutos: 60,
  minHorasParaCancelar: 24,
  maxDiasAnticipacionReserva: 30,  // 30 days ahead
);

Booking Window Strategies

Best for:
  • Restaurants with frequent menu changes
  • Small establishments
  • Highly variable schedules
Pros:
  • More flexibility in scheduling
  • Easier to manage staff schedules
Cons:
  • May lose customers who plan ahead
  • Less predictable revenue
Best for:
  • Most restaurants
  • Balanced planning needs
  • Standard operations
Pros:
  • Good balance of planning and flexibility
  • Industry standard
Cons:
  • May not suit special use cases
Best for:
  • Fine dining establishments
  • Special occasion restaurants
  • Highly sought-after venues
Pros:
  • Allows customers to plan special events
  • Better revenue forecasting
Cons:
  • Higher cancellation risk
  • Less flexibility for changes
Best for:
  • Event venues
  • Michelin-starred restaurants
  • Destination restaurants
Pros:
  • Accommodates travel planning
  • Premium positioning
Cons:
  • Significant advance commitment
  • Staff scheduling complexity

Business Hours Configuration

Define when your restaurant is open for reservations.

Hours Structure

Business hours are managed separately through the HorarioApertura entity:
class HorarioApertura {
  final String negocioId;
  final List<HorarioDia> horariosSemanal;
}

class HorarioDia {
  final String nombreDia;      // "Lunes", "Martes", etc.
  final bool cerrado;           // Is restaurant closed?
  final List<IntervaloHorario> intervalos;  // Multiple time intervals
}

class IntervaloHorario {
  final int horaInicio;         // 0-23
  final int minutoInicio;       // 0-59
  final int horaFin;            // 0-23
  final int minutoFin;          // 0-59
}
Implementation: source/lib/dominio/entidades/horario_apertura.dart

Configuring Hours

final cubit = context.read<PantallaDuenoCubit>();

// Get current hours
final horariosActuales = await cubit.obtenerHorarios(negocioId);

// Update hours
final nuevosHorarios = {
  'lunes': '12:00-15:00,19:00-23:00',     // Lunch & dinner
  'martes': '12:00-15:00,19:00-23:00',
  'miércoles': '12:00-15:00,19:00-23:00',
  'jueves': '12:00-15:00,19:00-23:00',
  'viernes': '12:00-15:00,19:00-00:00',   // Late Friday
  'sábado': '12:00-00:00',                // All day Saturday
  'domingo': 'Cerrado',                    // Closed Sunday
};

final success = await cubit.actualizarHorarios(negocioId, nuevosHorarios);
Implementation reference: source/lib/presentacion/pantalla_dueno/pantalla_dueno_cubit.dart:187-204

Multiple Service Periods

Restaurants can define multiple time intervals per day:
// Lunch and dinner service
'lunes': '12:00-15:00,19:00-23:00'

// Continuous service
'sábado': '11:00-23:00'

// Closed
'domingo': 'Cerrado'
The system automatically prevents reservations outside configured business hours.

Validation Example

final horario = await horarioAperturaRepositorio
  .obtenerHorarioPorNegocio(negocioId);

if (!horario.estaAbiertoEn(fechaReserva)) {
  final mensaje = horario.obtenerMensajeError(fechaReserva);
  throw Exception(mensaje);
}

// Example error messages:
// "El restaurante está cerrado los domingos."
// "El horario seleccionado (16:30) está fuera del horario de atención.
//  Lunes: 12:00 - 15:00 y 19:00 - 23:00"
Implementation reference: source/lib/dominio/entidades/horario_apertura.dart:79-112

Zone Configuration

Organize tables into zones or sections.

Default Zones

Every restaurant starts with two default zones:
final zonas = ['Salón', 'Terraza'];

Adding Custom Zones

final cubit = context.read<PantallaDuenoCubit>();

final nuevasZonas = [
  'Salón Principal',
  'Terraza',
  'Bar',
  'Área VIP',
  'Sala Privada',
  'Jardín',
  'Patio Interior',
];

final success = await cubit.actualizarZonas(negocio, nuevasZonas);
Implementation reference: source/lib/presentacion/pantalla_dueno/pantalla_dueno_cubit.dart:104-116

Zone Best Practices

Descriptive Names

Use clear, customer-facing names:
  • ✅ “Terraza con Vista”
  • ✅ “Salón Principal”
  • ❌ “Zona A”
  • ❌ “Sector 1”

Logical Grouping

Group by customer preference:
  • Indoor vs Outdoor
  • Quiet vs Lively
  • Standard vs VIP
  • Smoking vs Non-smoking (if applicable)

Consistent Usage

Apply zones consistently:
  • All tables should have a zone
  • Zone names should be standardized
  • Update when layout changes

Customer Choice

Enable zone preferences:
  • Customers can request specific zones
  • System filters tables by zone
  • Improves customer satisfaction

Restaurant Information

Update basic restaurant details from the admin panel.

Editable Fields

All business information can be updated:
await cubit.actualizarNombre(negocio, 'Nuevo Nombre');
The restaurant name appears in:
  • Admin panel header
  • Customer-facing reservation confirmations
  • Email notifications

Restaurant Story

Create a compelling narrative about your restaurant’s history and philosophy.

Story Entity

class HistoriaRestaurante {
  final String titulo;              // Story title
  final String contenido;           // Full story content
  final List<String> imagenes;      // Image URLs
}
Implementation: source/lib/dominio/entidades/historia_restaurante.dart

Managing Story Content

final cubit = context.read<PantallaDuenoCubit>();

// Get current story
final historia = await cubit.obtenerHistoria(negocioId);

// Update story
final nuevaHistoria = HistoriaRestaurante(
  titulo: 'Nuestra Historia',
  contenido: '''
    Fundado en 1995, nuestro restaurante ha sido un punto de referencia
    en la gastronomía local. Combinamos recetas tradicionales con
    técnicas modernas para crear una experiencia única...
  ''',
  imagenes: [
    'https://example.com/restaurant-exterior.jpg',
    'https://example.com/chef-team.jpg',
  ],
);

final success = await cubit.guardarHistoria(negocioId, nuevaHistoria);
Implementation reference: source/lib/presentacion/pantalla_dueno/pantalla_dueno_cubit.dart:207-226

Story Writing Tips

Write in your restaurant’s authentic voice:
  • Share genuine passion for food
  • Tell the founding story
  • Highlight what makes you unique
Focus on customer experience:
  • Describe ambiance and atmosphere
  • Mention signature dishes
  • Explain your culinary philosophy
Include compelling images:
  • Restaurant exterior and interior
  • Signature dishes
  • Chef and team
  • Historic photos if applicable
Keep it engaging but concise:
  • 200-500 words is ideal
  • Use paragraphs for readability
  • Highlight key information

Configuration Persistence

All configuration is stored in Firestore:
negocios/
  {negocioId}/
    nombre: "La Cocina"
    email: "[email protected]"
    telefono: "+54 9 261 123-4567"
    direccion: "Calle Ejemplo 123"
    especialidad: "Cocina Mediterránea"
    descripcion: "Restaurante familiar..."
    icono: "restaurant"
    minHorasParaCancelar: 24
    maxDiasAnticipacionReserva: 14
    duracionPromedioMinutos: 60
    zonas: ["Salón", "Terraza", "Bar"]
    telefonoVerificado: true

horarios_apertura/
  {negocioId}/
    lunes: "12:00-15:00,19:00-23:00"
    martes: "12:00-15:00,19:00-23:00"
    // ... other days

historias/
  {negocioId}/
    titulo: "Nuestra Historia"
    contenido: "Texto completo..."
    imagenes: ["url1", "url2"]

Troubleshooting

Problem: Hours Not Validating

Possible causes:
  • Invalid time format in hours string
  • Hour intervals overlap incorrectly
  • End time before start time
Solution: Use format HH:MM-HH:MM and ensure logical time ordering

Problem: Reservations Outside Hours

Possible causes:
  • Business hours not configured
  • Customer bypassing validation
  • Time zone mismatch
Solution: Verify HorarioApertura exists and covers all days

Problem: Zone Changes Not Reflecting

Possible causes:
  • Tables still assigned to old zone names
  • Configuration not saved
Solution: Update table zones after changing business zone list

Best Practices

Test Configuration

Test changes before implementing:
  • Verify hours with sample reservations
  • Check cancellation policy with different scenarios
  • Ensure zones match physical layout

Communicate Changes

Notify customers of policy changes:
  • Update website with new hours
  • Announce cancellation policy changes
  • Inform regular customers directly

Seasonal Adjustments

Adjust configuration seasonally:
  • Extend hours during busy seasons
  • Add outdoor zones in summer
  • Modify cancellation policy for holidays

Monitor Impact

Track how configuration affects bookings:
  • Monitor reservation trends
  • Track cancellation rates
  • Adjust based on data

Next Steps

Table Management

Configure tables and assign them to zones

Reservation Management

Manage customer bookings with your configured rules

Build docs developers (and LLMs) love