Skip to main content

Overview

The Project Catalog (Alta de Proyectos) enables administrators to assign research programs and projects to regional investigation centers (CRIAPs) and administrative directorates. Projects serve as the primary organizational unit for tracking expenses and travel allowances within SMAF.
Projects in SMAF are derived from federal programs and must be associated with a specific administrative unit (CRIP or Dirección) before expense tracking can begin.

Accessing Project Management

Navigate to Catálogos > Alta de Proyectos in the main menu. Access is restricted based on user role:
RoleAccess Level
Director GeneralFull access - all directorates
Director de AdministraciónFull access - all directorates
Director AdjuntoOwn directorate only
Jefe de CentroOwn CRIP only

Creating Projects

Step-by-Step Process

1

Select Directorate

Choose the directorate (Dirección Adjunta) that owns the program.
dplDireccion.DataSource = MngNegocioDirecciones.ObtienenDirecciones(Year, true);
dplDireccion.DataValueField = "Codigo";
dplDireccion.DataTextField = "Descripcion";
The directorate selection determines which programs are available. Changing this after selecting programs will clear your selections.
2

Choose Program

Select the federal program (Programa) to assign. Programs are filtered by the selected directorate and current fiscal year.
dplProgramas.DataSource = MngNegociosProgramas.ListaProgramas(lsdireccion, Year);
3

Enter Project Name

Provide a descriptive name for the project. If left blank, the system uses the program code as the project name.
if (txtNombre.Text == Dictionary.CADENA_NULA || txtNombre.Text == null)
{
    lsProyecto = lsPrograma;
}
else
{
    lsProyecto = clsFuncionesGral.ConvertMayus(txtNombre.Text);
}
4

Select Assignment Unit

Choose whether to assign to a regional center (CRIP) or an administrative directorate.Option 1: Regional Centers (CRIPs)
  • Default mode shows all research centers
  • Use for projects executed at specific geographic locations
Option 2: Administrative Directorates
  • Check “Agregar a direcciones” to enable
  • Use for central office programs
if (chkDirecciones.Checked)
{
    dplCrips.DataSource = MngNegocioAdscripcion.ObtieneCrips("3", "");
}
else
{
    dplCrips.DataSource = MngNegocioAdscripcion.ObtieneCrips("1", "");
}
5

Add to Grid

Click Agregar to add the project to the pending assignments list. You can add multiple projects before saving.
6

Save Projects

Click Guardar to commit all pending project assignments to the database.

Project Codes

Project codes are automatically generated by the system based on the program structure:

Code Format

[Componente]-[Programa]-[Dirección]
Example:
  • Component: 01 (Investigación)
  • Program: 001 (Programa de Recursos Pesqueros)
  • Direction: 906 (DGAIA)
  • Result: 01-001-906

Code Generation Logic

Programa oPrograma = new Programa();
oPrograma = MngNegociosProgramas.Obtiene_Datos_Programa(lsPrograma, lsdireccion);

Boolean bandera = MngNegocioProyecto.Inserta_Proyecto(
    oPrograma.Componente,      // Component code
    oPrograma.Id_Programa,     // Program ID
    oPrograma.Direccion,       // Directorate code
    lsProyecto,                // Project name
    lsProyecto,                // Short description
    oPrograma.Coordinador,     // Coordinator
    oPrograma.Objetivo,        // Objective
    lsAdscripcion,             // Assignment unit (CRIP/Direction)
    oPrograma.Tipo,            // Program type
    "906",                     // Area code
    oPrograma.Presupuesto      // Budget allocation
);

Budget Allocation

Projects inherit budget allocations from their parent programs:
Presupuesto
decimal
Total budget allocated to the project. Inherited from the program’s global budget unless specified otherwise.

Budget Inheritance Example

// Program has global budget of $1,000,000
Programa oPrograma = MngNegociosProgramas.Obtiene_Datos_Programa(lsPrograma, lsdireccion);
// oPrograma.Presupuesto = 1000000.00

// Project inherits this budget
MngNegocioProyecto.Inserta_Proyecto(
    ...,
    oPrograma.Presupuesto  // Project budget = $1,000,000
);
For programs with multiple projects, budget distribution must be managed manually through the Proyecto_Partida module to assign specific budget items.

Assigning Researchers and Staff

Coordinator Assignment

Each project must have a designated coordinator responsible for managing expenses:
// Coordinator is inherited from the program
oPrograma.Coordinador  // User ID of the program coordinator

Staff Assignment Workflow

1

Navigate to Project-User Assignment

Go to Catálogos > Proyecto Investigador after creating your project.
2

Select Administrative Unit

Choose the CRIP or directorate where the project is assigned.
dplUnidadAdministrativa.DataSource = MngNegocioAdscripcion.ObtieneCrips("1");
3

Select Project

Choose the project from the filtered list.
dplProyectos.DataSource = MngNegocioProyecto.ListaProyectoCrip(lsUnidad);
4

Assign Users

Select researchers or staff members who will charge expenses to this project.

Transversal Programs

SMAF supports transversal (cross-directorate) programs that can be assigned to units outside their parent directorate:

Validation Rules

// Check if program is being assigned to a different directorate
if (lsdireccion != MngNegocioDependencia.Obtiene_Direccion(lsAdscripcion))
{
    // Verify program is marked as transversal
    if ((oPrograma.Tipo == "2") || (oPrograma.Tipo == "3"))
    {
        ClientScript.RegisterStartupScript(
            this.GetType(), 
            "Inapesca", 
            "alert('EL PROGRAMA SELECCIONADO NO ES TRANSVERSAL');", 
            true
        );
        return;
    }
}

Program Types

Tipo
string
  • “1”: Transversal - Can be assigned to any directorate or CRIP
  • “2”: Directorate-specific - Must stay within parent directorate
  • “3”: Local - Restricted to specific CRIP

Duplicate Prevention

The system prevents duplicate program assignments:
if (MngNegocioProyecto.Proyecto_Dep(lsdireccion, lsPrograma, lsAdscripcion))
{
    ClientScript.RegisterStartupScript(
        this.GetType(), 
        "Inapesca", 
        "alert('El programa ya es parte de la unidad seleccionada');", 
        true
    );
    return;
}
Once a program is assigned to a unit, attempting to assign it again will be rejected. Use the project modification interface if you need to update project details.

Grid View Interface

The project assignment grid displays pending assignments before final save:
ColumnDescription
PROGRAMAProgram code
DIRECCIÓNParent directorate
DESCRIPCIÓNProject description
EliminarRemove from pending list

Grid Operations

// Add to grid
Programa objGrid = new InapescaWeb.Entidades.Programa();
objGrid.Id_Programa = r.Cells[0].Text.ToString();
objGrid.Direccion = r.Cells[1].Text.ToString();
objGrid.Descripcion = r.Cells[2].Text.ToString();
listaPrograma.Add(objGrid);

// Bind to grid
gvProgramas.DataSource = listaPrograma;
gvProgramas.DataBind();

Validation and Error Handling

Required Field Validation

if (dplDireccion.SelectedValue == Dictionary.NUMERO_CERO)
{
    alert('Seleccione una dirección para continuar');
    return;
}
if (dplCrips.SelectedValue == string.Empty)
{
    alert('Seleccione un centro o dirección para continuar');
    return;
}
if (dplProgramas.Items.Count == 0)
{
    alert('Seleccione un programa para continuar');
    return;
}

Batch Operations

The system supports batch assignment of multiple programs to a single unit:
int contador = 0;

foreach (System.Web.UI.WebControls.GridViewRow r in gvProgramas.Rows)
{
    lsPrograma = r.Cells[0].Text.ToString();
    lsdireccion = r.Cells[1].Text.ToString();
    lsProyecto = r.Cells[2].Text.ToString();
    
    Programa oPrograma = MngNegociosProgramas.Obtiene_Datos_Programa(lsPrograma, lsdireccion);
    
    Boolean bandera = MngNegocioProyecto.Inserta_Proyecto(
        oPrograma.Componente,
        oPrograma.Id_Programa,
        oPrograma.Direccion,
        lsProyecto,
        lsProyecto,
        oPrograma.Coordinador,
        oPrograma.Objetivo,
        lsAdscripcion,
        oPrograma.Tipo,
        "906",
        oPrograma.Presupuesto
    );
    
    if (bandera) contador += 1;
}

if (contador == gvProgramas.Rows.Count)
{
    alert('Datos guardados correctamente');
}

Best Practices

Use Descriptive Names

Provide clear, meaningful project names that reflect the research area and fiscal year.

Verify Transversal Status

Before assigning programs across directorates, confirm they are marked as transversal.

Check for Duplicates

Review existing assignments to avoid duplicate program-unit combinations.

Coordinate with CRIPs

Communicate with regional center directors before assigning projects to ensure capacity.

Common Issues and Solutions

Issue: Changing the CRIP/directorate dropdown clears the program grid.Solution: This is by design to prevent mismatched assignments. Complete all program selections before changing units.
protected void dplCrips_SelectedIndexChanged(object sender, EventArgs e)
{
    gvProgramas.DataSource = null;
    gvProgramas.DataBind();
    alert('Una vez seleccionados programas a una unidad, no debe cambiar de unidad');
}
Issue: System rejects assignment with message “El programa ya es parte de la unidad seleccionada”.Solution: This program is already active for the selected unit. Use the project modification interface to update details instead of creating a new assignment.
Issue: Cannot assign program to a different directorate.Solution: The program is not marked as transversal. Either:
  1. Assign it to units within its parent directorate, or
  2. Contact the Director General to modify the program’s transversal status

Programs

Create and configure program catalogs

Budget Items

Assign partidas presupuestales to projects

Expense Tracking

Track project expenses and travel

Build docs developers (and LLMs) love