using Microsoft.Reporting.WebForms; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; using Extensiones; using System.Data; using System.Text; using ADSistemaLibrary2.SatXml; //using ADS_CFDI_SAT; public partial class Ventas_RepConciliacionEmitidosSat : ClsPaginas { #region "Propiedades" const string rqFechaInicio = "FechaInicio"; const string rqFechaFin = "FechaFin"; const string rqRegistroEn = "RegistroEn"; public string RfechaI { get { return ViewState["RfechaI"].ToString(); } set { ViewState["RfechaI"] = value; } } public string RfechaF { get { return ViewState["RfechaF"].ToString(); } set { ViewState["RfechaF"] = value; } } public object CurrentRow { get { return ViewState["CurrentRow"]; } set { ViewState["CurrentRow"] = value; } } public int RegistroEn { get { if (ViewState["RegistroEn"] != null) { return ViewState["RegistroEn"].ToString().ToEntero(); } else { return 0; } } set { ViewState["RegistroEn"] = value; } } private StringBuilder strErrores; #endregion protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string path; if (Request["op"] != null && Request["op"].ToString().Length > 0) { try { if (System.IO.File.Exists((path = string.Format("{0}\\{1}", UsuarioActual.Empresa.Ruta.Trim(), Extensiones.ModExtensiones.Decripta(Request["op"].ToString()).Trim()).Replace("/", "\\")))) { System.IO.FileInfo archivo = new System.IO.FileInfo(path); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "text/plain"; HttpContext.Current.Response.AppendHeader("Content-disposition", string.Format("attachment; filename={0}", archivo.Name)); HttpContext.Current.Response.AddHeader("Content-Length", archivo.Length.ToString()); HttpContext.Current.Response.TransmitFile(path); HttpContext.Current.Response.End(); } else { RegistraScript("window.close()"); } } catch (Exception ex) { Extensiones.ModExtensiones.GuardaLog(ex.ToString()); RegistraScript("window.close()"); } } fillrequestfields(); DdlSubProyectoDatos.DataSource = get_GlobalDTSubProyectosUsuarios(UsuarioActual.CveUsuario, -1, UsuarioActual.CveEmpresa, -1, 1).FiltraParametros("EsSucursal = True "); DdlSubProyectoDatos.DataBind(); DdlClasificacion.DataSource = get_GlobalDTClasificaciones(UsuarioActual.CveEmpresa, UsoClasificacion: 1).FiltraParametros(" Codigo = '' OR Codigo IS NULL ", Orderby: "Clasificacion"); DdlClasificacion.DataBind(); CargaConciliacionemitidasSATGet(); int CveClasificacion = DdlClasificacion.SelectedValue.ToEntero(); if (UsuarioActual.Empresa.Funcionalidad(141).ToString() == "1") { DdlPS.setEsWebService(true); DdlPS.ddlWS.Attributes.Add("data-cveclasificacion", CveClasificacion.ToString()); DdlPS.ddlWS.Attributes.Add("data-pagina", "ventas/ventas"); DdlPS.ddlWS.Attributes.Add("data-Estatus", "1"); } else { DdlPS.setEsWebService(false); DdlPS.ddl.DataSource = get_GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CveClasificacion: CveClasificacion, Estatus: 1, AplicaParaVenta: 1); DdlPS.ddl.DataBind(); } } } private void downfile(string path) { } public void fillrequestfields() { DateTime fecha; DateTime fechaInicio = DateTime.Now; DateTime fechaFin = DateTime.Now; RegistroEn = -1; if (fechaInicio.Day < 5) { fechaInicio = fechaInicio.AddMonths(-1); } fechaInicio = fechaInicio.AddDays(1 - fechaInicio.Day); fechaFin = fechaInicio.AddYears(1).AddDays(-1); if (Request[rqRegistroEn] != null) { RegistroEn = Request[rqRegistroEn].ToEntero(); } if (Request[rqFechaInicio] != null) { DateTime.TryParse(Request[rqFechaInicio], out fecha); fechaInicio = fecha.Year > 1900 ? fecha : fechaInicio; } if (Request[rqFechaFin] != null) { DateTime.TryParse(Request[rqFechaFin], out fecha); fechaFin = fecha.Year > 1900 ? fecha : fechaFin; } txtFechaI.Text = string.Format("{0:dd/MM/yyyy}", fechaInicio); txtFechaF.Text = string.Format("{0:dd/MM/yyyy}", fechaFin); ddlRegistroen.SelectedValueExist(RegistroEn); } protected void CargaRepConciliacionSatGET() { string RtipoDocto; RtipoDocto = "I"; RfechaI = txtFechaI.Text.Length > 0 ? txtFechaI.Text.ToDateTime().ToString("yyyy/MM/dd") : ""; RfechaF = txtFechaF.Text.Length > 0 ? string.Format("{0:yyyy/MM/dd}", txtFechaF.Text.ToDateTime()) : ""; RegistroEn = ddlRegistroen.SelectedValue.ToEntero(); using (ClsGenerales ObjRepC = new ClsGenerales()) { if (ObjRepC.RepConciliacionSatDetalleGET(UsuarioActual.CveEmpresa, RtipoDocto, RfechaI, RfechaF, RegistroEn)) { Ltlsinregistrar.Text = $"{ObjRepC.DtResultados.COUNT("FolioFiscal", "CveVenta IS NULL")}"; ltlTotal.Text = $"{ObjRepC.DtResultados.Rows.Count}"; } GVConciliacionemitidasSAT.DataSource = ObjRepC.DtResultados; ObjRepC.Dispose(); } GVConciliacionemitidasSAT.DataBind(); UpDatosReporte.Update(); } protected void CargaConciliacionemitidasSATGet() { CargaRepConciliacionSatGET(); //ClsVentas ObjV = new ClsVentas(); //ObjV.ConciliacionemitidasSATGet(UsuarioActual.CveEmpresa); //GVConciliacionemitidasSAT.DataSource = ObjV.DtResultados.FiltraParametros("", "CveVenta"); //Ltlsinregistrar.Text = $"{ObjV.DtResultados.COUNT("FolioFiscal","CveVenta IS NULL")}"; //ltlTotal.Text = $"{ObjV.DtResultados.Rows.Count}"; //ObjV.Dispose(); //GVConciliacionemitidasSAT.DataBind(); //UpDatosReporte.Update(); } private void registrarventa(GridViewRow gvrow) { { string rutaempresa = UsuarioActual.Empresa.Ruta.Trim().Replace("/", "\\"); string rutafile = gvrow.DataKey("RutaXml").Trim().Replace("/", "\\"); rutaempresa = rutaempresa.Substring(rutaempresa.Length - 1, 1) == "\\" ? rutaempresa.Substring(0, rutaempresa.Length - 1): rutaempresa; rutafile = rutafile.Substring(0, 1) == "\\" ? rutafile.Substring(1): rutafile; string ruta = string.Format("{0}\\{1}", rutaempresa, rutafile); //gvrow.DataKey("RutaXml"); //Alert(ruta); //return false; strErrores = new StringBuilder(); XmlSatCFDI objxml = null; Modelos.Factura objfact = null; bool continuar = true; objxml = XmlSatCFDI.readXML(ruta); continuar = continuar && (objxml != null); if (continuar) { objfact = GetFacturaFromXML(objxml); } continuar = continuar && (objfact != null); if (continuar) { // Dim As New (ObjVentas.IniciaTransacSQL()) // Dim As = Nothing // Dim MensajeAlert = New StringBuilder ClsVentas ObjVentas = new ClsVentas(); ClsInventarios ObjInventario = new ClsInventarios(ObjVentas.IniciaTransacSQL()); ClsContabilidad ObjConta = new ClsContabilidad(ObjVentas.IniciaTransacSQL()); ClsContratos ObjContr = new ClsContratos(ObjVentas.IniciaTransacSQL()); ClsOS ObjOS = new ClsOS(ObjVentas.IniciaTransacSQL()); ClsBancos ObjBancos = new ClsBancos(ObjVentas.IniciaTransacSQL()); ClsClientes ObjClientes = new ClsClientes(ObjVentas.IniciaTransacSQL()); ClsOIEventos ObjEventos = new ClsOIEventos(ObjVentas.IniciaTransacSQL()); ClsCGame ObjCGame = new ClsCGame(ObjVentas.IniciaTransacSQL()); ClsEdocumentacion ObjDocCliente = new ClsEdocumentacion(ObjVentas.IniciaTransacSQL()); ClsAcumuladores ObjAcum = new ClsAcumuladores(ObjVentas.IniciaTransacSQL()); ClsContPAQi ObjContPaq = null; //StringBuilder MensajeAlert = new StringBuilder() ; DataTable DtDetalle = objfact.DtDetalle; try { objfact.GuardarVenta(ref objfact, ref ObjVentas, ref ObjConta, ref ObjInventario, ref ObjContr, ref DtDetalle, objfact.CveNCaVincular, ref ObjContPaq, ref ObjBancos, ref ObjOS, ref ObjEventos, ref ObjCGame, ref ObjClientes, ObjAcum: ObjAcum); } catch (Exception e) { objfact.CveVenta = -1; e.ToString().GuardaLog(); strErrores.AppendLine("
"); strErrores.AppendLine(e.ToString()); } if (ObjVentas.UpdateEstatusFactura(3, objxml.complemento.UUID, "", DateTime.ParseExact(objxml.comprobante.Fecha.Replace("T", " "), "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture), ObjVentas.CveVenta, CvePAC: 4)) if (objfact.CveVenta > 0 && objfact.ErrorList.Count == 0) { ObjVentas.Commit(); } else { foreach (string item in objfact.ErrorList) { strErrores.AppendLine("
"); strErrores.AppendLine(item); } objfact.CveVenta = -1; ObjVentas.RollBack(); } ObjVentas.Dispose(); ObjConta.Dispose(); ObjInventario.Dispose(); ObjCGame.Dispose(); ObjContr.Dispose(); ObjDocCliente.Dispose(); ObjClientes.Dispose(); ObjAcum.Dispose(); } if (objfact != null && objfact.CveVenta > 0) { CargaConciliacionemitidasSATGet(); Alert($"se ha agregado la factura correctamente.
Ver Factura ", ModExtensiones.TipoMensaje.ToastInformacion, timeout: 25); } else { continuar = false; } if (!continuar) { Alert($"no se pudo agregar la factura {strErrores.ToString()}", ModExtensiones.TipoMensaje.MsgAdvertencia); } } } protected void LnkRegistrar_Click(object sender, EventArgs e) { GridViewRow gvrow = (GridViewRow)(((LinkButton)sender).NamingContainer); CurrentRow = gvrow; RegistraScript("$('#DModalDefaults').modal();"); //registrarventa(gvrow); //string ruta = gvrow.DataKey("RutaXml"); //strErrores = new StringBuilder(); //XmlSatCFDI objxml = null; //Modelos.Factura objfact = null; //bool continuar = true; //objxml = XmlSatCFDI.readXML(ruta); //continuar = continuar && (objxml != null); //if (continuar) //{ // objfact = GetFacturaFromXML(objxml); //} //continuar = continuar && (objfact != null); //if (continuar) //{ // // Dim As New (ObjVentas.IniciaTransacSQL()) // // Dim As = Nothing // // Dim MensajeAlert = New StringBuilder // ClsVentas ObjVentas = new ClsVentas(); // ClsInventarios ObjInventario = new ClsInventarios(ObjVentas.IniciaTransacSQL()); // ClsContabilidad ObjConta = new ClsContabilidad(ObjVentas.IniciaTransacSQL()); // ClsContratos ObjContr = new ClsContratos(ObjVentas.IniciaTransacSQL()); // ClsOS ObjOS = new ClsOS(ObjVentas.IniciaTransacSQL()); // ClsBancos ObjBancos = new ClsBancos(ObjVentas.IniciaTransacSQL()); // ClsClientes ObjClientes = new ClsClientes(ObjVentas.IniciaTransacSQL()); // ClsOIEventos ObjEventos = new ClsOIEventos(ObjVentas.IniciaTransacSQL()); // ClsCGame ObjCGame = new ClsCGame(ObjVentas.IniciaTransacSQL()); // ClsEdocumentacion ObjDocCliente = new ClsEdocumentacion(ObjVentas.IniciaTransacSQL()); // ClsAcumuladores ObjAcum = new ClsAcumuladores(ObjVentas.IniciaTransacSQL()); // ClsContPAQi ObjContPaq = null; // //StringBuilder MensajeAlert = new StringBuilder() ; // try // { // objfact.GuardarVenta(ref objfact, ref ObjVentas, ref ObjConta, ref ObjInventario, ref ObjContr, ref objfact.DtDetalle, objfact.CveNCaVincular, ref ObjContPaq, ref ObjBancos, ref ObjOS, ref ObjEventos, ref ObjCGame, ref ObjClientes, ObjAcum: ObjAcum); // } // catch (Exception ) // { // objfact.CveVenta = -1; // } // if (ObjVentas.UpdateEstatusFactura(3, objxml.complemento.UUID, "", DateTime.ParseExact(objxml.comprobante.Fecha.Replace("T", " "), "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture), ObjVentas.CveVenta, CvePAC: 4)) // if (objfact.CveVenta > 0 && objfact.ErrorList.Count == 0) // { // ObjVentas.Commit(); // } // else // { // foreach (string item in objfact.ErrorList) // { // strErrores.AppendLine("
"); // strErrores.AppendLine(item); // } // objfact.CveVenta = -1; // ObjVentas.RollBack(); // } // ObjVentas.Dispose(); // ObjConta.Dispose(); // ObjInventario.Dispose(); // ObjCGame.Dispose(); // ObjContr.Dispose(); // ObjDocCliente.Dispose(); // ObjClientes.Dispose(); // ObjAcum.Dispose(); //} //if (objfact != null && objfact.CveVenta > 0) //{ // CargaConciliacionemitidasSATGet(); // Alert($"se ha agregado la factura correctamente.
Ver Factura ", ModExtensiones.TipoMensaje.ToastInformacion,timeout:25); //} //else { continuar = false; } //if (!continuar) //{ // Alert($"no se pudo agregar la factura {strErrores.ToString()}", ModExtensiones.TipoMensaje.MsgAdvertencia); //} } protected Modelos.Factura GetFacturaFromXML(XmlSatCFDI objxml) { int CvePsReconstruccion = DdlPS.SelectedValue.ToEntero(); int CveSubProyectoReconstruccion = DdlSubProyectoDatos.SelectedValue.ToEntero(); //Modelos.Factura.MMensajeFactura resp; string Moneda = objxml.comprobante.Moneda; if (objxml.comprobante.Version == "3.2") { switch (Moneda) { case "Peso Mexicano": Moneda = "MXN"; break; case "Dolar Americano": Moneda = "USD"; break; } } string formadepago = objxml.comprobante.FormaPago; string metododepago = objxml.comprobante.MetodoPago; if (objxml.comprobante.Version == "3.2") { switch (objxml.comprobante.MetodoPago)//si es correcto estan invertidos { case "TRANSFERENCIA ELECTRONICA": formadepago = "03"; break; default: formadepago = objxml.comprobante.MetodoPago; break; } } if (objxml.comprobante.Version == "3.2") { switch (objxml.comprobante.FormaPago)//si es correcto estan invertidos { case "PAGO EN UNA SOLA EXHIBICION": metododepago = "PUE"; break; default: metododepago = objxml.comprobante.FormaPago; break; } } Modelos.Factura objfact = new Modelos.Factura(UsuarioActual) { TipoMensajeRespuesta = Modelos.TipoMensajeRespuesta.TextoLimpio,//?que es esto CveUsuario = UsuarioActual.CveUsuario, CveEmpresa = UsuarioActual.CveEmpresa, FolioFiscal = objxml.complemento.UUID, Serie = objxml.comprobante.Serie, Folio = objxml.comprobante.Folio.ToEntero(),//Nota en el sat puede ser un string Version = objxml.comprobante.Version, TipoCambio = objxml.comprobante.TipoCambio, //ConvertirPesos =false,//?para que sirve MonedaSAT = objxml.comprobante.Moneda, CveMoneda = GlobalDTMonedas.FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT= '{Moneda}' ").ToEntero(), Moneda = GlobalDTMonedas.FiltroPrimeroValor("Moneda", $" AbreviaturaSAT= '{Moneda}' "), TipoDocto = objxml.comprobante.TipoDeComprobanteSIG, RefDocto = "", CveMesa = -1, Fecha = DateTime.ParseExact(objxml.comprobante.Fecha, "yyyy-MM-ddTHH:mm:ss", System.Globalization.CultureInfo.InvariantCulture), CvePrePoliza = -1, FechaPago = DateTime.Now, MotivoDescuento = "", FechaEjecucion = DateTime.Now, UsuarioCreo = UsuarioActual.Usuario, CveCondicionEntrega = -1, CondicionEntrega = "", NumeroCuenta = "", CondicionesPago = 0, FormaPago = 0, PedidoContrato = "", NumeroContrato = "", DescripcionContrato = "", CveCorte = -1, TipoDocumento = objxml.comprobante.TipoDeComprobanteTexto, Alfa1 = "", Alfa2 = "", Alfa3 = "", CveContrato = -1 }; DataRow dr = get_GlobalDTSubProyectos(-1, -1, UsuarioActual.CveEmpresa, 1).FiltroPrimero(string.Format("Serie='{0}'", objfact.Serie)); if (dr == null) { dr = get_GlobalDTSubProyectos(-1, CveSubProyectoReconstruccion, UsuarioActual.CveEmpresa, 1).Rows[0]; } if (dr != null) { objfact.CveSubProyecto = dr["CveSubProyecto"].ToString().ToEntero(); objfact.CveSubProyectoCobranza = dr["CveSubProyecto"].ToString().ToEntero(); objfact.CveSubProyectoEjecucion = dr["CveSubProyecto"].ToString().ToEntero(); objfact.SubProyecto = new Modelos.SubProyectoModel(dr); objfact.SubProyectoMatriz = new Modelos.SubProyectoModel(get_GlobalDTSubProyectos(-1, CveSubProyecto: -1, CveEmpresa: UsuarioActual.CveEmpresa).FiltroPrimero("TipoSucursal=1")); } using (ClsClientes objClientes = new ClsClientes()) { if (objClientes.GetClientes(-1, "-1", "-1", "-1", objxml.receptor.Rfc, "-1", "-1", -1, UsuarioActual.CveEmpresa, -1, TipoCliente: -1) && objClientes.DtResultados.Rows.Count > 0) { DataRow drCliente = objClientes.DtResultados.Rows[0]; objfact.CveCliente = drCliente["CveCliente"].ToString().ToEntero(); objfact.SetCliente(); } } objfact.CveAlmacen = -1; objfact.CveFormaPago33 = GlobalDTVtaFormaPago.FiltroPrimeroValor("CveFormaPago", $"ClaveFormaPagoSAT = '{formadepago}'").ToEntero(); objfact.FormaPagoSAT33 = objxml.comprobante.FormaPago; objfact.FormaPago33 = objxml.comprobante.FormaPagoTexto; objfact.CveMetodoPago33 = GlobalDTVtaMetodoPago.FiltroPrimeroValor("CveMetodoPago", $" ClaveMetodoPagoSAT = '{metododepago}'").ToEntero(); objfact.CveMetodoPago = GlobalDTVtaMetodoPago.FiltroPrimeroValor("CveMetodoPago", $" ClaveMetodoPagoSAT = '{metododepago}'").ToEntero(); objfact.ClaveMetodoPagoSAT = objxml.comprobante.MetodoPago; objfact.MetodoPago33 = objxml.comprobante.MetodoPagoTexto; objfact.CveUsoCFDI = get_GlobalDTSATUsosCFDI(-1).FiltroPrimeroValor("CveUsoCFDI", $"UsoCFDI = '{objxml.receptor.UsoCFDI}'").ToEntero(); objfact.UsoCFDI = objxml.receptor.UsoCFDITexto; objfact.ClaveUsoCFDI = objxml.receptor.UsoCFDI; objfact.CveClienteSucursal = -1; objfact.DtDetalle = CreaDTDetalle(UsuarioActual, objxml.conceptos, objfact.CveSubProyecto, CvePsReconstruccion, objxml); objfact.TipoCambioDolares = objxml.comprobante.TipoCambio; objfact.SubTotal = objxml.comprobante.SubTotal; objfact.Descuento = objxml.comprobante.Descuento; objfact.Amortizacion = 0; objfact.IVA = objxml.Impuestos.Where(x => (x.Impuesto == "002" || x.Impuesto == "IVA") && x.Tipo == "Traslados").Sum(item => item.Importe); objfact.RetIVA = objxml.Impuestos.Where(x => (x.Impuesto == "002" || x.Impuesto == "IVA") && x.Tipo == "Retenciones").Sum(item => item.Importe); objfact.RetISR = objxml.Impuestos.Where(x => (x.Impuesto == "001" || x.Impuesto == "ISR") && x.Tipo == "Retenciones").Sum(item => item.Importe); objfact.IEPS = objxml.Impuestos.Where(x => (x.Impuesto == "003" || x.Impuesto == "IEPS")).Sum(item => item.Importe); objfact.Total = objxml.comprobante.Total; objfact.TotalOtrosConceptos = 0; objfact.Observaciones = ""; objfact.OrdenCompra = ""; objfact.PedidoContrato = ""; objfact.ObservacionesAlmacen = ""; if (strErrores.Length > 0) { objfact = null; } return objfact; } private DataTable CreaDTDetalle(Usuario UsuarioActual, List conceptos, int CveSubProyecto, int CvePsReconstruccion, XmlSatCFDI objxml) { bool continuar = true; var TmpDT = new DataTable(); #region TmpDT Fields TmpDT.Columns.Add("CveVenta", typeof(int)); TmpDT.Columns.Add("Consec", typeof(int)); TmpDT.Columns.Add("Cantidad", typeof(decimal)); TmpDT.Columns.Add("Codigo", typeof(string)); TmpDT.Columns.Add("CveUM", typeof(int)); TmpDT.Columns.Add("UM", typeof(string)); TmpDT.Columns.Add("SATClaveUM", typeof(string)); TmpDT.Columns.Add("CveClasificacion", typeof(int)); TmpDT.Columns.Add("Clasificacion", typeof(string)); TmpDT.Columns.Add("CvePS", typeof(int)); TmpDT.Columns.Add("PS", typeof(string)); TmpDT.Columns.Add("CodigoPS", typeof(string)); TmpDT.Columns.Add("SATClaveProdServ", typeof(string)); TmpDT.Columns.Add("NoIdentificacion", typeof(string)); TmpDT.Columns.Add("CveTipoPS", typeof(int)); TmpDT.Columns.Add("CveTipoInvPS", typeof(int)); TmpDT.Columns.Add("SerieLote", typeof(string)); TmpDT.Columns.Add("CuentaPredial", typeof(string)); TmpDT.Columns.Add("Obs", typeof(string)); TmpDT.Columns.Add("TiempoEntrega", typeof(string)); TmpDT.Columns.Add("PU", typeof(decimal)); TmpDT.Columns.Add("IVA", typeof(decimal)); TmpDT.Columns.Add("ImporteIVA", typeof(decimal)); TmpDT.Columns.Add("PorcentajeIVA", typeof(decimal)); TmpDT.Columns.Add("ImporteRetIVA", typeof(decimal)); TmpDT.Columns.Add("ImporteRetISR", typeof(decimal)); TmpDT.Columns.Add("PorcentajeRetIVA", typeof(decimal)); TmpDT.Columns.Add("PorcentajeRetISR", typeof(decimal)); TmpDT.Columns.Add("ImporteIEPS", typeof(decimal)); TmpDT.Columns.Add("IEPS", typeof(decimal)); TmpDT.Columns.Add("PorcentajeIEPS", typeof(decimal)); TmpDT.Columns.Add("Descuento", typeof(decimal)); TmpDT.Columns.Add("TipoDescuento", typeof(int)); TmpDT.Columns.Add("TotalImporte", typeof(decimal)); TmpDT.Columns.Add("Total", typeof(decimal)); // Para uso del módulo contable TmpDT.Columns.Add("AsientoContableVentas", typeof(int)); TmpDT.Columns.Add("IdCtaContVentas", typeof(int)); TmpDT.Columns.Add("AplicaParaConcepto", typeof(bool)); TmpDT.Columns.Add("CveProyecto", typeof(int)); TmpDT.Columns.Add("Proyecto", typeof(string)); TmpDT.Columns.Add("CveSubProyecto", typeof(int)); TmpDT.Columns.Add("SubProyecto", typeof(string)); // TipoDescuento: 1 = Descuento * PU; 2 = Descuento por Total del concepto TmpDT.Columns.Add("CvePresupuestoIngreso", typeof(int)); TmpDT.Columns.Add("CveFuenteRecaudacion", typeof(int)); // Contratos TmpDT.Columns.Add("CveContratoDetalle", typeof(int)); // Remisiones a Facturas TmpDT.Columns.Add("CveVentaDetalle", typeof(int)); TmpDT.Columns.Add("CveVentaDetalleRemision", typeof(int)); TmpDT.Columns.Add("CveVentaDetalleCotizacion", typeof(int)); // Pedido2 a Facturas TmpDT.Columns.Add("CveVentaDetallePedido2", typeof(int)); TmpDT.Columns.Add("Origen", typeof(int)); // Ordenes Servicio TmpDT.Columns.Add("CveOS", typeof(int)); TmpDT.Columns.Add("CveOSDetalle", typeof(int)); TmpDT.Columns.Add("SeFacturara", typeof(int)); TmpDT.Columns.Add("Folio", typeof(int)); TmpDT.Columns.Add("Estatus", typeof(string)); // Ordenamiento TmpDT.Columns.Add("Orden", typeof(int)); TmpDT.Columns.Add("TipoDocto", typeof(string)); // OC TmpDT.Columns.Add("CveOrdenCompraDetalle", typeof(int)); TmpDT.Columns.Add("EntregaDirecta", typeof(int)); TmpDT.Columns.Add("CveMovimientoDetallePedido", typeof(int)); TmpDT.Columns.Add("CantidadFacturadaRem", typeof(decimal)); TmpDT.Columns.Add("CantidadFacturadaCot", typeof(decimal)); TmpDT.Columns.Add("CantidadInventario", typeof(decimal)); TmpDT.Columns.Add("ClaveSATFraccionArancelaria", typeof(string)); TmpDT.Columns.Add("ClaveSATUnidadAduana", typeof(string)); TmpDT.Columns.Add("ClaveSATFraccionArancelariaDescripcion", typeof(string)); TmpDT.Columns.Add("ClaveSATUnidadAduanaDescripcion", typeof(string)); TmpDT.Columns.Add("CveTamaño", typeof(int)); #endregion foreach (CFDIConcepto item in conceptos) { DataRow DrPS = null;// get_GlobalDTPS(UsuarioActual.CveEmpresa).FiltroPrimero(string.Format("PS ={0}",item.Descripcion)); DataRow DrSubProyecto = null; DataRow DrUmSat = null; DataRow DrUm = null; if (continuar) { using (ClsProductosServicios obj = new ClsProductosServicios()) { if (obj.GetPS(-1, -1, UsuarioActual.CveEmpresa, PS: item.Descripcion) && obj.DtResultados.Rows.Count > 0) { DrPS = obj.DtResultados.Rows[0]; } else if (obj.GetPS(CvePsReconstruccion, -1, UsuarioActual.CveEmpresa) && obj.DtResultados.Rows.Count > 0) { DrPS = obj.DtResultados.Rows[0]; } } DrSubProyecto = get_GlobalDTSubProyectos(-1, CveSubProyecto, UsuarioActual.CveEmpresa).Rows[0]; if (objxml.comprobante.Version == "3.2") { item.ClaveUnidad = item.Unidad; switch (item.ClaveUnidad) { case "TON": item.ClaveUnidad = "A75"; break; case "No aplica": item.ClaveUnidad = "ACT"; break; case "LITROS": item.ClaveUnidad = "E32"; break; case "M3-KM": item.ClaveUnidad = "M73"; break; } } DrUmSat = GlobalDTPSATUM.FiltroPrimero(string.Format("SATClaveUnidadMedida='{0}'", item.ClaveUnidad)); } if (continuar && DrUmSat == null) { continuar = false; strErrores.AppendLine($"No se encontro la unidad de medida en el catalogo del sat '{item.ClaveUnidad}', favor de contactar a soporte tecnico."); } if (continuar) { DrUm = get_GlobalDTUnidadesMedida(UsuarioActual.CveEmpresa).FiltroPrimero(string.Format("CveUnidadMedidaSAT={0}", DrUmSat["CveSATUnidadMedida"])); } if (continuar && DrUm == null) { continuar = false; strErrores.AppendLine($"No se encontro la unidad de medida relacionada a la clave del sat '{item.ClaveUnidad}', favor de asignarla en el catalogo de unidad de medida."); } if (continuar) { //no se encontro una undidad de medida para DataRow Row = TmpDT.NewRow(); Row["CveProyecto"] = DrSubProyecto["CveProyecto"].ToString().ToEntero(); Row["Proyecto"] = DrSubProyecto["Proyecto"].ToString(); Row["CveSubProyecto"] = CveSubProyecto; Row["SubProyecto"] = DrSubProyecto["SubProyecto"].ToString(); Row["SerieLote"] = ""; Row["TiempoEntrega"] = ""; Row["Orden"] = TmpDT.Rows.Count + 1; Row["Cantidad"] = item.Cantidad; Row["CveUM"] = DrUm["CveUnidadMedida"]; Row["UM"] = DrUm["UnidadMedida"]; Row["CveClasificacion"] = DrPS["CveClasificacion"]; Row["Clasificacion"] = DrPS["Clasificacion"]; Row["CvePS"] = DrPS["CvePS"]; Row["Obs"] = item.Descripcion; //TotalCalculableImpuestos = (Cantidad * PU) - Descuento; Row["PU"] = item.ValorUnitario; Row["Codigo"] = DrPS["Codigo"]; Row["NoIdentificacion"] = DrPS["Codigo"]; Row["ClaveSATFraccionArancelaria"] = DrPS["ClaveSATFraccionArancelaria"]; Row["ClaveSATUnidadAduana"] = DrPS["ClaveSATUnidadAduana"]; Row["ClaveSATFraccionArancelariaDescripcion"] = DrPS["ClaveSATFraccionArancelariaDescripcion"]; Row["ClaveSATUnidadAduanaDescripcion"] = DrPS["ClaveSATUnidadAduanaDescripcion"]; Row["Consec"] = TmpDT.Rows.Count + 1; Row["PS"] = item.Descripcion; Row["CodigoPS"] = DrPS["PSCodigo"].ToString(); Row["CveTipoPS"] = DrPS["CveTipoPS"]; Row["CveTipoInvPS"] = DrPS["Inv_CveMetodoInventario"]; Row["CveTamaño"] = DrPS["CveTamaño"]; CFDIConceptoImpuesto impuesto = item.Impuestos.FirstOrDefault(x => x.Impuesto == "002" && x.Tipo == "Traslado"); decimal sumaimpuesto = 0; decimal PorcentajeIVA = 0; if (impuesto != null) { decimal decimpuesto = 0; decimal.TryParse(impuesto.TasaOCuota, out decimpuesto); PorcentajeIVA = decimpuesto / 100; Row["PorcentajeIVA"] = PorcentajeIVA; Row["ImporteIVA"] = impuesto.Importe;// impuesto.Importe;//Math.Round(item.Importe * (decimpuesto/100), 2); sumaimpuesto += impuesto.Importe; } else { Row["PorcentajeIVA"] = 0; Row["ImporteIVA"] = 0; if (objxml.comprobante.Version == "3.2") { if (item.Importe > 0) { PorcentajeIVA = .16M; Row["PorcentajeIVA"] = PorcentajeIVA; Row["ImporteIVA"] = item.Importe * PorcentajeIVA;//Math.Round(((item.Importe / (1 + PorcentajeIVA))*.16M),2); } } } Row["IVA"] = Row["ImporteIVA"]; impuesto = item.Impuestos.FirstOrDefault(x => x.Impuesto == "003" && x.Tipo == "Traslado"); if (impuesto != null) { decimal decimpuesto = 0; decimal.TryParse(impuesto.TasaOCuota, out decimpuesto); Row["PorcentajeIEPS"] = decimpuesto / 100; Row["ImporteIEPS"] = impuesto.Importe; Row["IEPS"] = impuesto.Importe; sumaimpuesto += impuesto.Importe; } else { Row["PorcentajeIEPS"] = 0; Row["ImporteIEPS"] = 0; Row["IEPS"] = 0; } impuesto = item.Impuestos.FirstOrDefault(x => x.Impuesto == "001" && x.Tipo == "Retencion"); if (impuesto != null) { decimal decimpuesto = 0; decimal.TryParse(impuesto.TasaOCuota, out decimpuesto); Row["PorcentajeRetISR"] = decimpuesto / 100; Row["ImporteRetISR"] = impuesto.Importe; sumaimpuesto -= impuesto.Importe; } else { Row["ImporteRetISR"] = 0; Row["PorcentajeRetISR"] = 0; } impuesto = item.Impuestos.FirstOrDefault(x => x.Impuesto == "002" && x.Tipo == "Retencion"); if (impuesto != null) { decimal decimpuesto = 0; decimal.TryParse(impuesto.TasaOCuota, out decimpuesto); Row["PorcentajeRetIVA"] = decimpuesto / 100; Row["ImporteRetIVA"] = impuesto.Importe; sumaimpuesto -= impuesto.Importe; } else { Row["ImporteRetIVA"] = 0; Row["PorcentajeRetIVA"] = 0; } Row["Descuento"] = item.Descuento; Row["TipoDescuento"] = "2"; //Row["Total"] = item.Importe - sumaimpuesto; Row["Total"] = item.Importe / (1 + PorcentajeIVA); Row["TotalImporte"] = item.Importe; Row["SATClaveProdServ"] = item.ClaveProdServ; Row["SATClaveUM"] = item.ClaveUnidad; Row["EntregaDirecta"] = "-1"; // Contratos Row["CveContratoDetalle"] = -1; Row["CveVentaDetalle"] = -1; Row["CveMovimientoDetallePedido"] = -1; Row["CveOrdenCompraDetalle"] = -1; Row["CveVentaDetalleRemision"] = -1; Row["CveVentaDetalleCotizacion"] = -1; Row["CveVentaDetallePedido2"] = -1; Row["CuentaPredial"] = item.CuentaPredial; TmpDT.Rows.Add(Row); } } return TmpDT; } protected void LnkAceptarDefault_Click(object sender, EventArgs e) { RegistraScript("$('#DModalDefaults').modal('hide');"); registrarventa((GridViewRow)CurrentRow); //foreach (GridViewRow gvrow in GVConciliacionemitidasSAT.Rows) //{ // registrarventa(gvrow); //} } protected void BtnConsultar_Click(object sender, EventArgs e) { CargaRepConciliacionSatGET(); } protected void GVConciliacionemitidasSAT_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { string navurl = ""; if (e.Row.DBCampo("Tipo") == "1") { string RutaXml = e.Row.DBCampo("RutaXml"); //if (RutaXml.IndexOf("Empresas")>0) //{ // RutaXml = RutaXml.Substring(RutaXml.IndexOf("Empresas")); //} navurl = string.Format("RepConciliacionEmitidosSat.aspx?op={0}", Extensiones.ModExtensiones.Encripta(e.Row.DataKey("RutaXml"))); } else { navurl = string.Format("/Compras/PopUpVerFactura.aspx?P={0}", Extensiones.ModExtensiones.Encripta(String.Format("OP=FactVta&CVEVENTA={0}&EXT={1}&SERIEFOLIO={2}&TIPODOCTO={3}", e.Row.DBCampo("CveVenta"), "XML", e.Row.DBCampo("SerieFolio"), e.Row.DBCampo("TipoDocto")))); } e.Row.FCHyperLink("HypXml").NavigateUrl = navurl; } //String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=FactVta&CVEVENTA={0}&EXT={1}&SERIEFOLIO={2}&TIPODOCTO={3}", CveVenta, "XML", DbRowVenta("SerieFolio"), DbRowVenta("TipoDocto")))) } } namespace ADSistemaLibrary2.SatXml { public class XmlSatCFDI { public XmlSatCFDI() { comprobante = new CFDIComprobante(); emisor = new CFDIEmisor(); receptor = new CFDIReceptor(); complemento = new CFDIComplemento(); cFDIRelacionados = new List(); conceptos = new List(); Impuestos = new List(); } public CFDIComprobante comprobante; public CFDIEmisor emisor; public CFDIReceptor receptor; public CFDIComplemento complemento; public List cFDIRelacionados; public List conceptos; public List Impuestos; public List GetConceptosforpdf() { List lcon = new List(); if (conceptos != null) { int _orden = 0; foreach (CFDIConcepto item in conceptos) { _orden += 1; CFDIConcepto_I con = new CFDIConcepto_I { tipo = 1, orden = _orden, ClaveProdServ = item.ClaveProdServ, NoIdentificacion = item.NoIdentificacion, Cantidad = item.Cantidad, ClaveUnidad = item.ClaveUnidad, Unidad = item.Unidad, ValorUnitario = item.ValorUnitario, Importe = item.Importe, Descuento = item.Descuento, NumeroPedimento = item.NumeroPedimento, CuentaPredial = item.CuentaPredial, Descripcion = item.Descripcion }; int index = 0; foreach (CFDIConceptoImpuesto Imp in item.Impuestos) { index++; if (index > 1) { lcon.Add(con); con = new CFDIConcepto_I { tipo = 2, orden = _orden, }; } con.Impuesto = Imp.ImpuestoTexto; con.Impuesto_Tipo = Imp.Tipo; con.Impuesto_Base = Imp.Base; con.Impuesto_TipoFactor = Imp.TipoFactor; con.Impuesto_TasaOCuota = Imp.TasaOCuota; con.Impuesto_Importe = Imp.Importe; } lcon.Add(con); } } return lcon; } public static XmlSatCFDI readXML(string fileUrl) { XmlSatCFDI xmlCFDI = new XmlSatCFDI(); bool canread = true; //keys string keyComprobante = "Comprobante"; string keyCfdiRelacionados = "CfdiRelacionados"; string keyEmisor = "Emisor"; string keyReceptor = "Receptor"; string keyConceptos = "Conceptos"; string keyImpuestos = "Impuestos"; string keyComplemento = "Complemento"; //endkeys string[] PrimerNivel = new string[] { keyCfdiRelacionados, keyEmisor, keyReceptor, keyConceptos, keyImpuestos, keyComplemento }; //(canread = xtr.Read()) para evitar ciclos infinitos, todos los .Read() los guardo en la variable Canread y en los while reviso primero esta variable if (File.Exists(fileUrl)) { XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; settings.IgnoreComments = true; using (XmlReader xtr = XmlReader.Create(fileUrl, settings)) { while ((canread = xtr.Read()) && !(xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:","") == keyComprobante)) { //if (xtr.NodeType != XmlNodeType.Element) { while (xtr.Read() && xtr.NodeType != XmlNodeType.Element) { } } } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyComprobante) { int Nivel = xtr.Depth; bool cont = xtr.MoveToFirstAttribute(); while (cont) { switch (xtr.Name.ToUpper()) { case "XMLNS:CFDI": xmlCFDI.comprobante.xmlns_cfdi = xtr.Value; break; case "XMLNS:XSI": xmlCFDI.comprobante.xmlns_xsi = xtr.Value; break; case "XSI:SCHEMALOCATION": xmlCFDI.comprobante.xsi_schemaLocation = xtr.Value; break; case "VERSION": xmlCFDI.comprobante.Version = xtr.Value; break; case "SERIE": xmlCFDI.comprobante.Serie = xtr.Value; break; case "FOLIO": xmlCFDI.comprobante.Folio = xtr.Value; break; case "FECHA": xmlCFDI.comprobante.Fecha = xtr.Value; break; case "MONEDA": xmlCFDI.comprobante.Moneda = xtr.Value; break; case "SUBTOTAL": decimal SubTotal = 0; decimal.TryParse(xtr.Value, out SubTotal); xmlCFDI.comprobante.SubTotal = SubTotal; break; case "TOTAL": decimal Total = 0; decimal.TryParse(xtr.Value, out Total); xmlCFDI.comprobante.Total = Total; break; case "DESCUENTO": decimal Descuento = 0; decimal.TryParse(xtr.Value, out Descuento); xmlCFDI.comprobante.Descuento = Descuento; break; case "TIPOCAMBIO": decimal TipoCambio = 0; decimal.TryParse(xtr.Value, out TipoCambio); xmlCFDI.comprobante.TipoCambio = TipoCambio; break; case "TIPODECOMPROBANTE": xmlCFDI.comprobante.TipoDeComprobante = xtr.Value; break; case "FORMAPAGO": xmlCFDI.comprobante.FormaPago = xtr.Value; break; case "FORMADEPAGO": xmlCFDI.comprobante.FormaPago = xtr.Value; break; case "METODOPAGO": xmlCFDI.comprobante.MetodoPago = xtr.Value; break; case "METODODEPAGO": xmlCFDI.comprobante.MetodoPago = xtr.Value; break; case "CONDICIONESDEPAGO": xmlCFDI.comprobante.CondicionesDePago = xtr.Value; break; case "LUGAREXPEDICION": xmlCFDI.comprobante.LugarExpedicion = xtr.Value; break; case "CONFIRMACION": xmlCFDI.comprobante.Confirmacion = xtr.Value; break; case "NOCERTIFICADO": xmlCFDI.comprobante.NoCertificado = xtr.Value; break; case "SELLO": xmlCFDI.comprobante.Sello = xtr.Value; break; case "CERTIFICADO": xmlCFDI.comprobante.Certificado = xtr.Value; break; } cont = xtr.MoveToNextAttribute(); } cont = xtr.MoveToFirstAttribute(); while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > Nivel) { if (PrimerNivel.Contains(xtr.Name.Replace("cfdi:", ""))) { if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyCfdiRelacionados) { int cDepth = xtr.Depth; string TipoRelacion = null; cont = xtr.MoveToFirstAttribute(); while (cont) { switch (xtr.Name.ToUpper()) { case "TIPORELACION": TipoRelacion = xtr.Value; break; } cont = xtr.MoveToNextAttribute(); } while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepth) { if (xtr.Name.Replace("cfdi:", "") == "CfdiRelacionado") { CFDIRelacionado cfdir = new CFDIRelacionado(); cfdir.TipoRelacion = TipoRelacion; cfdir.UUID = xtr.GetAttribute("UUID"); xmlCFDI.cFDIRelacionados.Add(cfdir); } while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyEmisor) { int curentNivel = xtr.Depth; cont = xtr.MoveToFirstAttribute(); while (cont) { switch (xtr.Name.ToUpper()) { case "REGIMENFISCAL": xmlCFDI.emisor.RegimenFiscal = xtr.Value; break; case "NOMBRE": xmlCFDI.emisor.Nombre = xtr.Value; break; case "RFC": xmlCFDI.emisor.Rfc = xtr.Value; break; } cont = xtr.MoveToNextAttribute(); } while ((canread = xtr.Read()) && !(xtr.NodeType == XmlNodeType.Element && curentNivel >= xtr.Depth)) { }//continua hasta que no tenga nodos y (el nodo sea tipo elemnto y ete en el mismo nivel) } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyReceptor) { int curentNivel = xtr.Depth; cont = xtr.MoveToFirstAttribute(); while (cont) { switch (xtr.Name.ToUpper()) { case "RFC": xmlCFDI.receptor.Rfc = xtr.Value; break; case "NOMBRE": xmlCFDI.receptor.Nombre = xtr.Value; break; case "RESIDENCIAFISCAL": xmlCFDI.receptor.ResidenciaFiscal = xtr.Value; break; case "NUMREGIDTRIB": xmlCFDI.receptor.NumRegIdTrib = xtr.Value; break; case "USOCFDI": xmlCFDI.receptor.UsoCFDI = xtr.Value; break; } cont = xtr.MoveToNextAttribute(); } while ((canread = xtr.Read()) && !(xtr.NodeType == XmlNodeType.Element && curentNivel >= xtr.Depth)) { }//continua hasta que no tenga nodos y (el nodo sea tipo elemnto y ete en el mismo nivel) } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyConceptos) { int cDepth = xtr.Depth; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepth) { if (xtr.Name.Replace("cfdi:", "") == "Concepto") { int cDepthb = xtr.Depth; CFDIConcepto concepto = new CFDIConcepto(); cont = xtr.MoveToFirstAttribute(); while (cont) { switch (xtr.Name.ToUpper()) { case "CLAVEPRODSERV": concepto.ClaveProdServ = xtr.Value; break; case "NOIDENTIFICACION": concepto.NoIdentificacion = xtr.Value; break; case "CANTIDAD": concepto.Cantidad = xtr.Value; break; case "CLAVEUNIDAD": concepto.ClaveUnidad = xtr.Value; break; case "UNIDAD": concepto.Unidad = xtr.Value; break; case "VALORUNITARIO": decimal ValorUnitario = 0; decimal.TryParse(xtr.Value, out ValorUnitario); concepto.ValorUnitario = ValorUnitario; ; break; case "IMPORTE": decimal Importe = 0; decimal.TryParse(xtr.Value, out Importe); concepto.Importe = Importe; ; break; case "DESCUENTO": decimal DDescuento = 0; decimal.TryParse(xtr.Value, out DDescuento); concepto.Descuento = DDescuento; ; break; case "DESCRIPCION": concepto.Descripcion = xtr.Value; break; } cont = xtr.MoveToNextAttribute(); } xtr.MoveToFirstAttribute(); while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepthb) { if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == "Impuestos") { int cDepthc = xtr.Depth; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepthc) { if (xtr.Name.Replace("cfdi:", "") == "Traslado" || xtr.Name.Replace("cfdi:", "") == "Retencion") { CFDIConceptoImpuesto impuesto = new CFDIConceptoImpuesto(); impuesto.Impuesto = xtr.GetAttribute("Impuesto"); impuesto.Tipo = xtr.LocalName; decimal Base = 0; decimal.TryParse(xtr.GetAttribute("Base"), out Base); impuesto.Base = Base; impuesto.TipoFactor = xtr.GetAttribute("TipoFactor"); decimal tasaOCuota = 0; decimal.TryParse(xtr.GetAttribute("TasaOCuota"), out tasaOCuota); impuesto.TasaOCuota = impuesto.TipoFactor == "Tasa" ? (tasaOCuota * 100).ToString("N4") : xtr.GetAttribute("TasaOCuota"); decimal ImImporte = 0; decimal.TryParse(xtr.GetAttribute("Importe"), out ImImporte); impuesto.Importe = ImImporte; concepto.Impuestos.Add(impuesto); } while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } else { bool rednew = true; if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == "InformacionAduanera") { concepto.NumeroPedimento = xtr.GetAttribute("NumeroPedimento"); rednew = false; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == "CuentaPredial") { concepto.CuentaPredial = xtr.GetAttribute("CuentaPredial"); rednew = false; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } if (rednew) { while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } } xmlCFDI.conceptos.Add(concepto); } } } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyImpuestos) { int cDepth = xtr.Depth; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepth) { CFDIImpuesto impuest = new CFDIImpuesto(); if (xtr.Name.Replace("cfdi:", "") == "Traslado" || xtr.Name.Replace("cfdi:", "") == "Retencion" && xmlCFDI.comprobante.Version != null) { impuest.Tipo = xtr.LocalName == "Traslado" ? "Traslados" : (xtr.LocalName == "Retencion" ? "Retenciones" : ""); impuest.Impuesto = xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("Impuesto") : xtr.GetAttribute("impuesto"); impuest.TipoFactor = xtr.GetAttribute("TipoFactor"); impuest.TasaOCuota = xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("TasaOCuota") : xtr.GetAttribute("tasa"); decimal ImImporte = 0; decimal.TryParse((xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("Importe") : xtr.GetAttribute("importe")), out ImImporte); impuest.Importe = ImImporte; xmlCFDI.Impuestos.Add(impuest); } while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } if (xtr.NodeType == XmlNodeType.Element && xtr.Name.Replace("cfdi:", "") == keyComplemento) { int cDepth = xtr.Depth; while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > cDepth) { if (xtr.NodeType == XmlNodeType.Element && xtr.LocalName == "TimbreFiscalDigital" && xmlCFDI.comprobante.Version != null) { xmlCFDI.complemento.xmlns_tfd = xtr.GetAttribute("xmlns:tfd"); xmlCFDI.complemento.xsi_schemaLocation = xtr.GetAttribute("xsi:schemaLocation"); xmlCFDI.complemento.Version = xtr.GetAttribute("Version"); xmlCFDI.complemento.UUID = xtr.GetAttribute("UUID"); xmlCFDI.complemento.FechaTimbrado = xtr.GetAttribute("FechaTimbrado"); xmlCFDI.complemento.RfcProvCertif = xtr.GetAttribute("RfcProvCertif"); xmlCFDI.complemento.SelloCFD = xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("SelloCFD") : xtr.GetAttribute("selloCFD"); xmlCFDI.complemento.NoCertificadoSAT = xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("NoCertificadoSAT") : xtr.GetAttribute("noCertificadoSAT"); xmlCFDI.complemento.SelloSAT = xmlCFDI.comprobante.Version == "3.3" ? xtr.GetAttribute("SelloSAT") : xtr.GetAttribute("selloSAT"); } if (xtr.NodeType == XmlNodeType.Element && xtr.LocalName == "Pagos" && xmlCFDI.comprobante.Version != null) { while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } xmlCFDI.complemento.Pagos = new CFDIPago(); int depthpagos = xtr.Depth; bool conts = xtr.MoveToFirstAttribute(); while (conts) { decimal Base = 0; switch (xtr.Name.ToUpper()) { case "FECHAPAGO": xmlCFDI.complemento.Pagos.FechaPago = xtr.Value; break; case "FORMADEPAGOP": xmlCFDI.complemento.Pagos.FormaDePagoP = xtr.Value; break; case "FORMADEPAGOPTEXT": xmlCFDI.complemento.Pagos.FormaDePagoPText = xtr.Value; break; case "MONEDAP": xmlCFDI.complemento.Pagos.MonedaP = xtr.Value; break; case "MONTO": decimal.TryParse(xtr.Value, out Base); xmlCFDI.complemento.Pagos.Monto = Base; break; case "TIPOCAMBIOP": decimal.TryParse(xtr.Value, out Base); xmlCFDI.complemento.Pagos.TipoCambioP = Base; break; case "NUMOPERACION": xmlCFDI.complemento.Pagos.NumOperacion = xtr.Value; break; case "NOMBANCOORDEXT": xmlCFDI.complemento.Pagos.NomBancoOrdExt = xtr.Value; break; case "RFCEMISORCTAORD": xmlCFDI.complemento.Pagos.RfcEmisorCtaOrd = xtr.Value; break; case "CTAORDENANTE": xmlCFDI.complemento.Pagos.CtaOrdenante = xtr.Value; break; case "RFCEMISORCTABEN": xmlCFDI.complemento.Pagos.RfcEmisorCtaBen = xtr.Value; break; case "CTABENEFICIARIO": xmlCFDI.complemento.Pagos.CtaBeneficiario = xtr.Value; break; } conts = xtr.MoveToNextAttribute(); } conts = xtr.MoveToFirstAttribute(); while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } while (canread && xtr.Depth > depthpagos) { CFDIPagoDoctoRelacionado objpago = new CFDIPagoDoctoRelacionado(); conts = xtr.MoveToFirstAttribute(); while (conts) { decimal Basep = 0; switch (xtr.Name.ToUpper()) { case "IDDOCUMENTO": objpago.IdDocumento = xtr.Value; break; case "SERIE": objpago.Serie = xtr.Value; break; case "FOLIO": objpago.Folio = xtr.Value; break; case "MONEDADR": objpago.MonedaDR = xtr.Value; break; case "METODODEPAGODR": objpago.MetodoDePagoDR = xtr.Value; break; case "NUMPARCIALIDAD": objpago.NumParcialidad = xtr.Value; break; case "IMPSALDOANT": decimal.TryParse(xtr.Value, out Basep); objpago.ImpSaldoAnt = Basep; break; case "IMPPAGADO": decimal.TryParse(xtr.Value, out Basep); objpago.ImpPagado = Basep; break; case "IMPSALDOINSOLUTO": decimal.TryParse(xtr.Value, out Basep); objpago.ImpSaldoInsoluto = Basep; break; } conts = xtr.MoveToNextAttribute(); } conts = xtr.MoveToFirstAttribute(); xmlCFDI.complemento.Pagos.doctosRelacionados.Add(objpago); while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } else { while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } } } else { //si no entro en ninguna de los anteriores no se debe ciclar while ((canread = xtr.Read()) && xtr.NodeType != XmlNodeType.Element) { } } } } } } if (xmlCFDI.comprobante.Version == "3.3" || xmlCFDI.comprobante.Version == "3.2") { return xmlCFDI; } else { return null; } } public class utilValores { public utilValores(string nombre, string valor) { Nombre = nombre; Valor = valor; } public string Nombre { get; set; } public string Valor { get; set; } } public class utilImage { public utilImage(byte[] imagenByte) { ImagenByte = imagenByte; } public byte[] ImagenByte { get; set; } } } public class CFDIComplemento { public string xmlns_tfd { get; set; } public string xsi_schemaLocation { get; set; } public string Version { get; set; } public string UUID { get; set; } public string FechaTimbrado { get; set; } public string RfcProvCertif { get; set; } public string SelloCFD { get; set; } public string NoCertificadoSAT { get; set; } public string SelloSAT { get; set; } public CFDIPago Pagos { get; set; } public string CadenaOriginal { get { return string.Format("||{0}|{1}|{2}|{3}|{4}|{5}||", Version, UUID, FechaTimbrado, RfcProvCertif, SelloCFD, NoCertificadoSAT); } } } public class CFDIComprobante { public string xmlns_cfdi { get; set; } public string xmlns_xsi { get; set; } public string xsi_schemaLocation { get; set; } public string Version { get; set; } public string Serie { get; set; } public string Folio { get; set; } public string Fecha { get; set; } public string Moneda { get; set; } public decimal SubTotal { get; set; } public decimal Total { get; set; } public decimal Descuento { get; set; } public decimal TipoCambio { get; set; } public string TipoDeComprobante { get; set; } public string TipoDeComprobanteSIG { get { string retorno = ""; if (Version == "3.3") { switch (TipoDeComprobante) { case "I": retorno = "Ing"; break; case "E": retorno = "Egs"; break; case "P": retorno = "PA"; break; //case "T": // retorno = "Traslado"; // break; //case "N": // retorno = "Nómina"; // break; default: break; } } else if (Version == "3.2") { switch (TipoDeComprobante) { case "ingreso": retorno = "Ing"; break; case "egreso": retorno = "Egs"; break; case "P": retorno = "PA"; break; //case "T": // retorno = "Traslado"; // break; //case "N": // retorno = "Nómina"; // break; default: break; } } else { retorno = TipoDeComprobante; } return retorno; } } public string TipoDeComprobanteTexto { get { string retorno = ""; if (Version == "3.3") { switch (TipoDeComprobante) { case "I": retorno = "Ingreso"; break; case "E": retorno = "Egreso"; break; case "P": retorno = "Pago"; break; case "T": retorno = "Traslado"; break; case "N": retorno = "Nómina"; break; default: retorno = TipoDeComprobante; break; } } else if (Version == "3.2") { switch (TipoDeComprobante) { case "ingreso": retorno = "Ing"; break; case "egreso": retorno = "Egs"; break; case "P": retorno = "PA"; break; //case "T": // retorno = "Traslado"; // break; //case "N": // retorno = "Nómina"; // break; default: retorno = TipoDeComprobante; break; } } else { retorno = TipoDeComprobante; } return retorno; } } public string FormaPago { get; set; } public string FormaPagoTexto { get { string retorno = ""; switch (FormaPago) { case "01": retorno = "Efectivo"; break; case "02": retorno = "Cheque nominativo"; break; case "03": retorno = "Transferencia electrónica de fondos"; break; case "04": retorno = "Tarjeta de crédito"; break; case "05": retorno = "Monedero electrónico"; break; case "06": retorno = "Dinero electrónico"; break; case "08": retorno = "Vales de despensa"; break; case "12": retorno = "Dación en pago"; break; case "13": retorno = "Pago por subrogación"; break; case "14": retorno = "Pago por consignación"; break; case "15": retorno = "Condonación"; break; case "17": retorno = "Compensación"; break; case "23": retorno = "Novación"; break; case "24": retorno = "Confusión"; break; case "25": retorno = "Remisión de deuda"; break; case "26": retorno = "Prescripción o caducidad"; break; case "27": retorno = "A satisfacción del acreedor"; break; case "28": retorno = "Tarjeta de débito"; break; case "29": retorno = "Tarjeta de servicios"; break; case "30": retorno = "Aplicación de anticipos"; break; case "31": retorno = "Intermediario pagos"; break; case "99": retorno = "Por definir"; break; default: retorno = FormaPago; break; } return retorno; } } public string MetodoPago { get; set; } public string MetodoPagoTexto { get { string retorno = ""; switch (MetodoPago) { case "PUE": retorno = "Pago en una sola exhibición"; break; case "PPD": retorno = "Pago en parcialidades o diferido"; break; default: retorno = MetodoPago; break; } return retorno; } } public string CondicionesDePago { get; set; } public string LugarExpedicion { get; set; } public string Confirmacion { get; set; } public string NoCertificado { get; set; } public string Sello { get; set; } public string Certificado { get; set; } } public class CFDIConcepto { public CFDIConcepto() { Impuestos = new List(); } public string ClaveProdServ { get; set; } public string NoIdentificacion { get; set; } public string Cantidad { get; set; } public string ClaveUnidad { get; set; } public string Unidad { get; set; } public decimal ValorUnitario { get; set; } public decimal Importe { get; set; } public decimal Descuento { get; set; } public string NumeroPedimento { get; set; } public string CuentaPredial { get; set; } public string Descripcion { get; set; } public List Impuestos { get; set; } } public class CFDIConcepto_I { public int tipo { get; set; } public int orden { get; set; } public string ClaveProdServ { get; set; } public string NoIdentificacion { get; set; } public string Cantidad { get; set; } public string ClaveUnidad { get; set; } public string Unidad { get; set; } public decimal ValorUnitario { get; set; } public decimal Importe { get; set; } public decimal Descuento { get; set; } public string NumeroPedimento { get; set; } public string CuentaPredial { get; set; } public string Descripcion { get; set; } public string Impuesto { get; set; } public string Impuesto_Tipo { get; set; } public decimal Impuesto_Base { get; set; } public string Impuesto_TipoFactor { get; set; } public string Impuesto_TasaOCuota { get; set; } public decimal Impuesto_Importe { get; set; } } public class CFDIConceptoImpuesto { public string Impuesto { get; set; } public string ImpuestoTexto { get { string retorno = ""; switch (Impuesto) { case "001": retorno = "ISR"; break; case "002": retorno = "IVA"; break; case "003": retorno = "IEPS"; break; } return retorno; } } public string Tipo { get; set; } public decimal Base { get; set; } public string TipoFactor { get; set; } public string TasaOCuota { get; set; } public decimal Importe { get; set; } } public class CFDIEmisor { public string RegimenFiscal { get; set; } public string RegimenFiscalTexto { get { string retorno = ""; switch (RegimenFiscal) { case "601": retorno = "General de Ley Personas Morales"; break; case "603": retorno = "Personas Morales con Fines no Lucrativos"; break; case "605": retorno = "Sueldos y Salarios e Ingresos Asimilados a Salarios"; break; case "606": retorno = "Arrendamiento"; break; case "608": retorno = "Demás ingresos"; break; case "609": retorno = "Consolidación"; break; case "610": retorno = "Residentes en el Extranjero sin Establecimiento Permanente en México"; break; case "611": retorno = "Ingresos por Dividendos (socios y accionistas)"; break; case "612": retorno = "Personas Físicas con Actividades Empresariales y Profesionales"; break; case "614": retorno = "Ingresos por intereses"; break; case "616": retorno = "Sin obligaciones fiscales"; break; case "620": retorno = "Sociedades Cooperativas de Producción que optan por diferir sus ingresos"; break; case "621": retorno = "Incorporación Fiscal"; break; case "622": retorno = "Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras"; break; case "623": retorno = "Opcional para Grupos de Sociedades"; break; case "624": retorno = "Coordinados"; break; case "628": retorno = "Hidrocarburos"; break; case "607": retorno = "Régimen de Enajenación o Adquisición de Bienes"; break; case "629": retorno = "De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales"; break; case "630": retorno = "Enajenación de acciones en bolsa de valores"; break; case "615": retorno = "Régimen de los ingresos por obtención de premios"; break; } return retorno; } } public string Nombre { get; set; } public string Rfc { get; set; } } public class CFDIImpuesto { public string Tipo { get; set; } public string Impuesto { get; set; } public string ImpuestoTexto { get { string retorno = ""; switch (Impuesto) { case "001": retorno = "ISR"; break; case "002": retorno = "IVA"; break; case "003": retorno = "IEPS"; break; } return retorno; } } public string TipoFactor { get; set; } public string TasaOCuota { get; set; } public decimal Importe { get; set; } } public class CFDIPago { public CFDIPago() { doctosRelacionados = new List(); } public string FechaPago { get; set; } public string FormaDePagoP { get; set; } public string FormaDePagoPText { get; set; } public string MonedaP { get; set; } public decimal Monto { get; set; } public decimal TipoCambioP { get; set; } public string NumOperacion { get; set; } public string NomBancoOrdExt { get; set; } public string RfcEmisorCtaOrd { get; set; } public string CtaOrdenante { get; set; } public string RfcEmisorCtaBen { get; set; } public string CtaBeneficiario { get; set; } public List doctosRelacionados { get; set; } } public class CFDIPagoDoctoRelacionado { public string IdDocumento { get; set; } public string Serie { get; set; } public string Folio { get; set; } public string MonedaDR { get; set; } public string MetodoDePagoDR { get; set; } public string NumParcialidad { get; set; } public decimal ImpSaldoAnt { get; set; } public decimal ImpPagado { get; set; } public decimal ImpSaldoInsoluto { get; set; } } public class CFDIReceptor { public string Rfc { get; set; } public string Nombre { get; set; } public string ResidenciaFiscal { get; set; } public string NumRegIdTrib { get; set; } public string UsoCFDI { get; set; } public string UsoCFDITexto { get { string retorno = "N/A"; switch (UsoCFDI) { case "G01": retorno = "Adquisición de mercancías"; break; case "G02": retorno = "Devoluciones, descuentos o bonificaciones"; break; case "G03": retorno = "Gastos en general"; break; case "I01": retorno = "Construcciones"; break; case "I02": retorno = "Mobiliario y equipo de oficina por inversiones"; break; case "I03": retorno = "Equipo de transporte"; break; case "I04": retorno = "Equipo de cómputo y accesorios"; break; case "I05": retorno = "Dados, troqueles, moldes, matrices y herramental"; break; case "I06": retorno = "Comunicaciones telefónicas"; break; case "I07": retorno = "Comunicaciones satelitales"; break; case "I08": retorno = "Otra maquinaria y equipo"; break; case "D01": retorno = "Honorarios médicos, dentales y gastos hospitalarios."; break; case "D02": retorno = "Gastos médicos por incapacidad o discapacidad"; break; case "D03": retorno = "Gastos funerales."; break; case "D04": retorno = "Donativos."; break; case "D05": retorno = "Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación)."; break; case "D06": retorno = "Aportaciones voluntarias al SAR."; break; case "D07": retorno = "Primas por seguros de gastos médicos."; break; case "D08": retorno = "Gastos de transportación escolar obligatoria."; break; case "D09": retorno = "Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones."; break; case "D10": retorno = "Pagos por servicios educativos (colegiaturas)"; break; case "P01": retorno = "Por definir"; break; default: break; } return retorno; } } } public class CFDIRelacionado { public string TipoRelacion { get; set; } public string TipoRelacionTexto { get { string retorno; switch (TipoRelacion) { case "01": retorno = "Nota de crédito de los documentos relacionados"; break; case "02": retorno = "Nota de débito de los documentos relacionados"; break; case "03": retorno = "Devolución de mercancía sobre facturas o traslados previos"; break; case "04": retorno = "Sustitución de los CFDI previos"; break; case "05": retorno = "Traslados de mercancias facturados previamente"; break; case "06": retorno = "Factura generada por los traslados previos"; break; case "07": retorno = "CFDI por aplicación de anticipo"; break; default: retorno = "Por definir"; break; } return retorno; } } public string UUID { get; set; } } }