public ActionResult NuevaReserva([Bind(Include = "id_rec,fecha,hora")] nuevaReservaSocioViewModel model) { if (ModelState.IsValid) { // Recuperamos el socio string id_soc = Session["UserID"].ToString(); socios db_socio = db.socios.Find(id_soc); DateTime fecha_baja = db_socio.f_baja ?? default(DateTime); if (DateTime.Compare(fecha_baja, DateTime.Today) < 0) { addError("No puede realizar la reserva, su cuota ha expirado o aún no ha pagado su primera cuota de socio"); } if (DateTime.Compare(fecha_baja, model.fecha) < 0) { addError("No puede realizar la reserva, su cuota expira antes de la fecha de reserva"); } // Recuperamos el recurso y comprobamos que existe y esta disponible recursos db_recurso = db.recursos.Find(model.id_rec); if (db_recurso == null) { addError("El recurso no existe"); } if (db_recurso.disponible == false) { addError("El recurso seleccionado no está disponible"); } reservas reserva = new reservas(); reserva.fecha = model.fecha; reserva.hora = new DateTime(reserva.fecha.Year, reserva.fecha.Month, reserva.fecha.Day, model.hora.Hour, model.hora.Minute, model.hora.Second); reserva.pagado = false; reserva.precio = 3; // Comprobacion que la fecha y/u hora no son anteriores a hoy if (DateTime.Compare(reserva.fecha, DateTime.Today) < 0) { addError("La fecha de la reserva no puede ser anterior a hoy"); } if (DateTime.Compare(reserva.hora, DateTime.Now) < 0) { addError("La hora de la reserva no puede ser anterior a ahora"); } // Comprobacion que el socio no ha realizado reserva la fecha seleccionada reservas res_soc = db.reservas.Where(x => x.socios.id == id_soc && x.fecha == model.fecha).FirstOrDefault(); if (res_soc != null) { addError("Ya has hecho reserva en esta fecha (solo se te permite una reserva por dia)"); } // Comprobación que el recurso se encuentra libre reservas existe_reserva = db.reservas.Where(x => x.recursos.id == model.id_rec && x.hora == reserva.hora).FirstOrDefault(); if (existe_reserva != null) { addError("El recurso se encuentra ocupado en esa fecha y hora"); } if (errors != null) { saveErrors(); return RedirectToAction("NuevaReserva", "Socio"); } // Guardamos los datos en la BBDD reserva.socios = db_socio; reserva.recursos = db_recurso; facturas factura = new facturas(); factura.xml_factura = ""; reserva.facturas = factura; db.reservas.Add(reserva); factura.id_reserva = reserva.id; db.facturas.Add(factura); db.SaveChanges(); factura.xml_factura = Tools.generarXmlFactura(factura, reserva); db.Entry(factura).State = EntityState.Modified; db.SaveChanges(); // Envio de email al socio con los datos de la reserva string subject = "Reserva realizada en Gestenis"; string body = "<h1>Esto es un mensaje automático del sistema</h1>" + "<p>" + db_socio.nombre + " has realizado correctamente una reserva en GesTenis.</p>" + "<p>Estos son los datos de su reserva:</p>" + "<p>Nombre del recurso: " + reserva.recursos.nombre_rec + "</p>" + "<p>Día: " + reserva.fecha.ToString("dd/MM/yyyy") + "</p>" + "<p>Hora: " + reserva.hora.ToString("HH:00") + "</p>" + "<p>Una vez realizado el pago en conserjería, podrá visualizar la factura en su área de usuario.</p>"; Tools.sendEmail(db_socio, subject, body); saveMessage("Reserva realizada con éxito"); return RedirectToAction("MisReservas"); } //ViewBag.id = new SelectList(db.facturas, "id_reserva", "xml_factura"); return View(model); }
/// <summary> /// Genera el xml con los datos para rellenar la factura /// </summary> /// <param name="factura">Instancia de facturas</param> /// <param name="reserva">Instancia de reservas</param> /// <returns>xml codificado en UTF8 para rellenar formulario en pdf</returns> public static string generarXmlFactura(facturas factura, reservas reserva) { // Transformamos los campos que pueden dar problemas de codificacion a utf8 para no tener problemas con el pdf byte[] bytes = Encoding.Default.GetBytes(reserva.socios.nombre); string nombre = Encoding.UTF8.GetString(bytes); bytes = Encoding.Default.GetBytes(reserva.socios.apellidos); string apellidos = Encoding.UTF8.GetString(bytes); bytes = Encoding.Default.GetBytes(reserva.socios.direccion1); string direccion1 = Encoding.UTF8.GetString(bytes); bytes = Encoding.Default.GetBytes(reserva.socios.direccion2); string direccion2 = Encoding.UTF8.GetString(bytes); bytes = Encoding.Default.GetBytes(reserva.recursos.nombre_rec); string nombre_rec = Encoding.UTF8.GetString(bytes); // Generamos el xml con formato UTF8 string ret = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<xfdf xmlns=\"http://ns.adobe.com/xfdf/\" xml:space=\"preserve\">" + "<f href=\"c:/Google Drive/PFC/factura.pdf\" />" + "<fields>" + "<field name = \"n_factura\">" + "<value>" + factura.id.ToString() + "</value>" + "</field>" + "<field name = \"f_factura\">" + "<value>" + DateTime.Today.ToString("dd/MM/yyyy") + "</value>" + "</field>" + "<field name = \"id_socio\">" + "<value>" + reserva.socios.id + "</value>" + "</field>" + "<field name = \"nombre\">" + "<value>" + nombre + " " + apellidos + "</value>" + "</field>" + "<field name = \"nif\">" + "<value>" + reserva.socios.nif + "</value>" + "</field>" + "<field name = \"direccion1\">" + "<value>" + direccion1 + "</value>" + "</field>" + "<field name = \"direccion2\">" + "<value>" + direccion2 + "</value>" + "</field>" + "<field name = \"nombre_recurso\">" + "<value>" + nombre_rec + "</value>" + "</field>" + "<field name = \"fecha\">" + "<value>" + reserva.fecha.ToString("dd/MM/yyyy") + "</value>" + "</field>" + "<field name = \"hora\">" + "<value>" + reserva.hora.ToString("HH:00") + "</value>" + "</field>" + "<field name = \"precio\">" + "<value>" + reserva.precio.ToString() + "</value>" + "</field>" + "<field name = \"precio_total\">" + "<value>" + reserva.precio.ToString() + "</value>" + "</field>" + "</fields>" + "</xfdf>"; return ret; }