private void PopularItemsFacturas() { List <Consumo> consumos = new ConsumoDAO().ObtenerConsumosDeEstadia(estadia); dataGridView1.Rows.Clear(); double costoDiario = new EstadiaDAO().ObtenerCostoDiarioEstadia(estadia); int diasReserva = reserva.Fecha_Fin.Subtract(reserva.Fecha_Inicio).Days; int diasEstadia = estadia.Fecha_Fin.Value.Subtract(estadia.Fecha_Inicio.Value).Days; // Agrego el item relacionado a los días en estadía AgregarItemFactura(new ItemFactura(costoDiario, "Días de alojamiento", diasEstadia), true); if (diasReserva != diasEstadia) { AgregarItemFactura(new ItemFactura(costoDiario, "Días de alojamiento no utilizados", diasReserva - diasEstadia), true); } foreach (Consumo c in consumos) { AgregarItemFactura(new ItemFactura(c), true); } RegimenDAO rDAO = new RegimenDAO(); Regimen regimen = rDAO.ObtenerRegimenDeEstadia(estadia); if (regimen.Equals(rDAO.ObtenerRegimenAllInclusive())) // es all inclusive? descuento todo { AgregarItemFactura(new ItemFactura( -consumos.Select(c => c.Cantidad * c.Consumible.Precio).Sum(), "Descuento por régimen All Inclusive", 1), true); } else if (regimen.Equals(rDAO.ObtenerRegimenAllInclusiveModerado())) // es moderado? 50% off { AgregarItemFactura(new ItemFactura( -0.5 * consumos.Select(c => c.Cantidad * c.Consumible.Precio).Sum(), "Descuento por régimen All Inclusive moderado", 1), true); } ActualizarPrecioFinal(); }
private void ValidateReserva(DateTime inicio, DateTime fin, Regimen regimen, Hotel hotel, List <TipoHabitacion> tiposHabitación) { List <Habitacion> habitaciones = new HabitacionDAO().ObtenerHabitacionesDisponiblesReserva( inicio, fin, hotel, reserva == null ? new Reserva(-1) : reserva); if (habitaciones.Count == 0) // No hay habitaciones disponibles { MessageBox.Show("Lo sentimos. No hay ninguna habitación disponible en ese periodo", "INFO"); return; } if (habitaciones.Count == 1 && habitaciones[0].Id == -1) // Hotel cerrado ?? { MessageBox.Show("Lo sentimos. Durante ese período el hotel se cerrará temporalmente", "INFO"); return; } // Hacemos la validación de tipos de habitaación con las habitaciones // Para eso generamos un dictionary por tipo de habitación y cantidad ^.^ Dictionary <TipoHabitacion, int> tiposNecesarios = new Dictionary <TipoHabitacion, int>(); Dictionary <TipoHabitacion, int> tiposDisponibles = new Dictionary <TipoHabitacion, int>(); foreach (var tipo in tiposHabitación) { if (!tiposNecesarios.ContainsKey(tipo)) { tiposNecesarios[tipo] = 1; } else { tiposNecesarios[tipo]++; } } foreach (var tipo in new TipoHabitacionDAO().ObtenerTiposHabitacion()) { tiposDisponibles[tipo] = 0; } // Y ahora analizamos qué habitaciones se van disponibilizando List <Habitacion> habitacionesTomadas = new List <Habitacion>(); // Finalmente, loopeamos por cada habitación hasta asegurarnos que ningun tipo de habitación requiera más. foreach (var habitación in habitaciones) { TipoHabitacion tipo = habitación.TipoHabitación; if (tiposNecesarios.ContainsKey(tipo) && tiposNecesarios[tipo] > 0) { tiposNecesarios[tipo]--; habitacionesTomadas.Add(habitación); } tiposDisponibles[tipo]++; } if (!tiposNecesarios.All(pair => pair.Value == 0)) { StringBuilder noHabitaciones = new StringBuilder( "No hay suficientes habitaciones disponibles.\n\nPara este periodo, contamos con:\n\n"); foreach (var kv in tiposDisponibles) { noHabitaciones.Append(kv.Key.Descripción).Append(": ").Append(kv.Value) .Append(" habitacion(es) disponible(s)\n"); } noHabitaciones.Append("\nLo sentimos"); MessageBox.Show(noHabitaciones.ToString(), "INFO"); return; } // Armo el nuevo string en base a las habitaciones StringBuilder PrecioRecibo = new StringBuilder("Detalle de la reserva\n\n"); double SubTotalDiario = 0; int dias = (fin - inicio).Days; PrecioRecibo.Append(dias).Append(" día(s) reservado(s)\n\n"); foreach (var habitacion in habitacionesTomadas) { var tipo = habitacion.TipoHabitación; double precioDiario = GetPrecioFinalDiarioHabitación(regimen, hotel, tipo); PrecioRecibo.Append("Habitación ").Append(habitacion.Número).Append(" - ") .Append(tipo.Descripción).Append(". USD ") .Append(precioDiario).Append(" por día.\n Subtotal (habitación) por estadía: USD ") .Append(precioDiario * dias).Append(".\n"); SubTotalDiario += precioDiario; } if (regimen.Equals(new RegimenDAO().ObtenerRegimenAllInclusive())) { PrecioRecibo.Append("\nPrecio FINAL (todo incluído): USD "); } else { PrecioRecibo.Append("\nSubtotal: USD "); } PrecioRecibo.Append(SubTotalDiario * dias).Append("\n\n¿Desea continuar con la reserva?"); if (MessageBox.Show(PrecioRecibo.ToString(), "ATENCIÓN!", MessageBoxButtons.YesNo) == DialogResult.Yes) { if (reserva == null) // es nueva { ProcederFormCliente(inicio, fin, regimen, hotel, habitacionesTomadas); } else { reserva.Fecha_Inicio = inicio; reserva.Fecha_Fin = fin; reserva.Regimen = regimen; reserva.Habitaciones = habitacionesTomadas; ProcederUpdateReserva(reserva); } } }