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.
Marco Legal
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.
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>
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 ();
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.
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
Comisiones Principales
Ampliaciones
El sistema obtiene todas las comisiones del año fiscal: List < Comision > ListaComisiones = MngNegocioTransparencia . Obten_Lista_Comision ( lsAnio );
List < RepTransparencia > ListTransparencia = new List < RepTransparencia >();
Las ampliaciones se procesan por separado para evitar duplicados: List < Entidad > ListArchivosAmp = MngNegocioTransparencia . Transparencia_Ampliaciones ( lsAnio );
List < Entidad > ListArchivosAmpNueva = new List < Entidad >();
// Procesar archivos concatenados con |
foreach ( Entidad Rec in ListArchivosAmp )
{
string [] psCadena ;
psCadena = Rec . Descripcion . Split ( new Char [] { '|' });
for ( int i = 0 ; i < psCadena . Length ; i ++ )
{
Entidad oEntidad = new Entidad ();
oEntidad . Codigo = Rec . Codigo ; // Comisión original
oEntidad . Descripcion = psCadena [ i ]; // Archivo de ampliación
ListArchivosAmpNueva . Add ( oEntidad );
}
}
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 ();
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