public void ObtenerRelacionFactura(ref Modelo.Factura factura)
        {
            try
            {
                int id = factura.FormatoId == 0 ? 1 : factura.FormatoId;
                factura.Formato = factura.Formato ?? _contexto.Formatos.Where(f => f.Id == id).FirstOrDefault();
                id = factura.SucursalId;
                var _serie    = factura.Serie;
                var _facturas = this._contexto.Facturas.Where(f => f.SucursalId == id && f.Serie.Equals(_serie)).ToList();
                var _folio    = _facturas.Count() == 0 || _facturas == null ? 0 : _facturas.Max(f => f.Folio);
                _folio++;
                factura.Folio    = (int)_folio;
                factura.Sucursal = _contexto.Sucursales.Where(f => f.Id == id).FirstOrDefault();
                id = factura.RegimenId;
                factura.Regimen = factura.Regimen ?? _contexto.Regimenes.Where(f => f.Id == id).FirstOrDefault();
                id = factura.ClienteId;
                factura.Cliente = factura.Cliente ?? _contexto.Clientes.Where(f => f.Id == id).FirstOrDefault();
                id = factura.MetodopagoId;
                factura.MetodoPago = factura.MetodoPago ?? _contexto.MetodoPagos.Where(f => f.Id == id).FirstOrDefault();
                id = factura.FormaPagoId;
                factura.FormaPago = factura.FormaPago ?? _contexto.FormaPagos.Where(f => f.Id == id).FirstOrDefault();
                id = factura.UsoCFDIId;
                factura.UsoCFDI = factura.UsoCFDI ?? _contexto.UsoCFDIs.Where(f => f.Id == id).FirstOrDefault();

                foreach (var detalle in factura.Detalles)
                {
                    detalle.CatSatProducto = detalle.CatSatProducto ?? _contexto.CatSatProductos.Find(detalle.CatalogoId);
                    detalle.CatSatUnidad   = detalle.CatSatUnidad ?? _contexto.CatSatUnidades.Find(detalle.UnidadId);
                }
            }
            catch (Exception e)
            {
                this._logger.EscribirError(e.ToString());
            }
        }
 public static bool ValidarFactura(ref string error, ref Modelo.Factura factura)
 {
     factura.Activo  = true;
     factura.Tipo    = "I";
     factura.Estatus = "A";
     factura.Fecha   = DateTime.Now;
     if (factura.ClienteId == 0)
     {
         error += "Favor de seleccionar un cliente.";
     }
     if (factura.MetodopagoId == 0)
     {
         error += "Favor de seleccionar un Metodo de pago.";
     }
     if (factura.MetodopagoId == 0)
     {
         error += "Favor de seleccionar una forma de pago.";
     }
     if (factura.Detalles.Count() == 0)
     {
         error += "La Factura necesita de un detalle.";
     }
     if (error.Length > 0)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }
        public FileStream GetFile(ref string nombre, ref Modelo.Factura factura, int opcion, int facturaId, HttpContext contexto)
        {
            factura = GetId(facturaId);
            ServicioXml _servicio = new ServicioXml(this._logger);
            FileStream  _archivo  = null;
            string      _error    = string.Empty;
            Ruta        _ruta     = new Ruta(contexto, factura);

            new ServicioArchivo(_logger).CrearCarpeta(_ruta.RutaCarpetaFacturasClientes);
            switch (opcion)
            {
            case 1:
                if (!File.Exists(_ruta.RutaGuardadoXML))
                {
                    _servicio.RecuperarXML(factura.Sucursal.Rfc, factura.FolioFiscal, _ruta.RutaGuardadoXML);
                }
                _archivo = new FileStream(_ruta.RutaGuardadoXML, FileMode.Open, FileAccess.Read);
                nombre   = _ruta.NombreArchivoCompletoXml;
                break;

            case 2:
                if (!File.Exists(_ruta.RutaPDF))
                {
                    _servicio.GeneraCBB(ref _error, factura.Sucursal.Rfc, factura.Cliente.Rfc, factura.FolioFiscal, factura.Total, _ruta.RutaCBB);
                    GenerarPDF(factura, _ruta);
                }
                nombre = _ruta.NombreArchivoCompletoPDF;
                if (File.Exists(_ruta.RutaPDF))
                {
                    _archivo = new FileStream(_ruta.RutaPDF, FileMode.Open, FileAccess.Read);
                }
                break;
            }
            return(_archivo);
        }
Ejemplo n.º 4
0
        public static ReportClass GenerarPDF(ref string error, Modelo.Factura factura, Logger logger)
        {
            try
            {
                var facturaReporte = (ReportClass)Activator.CreateInstance(Type.GetType(factura.Formato.NombreFormato));
                //var facturaReporte = new Reportes.FacturaNormalLila();
                Datos.Datos datos    = new Datos.Datos();
                var         _colores = factura.Sucursal.ColorReporte.Split(',');
                datos.Cliente.AddClienteRow(
                    factura.Cliente.Descripcion, factura.Cliente.Rfc, factura.Cliente.Calle, factura.Cliente.CodigoPostal,
                    factura.Cliente.Ciudad, factura.Cliente.Colonia, factura.Cliente.Municipio, factura.Cliente.Estado, factura.Cliente.Pais
                    );
                datos.Sucursal.AddSucursalRow(
                    factura.Sucursal.Descripcion, factura.Sucursal.Rfc, factura.Sucursal.Calle, factura.Sucursal.CodigoPostal,
                    factura.Sucursal.Ciudad, factura.Sucursal.Colonia, factura.Sucursal.Municipio, factura.Sucursal.Estado, factura.Sucursal.Pais, factura.Sucursal.LogoBytes, factura.Regimen.Descripcion,
                    "", factura.Sucursal.Telefono, factura.Sucursal.Celular, int.Parse(_colores[0]), int.Parse(_colores[1]), int.Parse(_colores[2])
                    );
                if (factura.Complementos.Count > 0)
                {
                    try
                    {
                        Ine ine = JsonConvert.DeserializeObject <Ine>(factura.Complementos.ElementAt(0).Detalle);
                        datos.Ine.AddIneRow(ine.TipoProceso, ine.TipoComite, ine.ContabilidadId, ine.Ambito, ine.ClaveEntidad, ine.Version);
                    }
                    catch
                    {
                    }
                }
                datos.Factura.AddFacturaRow(
                    factura.Id,
                    factura.Serie, factura.Folio, factura.Tipoventa, factura.Fecha, factura.CantidadEnLetra,
                    factura.MetodoPago.Descripcion, factura.FormaPago.Descripcion, factura.Banco, factura.NoCuentaPago, factura.SubtotalE,
                    factura.SubtotalG, factura.Iva, factura.RetIva, factura.RetIsr, factura.Descuento, factura.Total, factura.SelloCfd, factura.SelloSat, factura.NoCertificadoSat,
                    factura.NoCertificadoEmisor, factura.FechaTimbrado, factura.VersionTimbrado, factura.CadenaOriginal, factura.Tipo, "A", factura.ImagenCbbBytes, factura.FolioFiscal, factura.Ieps, (bool)factura.EsCredito, factura.Observacion
                    );
                datos.RegimenFiscal.AddRegimenFiscalRow(factura.Regimen.Codigo, factura.Regimen.Descripcion);
                datos.FormaPago.AddFormaPagoRow(factura.FormaPago.Codigo, factura.FormaPago.Descripcion);
                datos.MetodoPago.AddMetodoPagoRow(factura.MetodoPago.Codigo, factura.MetodoPago.Descripcion);
                datos.UsoCFDI.AddUsoCFDIRow(factura.UsoCFDI.Codigo, factura.UsoCFDI.Descripcion);
                foreach (var det in factura.Detalles)
                {
                    datos.CatalogoSat.AddCatalogoSatRow(det.CatSatProducto.Codigo, det.CatSatProducto.Descripcion);
                    datos.FactDetalle.AddFactDetalleRow(det.CatSatProducto.Codigo, det.CuentaPredial, det.Codigo, det.Descripcion, det.CatSatUnidad.Descripcion, det.TasaIva,
                                                        det.TasaIeps, det.Precio, det.Cantidad, det.TasaDesc, det.Total, det.Lote, det.FechaCaducidad, det.CatSatUnidad.Codigo);
                }

                facturaReporte.SetDataSource(datos);
                return(facturaReporte);
            }
            catch (Exception e)
            {
                error = e.ToString();
                logger.EscribirError(e.ToString());
                return(null);
            }
        }
Ejemplo n.º 5
0
 public IHttpActionResult Post(Modelo.Factura factura)
 {
     if (_servicio.Post(ref _error, factura, Util.USUARIO, HttpContext.Current))
     {
         return(Ok("Factura Guardada Correctamente"));
     }
     else
     {
         return(BadRequest(_error));
     }
 }
 public void Save(ref string error, Modelo.Factura factura)
 {
     this._contexto.Facturas.Add(factura);
     try
     {
         this._contexto.SaveChanges();
     }
     catch (Exception e)
     {
         this._logger.EscribirError(e.ToString());
     }
 }
 public void SanitizarFactura(ref Modelo.Factura factura)
 {
     factura.Cliente    = null;
     factura.Regimen    = null;
     factura.MetodoPago = null;
     factura.FormaPago  = null;
     factura.Sucursal   = null;
     factura.Formato    = null;
     factura.UsoCFDI    = null;
     foreach (var detalle in factura.Detalles)
     {
         detalle.CatSatProducto = null;
         detalle.CatSatUnidad   = null;
     }
 }
 public Boolean GenerarXML(ref string error, string ruta, Modelo.Factura factura, ICollection <DetalleTicket> productos = null)
 {
     if (productos == null)
     {
         if (!GenerarEncabezado(ref error, ruta, factura))
         {
             return(false);
         }
         if (!GenerarEmisor(ref error, factura.Sucursal, factura.Regimen))
         {
             return(false);
         }
         if (!GenerarReceptor(ref error, factura.Cliente, factura.UsoCFDI))
         {
             return(false);
         }
         if (!GenerarDetalle(ref error, factura.Detalles))
         {
             return(false);
         }
         if (!GenerarImpuestos(ref error, factura))
         {
             return(false);
         }
     }
     else
     {
         //GenerarEncabezadoGlobal(ref error, ruta, factura);
         //GenerarEmisor(ref error, factura);
         //GenerarReceptor(ref error, factura);
         //generarDetalle(productos);
         //GenerarImpuestosGlobal(ref error, factura, productos);
     }
     if (factura.Complementos.Count > 0)
     {
         try
         {
             Ine ine = JsonConvert.DeserializeObject <Ine>(factura.Complementos.ElementAt(0).Detalle);
             GenerarComplementoIne(ref error, ine);
         }
         catch
         {
         }
     }
     GenerarFin();
     return(true);
 }
Ejemplo n.º 9
0
        public void Ejecutar(FacturaViewModel oFacturaViewModel)
        {
            Modelo.Factura oFactura = new Modelo.Factura()
            {
                RUC              = oFacturaViewModel.RUC,
                RazonSocial      = oFacturaViewModel.RazonSocial,
                Fecha            = oFacturaViewModel.Fecha,
                Glosa            = oFacturaViewModel.Glosa,
                FechaVencimiento = oFacturaViewModel.FechaVencimiento,
                SubTotal         = oFacturaViewModel.SubTotal,
                IGV              = oFacturaViewModel.IGV,
                Total            = oFacturaViewModel.Total
            };

            oFacturaRepositorio.Facturas.Agregar(oFactura);
            oFacturaRepositorio.Commit();
        }
        public Boolean Reenviar(ref string error, UsuarioDto usuario, int facturaId, HttpContext context)
        {
            Modelo.Factura _factura     = new Modelo.Factura();
            ServicioXml    _servicioXml = new ServicioXml(this._logger);
            string         _nombre      = "";

            GetFile(ref _nombre, ref _factura, 1, facturaId, context);
            GetFile(ref _nombre, ref _factura, 2, facturaId, context);
            Ruta _ruta = new Ruta(context, _factura);

            if (!File.Exists(_ruta.RutaGuardadoXML) || !File.Exists(_ruta.RutaPDF))
            {
                error = "No se recuperaron los archivos necesarios.";
                return(false);
            }
            ServicioCorreo.Enviar(_factura.Sucursal.Asunto, _factura.Sucursal.Mensaje, _factura.Cliente.Correo, _ruta.RutaPDF, _ruta.RutaGuardadoXML, this._logger);

            return(true);
        }
        public Boolean Post(ref string error, Modelo.Factura factura, UsuarioDto usuario, HttpContext context)
        {
            var _servicioRelacion = new ServicioRelaciones(this._logger, this._contexto);

            _servicioRelacion.ObtenerRelacionFactura(ref factura);
            Ruta ruta = new Ruta(context, factura);

            if (!ValidarFactura(ref error, ref factura))
            {
                return(false);
            }
            ServicioXml _servicioXml = new ServicioXml(this._logger);

            if (!_servicioXml.GeneraCFDI(ref error, factura, ruta.RutaGuardadoXML, ruta.RutaCertificado, ruta.RutaKey, ruta.RutaArchivosXSLT, ruta.RutaCarpetaFacturasClientes))
            {
                return(false);
            }
            XmlDocument _xmlDocument = new XmlDocument();

            if (!_servicioXml.Timbrar(ref error, ref _xmlDocument, ruta.RutaGuardadoXML, ruta.RutaGuardadoXML))
            {
                return(false);
            }
            Put(ref error, ref factura, _xmlDocument);
            try
            {
                factura.ImagenCbb = ruta.RutaImagenCBB;
                _servicioXml.GeneraCBB(ref error, factura.Sucursal.Rfc, factura.Cliente.Rfc, factura.FolioFiscal, factura.Total, ruta.RutaCBB);
                var correo = factura.Cliente.Correo;
                GenerarPDF(factura, ruta);
                ServicioCorreo.Enviar(factura.Sucursal.Asunto, factura.Sucursal.Mensaje, correo, ruta.RutaPDF, ruta.RutaGuardadoXML, this._logger);
                _servicioRelacion.SanitizarFactura(ref factura);
                Save(ref error, factura);
                return(true);
            }
            catch (Exception e)
            {
                this._logger.EscribirError(e.ToString());
                error = "Ocurrio un error al guardar la factura";
                return(false);
            }
        }
 public void Put(ref string error, ref Modelo.Factura factura, XmlDocument xmlDocumento)
 {
     try
     {
         XmlNodeList            nodoss = xmlDocumento.GetElementsByTagName("tfd:TimbreFiscalDigital");
         XmlAttributeCollection nodos  = nodoss[0].Attributes;
         factura.FechaTimbrado    = nodos["FechaTimbrado"].InnerText;
         factura.FolioFiscal      = nodos["UUID"].InnerText;
         factura.NoCertificadoSat = nodos["NoCertificadoSAT"].InnerText;
         factura.SelloCfd         = nodos["SelloCFD"].InnerText;
         factura.SelloSat         = nodos["SelloSAT"].InnerText;
         factura.VersionTimbrado  = nodos["Version"].InnerText;
         factura.Estatus          = "Timbrada";
         factura.CantidadEnLetra  = ServicioNumeroLetra.Convertir(factura.Total.ToString("F"), true);
     }
     catch (Exception e)
     {
         this._logger.EscribirError(e.ToString());
     }
 }
        public Boolean GenerarPDF(Modelo.Factura factura, Ruta ruta)
        {
            string respuesta = "";

            try
            {
                factura.ImagenCbbBytes     = ruta.GetImageByte(ruta.RutaCBB);
                factura.Sucursal.LogoBytes = ruta.GetImageByte(HttpContext.Current.Server.MapPath(String.Format(Ruta.RutaImagenes, factura.Sucursal.Id, factura.Sucursal.Rfc, factura.Sucursal.Logo)));
                var facturaReporte = ServicioReporte.GenerarPDF(ref respuesta, factura, this._logger);
                if (facturaReporte != null)
                {
                    facturaReporte.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, ruta.RutaPDF);
                }
                return(true);
            }
            catch (Exception e)
            {
                this._logger.EscribirError(e.ToString());
                return(false);
            }
        }
Ejemplo n.º 14
0
        public IHttpActionResult GetFilePDF(int id)
        {
            string _nombre = "";

            Modelo.Factura _factura = new Modelo.Factura();
            var            _archivo = _servicio.GetFile(ref _nombre, ref _factura, 2, id, HttpContext.Current);

            if (_archivo == null)
            {
                return(BadRequest("No se encuentra el archivo."));
            }

            var response = new HttpResponseMessage(HttpStatusCode.OK);

            response.Content = new StreamContent(_archivo);
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = _nombre
            };
            return(ResponseMessage(response));
        }
        public Boolean Cancelar(ref string error, ref Modelo.Factura factura, string rutaCertificado, string rutaKey)
        {
            var _rutaCertificadoPem = String.Format("{0}{1}", rutaCertificado, ".pem");
            var _rutaKeyPem         = String.Format("{0}{1}", rutaKey, ".pem");
            ServicioCertificado _servicioCertificado = new ServicioCertificado(this._logger);

            _servicioCertificado.CreaArchivoExtPEM(rutaCertificado, _rutaCertificadoPem);
            _servicioCertificado.CreaArchivoKeyPEM(rutaKey, _rutaKeyPem, factura.Sucursal.ClavePrivada);
            cancelResponse _respuestaCancelacion = null;

            try
            {
                CancelSOAP cancela = new CancelSOAP();
                cancel     can     = new cancel();
                can.username    = Resources.UsuarioFinkokP;
                can.password    = Resources.ContraFinkok;
                can.taxpayer_id = factura.Sucursal.Rfc;
                can.cer         = RegresaEN64(File.ReadAllText(_rutaCertificadoPem));
                can.key         = RegresaEN64(File.ReadAllText(_rutaKeyPem));
                UUIDS    nim        = new UUIDS();
                string[] uuidString = new string[] { factura.FolioFiscal };
                nim.uuids             = uuidString.ToArray();
                can.UUIDS             = nim;
                _respuestaCancelacion = cancela.cancel(can);
                if ((_respuestaCancelacion != null) && (_respuestaCancelacion.cancelResult != null))
                {
                    factura.AcuseCancelacion = _respuestaCancelacion.cancelResult.Acuse;
                    factura.FechaCancelacion = DateTime.Now;
                    factura.Estatus          = "Cancelada";
                }
                return(true);
            }
            catch (Exception e)
            {
                this._logger.EscribirError(e.ToString());
                return(false);
            }
        }
Ejemplo n.º 16
0
        public void generar(Modelo.Factura unaFactura, Tramite unTramite, string placa, string idenPropietario)
        {
            DsFactura        dsF           = new DsFactura();
            DataRow          fila1         = dsF.FACTURATRAMITE.NewRow();
            DatosPropietario objDatosPropi = new DatosPropietario();
            Propietario      unPropietario = new Propietario();

            unPropietario      = objDatosPropi.buscarPropietario(idenPropietario);
            fila1["FT_NUMERO"] = unaFactura.numero;
            fila1["FT_FECHA"]  = unaFactura.fecha;
            fila1["FT_PLACA"]  = placa;
            fila1["FT_IDENTIFICACION_PROPI"] = idenPropietario;
            fila1["FT_PROPIETARIO_NOMBRE"]   = unPropietario.nombres;
            fila1["FT_PROPIETARIO_APELLIDO"] = unPropietario.apellidos;
            fila1["FT_VALOR"]       = unTramite.valor;
            fila1["FT_DESCRIPCION"] = unTramite.descripcion;
            dsF.FACTURATRAMITE.Rows.Add(fila1);
            frmGenerarFacturaT frm = new frmGenerarFacturaT(dsF);

            frm.ShowDialog();
            dsF.FACTURATRAMITE.Dispose();
            dsF = null;
        }
 public Boolean GeneraCFDI(ref string error, Modelo.Factura factura, string rutaGuardadoCFDI, string rutaCertificado, string rutaKey, string rutaXSLT, string rutaCarpetaTemp, ICollection <DetalleTicket> productos = null)
 {
     try
     {
         ServicioCertificado _servicioCertificado = new ServicioCertificado(_logger);
         factura.NoCertificadoEmisor = _servicioCertificado.GetNumeroCertificado(ref error, rutaCertificado);
         if (String.IsNullOrEmpty(factura.NoCertificadoEmisor))
         {
             return(false);
         }
         this.Certificado = _servicioCertificado.GetCertificado(rutaCarpetaTemp, rutaCertificado, factura.Sucursal.RutaCer);
         if (String.IsNullOrEmpty(this.Certificado))
         {
             return(false);
         }
         GenerarXML(ref error, rutaGuardadoCFDI, factura);
         factura.CadenaOriginal = _servicioCertificado.GetCadenaOriginal(ref error, rutaGuardadoCFDI, rutaXSLT);
         if (String.IsNullOrEmpty(factura.CadenaOriginal))
         {
             return(false);
         }
         this.SelloDigital = _servicioCertificado.GetSelloDigital(ref error, rutaKey, factura.Sucursal.ClavePrivada, factura.CadenaOriginal);
         if (String.IsNullOrEmpty(this.SelloDigital))
         {
             return(false);
         }
         GenerarXML(ref error, rutaGuardadoCFDI, factura);
         return(true);
     }
     catch (Exception e)
     {
         GenerarFin();
         _logger.EscribirError(e.ToString());
         return(false);
     }
 }
Ejemplo n.º 18
0
 public Ruta(HttpContext _contexto, Modelo.Factura factura)
 {
     this._contexto = _contexto;
     this._factura  = factura;
 }
Ejemplo n.º 19
0
 public Facturacion(ListadoOfertas unForm, Modelo.Factura unaFactura)
 {
     InitializeComponent();
     factura       = unaFactura;
     form_anterior = unForm;
 }
 public Boolean GenerarEncabezado(ref string error, string ruta, Modelo.Factura factura)
 {
     try
     {
         if (File.Exists(ruta))
         {
             File.Delete(ruta);
         }
         XmlCreador = new XmlTextWriter(ruta, Encoding.UTF8);
         XmlCreador.WriteStartDocument();                  //empezamos a crear el xml
         XmlCreador.WriteStartElement("cfdi:Comprobante"); //definimos el elemento principal comprobante
         XmlCreador.WriteStartAttribute("xmlns:xsi");
         XmlCreador.WriteValue("http://www.w3.org/2001/XMLSchema-instance");
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("xsi:schemaLocation");
         XmlCreador.WriteValue("http://www.sat.gob.mx/cfd/3  http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/iedu http://www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd");
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Version");
         XmlCreador.WriteValue("3.3");
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Serie");
         XmlCreador.WriteValue(factura.Serie);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Folio");
         XmlCreador.WriteValue(factura.Folio);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Fecha");
         XmlCreador.WriteValue(Convert.ToDateTime(String.Format("{0:s}", factura.Fecha)));
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Sello");
         XmlCreador.WriteValue(this.SelloDigital);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("FormaPago");
         XmlCreador.WriteValue(factura.FormaPago.Codigo);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("NoCertificado");
         XmlCreador.WriteValue(factura.NoCertificadoEmisor);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Certificado");
         XmlCreador.WriteValue(this.Certificado);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("SubTotal");
         XmlCreador.WriteValue(factura.Detalles.Sum(f => f.Total).ToString("F", CultureInfo.InvariantCulture));
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Descuento");
         XmlCreador.WriteValue(factura.Detalles.Sum(d => d.Descuento).ToString("F", CultureInfo.InvariantCulture));
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Moneda");
         XmlCreador.WriteValue("MXN");
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("Total");
         XmlCreador.WriteValue(factura.Total.ToString("F", CultureInfo.InvariantCulture));
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("TipoDeComprobante");
         XmlCreador.WriteValue(factura.Tipo);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("MetodoPago");
         XmlCreador.WriteValue(factura.MetodoPago.Codigo);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("LugarExpedicion");
         XmlCreador.WriteValue(factura.Sucursal.CodigoPostal);
         XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("xmlns:cfdi");
         XmlCreador.WriteValue("http://www.sat.gob.mx/cfd/3");
         XmlCreador.WriteEndAttribute();
         if (factura.Complementos.Count > 0)
         {
             XmlCreador.WriteStartAttribute("xmlns:ine");
             XmlCreador.WriteValue("http://www.sat.gob.mx/ine");
             XmlCreador.WriteEndAttribute();
         }
         //XmlCreador.WriteStartAttribute("xmlns:pago10");
         //XmlCreador.WriteValue("http://www.sat.gob.mx/Pagos");
         //XmlCreador.WriteEndAttribute();
         XmlCreador.WriteStartAttribute("xmlns:iedu");
         XmlCreador.WriteValue("http://www.sat.gob.mx/iedu");
         XmlCreador.WriteEndAttribute();
         return(true);
     }
     catch (Exception e)
     {
         error = "Ocurrio un error al generar nodo Encabezado";
         _logger.EscribirError(e.ToString());
         GenerarFin();
         return(false);
     }
 }
        public Boolean GenerarImpuestos(ref string error, Modelo.Factura factura)
        {
            try
            {
                var todosIeps = factura.Detalles.Where(d => d.TasaIeps > 0)
                                .GroupBy(d => d.TasaIeps)
                                .Select(cl => new
                {
                    nombre = cl.First().TasaIeps,
                    Suma   = cl.Sum(c => c.Ieps).ToString("F"),
                }).ToList();
                var totalImpuestosRetenidos   = factura.Detalles.Sum(d => d.RetIsrDinero + d.RetIvaDinero);
                var totalImpuestosTrasladados = factura.Detalles.Sum(d => d.Iva + d.Ieps);

                XmlCreador.WriteStartElement("cfdi:Impuestos"); //element de IMPUESTOS
                XmlCreador.WriteStartAttribute("TotalImpuestosTrasladados");
                XmlCreador.WriteValue(totalImpuestosTrasladados.ToString("F", CultureInfo.InvariantCulture));
                XmlCreador.WriteEndAttribute();
                XmlCreador.WriteStartAttribute("TotalImpuestosRetenidos");
                XmlCreador.WriteValue(totalImpuestosRetenidos.ToString("F", CultureInfo.InvariantCulture));
                XmlCreador.WriteEndAttribute();
                var sumRetISR = factura.Detalles.Sum(d => d.RetIsrDinero);
                var sumRetIva = factura.Detalles.Sum(d => d.RetIvaDinero);
                if (sumRetISR > 0 || sumRetIva > 0)
                {
                    XmlCreador.WriteStartElement("cfdi:Retenciones"); //cfdi:Retenciones
                    if (sumRetISR > 0)
                    {
                        XmlCreador.WriteStartElement("cfdi:Retencion"); //cfdi:Retencion IVA
                        XmlCreador.WriteStartAttribute("Impuesto");
                        XmlCreador.WriteValue("001");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("Importe");
                        XmlCreador.WriteValue(sumRetISR.ToString("F", CultureInfo.InvariantCulture));
                        XmlCreador.WriteEndElement();
                    }
                    if (sumRetIva > 0)
                    {
                        XmlCreador.WriteStartElement("cfdi:Retencion"); //cfdi:Retencion IVA
                        XmlCreador.WriteStartAttribute("Impuesto");
                        XmlCreador.WriteValue("002");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("Importe");
                        XmlCreador.WriteValue(sumRetIva.ToString("F", CultureInfo.InvariantCulture));
                        XmlCreador.WriteEndElement();
                    }
                    XmlCreador.WriteEndElement();//ELEMENT DE retenciones
                }
                var ivaGlobal = factura.Detalles.Sum(d => d.Iva);
                if (ivaGlobal > 0 || todosIeps.Count > 0)
                {
                    XmlCreador.WriteStartElement("cfdi:Traslados");
                    if (ivaGlobal > 0)
                    {
                        XmlCreador.WriteStartElement("cfdi:Traslado");
                        XmlCreador.WriteStartAttribute("Impuesto");
                        XmlCreador.WriteValue("002");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("TasaOCuota");
                        XmlCreador.WriteValue("0.160000");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("TipoFactor");
                        XmlCreador.WriteValue("Tasa");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("Importe");
                        XmlCreador.WriteValue(ivaGlobal.ToString("F", CultureInfo.InvariantCulture));
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteEndElement();
                    }
                    //if (ivaGlobal == 0)
                    //{
                    //    XmlCreador.WriteStartElement("cfdi:Traslado");
                    //    XmlCreador.WriteStartAttribute("Impuesto");
                    //    XmlCreador.WriteValue("002");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("TasaOCuota");
                    //    XmlCreador.WriteValue("0.000000");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("TipoFactor");
                    //    XmlCreador.WriteValue("Tasa");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("Importe");
                    //    XmlCreador.WriteValue(ivaGlobal.ToString("F", CultureInfo.InvariantCulture));
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteEndElement();
                    //}
                    //if (ivaGlobal == -1)
                    //{
                    //    XmlCreador.WriteStartElement("cfdi:Traslado");
                    //    XmlCreador.WriteStartAttribute("Impuesto");
                    //    XmlCreador.WriteValue("002");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("TasaOCuota");
                    //    XmlCreador.WriteValue("0.000000");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("TipoFactor");
                    //    XmlCreador.WriteValue("Tasa");
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteStartAttribute("Importe");
                    //    XmlCreador.WriteValue(ivaGlobal.ToString("F", CultureInfo.InvariantCulture));
                    //    XmlCreador.WriteEndAttribute();
                    //    XmlCreador.WriteEndElement();
                    //}
                    foreach (var ieps in todosIeps)
                    {
                        XmlCreador.WriteStartElement("cfdi:Traslado");
                        XmlCreador.WriteStartAttribute("Impuesto");
                        XmlCreador.WriteValue("003");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("TasaOCuota");
                        XmlCreador.WriteValue(ieps.nombre.ToString("N6", CultureInfo.InvariantCulture));
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("TipoFactor");
                        XmlCreador.WriteValue("Tasa");
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteStartAttribute("Importe");
                        XmlCreador.WriteValue(decimal.Parse(ieps.Suma).ToString("F", CultureInfo.InvariantCulture));
                        XmlCreador.WriteEndAttribute();
                        XmlCreador.WriteEndElement();
                    }
                    XmlCreador.WriteEndElement(); //ELEMENT DE Traslados
                }
                XmlCreador.WriteEndElement();     //ELEMENT DE IMPUESTOS
                return(true);
            }
            catch (Exception e)
            {
                _logger.EscribirError(e.ToString());
                error = "Ocurrio un error al generar nodo Impuestos";
                GenerarFin();
                return(false);
            }
        }