Ejemplo n.º 1
0
        public void GenerarFactura(string id)
        {
            var existepuntorecogida = false;
            var clavevalor          = new Dictionary <string, string>();

            contexto.clavevalor.ToList().ForEach(x => clavevalor.Add(x.clave, x.valor));

            var datosreserva = contexto.reservaexcursionactividad.Where(x => x.reserva.codigoqr == id).Select(x => new
            {
                exact_id         = x.calendarioexcursion.exact_id,
                fechatransaccion = x.reserva.fechatransaccion,
                fecha            = x.calendarioexcursion.fecha,
                duracion         = x.calendarioexcursion.excursionactividad.duracion,
                tipo_duracion    = x.calendarioexcursion.excursionactividad.tipoduracion,
                actividad        = x.calendarioexcursion.excursionactividad.configuracion.nombre,
                preciogrupo      = x.calendarioexcursion.excursionactividad.precioporgrupo,
                numadultos       = x.numadultos,
                numninos         = x.numninos,
                numinfantes      = x.numinfantes,
                numjuniors       = x.numjuniors,
                numseniors       = x.numseniors,
                direccion        = x.calendarioexcursion.excursionactividad.configuracion.direccion,
                lat             = x.calendarioexcursion.excursionactividad.configuracion.lat,
                lng             = x.calendarioexcursion.excursionactividad.configuracion.lng,
                localidad       = x.calendarioexcursion.excursionactividad.configuracion.localidad.nombre,
                codigopostal    = x.calendarioexcursion.excursionactividad.configuracion.localidad.cp,
                provincia       = x.calendarioexcursion.excursionactividad.configuracion.localidad.provincia.nombre,
                pais            = x.calendarioexcursion.excursionactividad.configuracion.localidad.provincia.pais.nombre,
                descuento       = x.calendarioexcursion.excursionactividad.descuento == null ? 0 : x.calendarioexcursion.excursionactividad.descuento,
                punto           = x.punto,
                telefono        = x.reserva.proveedor.usuario.PhoneNumber,
                nombre          = x.reserva.cliente.usuario.nombre,
                primerapellido  = x.reserva.cliente.usuario.primerapellido,
                segundoapellido = x.reserva.cliente.usuario.segundoapellido,
                idfactura       = x.reserva.id
            }).FirstOrDefault();

            dynamic precios;

            if (datosreserva.preciogrupo)
            {
                precios = contexto.preciotemporada.Where(c => (c.desde <= datosreserva.fechatransaccion && datosreserva.fechatransaccion <= c.hasta) && c.exact_id == datosreserva.exact_id).Select(x => new
                {
                    preciogrupo = x.pvpgrupo
                }).FirstOrDefault();
            }
            else
            {
                precios = contexto.preciotemporada.Where(c => (c.desde <= datosreserva.fechatransaccion && datosreserva.fechatransaccion <= c.hasta) && c.exact_id == datosreserva.exact_id).Select(x => new
                {
                    precioadulto  = x.pvpadulto,
                    precionino    = x.pvpnino,
                    precioinfante = x.pvpinfante,
                    preciojunior  = x.pvpjunior,
                    preciosenior  = x.pvpsenior,
                    totaladulto   = datosreserva.numadultos * x.pvpadulto,
                    totaljunior   = datosreserva.numjuniors * x.pvpjunior,
                    totalsenior   = datosreserva.numseniors * x.pvpsenior,
                    totalnino     = datosreserva.numninos * x.pvpnino,
                    totalinfante  = datosreserva.numinfantes * x.pvpinfante
                }).FirstOrDefault();
            }

            var facturaitems = contexto.facturaitem_exact.Where(x => x.exact_id == datosreserva.exact_id).Select(x => x.item).ToList();

            if (datosreserva.punto != null)
            {
                existepuntorecogida = true;
            }

            string    filePath = HostingEnvironment.MapPath("~/facturas/" + id + ".pdf");
            Document  doc      = new Document(PageSize.A4);
            PdfWriter writer   = PdfWriter.GetInstance(doc, new FileStream(filePath, FileMode.Create));

            doc.Open();
            iTextSharp.text.Font  fuente       = new iTextSharp.text.Font(iTextSharp.text.Font.TIMES_ROMAN, 12, iTextSharp.text.Font.NORMAL, iTextSharp.text.Color.BLACK);
            iTextSharp.text.Font  bold         = new iTextSharp.text.Font(iTextSharp.text.Font.TIMES_ROMAN, 12, iTextSharp.text.Font.BOLD, iTextSharp.text.Color.BLACK);
            iTextSharp.text.Font  pequeña      = new iTextSharp.text.Font(iTextSharp.text.Font.TIMES_ROMAN, 7, iTextSharp.text.Font.NORMAL, iTextSharp.text.Color.BLACK);
            iTextSharp.text.Image logocabecera = iTextSharp.text.Image.GetInstance(HostingEnvironment.MapPath("~/recursos/imagenes/logo_empresa.png"));
            logocabecera.ScalePercent(15);

            PdfContentByte cb = writer.DirectContent;

            cb.SetColorStroke(iTextSharp.text.Color.BLACK);
            cb.MoveTo(38, 720);
            cb.SetLineWidth(0.5f);
            cb.LineTo(doc.PageSize.Width - 38, 720);
            cb.Stroke();

            #region tabla_empresa

            PdfPTable tabla_cabecera_datos_empresa = new PdfPTable(1);

            PdfPCell celda_tabla_cabecera_datos_empresa_nombre    = new PdfPCell(new Phrase("EcoTurismo Adventures S.L", fuente));
            PdfPCell celda_tabla_cabecera_datos_empresa_cif       = new PdfPCell(new Phrase("B569854122", fuente));
            PdfPCell celda_tabla_cabecera_datos_empresa_telefono  = new PdfPCell(new Phrase("(+34) 922 68 32 44", fuente));
            PdfPCell celda_tabla_cabecera_datos_empresa_email     = new PdfPCell(new Phrase("*****@*****.**", fuente));
            PdfPCell celda_tabla_cabecera_datos_empresa_direccion = new PdfPCell(new Phrase(@"C:\Avenida Bélgica 32006 (Adeje) Santa Cruz de Tenerife, España", fuente));

            tabla_cabecera_datos_empresa.AddCell(celda_tabla_cabecera_datos_empresa_nombre);
            tabla_cabecera_datos_empresa.AddCell(celda_tabla_cabecera_datos_empresa_cif);
            tabla_cabecera_datos_empresa.AddCell(celda_tabla_cabecera_datos_empresa_telefono);
            tabla_cabecera_datos_empresa.AddCell(celda_tabla_cabecera_datos_empresa_email);
            tabla_cabecera_datos_empresa.AddCell(celda_tabla_cabecera_datos_empresa_direccion);
            PdfPCell celda = null;
            foreach (PdfPRow row in tabla_cabecera_datos_empresa.GetRows(0, tabla_cabecera_datos_empresa.Rows.Count))
            {
                foreach (PdfPCell cell in row.GetCells())
                {
                    celda = new PdfPCell(cell.Phrase);
                    celda.HorizontalAlignment = PdfCell.ALIGN_RIGHT;
                    celda.Border = 0;
                    tabla_cabecera_datos_empresa.DeleteRow(0);
                    tabla_cabecera_datos_empresa.AddCell(celda);
                }
            }
            #endregion

            #region tabla_cabecera

            PdfPTable tabla_cabecera = new PdfPTable(2);
            tabla_cabecera.WidthPercentage = 100;
            tabla_cabecera.SetWidths(new float[] { 20, 80 });

            PdfPCell celda_cabecera_logo = new PdfPCell(logocabecera);
            celda_cabecera_logo.Border = 0;

            PdfPCell celda_cabecera_datosempresa = new PdfPCell(tabla_cabecera_datos_empresa);
            celda_cabecera_datosempresa.Border = 0;

            tabla_cabecera.AddCell(celda_cabecera_logo);
            tabla_cabecera.AddCell(celda_cabecera_datosempresa);

            doc.Add(tabla_cabecera);

            #endregion

            #region tabla_precios

            PdfPTable tabla_precios = new PdfPTable(2);
            tabla_precios.WidthPercentage = 100;
            tabla_precios.SetWidths(new float[] { 40, 60 });
            Dictionary <string, string> preciosdic = new Dictionary <string, string>();

            preciosdic.Add(Mensajes.mensaje15, datosreserva.actividad);
            preciosdic.Add(Mensajes.mensaje16, datosreserva.fecha.ToString("dd-MM-yyyy HH:mm:ss"));
            if (datosreserva.tipo_duracion.Equals("flexible"))
            {
                preciosdic.Add(Mensajes.mensaje17, Mensajes.mensaje18);
            }
            else
            {
                var tiempo = "";
                switch (datosreserva.tipo_duracion)
                {
                case "hora":
                    tiempo = Mensajes.mensaje19;
                    break;

                case "minuto":
                    tiempo = Mensajes.mensaje20;
                    break;

                case "dia":
                    tiempo = Mensajes.mensaje21;
                    break;
                }
                preciosdic.Add(Mensajes.mensaje17, datosreserva.duracion.ToString() + " " + tiempo);
            }
            preciosdic.Add(Mensajes.mensaje22, datosreserva.numadultos.ToString());
            preciosdic.Add(Mensajes.mensaje23, datosreserva.numjuniors.ToString());
            preciosdic.Add(Mensajes.mensaje24, datosreserva.numseniors.ToString());
            preciosdic.Add(Mensajes.mensaje25, datosreserva.numninos.ToString());
            preciosdic.Add(Mensajes.mensaje26, datosreserva.numinfantes.ToString());
            if (datosreserva.preciogrupo)
            {
                preciosdic.Add(Mensajes.mensaje40, precios.preciogrupo.ToString());
            }
            else
            {
                preciosdic.Add(Mensajes.mensaje27, precios.precioadulto.ToString());
                preciosdic.Add(Mensajes.mensaje28, precios.preciojunior.ToString());
                preciosdic.Add(Mensajes.mensaje29, precios.preciosenior.ToString());
                preciosdic.Add(Mensajes.mensaje30, precios.precionino.ToString());
                preciosdic.Add(Mensajes.mensaje31, precios.precioinfante.ToString());
                preciosdic.Add(Mensajes.mensaje32, precios.totaladulto.ToString());
                preciosdic.Add(Mensajes.mensaje33, precios.totaljunior.ToString());
                preciosdic.Add(Mensajes.mensaje34, precios.totalsenior.ToString());
                preciosdic.Add(Mensajes.mensaje35, precios.totalnino.ToString());
                preciosdic.Add(Mensajes.mensaje36, precios.totalinfante.ToString());
            }
            PdfPCell cel1 = null;
            foreach (KeyValuePair <string, string> val in preciosdic)
            {
                cel1        = new PdfPCell(new Phrase(val.Key, bold));
                cel1.Border = 0;
                cel1.HorizontalAlignment = PdfCell.ALIGN_LEFT;
                tabla_precios.AddCell(cel1);
                cel1        = new PdfPCell(new Phrase(val.Value, fuente));
                cel1.Border = 0;
                cel1.HorizontalAlignment = PdfCell.ALIGN_LEFT;
                tabla_precios.AddCell(cel1);
            }

            #endregion

            #region tabla_wraper1

            PdfPTable tabla_wraper1 = new PdfPTable(2);
            tabla_wraper1.WidthPercentage = 100;
            tabla_wraper1.SetWidths(new float[] { 70, 30 });
            tabla_wraper1.SpacingBefore       = 40f;
            tabla_wraper1.HorizontalAlignment = 0;
            PdfPCell cel2 = new PdfPCell(new Phrase(Mensajes.menaje37 + " " + datosreserva.nombre + " " + datosreserva.primerapellido + " " + datosreserva.segundoapellido, bold));
            cel2.Colspan       = 2;
            cel2.PaddingBottom = 5;
            tabla_wraper1.AddCell(cel2);
            tabla_wraper1.AddCell(tabla_precios);

            var          qrEncoder = new QrEncoder(ErrorCorrectionLevel.H);
            var          qrCode    = qrEncoder.Encode(id);
            var          renderer  = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Four), Brushes.Black, Brushes.White);
            MemoryStream stream    = new MemoryStream();
            renderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream);
            stream.Position = 0;
            iTextSharp.text.Image output = iTextSharp.text.Image.GetInstance(stream);
            stream.Close();
            tabla_wraper1.AddCell(output);

            doc.Add(tabla_wraper1);

            #endregion

            #region tabla_precio_total

            PdfPTable tabla_precio_total = new PdfPTable(2);
            tabla_precio_total.SetWidths(new float[] { 80, 20 });
            tabla_precio_total.WidthPercentage     = 100;
            tabla_precio_total.SpacingBefore       = 20;
            tabla_precio_total.HorizontalAlignment = 0;

            PdfPCell celda_tabla_precio_total_nombre = null;

            if (datosreserva.descuento == 0)
            {
                celda_tabla_precio_total_nombre = new PdfPCell(new Phrase(Mensajes.menasje38, fuente));
            }
            else
            {
                celda_tabla_precio_total_nombre = new PdfPCell(new Phrase(String.Format(Mensajes.mensaje39, datosreserva.descuento), fuente));
            }

            celda_tabla_precio_total_nombre.HorizontalAlignment = PdfCell.ALIGN_RIGHT;
            celda_tabla_precio_total_nombre.BorderWidthRight    = 0;
            celda_tabla_precio_total_nombre.PaddingBottom       = 5;
            decimal total = 0;
            if (datosreserva.preciogrupo)
            {
                total = (precios.preciogrupo) - (precios.preciogrupo * ((decimal)datosreserva.descuento / 100));
            }
            else
            {
                total = (precios.totaladulto + precios.totalinfante + precios.totalnino + precios.totaljunior + precios.totalsenior) - ((precios.totaladulto + precios.totalinfante + precios.totalnino + precios.totaljunior + precios.totalsenior) * ((decimal)datosreserva.descuento / 100));
            }
            PdfPCell celda_tabla_precio_total_precio = new PdfPCell(new Phrase(Math.Round(total, 2).ToString() + " €", fuente));
            celda_tabla_precio_total_precio.HorizontalAlignment = PdfCell.ALIGN_RIGHT;
            celda_tabla_precio_total_precio.BorderWidthLeft     = 0;
            celda_tabla_precio_total_precio.PaddingBottom       = 5;

            tabla_precio_total.AddCell(celda_tabla_precio_total_nombre);
            tabla_precio_total.AddCell(celda_tabla_precio_total_precio);

            doc.Add(tabla_precio_total);
            #endregion

            if (existepuntorecogida)

            {
                var datospunto = contexto.puntorecogida.Where(x => x.id == datosreserva.punto.id).Select(x => new
                {
                    pais      = x.localidad.provincia.pais.nombre,
                    provincia = x.localidad.provincia.nombre,
                    localidad = x.localidad.nombre,
                    cp        = x.localidad.cp
                }).First();


                #region tabla_punto

                PdfPTable tabla_punto = new PdfPTable(2);
                tabla_punto.WidthPercentage = 100;
                tabla_punto.SetWidths(new float[] { 20, 80 });
                tabla_punto.SpacingBefore = 20;

                Dictionary <string, string> puntodic = new Dictionary <string, string>();
                puntodic.Add(Mensajes.mensaje9, datosreserva.punto.nombre);
                puntodic.Add(Mensajes.mensaje5, datosreserva.punto.direccion);
                puntodic.Add(Mensajes.mensaje11, datospunto.localidad);
                puntodic.Add(Mensajes.mensaje12, datospunto.provincia);
                puntodic.Add(Mensajes.mensaje13, datospunto.pais);
                puntodic.Add(Mensajes.mensaje14, datospunto.cp.ToString());
                puntodic.Add(Mensajes.mensaje6, String.Format(clavevalor["googlemap"], datosreserva.punto.lat, datosreserva.punto.lng));
                PdfPCell cel       = null;
                var      puntotext = new Phrase(Mensajes.mensaje8, bold);
                cel                     = new PdfPCell(puntotext);
                cel.Colspan             = 2;
                cel.HorizontalAlignment = PdfCell.ALIGN_LEFT;
                cel.PaddingBottom       = 10;
                cel.BorderWidthBottom   = 0;
                tabla_punto.AddCell(cel);
                foreach (KeyValuePair <string, string> val in puntodic)
                {
                    cel = new PdfPCell(new Phrase(val.Key, bold));
                    cel.BorderWidthBottom = 0;
                    cel.BorderWidthRight  = 0;
                    cel.BorderWidthTop    = 0;
                    tabla_punto.AddCell(cel);
                    cel = new PdfPCell(new Phrase(val.Value, fuente));
                    cel.BorderWidthBottom = 0;
                    cel.BorderWidthLeft   = 0;
                    cel.BorderWidthTop    = 0;
                    tabla_punto.AddCell(cel);
                }
                PdfPRow last = tabla_punto.GetRow(tabla_punto.Rows.Count - 1);
                last.GetCells()[0].BorderWidthBottom = 0.5F;
                last.GetCells()[0].PaddingBottom     = 5;
                last.GetCells()[1].BorderWidthBottom = 0.5F;
                last.GetCells()[1].PaddingBottom     = 5;
                doc.Add(tabla_punto);


                #endregion
            }
            else
            {
                #region tabla_punto

                PdfPTable tabla_punto = new PdfPTable(2);
                tabla_punto.WidthPercentage = 100;
                tabla_punto.SetWidths(new float[] { 20, 80 });
                tabla_punto.SpacingBefore = 20;

                Dictionary <string, string> puntodic = new Dictionary <string, string>();
                puntodic.Add(Mensajes.mensaje5, datosreserva.direccion);
                puntodic.Add(Mensajes.mensaje11, datosreserva.localidad);
                puntodic.Add(Mensajes.mensaje12, datosreserva.provincia);
                puntodic.Add(Mensajes.mensaje13, datosreserva.pais);
                puntodic.Add(Mensajes.mensaje14, datosreserva.codigopostal.ToString());
                puntodic.Add(Mensajes.mensaje6, String.Format(clavevalor["googlemap"], datosreserva.lat, datosreserva.lng));
                PdfPCell cel       = null;
                var      puntotext = new Phrase(Mensajes.mensaje7, bold);
                cel                     = new PdfPCell(puntotext);
                cel.Colspan             = 2;
                cel.HorizontalAlignment = PdfCell.ALIGN_LEFT;
                cel.PaddingBottom       = 10;
                cel.BorderWidthBottom   = 0;
                tabla_punto.AddCell(cel);
                foreach (KeyValuePair <string, string> val in puntodic)
                {
                    cel = new PdfPCell(new Phrase(val.Key, bold));
                    cel.BorderWidthBottom = 0;
                    cel.BorderWidthRight  = 0;
                    cel.BorderWidthTop    = 0;
                    tabla_punto.AddCell(cel);
                    cel = new PdfPCell(new Phrase(val.Value, fuente));
                    cel.BorderWidthBottom = 0;
                    cel.BorderWidthLeft   = 0;
                    cel.BorderWidthTop    = 0;
                    tabla_punto.AddCell(cel);
                }
                PdfPRow last = tabla_punto.GetRow(tabla_punto.Rows.Count - 1);
                last.GetCells()[0].BorderWidthBottom = 0.5F;
                last.GetCells()[0].PaddingBottom     = 5;
                last.GetCells()[1].BorderWidthBottom = 0.5F;
                last.GetCells()[1].PaddingBottom     = 5;
                doc.Add(tabla_punto);

                #endregion
            }

            #region tabla_importante

            PdfPTable tabla_importante = new PdfPTable(1);
            tabla_importante.WidthPercentage = 100;
            tabla_importante.SpacingBefore   = 20;

            PdfPCell celda_tabla_importante_importante = new PdfPCell(new Phrase(Mensajes.mensaje3, bold));
            celda_tabla_importante_importante.HorizontalAlignment = PdfCell.ALIGN_LEFT;
            celda_tabla_importante_importante.BorderWidthBottom   = 0;
            celda_tabla_importante_importante.PaddingBottom       = 10;

            PdfPCell celda_tabla_importante_desc = null;

            if (existepuntorecogida)
            {
                celda_tabla_importante_desc = new PdfPCell(new Phrase(String.Format(Mensajes.mensaje2, datosreserva.telefono), fuente));
            }
            else
            {
                celda_tabla_importante_desc = new PdfPCell(new Phrase(String.Format(Mensajes.mensaje4, datosreserva.fecha.ToString("dd-MM-yyyy"), datosreserva.fecha.ToString("HH:mm:ss"), datosreserva.telefono), fuente));
            }

            celda_tabla_importante_importante.HorizontalAlignment = PdfCell.ALIGN_LEFT;
            celda_tabla_importante_desc.PaddingBottom             = 5;
            celda_tabla_importante_desc.BorderWidthTop            = 0;

            tabla_importante.AddCell(celda_tabla_importante_importante);
            tabla_importante.AddCell(celda_tabla_importante_desc);

            doc.Add(tabla_importante);

            #endregion

            #region tabla_condiciones

            PdfPTable tabla_items = new PdfPTable(1);
            tabla_items.WidthPercentage = 100;
            tabla_items.SpacingBefore   = 50;

            tabla_items.HorizontalAlignment = 0;

            PdfPCell celda_tabla_items = null;
            foreach (var item in facturaitems)
            {
                celda_tabla_items = new PdfPCell(new Phrase(item.nombre.ToUpper() + ": " + item.descripcion, pequeña));
                celda_tabla_items.HorizontalAlignment = PdfCell.ALIGN_LEFT;
                celda_tabla_items.Border        = 0;
                celda_tabla_items.PaddingBottom = 10;
                tabla_items.AddCell(celda_tabla_items);
            }

            doc.Add(tabla_items);

            #endregion

            doc.Close();
            writer.Close();
        }