Skip to main content

Descripción General

El módulo de Reportes de Viáticos permite generar informes detallados sobre comisiones, incluyendo montos autorizados, comprobaciones y reintegros. Soporta múltiples niveles de detalle y formatos de exportación.

Acceso al Módulo

Navegue a Reportes > Reporte de Viáticos desde el menú principal.
Filtros de Reporte de Viáticos

Filtros de Búsqueda

Filtros Básicos

1

Tipo de Comisión

Seleccione el ámbito de la comisión:
  • Nacional: Comisiones dentro del territorio mexicano
  • Internacional: Comisiones al extranjero
  • Todas: Incluir ambos tipos
dplTipoCom.Items.Add(new ListItem(" = S E L E C C I O N E = ", "0"));
dplTipoCom.Items.Add(new ListItem("N A C I O N A L", "2"));
dplTipoCom.Items.Add(new ListItem("I N T E R N A C I O N A L", "3"));
2

Período Fiscal

Seleccione el año fiscal para el reporte:
dplAnio.DataSource = MngNegocioAnio.ObtieneAnios();
dplAnio.DataTextField = Dictionary.DESCRIPCION;
dplAnio.DataValueField = Dictionary.CODIGO;
dplAnio.DataBind();
Si no especifica fechas, el sistema utilizará el rango completo del año fiscal.
3

Rango de Fechas

Defina el período específico de las comisiones:
<asp:TextBox ID="txtInicio" runat="server" Width="50%"></asp:TextBox>
<cc1:CalendarExtender ID="txtInicio_CalendarExtender" runat="server"
    BehaviorID="txtInicio_CalendarExtender" 
    TargetControlID="txtInicio" 
    Format="yyyy-MM-dd" />
Las fechas se refieren al período de comisión, no a la fecha de autorización.

Filtros Avanzados

Filtre por forma de pago:
dplTipoViaticos.DataSource = MngNegocioViaticos.Metodo_Viaticos(true);
dplTipoViaticos.DataTextField = Dictionary.DESCRIPCION;
dplTipoViaticos.DataValueField = Dictionary.CODIGO;
dplTipoViaticos.DataBind();
Opciones disponibles:
  • Anticipados: Viáticos entregados antes de la comisión
  • Devengados: Viáticos pagados después de la comisión
  • Todos: Ambos tipos

Tipos de Reportes

Reporte Detallado (Estándar)

Incluye información completa de cada comisión con montos autorizados y comprobados.

Estructura de Datos

DataTable tableFinal = new DataTable("DataSetArbol");

tableFinal.Columns.Add("OFICIO", typeof(String));
tableFinal.Columns.Add("ARCHIVO", typeof(String));
tableFinal.Columns.Add("COMISIONADO", typeof(String));
tableFinal.Columns.Add("LUGAR", typeof(String));
tableFinal.Columns.Add("FECHAS", typeof(String));

// Montos Otorgados
tableFinal.Columns.Add("PASAJES_OTORGADOS", typeof(Double));
tableFinal.Columns.Add("PEAJES_OTORGADOS", typeof(Double));
tableFinal.Columns.Add("COMBUSTIBLE_OTORGADO", typeof(Double));
tableFinal.Columns.Add("VIATICOS_OTORGADOS", typeof(Double));
tableFinal.Columns.Add("SINGLADURAS_OTORGADAS", typeof(Double));
tableFinal.Columns.Add("TOTAL_OTORGADOS", typeof(Double));

// Montos Comprobados
tableFinal.Columns.Add("PASAJES_COMPROBADOS", typeof(Double));
tableFinal.Columns.Add("PEAJES_COMPROBADOS", typeof(Double));
tableFinal.Columns.Add("COMBUSTIBLE_COMPROBADO", typeof(Double));
tableFinal.Columns.Add("VIATICOS_COMPROBADOS", typeof(Double));
tableFinal.Columns.Add("SINGLADURAS_COMPROBADAS", typeof(Double));
tableFinal.Columns.Add(" NO FISCALES ", typeof(Double));
tableFinal.Columns.Add("TOTAL_COMPROBADO", typeof(Double));
tableFinal.Columns.Add("REINTEGRO", typeof(Double));

tableFinal.Columns.Add("ESTATUS", typeof(String));
tableFinal.Columns.Add("TIPO COMISION", typeof(String));

Cálculo de Comprobaciones

foreach (DataRow r in workTable.Rows)
{
    DataRow workRow = tableFinal.NewRow();
    
    // Datos básicos
    workRow[0] = r[0].ToString();  // OFICIO
    workRow[1] = r[1].ToString();  // ARCHIVO
    workRow[2] = MngNegocioUsuarios.Obtiene_Nombre(r[2].ToString());  // COMISIONADO
    workRow[3] = r[3].ToString();  // LUGAR
    workRow[4] = r[4].ToString();  // FECHAS
    
    // Montos otorgados (convertir a double)
    workRow[5] = clsFuncionesGral.Convert_Double(
        clsFuncionesGral.Convert_Decimales(r[5].ToString().Trim())
    );  // PASAJES
    workRow[6] = clsFuncionesGral.Convert_Double(
        clsFuncionesGral.Convert_Decimales(r[6].ToString().Trim())
    );  // PEAJES
    workRow[7] = clsFuncionesGral.Convert_Double(
        clsFuncionesGral.Convert_Decimales(r[7].ToString().Trim())
    );  // COMBUSTIBLE
    workRow[8] = clsFuncionesGral.Convert_Double(
        clsFuncionesGral.Convert_Decimales(r[8].ToString().Trim())
    );  // VIATICOS
    workRow[9] = clsFuncionesGral.Convert_Double(
        clsFuncionesGral.Convert_Decimales(r[9].ToString().Trim())
    );  // SINGLADURAS
    
    // Total otorgado (suma de conceptos)
    workRow[10] = 
        clsFuncionesGral.Convert_Double(workRow[5].ToString()) +
        clsFuncionesGral.Convert_Double(workRow[6].ToString()) +
        clsFuncionesGral.Convert_Double(workRow[7].ToString()) +
        clsFuncionesGral.Convert_Double(workRow[8].ToString()) +
        clsFuncionesGral.Convert_Double(workRow[9].ToString());
    
    // Montos comprobados (por concepto)
    workRow[11] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(),  // Usuario
        r[10].ToString().Trim(), // Periodo
        "8",                     // Código: Pasajes
        r[0].ToString().Trim(),  // Oficio
        r[1].ToString().Trim()   // Archivo
    );
    
    workRow[12] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "7", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );  // PEAJES
    
    workRow[13] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "6", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );  // COMBUSTIBLE
    
    workRow[14] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "0", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );  // VIATICOS
    
    workRow[15] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "18", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );  // SINGLADURAS
    
    workRow[16] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "12", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );  // NO FISCALES
    
    // Total comprobado (sin reintegro)
    workRow[17] = clsFuncionesGral.Convert_Decimales(
        (clsFuncionesGral.Convert_Double(MngNegocioComprobacion.Totales(
            r[10].ToString().Trim(), 
            r[2].ToString().Trim(), 
            r[1].ToString().Trim(), 
            "0"
        )) - clsFuncionesGral.Convert_Double(MngNegocioComprobacion.Sum_Importe(
            r[2].ToString().Trim(), 
            r[10].ToString().Trim(), 
            "13", 
            r[0].ToString().Trim(), 
            r[1].ToString().Trim()
        ))).ToString()
    );
    
    // Reintegro
    workRow[18] = MngNegocioComprobacion.Sum_Importe(
        r[2].ToString().Trim(), r[10].ToString().Trim(), "13", 
        r[0].ToString().Trim(), r[1].ToString().Trim()
    );
    
    // Estatus de comprobación
    if (r[11].ToString() == "9")
        workRow[19] = "No Comprobada";
    else if (r[11].ToString() == "7")
        workRow[19] = "comprobada";
    else if (r[11].ToString() == "5")
        workRow[19] = "Sin viaticos";
    
    // Tipo de comisión
    if (r[12].ToString() == "2")
        workRow[20] = " NACIONAL";
    else
        workRow[20] = " INTERNACIONAL";
    
    tableFinal.Rows.Add(workRow);
}

Resumen Ejecutivo

Disponible solo para Directores de Administración. Agrupa gastos por centro de investigación.
if (CheckBox1.Checked)
{
    List<Entidad> ListaCentrosComisiones = MngNegocioComision.Lista_Centros_Comisiones(
        lsAnio, lsInicio, lsFinal, lsTipoViaticos, 
        lsEstatusComprobacion, lsAdscripcion, lsUsuarioAdscripcion
    );
    
    DataTable tableFinal = new DataTable("DataSetArbol");
    tableFinal.Columns.Add("CENTRO DE COSTO", typeof(String));
    tableFinal.Columns.Add("PASAJES COMPROBADOS", typeof(String));
    tableFinal.Columns.Add("PEAJES COMPROBADOS", typeof(String));
    tableFinal.Columns.Add("COMBUSTIBLE EN EFECTIVO COMPROBADO", typeof(String));
    tableFinal.Columns.Add("SINGADURAS COMPROBADAS", typeof(String));
    tableFinal.Columns.Add("CERTIFICADOS DE TRANSITO COMPROBADOS", typeof(String));
    tableFinal.Columns.Add("NO FISCALES", typeof(String));
    tableFinal.Columns.Add("VIATICOS COMPROBADOS", typeof(String));
    tableFinal.Columns.Add("REINTEGRO REALIZADO", typeof(String));
    
    foreach (Entidad r in ListaCentrosComisiones)
    {
        DataRow workRow = tableFinal.NewRow();
        workRow[0] = clsFuncionesGral.ConvertMayus(r.Descripcion);
        
        // Suma de comprobaciones por concepto
        workRow[1] = MngNegocioComprobacion.Sum_Totales("'8'", lsAnio, r.Codigo);
        workRow[2] = MngNegocioComprobacion.Sum_Totales("'7','16'", lsAnio, r.Codigo);
        workRow[3] = MngNegocioComprobacion.Sum_Totales("'6'", lsAnio, r.Codigo);
        workRow[4] = MngNegocioComprobacion.Sum_Totales("'19'", lsAnio, r.Codigo);
        workRow[5] = MngNegocioComprobacion.Sum_Totales("'18'", lsAnio, r.Codigo);
        workRow[6] = MngNegocioComprobacion.Sum_Totales("'12'", lsAnio, r.Codigo);
        workRow[7] = MngNegocioComprobacion.Sum_Totales(
            "'5','9','11','14','15','17','20'", lsAnio, r.Codigo
        );
        workRow[8] = MngNegocioComprobacion.Sum_Totales("'13'", lsAnio, r.Codigo);
        
        tableFinal.Rows.Add(workRow);
    }
}

Resumen de Auditoría

Incluye información adicional requerida para auditorías (CURP, RFC, número de empleado, partida presupuestal).
if (chkAuditoria.Checked)
{
    tableFinal.Columns.Add("OFICIO", typeof(String));
    tableFinal.Columns.Add("ARCHIVO", typeof(String));
    tableFinal.Columns.Add("AMPLIACION", typeof(String));
    tableFinal.Columns.Add("COMISIONADO", typeof(String));
    tableFinal.Columns.Add("NIVEL", typeof(String));
    tableFinal.Columns.Add("PUESTO", typeof(String));
    // ... más campos ...
    tableFinal.Columns.Add("CURP", typeof(String));
    tableFinal.Columns.Add("RFC", typeof(String));
    tableFinal.Columns.Add("NUM_EMPLEADO", typeof(String));
    tableFinal.Columns.Add("UBICACION_PROYECTO", typeof(String));
    tableFinal.Columns.Add("PROYECTO", typeof(String));
    
    foreach (DataRow r in workTable.Rows)
    {
        Usuario usu = MngNegocioUsuarios.DatosComisionado1(
            r[3].ToString().Trim(), lsAnio
        );
        
        workRow[26] = usu.CURP;
        workRow[27] = usu.RFC;
        workRow[28] = usu.NUM_EMP;
        workRow[29] = MngNegocioDependencia.Centro_Descrip(r[16].ToString());
        workRow[30] = MngNegocioProyecto.Nombre_Proyecto(
            r[17].ToString(), r[16].ToString(), lsAnio
        );
    }
}

Códigos de Concepto

El sistema utiliza códigos numéricos para identificar conceptos de gasto:
CódigoConceptoDescripción
0ViáticosAlimentación y hospedaje
5Viáticos zona 1
6CombustibleGasolina en efectivo
7PeajesCasetas de autopista
8PasajesBoletos aéreos o terrestres
9Viáticos zona 2
11Viáticos zona 3
12No FiscalesGastos sin factura
13ReintegroDevolución de recursos
14Viáticos zona 4
15Viáticos zona 5
16Certificados de Tránsito
17Viáticos zona 6
18SingladurasViáticos marítimos
19Certificados de Tránsito (alterno)
20Viáticos zona 7

Exportación a Excel

Proceso de Generación

1

Nombre del Archivo

El usuario debe proporcionar un nombre para el archivo:
if ((txtNombre.Text == "") | (txtNombre.Text == null) | (txtNombre.Text == string.Empty))
{
    ClientScript.RegisterStartupScript(
        this.GetType(), 
        "Inapesca", 
        "alert('Nombre de archivo forzoso');", 
        true
    );
    return;
}
2

Verificación y Limpieza

El sistema verifica y elimina archivos existentes:
string raiz = HttpContext.Current.Server.MapPath("..") + "\\Reportes\\Excel";

if (File.Exists(raiz + "/" + txtNombre.Text + ".xls"))
{
    File.Delete(raiz + "/" + txtNombre.Text + ".xls");
}
3

Generación del Archivo

El sistema genera el archivo Excel con formato TSV:
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 registros
foreach (DataRow item in tableFinal.Rows)
{
    foreach (object value in item.ItemArray)
    {
        // Limpiar saltos de línea
        output.Append(value.ToString().Replace('\n', ' ').Replace('\r', ' '));
        output.Append(FIELDSEPARATOR);
    }
    output.Append(ROWSEPARATOR);
}

// Guardar archivo
raiz = HttpContext.Current.Server.MapPath("..") + 
       "\\Reportes\\Excel\\" + txtNombre.Text + ".xls";

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

Descarga

El archivo se descarga automáticamente:
raiz = HttpContext.Current.Server.MapPath("..") + "\\Reportes\\Excel";
clsPdf.DonwloadFile(raiz, txtNombre.Text + ".xls");

Lógica de Fechas

El sistema maneja inteligentemente los rangos de fechas:
if (((txtInicio.Text == "") | (txtInicio.Text == null)) & 
    ((txtFin.Text == "") | (txtFin.Text == null)))
{
    // Sin fechas: usar año fiscal completo
    Entidad Inicio_Final = MngNegocioAnio.Inicio_Final(lsAnio);
    lsInicio = clsFuncionesGral.FormatFecha(Inicio_Final.Codigo);
    lsFinal = clsFuncionesGral.FormatFecha(Inicio_Final.Descripcion);
}
else if (((txtInicio.Text != "") | (txtInicio.Text != null)) & 
         ((txtFin.Text == "") | (txtFin.Text == null)))
{
    // Solo fecha inicio: hasta hoy
    lsInicio = txtInicio.Text;
    lsFinal = clsFuncionesGral.FormatFecha(lsHoy);
}
else if (((txtInicio.Text == "") | (txtInicio.Text == null)) & 
         ((txtFin.Text != "") | (txtFin.Text != null)))
{
    // Solo fecha fin: desde inicio del año
    lsInicio = MngNegocioAnio.Anio(lsAnio);
    lsFinal = txtFin.Text;
}
else
{
    // Ambas fechas especificadas
    lsInicio = txtInicio.Text;
    lsFinal = txtFin.Text;
}

Mejores Prácticas

  • Para reportes grandes (>1000 comisiones), considere filtrar por mes o centro específico
  • El resumen ejecutivo es más rápido que el reporte detallado
  • Evite generar múltiples reportes simultáneamente
  • Use nombres descriptivos: Viaticos_Enero_2024_CRIPMAZ
  • Incluya fecha y centro de investigación
  • Evite caracteres especiales (use solo letras, números y guiones)
  • Verifique que todas las comisiones estén comprobadas antes de generar reportes finales
  • Compare el total otorgado vs. comprobado para detectar inconsistencias
  • Revise los reintegros pendientes

Próximos Pasos

Reportes de Transparencia

Configure reportes regulatorios para transparencia

Reportes Financieros

Analice consumo presupuestal por programa

Comprobación

Aprenda a comprobar gastos de viaje

Proyectos

Gestione proyectos y presupuestos

Build docs developers (and LLMs) love