Skip to main content

Descripción General

El módulo de Transparencia genera reportes en formato estandarizado para cumplir con la Ley General de Transparencia y Acceso a la Información Pública, específicamente el Artículo 70 sobre viajes nacionales e internacionales de funcionarios públicos.
Estos reportes contienen información pública que debe publicarse en el Portal de Transparencia de la institución.

Obligaciones de Transparencia

Conforme al Artículo 70, Fracción XXV de la Ley General de Transparencia, las instituciones públicas deben publicar:
  • Viajes nacionales e internacionales de funcionarios
  • Objetivo del viaje
  • Monto total erogado
  • Gastos de representación
  • Número de acompañantes
  • Informe de actividades

Acceso al Módulo

Navegue a Reportes > Transparencia desde el menú principal.
Generador de Reportes de Transparencia

Generación del Reporte

Interfaz Simplificada

El módulo de transparencia tiene una interfaz mínima por diseño:
<table id="Table1" border="2">
    <tr>
        <td colspan="2">
            <h2><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></h2>
        </td>
    </tr>
    <tr>
        <td align="left">
            <b><asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></b>
        </td>
        <td align="left">
            <asp:DropDownList ID="dplAnio" runat="server" Width="25%">
            </asp:DropDownList>
        </td>
    </tr>
    <tr>
        <td colspan="2" align="right">
            <asp:Button ID="btnGenerar" runat="server"
                Text="Generar Archivo de Transparencia" 
                OnClick="btnGenerar_Click" 
                OnClientClick="clickOnce(this, 'Espere este proceso puede tardar minutos')" 
                ValidationGroup="Procesar" 
                UseSubmitBehavior="false" />
        </td>
    </tr>
    <tr>
        <td style="text-align: center">
            <a runat="server" id="LnkReport" target="_blank" href="#">Reporte</a>
        </td>
        <td style="text-align: center">
            <a runat="server" id="linkdes" target="_blank" href="#">Anexo Reporte</a>
        </td>
    </tr>
</table>
1

Seleccionar Año Fiscal

Seleccione el ejercicio fiscal para el cual generará el reporte:
dplAnio.DataSource = MngNegocioAnio.ObtieneAnios();
dplAnio.DataTextField = Dictionary.DESCRIPCION;
dplAnio.DataValueField = Dictionary.CODIGO;
dplAnio.DataBind();
2

Generar Reporte

Haga clic en Generar Archivo de Transparencia. El proceso puede tardar varios minutos.
function clickOnce(btn, msg) {
    btn.value = msg;
    btn.disabled = true;
    return true;
}
El botón se desactiva automáticamente para prevenir múltiples ejecuciones.
3

Descargar Archivos

Una vez completado, aparecerán dos enlaces de descarga:
  • Reporte: Archivo principal de transparencia
  • Anexo Reporte: Detalle de partidas presupuestales

Estructura del Reporte Principal

Campos Requeridos

El reporte principal incluye 34 campos por cada comisión:
DataTable tableFinal = new DataTable();

tableFinal.Columns.Add("Ejercicio", typeof(String));
tableFinal.Columns.Add("Periodo que se informa", typeof(String));
tableFinal.Columns.Add("Tipo de integrante del sujeto obligado", typeof(String));
tableFinal.Columns.Add("Clave o nivel del puesto", typeof(String));
tableFinal.Columns.Add("Denominacion del puesto", typeof(String));
tableFinal.Columns.Add("Denominacion del cargo", typeof(String));
tableFinal.Columns.Add("Area de adscripción", typeof(String));
tableFinal.Columns.Add("Nombre(s)", typeof(String));
tableFinal.Columns.Add("Primer apellido", typeof(String));
tableFinal.Columns.Add("Segundo apellido", typeof(String));
tableFinal.Columns.Add("Denominacion del acto de respresentacion", typeof(String));
tableFinal.Columns.Add("Tipo de viaje", typeof(String));
tableFinal.Columns.Add("Numero de personas acompañantes.", typeof(String));
tableFinal.Columns.Add("Importe ejercido por el total de acompanantes", typeof(String));
tableFinal.Columns.Add("Pais origen", typeof(String));
tableFinal.Columns.Add("Estado origen", typeof(String));
tableFinal.Columns.Add("Ciudad origen", typeof(String));
tableFinal.Columns.Add("Pais destino", typeof(String));
tableFinal.Columns.Add("Estado destino", typeof(String));
tableFinal.Columns.Add("Ciudad destino", typeof(String));
tableFinal.Columns.Add("Motivo del encargo o comision", typeof(String));
tableFinal.Columns.Add("Salida del encargo o comision", typeof(String));
tableFinal.Columns.Add("Regreso del encargo o comision", typeof(String));
tableFinal.Columns.Add("Importe ejercido", typeof(String));
tableFinal.Columns.Add("Importe total ejercido erogado", typeof(String));
tableFinal.Columns.Add("Importe total de gastos no erogados", typeof(String));
tableFinal.Columns.Add("Hipervinculo al informe de la comision o encargo", typeof(String));
tableFinal.Columns.Add("Hipervinculo a las facturas o comprobantes", typeof(String));
tableFinal.Columns.Add("Hipervinculo a la normatividad", typeof(String));
tableFinal.Columns.Add("Fecha de validacion", typeof(String));
tableFinal.Columns.Add("area responsable de la informacion", typeof(String));
tableFinal.Columns.Add("Periodo", typeof(String));
tableFinal.Columns.Add("Fecha de actualizacion", typeof(String));
tableFinal.Columns.Add("Nota", typeof(String));

Lógica de Procesamiento

Obtención de Datos

El sistema obtiene todas las comisiones del año fiscal:
List<Comision> ListaComisiones = MngNegocioTransparencia.Obten_Lista_Comision(lsAnio);
List<RepTransparencia> ListTransparencia = new List<RepTransparencia>();

Iteración y Procesamiento

int Contador = 0;
bool bInsertar;
double GastosErogados;
double GastosNoErogados;
int ContadorAmp;

foreach (Comision RecLis in ListaComisiones)
{
    Contador++;
    GastosErogados = 0;
    GastosNoErogados = 0;
    bInsertar = true;
    ContadorAmp = 0;
    
    RepTransparencia ObjTrans = new RepTransparencia();
    
    // Verificar si es una ampliación
    foreach (Entidad Rec in ListArchivosAmpNueva)
    {
        if (Rec.Descripcion == RecLis.Archivo)
        {
            // Es ampliación, no insertar como registro principal
            bInsertar = false;
            break;
        }
        else if (Rec.Codigo == RecLis.Archivo)
        {
            // Tiene ampliaciones, sumar montos
            ContadorAmp++;
            GastosErogados += Convert.ToDouble(
                MngNegocioTransparencia.SumaImporteComprobado(Rec.Descripcion, true)
            );
            GastosNoErogados += Convert.ToDouble(
                MngNegocioTransparencia.SumaImporteComprobado(Rec.Descripcion)
            );
        }
    }
    
    if (bInsertar == true)
    {
        // Procesar comisión principal
        // ...
    }
}

Datos del Comisionado

// Obtener datos personales
Usuario DatosUsuario = MngNegocioUsuarios.Datos_Comisionado(
    RecLis.Comisionado, 
    RecLis.Ubicacion_Comisionado
);

// Datos laborales adicionales
Usuario DatosUsuarioExtra = MngNegocioTransparencia.Obten_DatosExtras(
    RecLis.Comisionado
);

// Información geográfica
Entidad DatosDep = MngNegocioTransparencia.Obtiene_Clv_CiudadEstado(
    RecLis.Ubicacion_Comisionado
);

// Limpiar caracteres especiales
string Objetivo = clsFuncionesGral.RemoveSpecialCharacters(RecLis.Objetivo);

Población de Campos

ObjTrans.Ejercicio = lsAnio;
ObjTrans.Periodo_Informe = Year;
ObjTrans.Tipo_Integrante = "EMPLEADO";
ObjTrans.Clave_NivelPuesto = clsFuncionesGral.RemoveSpecialCharacters(
    DatosUsuarioExtra.Nivel
);
ObjTrans.Denominacion_Puesto = clsFuncionesGral.RemoveSpecialCharacters(
    DatosUsuarioExtra.Puesto
);
ObjTrans.Denominacion_Cargo = clsFuncionesGral.RemoveSpecialCharacters(
    DatosUsuarioExtra.Cargo
);
ObjTrans.Area_Adscripcion = clsFuncionesGral.RemoveSpecialCharacters(
    MngNegocioDependencia.Centro_Descrip(RecLis.Ubicacion_Comisionado)
);
ObjTrans.Nombre = clsFuncionesGral.RemoveSpecialCharacters(DatosUsuario.Nombre);
ObjTrans.Primer_Pat = clsFuncionesGral.RemoveSpecialCharacters(DatosUsuario.ApPat);
ObjTrans.Segundo_Mat = clsFuncionesGral.RemoveSpecialCharacters(DatosUsuario.ApMat);
ObjTrans.Denominacion_Representacion = Objetivo;

Tipo de Viaje

if (RecLis.Territorio == "2")
{
    ObjTrans.Tipo_Viaje = "NACIONAL";
    ObjTrans.Pais_Destino = "MEXICO";
}
if (RecLis.Territorio == "3")
{
    ObjTrans.Tipo_Viaje = "INTERNACIONAL";
    ObjTrans.Pais_Destino = clsFuncionesGral.RemoveSpecialCharacters(RecLis.Lugar);
}

Campos Constantes

// Campos con valores fijos
ObjTrans.Num_PersonasAcompanantes = "CONSTANTE A CERO";
ObjTrans.ImporteEjercido_TotalAcompanantes = "CONSTANTE A CERO";
ObjTrans.Pais_Origen = "CONSTANTE A MEXICO";

Origen y Destino

ObjTrans.Estado_Origen = clsFuncionesGral.RemoveSpecialCharacters(
    MngNegocioDependencia.Obtiene_Descripcion_Estado(DatosDep.Descripcion)
);
ObjTrans.Ciudad_Origen = clsFuncionesGral.RemoveSpecialCharacters(
    MngNegocioDependencia.Obtiene_Descripcion_Cuidad(
        DatosDep.Codigo, 
        DatosDep.Descripcion
    )
);

ObjTrans.Estado_Destino = "";  // Null
ObjTrans.Ciudad_Destino = clsFuncionesGral.RemoveSpecialCharacters(RecLis.Lugar);
ObjTrans.Objetivo_comision = Objetivo;

Fechas y Montos

DateTime FechaI = Convert.ToDateTime(RecLis.Fecha_Inicio);
DateTime FechaF = Convert.ToDateTime(RecLis.Fecha_Final);
ObjTrans.Fecha_I = FechaI.ToString("dd-MM-yyyy");
ObjTrans.Fecha_F = FechaF.ToString("dd-MM-yyyy");

// Montos (incluyendo ampliaciones)
ObjTrans.Importe_Ejercido = Contador.ToString();
ObjTrans.Importe_Total_Erogado = (
    GastosErogados + Convert.ToDouble(
        MngNegocioTransparencia.SumaImporteComprobado(RecLis.Archivo, true)
    )
).ToString();
ObjTrans.Importe_Total_NoErogado = (
    GastosNoErogados + Convert.ToDouble(
        MngNegocioTransparencia.SumaImporteComprobado(RecLis.Archivo)
    )
).ToString();

Metadatos

ObjTrans.Hipervinculo_Informe = "";  // Null
ObjTrans.Hipervinculo_Facturas = Contador.ToString();
ObjTrans.Hipervinculo_Normatividad = "";  // Null
ObjTrans.Fecha_Validacion = "";  // Null
ObjTrans.Area_Responsable = "SUBDIRECCION DE RECURSOS FINANCIEROS";
ObjTrans.Periodo = lsAnio.ToString();
ObjTrans.Fecha_Actualizacion = lsHoy.ToString();

if (ContadorAmp != 0)
{
    ObjTrans.Nota = "ESTA COMISION CUANTA CON " + ContadorAmp.ToString() + 
                    " OFICIOS DE AMPLIACION";
}
else
{
    ObjTrans.Nota = "";
}

Reporte de Partidas Presupuestales

Estructura del Anexo

El anexo incluye el desglose por partida presupuestal:
DataTable tableFinalPartidas = new DataTable();

tableFinalPartidas.Columns.Add("ID", typeof(String));
tableFinalPartidas.Columns.Add("CLAVE DE LA PARTIDA", typeof(String));
tableFinalPartidas.Columns.Add("DENOMINACION DE LA PARTIDA", typeof(String));
tableFinalPartidas.Columns.Add("IMPORTE EJERCIDO", typeof(String));

Generación de Partidas

List<Transparencia_Partidas> ListaPartidas = new List<Transparencia_Partidas>();

// Para cada comisión, agregar partidas con monto > 0
if ((RecLis.Total_Viaticos != null) && (Convert.ToDouble(RecLis.Total_Viaticos) > 0))
{
    Transparencia_Partidas ObjPartidas = new Transparencia_Partidas();
    ObjPartidas.ID = Contador.ToString();
    ObjPartidas.Clv_PartidaConceptos = RecLis.Partida_Presupuestal.ToString();
    ObjPartidas.Importe = RecLis.Total_Viaticos.ToString();
    ObjPartidas.Clv_Denominacion_PartidaConcepto = clsFuncionesGral.RemoveSpecialCharacters(
        MngNegocioPartidas.ObtieneDescripcionPartida(RecLis.Partida_Presupuestal)
    );
    ListaPartidas.Add(ObjPartidas);
}

if ((RecLis.Combustible_Autorizado != null) && 
    (Convert.ToDouble(RecLis.Combustible_Autorizado) > 0))
{
    Transparencia_Partidas ObjPartidas = new Transparencia_Partidas();
    ObjPartidas.ID = Contador.ToString();
    ObjPartidas.Clv_PartidaConceptos = RecLis.Partida_Combustible.ToString();
    ObjPartidas.Importe = RecLis.Combustible_Autorizado.ToString();
    ObjPartidas.Clv_Denominacion_PartidaConcepto = clsFuncionesGral.RemoveSpecialCharacters(
        MngNegocioPartidas.ObtieneDescripcionPartida(RecLis.Partida_Combustible)
    );
    ListaPartidas.Add(ObjPartidas);
}

if ((RecLis.Peaje != null) && (Convert.ToDouble(RecLis.Peaje) > 0))
{
    Transparencia_Partidas ObjPartidas = new Transparencia_Partidas();
    ObjPartidas.ID = Contador.ToString();
    ObjPartidas.Clv_PartidaConceptos = RecLis.Partida_Peaje.ToString();
    ObjPartidas.Importe = RecLis.Peaje.ToString();
    ObjPartidas.Clv_Denominacion_PartidaConcepto = clsFuncionesGral.RemoveSpecialCharacters(
        MngNegocioPartidas.ObtieneDescripcionPartida(RecLis.Partida_Peaje)
    );
    ListaPartidas.Add(ObjPartidas);
}

if ((RecLis.Pasaje != null) && (Convert.ToDouble(RecLis.Pasaje) > 0))
{
    Transparencia_Partidas ObjPartidas = new Transparencia_Partidas();
    ObjPartidas.ID = Contador.ToString();
    ObjPartidas.Clv_PartidaConceptos = RecLis.Partida_Pasaje.ToString();
    ObjPartidas.Importe = RecLis.Pasaje.ToString();
    ObjPartidas.Clv_Denominacion_PartidaConcepto = clsFuncionesGral.RemoveSpecialCharacters(
        MngNegocioPartidas.ObtieneDescripcionPartida(RecLis.Partida_Pasaje)
    );
    ListaPartidas.Add(ObjPartidas);
}

if ((RecLis.Singladuras != null) && (Convert.ToDouble(RecLis.Singladuras) > 0))
{
    Transparencia_Partidas ObjPartidas = new Transparencia_Partidas();
    ObjPartidas.ID = Contador.ToString();
    ObjPartidas.Clv_PartidaConceptos = "37901";
    ObjPartidas.Importe = RecLis.Singladuras.ToString();
    ObjPartidas.Clv_Denominacion_PartidaConcepto = 
        "GASTOS PARA OPERATIVOS Y TRABAJOS DE CAMPO EN AREAS RURALES";
    ListaPartidas.Add(ObjPartidas);
}

Generación de Archivos Excel

Archivo Principal

const string FIELDSEPARATOR = "\t";
const string ROWSEPARATOR = "\n";
StringBuilder output = new StringBuilder();

// Escribir encabezados
foreach (DataColumn dc in tableFinal.Columns)
{
    output.Append(dc.ColumnName);
    output.Append(FIELDSEPARATOR);
}
output.Append(ROWSEPARATOR);

// Escribir datos
foreach (DataRow item in tableFinal.Rows)
{
    foreach (object value in item.ItemArray)
    {
        output.Append(value.ToString().Replace('\n', ' ').Replace('\r', ' '));
        output.Append(FIELDSEPARATOR);
    }
    output.Append(ROWSEPARATOR);
}

string raiz = HttpContext.Current.Server.MapPath("..") + 
              "\\Reportes\\Reporte_Transparencia.xls";

StreamWriter sw = new StreamWriter(raiz);
sw.Write(output.ToString());
sw.Close();

Archivo de Partidas

output = new StringBuilder();

foreach (DataColumn dc in tableFinalPartidas.Columns)
{
    output.Append(dc.ColumnName);
    output.Append(FIELDSEPARATOR);
}
output.Append(ROWSEPARATOR);

foreach (DataRow item in tableFinalPartidas.Rows)
{
    foreach (object value in item.ItemArray)
    {
        output.Append(value.ToString().Replace('\n', ' ').Replace('\r', ' '));
        output.Append(FIELDSEPARATOR);
    }
    output.Append(ROWSEPARATOR);
}

string raiz2 = HttpContext.Current.Server.MapPath("..") + 
               "\\Reportes\\Reporte_PartidasTransparencia.xls";

sw = new StreamWriter(raiz2);
sw.Write(output.ToString());
sw.Close();

Enlaces de Descarga

LnkReport.Visible = true;
linkdes.Visible = true;

linkdes.HRef = "~/Reportes/Reporte_PartidasTransparencia.xls";
LnkReport.HRef = "~/Reportes/Reporte_Transparencia.xls";

Anonimización de Datos

Aunque el reporte incluye nombres de funcionarios, se deben seguir protocolos de protección de datos personales:

Limpieza de Caracteres Especiales

public static string RemoveSpecialCharacters(string str)
{
    if (string.IsNullOrEmpty(str))
        return str;
        
    // Remover saltos de línea y tabuladores
    str = str.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' ');
    
    // Normalizar espacios múltiples
    while (str.Contains("  "))
        str = str.Replace("  ", " ");
        
    return str.Trim();
}

Validaciones

string lsAnio = dplAnio.SelectedValue.ToString();
if (lsAnio == string.Empty)
{
    ClientScript.RegisterStartupScript(
        this.GetType(), 
        "Inapesca", 
        "alert('Debe seleccionar un ejercicio fiscal para poder avanzar');", 
        true
    );
    return;
}

Mejores Prácticas

  • Genere el reporte trimestralmente para cumplir con plazos regulatorios
  • Mantenga copias de reportes anteriores para auditoría
  • Verifique que todas las comisiones estén completas y comprobadas
Antes de publicar:
  • Verifique que todos los montos estén correctos
  • Confirme que los objetivos de las comisiones sean claros y descriptivos
  • Revise que no haya información sensible o confidencial
  • Publique en la sección de Transparencia del portal institucional
  • Use nomenclatura estándar: Transparencia_Art70_Q1_2024.xls
  • Mantenga el archivo de partidas junto con el principal

Próximos Pasos

Reportes Financieros

Genere análisis presupuestarios y comparativos

Reportes de Viáticos

Reportes operativos detallados de gastos

Comprobación

Complete la comprobación de gastos

Proyectos

Gestión de proyectos y presupuestos

Build docs developers (and LLMs) love