public async Task CambiarEstadoFacturaAsync(EditorEstadoFactura editor)
        {
            Factura = await BuscarFacturaAsync(editor.IdFactura);

            Factura.EstadoFactura = editor.EstadoFactura;

            _contexto.Entry(Factura).State = EntityState.Modified;
            await GuardarCambiosAsync();
        }
        public async Task<int> ActualizarFacturaAsync(EditorFactura editor)
        {
            Factura = await BuscarFacturaAsync(editor.Id);

            ModificarFactura(editor);
                             
            _contexto.Entry(Factura).State = EntityState.Modified;
            return  await GuardarCambiosAsync();
         }
        public static void InyectarFactura(this VisorFactura visor, Factura factura)
        {
            visor.InjectFrom(factura);

            visor.BorrarLineasFactura();

            foreach (var lineaFactura in factura.Lineas)
            {
                var lineaVisor = new LineaVisorFactura();
                lineaVisor.InjectFrom(lineaFactura);
                visor.Lineas.Add(lineaVisor);
            }
        }
        public async Task<int> EliminarFactura(int idFactura)
        {
            Factura = await BuscarFacturaAsync(idFactura);
            
            while (Factura.Lineas.Any())
            {
                var linea = Factura.Lineas.First();
                _contexto.LineasFacturas.Remove(linea);
            }

            _contexto.Facturas.Remove(Factura);

           return  await GuardarCambiosAsync();
        }
        public async Task<int> CrearFacturasAsync(List<EditorFactura> editores)
        {
            foreach (var editor in editores)
            {
                Factura = new Factura();

                ModificarFactura(editor);

                _contexto.Facturas.Add(Factura);
            }
            var cambios = await GuardarCambiosAsync();

            return cambios;
        }
        public async Task<int> CrearFacturaAsync(EditorFactura editor)
        {
            Factura = new Factura();

            ModificarFactura(editor);         

            _contexto.Facturas.Add(Factura);

            var cambios = await GuardarCambiosAsync();
            
            editor.InyectarFactura(Factura);

            return cambios;
        }
        public static void InyectarFactura(this EditorFactura editor, Factura factura)
        {
            editor.InjectFrom(factura);

            editor.PorcentajeIvaPorDefecto = 21;

            editor.BorrarLineasFactura();

            foreach (var lineaFactura in factura.Lineas)
            {
                var lineaEditor = new EditorLineaFactura();
                lineaEditor.InjectFrom(lineaFactura);
                editor.Lineas.Add(lineaEditor);
            }
        }
        public static void InyectarFactura(this DataSetFactura datasetFactura, Factura factura, string urlRaizWeb)
        {
            var filaDatasetFactura = datasetFactura.Facturas.NewFacturasRow();

            filaDatasetFactura.InyectarFactura(factura);

            datasetFactura.Facturas.AddFacturasRow(filaDatasetFactura);

            foreach (var linea in factura.Lineas)
            {
                var filaDatasetLineaFactura = datasetFactura.FacturasLineas.NewFacturasLineasRow();

                filaDatasetLineaFactura.Id = linea.Id;
                filaDatasetLineaFactura.IdFactura = linea.IdFactura;
                filaDatasetLineaFactura.Descripcion = linea.Descripcion;
                filaDatasetLineaFactura.Cantidad = linea.Cantidad;
                filaDatasetLineaFactura.PrecioUnitario = linea.PrecioUnitario;
                filaDatasetLineaFactura.PorcentajeImpuesto = linea.PorcentajeImpuesto;

                datasetFactura.FacturasLineas.AddFacturasLineasRow(filaDatasetLineaFactura);
            }
        }
        public static void InyectarFactura(this DataSetFactura.FacturasRow fila, Factura factura)
        {
            fila.Id = factura.Id;
            fila.RutaLogo = "/Content/Logos/LogoGF.jpg";

            fila.NumeroFactura = factura.NumeroFactura;
            fila.FechaEmisionFactura = factura.FechaEmisionFactura;

            if (factura.FechaVencimientoFactura.HasValue)
                fila.FechaVencimientoFactura = factura.FechaVencimientoFactura.Value;
            else
                fila.SetFechaVencimientoFacturaNull();

            fila.VendedorNumeroIdentificacionFiscal = factura.VendedorNumeroIdentificacionFiscal;
            fila.VendedorNombreOEmpresa= factura.VendedorNombreOEmpresa;
            fila.VendedorDireccion = factura.VendedorDireccion;
            fila.VendedorLocalidad = factura.VendedorLocalidad;
            fila.VendedorProvincia = factura.VendedorProvincia;
            fila.VendedorCodigoPostal = factura.VendedorCodigoPostal;

            fila.CompradorNumeroIdentificacionFiscal = factura.CompradorNumeroIdentificacionFiscal;
            fila.CompradorNombreOEmpresa = factura.CompradorNombreOEmpresa;
            fila.CompradorDireccion = factura.CompradorDireccion;
            fila.CompradorLocalidad = factura.CompradorLocalidad;
            fila.CompradorProvincia = factura.CompradorProvincia;
            fila.CompradorCodigoPostal = factura.CompradorCodigoPostal;

            fila.Comentarios = factura.Comentarios;
            fila.ComentariosPie = factura.ComentariosPie;

            fila.FormaPago = factura.FormaPago.ObtenerNombreAtributoDisplay();
            fila.FormaPagoDetalles = factura.FormaPagoDetalles;

            fila.BaseImponible = factura.BaseImponible;
            fila.ImporteImpuestos = factura.ImporteImpuestos;
            fila.ImporteTotal = factura.ImporteTotal;
        }
 public void EnviarFacturaPorEmail(MensajeEmail mensaje, Factura factura)
 {
     _servicioEmail.EnviarMensaje(mensaje);
     
     factura.EstadoFactura = EstadoFacturaEnum.Enviada;
     _contexto.SaveChanges();
 }
        private MensajeEmail GenerarMensajeEmail(EditorEmail editorEmail, Factura factura)
        {
            var informeLocal = GenerarInformeLocalFactura(factura);

            string mimeType;

            byte[] facturaPdf = ServicioPdf.GenerarPdfFactura(informeLocal, out mimeType);

            var mensaje = new MensajeEmail
            {
                Asunto = editorEmail.Asunto,
                Cuerpo = editorEmail.ContenidoHtml,
                DireccionRemitente = editorEmail.Remitente,
                NombreRemitente = factura.VendedorNombreOEmpresa,
                DireccionesDestinatarios = new List<string> { editorEmail.Destinatario },
                Adjuntos = new List<ArchivoAdjunto> {
                                new ArchivoAdjunto
                                {
                                    Archivo = facturaPdf,
                                    MimeType = mimeType,
                                    Nombre = factura.Titulo
                                }
                    }
            };

            return mensaje;
        }
        private LocalReport GenerarInformeLocalFactura(Factura factura)
        {
            var rutaPlantillaInforme = ObtenerRutaPlantillaInforme(factura);

            var informeLocal = new LocalReport {
                ReportPath = rutaPlantillaInforme,
                EnableExternalImages = true                
            };

            var urlRaizWeb = RutaServidor.ObtenerUrlRaizWeb();

            var datasetFactura = factura.ConvertirADataSet(urlRaizWeb);

            informeLocal.DataSources.Add(new ReportDataSource("Facturas", datasetFactura.Tables[0]));
            informeLocal.DataSources.Add(new ReportDataSource("Lineas", datasetFactura.Tables[1]));            

            return informeLocal;
        }
        private string ObtenerRutaPlantillaInforme(Factura factura)
        {
            if (string.IsNullOrEmpty(factura.NombreArchivoPlantillaInforme))
                return Server.MapPath("~/Content/Informes/Factura.rdlc");

            return Server.MapPath("~/App_Data/Informes/" + factura.NombreArchivoPlantillaInforme);
        }