Skip to main content

Processing Travel Allowance Payments

This guide walks through the complete process of registering and processing payments for approved travel assignments in SMAF.

Prerequisites

Before processing payments, ensure:
  • The travel assignment (comisión) has been approved
  • Financial approval has been granted
  • The commission is not already fully paid
  • You have Administrator or Center Chief role permissions

Payment Processing Steps

1

Select Travel Assignment

Choose the travel assignment to pay from the list of approved commissions.The system displays pending commissions based on your location:
gvFiscales.DataSource = MngNegocioPago.Comisiones_Pagar(
    Session["Crip_Ubicacion"].ToString(), Year);
gvFiscales.DataBind();
Each commission displays:
  • Folio: Assignment reference number
  • Usuario: Employee ID
  • Nombre: Employee name
  • Lugar: Travel destination
  • Periodo: Travel dates
2

Load Commission Details

When you select a commission, the system loads complete details:
Comision DetalleComision = MngNegocioComision.DetalleComision_Pagos(
    archivo + ".pdf", 
    Session["Crip_Ubicacion"].ToString(), 
    usuario
);

ComisionDetalle oCdetalle = MngNegocioComisionDetalle.Obtiene_detalle(
    DetalleComision.Archivo, 
    DetalleComision.Comisionado, 
    DetalleComision.Ubicacion_Comisionado, 
    Year
);
The system validates:
  • Commission has requested amounts
  • Not previously marked as paid
  • Commission detail record exists
3

Select or Create Ministracion

Associate the payment with a fund allocation (ministracion).

Existing Ministracion

If previous payments exist for this commission:
List<Entidad> ListaMinistracion = 
    MngNegocioMinistracion.Obtiene_Ministracion(Year, txtArchivoHiden.Text);

if (ListaMinistracion.Count > 0)
{
    dplMinistracion.DataSource = ListaMinistracion;
    dplMinistracion.DataTextField = Dictionary.DESCRIPCION;
    dplMinistracion.DataValueField = Dictionary.CODIGO;
    dplMinistracion.DataBind();
    Session["Crip_IsExistinMinistracion"] = "1";
}

New Ministracion

If this is the first payment:
else
{
    clsFuncionesGral.Llena_Lista(dplMinistracion, 
        clsFuncionesGral.ConvertMayus(
            " = s e l e c c i o n e= |Nueva Ministracion"));
    Session["Crip_IsExistinMinistracion"] = "0";
}
4

Select Ministracion Type

Choose the type of fund allocation from the dropdown.
dplTipoMinistracion.DataSource = 
    MngNegocioMinistracion.ListaTipoMinistracion("00");
dplTipoMinistracion.DataValueField = Dictionary.CODIGO;
dplTipoMinistracion.DataTextField = Dictionary.DESCRIPCION;
dplTipoMinistracion.DataBind();
You must select a ministracion type before payment panels are activated.
5

Enter Payment Amounts

For each applicable expense category, enter the payment amount and budget line (partida presupuestal).

Viáticos (Travel Allowances)

if (pnlViaticos.Visible)
{
    if ((txtViatpag.Text == "") | (txtViatpag.Text == ""))
    {
        ClientScript.RegisterStartupScript(this.GetType(), "Inapesca", 
            "alert('Debe ingresar un valor de viaticos a pagar');", true);
        return;
    }
    
    if (!clsFuncionesGral.IsNumeric(txtViatpag.Text))
    {
        ClientScript.RegisterStartupScript(this.GetType(), "Inapesca", 
            "alert('Valor de viaticos debe ser numerico.');", true);
        return;
    }
    
    if ((txtPartidaViaticos.Text == "") | (txtPartidaViaticos.Text == null))
    {
        ClientScript.RegisterStartupScript(this.GetType(), "Inapesca", 
            "alert('Partida de Viaticos obligatoria');", true);
        return;
    }
}
The system displays:
  • Requested amount: lblViaticos - Total originally requested
  • Previously paid: oCdetalle.Viaticos - Amount already disbursed
  • New payment: txtViatpag - Amount to pay now
  • Budget line: txtPartidaViaticos - Accounting partition code
This same pattern applies to all expense categories:
  • Combustible (fuel)
  • Peajes (tolls)
  • Pasajes (transportation)
  • Singladuras (maritime days)
6

Specify Payment Method and Bank Details

Enter the payment method and bank account information.

Payment Type

lsFormaPago = dplTipoPago.SelectedValue.ToString();

Destination Bank Details

txtBanco
string
required
Destination bank name
txtCuenta
string
required
Bank account number
txtClabe
string
required
CLABE interbank code (18 digits)
txtReferencia
string
required
Unique bank reference number for this payment
txtFecha
date
required
Payment date

Source Bank Details

Select the originating bank account for the transfer:
dplBancoOrigen.DataSource = 
    MngNegocioCuentas.ListaBancos(Session["Crip_Ubicacion"].ToString());
dplBancoOrigen.DataValueField = Dictionary.CODIGO;
dplBancoOrigen.DataTextField = Dictionary.DESCRIPCION;
dplBancoOrigen.DataBind();
When a source bank is selected, account and CLABE are automatically populated:
protected void dplBancoOrigen_SelectedIndexChanged(object sender, EventArgs e)
{
    string banco = dplBancoOrigen.SelectedValue.ToString();
    CuentasBancarias ListaCuentas = 
        MngNegocioCuentas.ListaCuentas(
            Session["Crip_Ubicacion"].ToString(), banco);
    
    txtCuentaOrigen.Text = ListaCuentas.Cuenta;
    txtClabeOrigen.Text = ListaCuentas.Clabe;
}
7

Register Payment

Click the “Registrar Pagos” button to process the payment.
protected void btnPagar_Click(object sender, EventArgs e)
{
    // Validation completed - process payment
    if (Session["Crip_IsExistinMinistracion"].ToString() == "0")
    {
        // Create new ministracion
        lsMinistracion = MngNegocioMinistracion.Obtiene_Max_Ministracion();
    }
    else
    {
        // Use existing ministracion
        lsMinistracion = dplMinistracion.SelectedValue.ToString();
    }
}

Payment Calculation Logic

The system calculates payment status based on requested vs. paid amounts.

New Ministracion Payment

When creating a new ministracion, the system:
  1. Creates ministracion detail record:
bool insert = MngNegocioMinistracion.Inserta_MInistracionDetalle(
    dplTipoMinistracion.SelectedValue.ToString(), 
    lsMinistracion, 
    lsHoy, 
    Year, 
    Session["Crip_Usuario"].ToString(), 
    Session["Crip_Ubicacion"].ToString(), 
    Dictionary.FECHA_NULA, 
    MngNegocioDependencia.Obtiene_DIrector_Financieros(
        Dictionary.PUESTO_FINANCIERO, Dictionary.SUBDIRECTOR_ADJUNTO), 
    // ... additional parameters
);
  1. Creates payment record for each expense type:
if (clsFuncionesGral.Convert_Double(DetalleComision.Total_Viaticos) > 0)
{
    insert = MngNegocioMinistracion.Inserta_Ministracion(
        dplTipoMinistracion.SelectedValue.ToString(),
        MngNegocioMinistracion.Obtiene_ClvPeriodo(lsHoy, Year),
        lsMinistracion,
        lsHoy,
        Year,
        // ... employee and bank details
        "17", // Viaticos code
        "VIATICOS PARA LA COMISION A " + DetalleComision.Lugar + 
            " DEL " + DetalleComision.Fecha_Inicio + 
            " AL " + DetalleComision.Fecha_Final,
        clsFuncionesGral.ConvertString(
            clsFuncionesGral.Convert_Double(DetalleComision.Total_Viaticos)),
        // ... amounts and budget codes
    );
}
  1. Updates commission detail with paid amount:
insert = MngNegocioComisionDetalle.UPdate_Monto_Pagado(
    clsFuncionesGral.ConvertString(
        clsFuncionesGral.Convert_Double(oCdetalle.Viaticos) + 
        clsFuncionesGral.Convert_Double(txtViatpag.Text)
    ), 
    txtFecha.Text, 
    txtPartidaViaticos.Text, 
    "17", 
    txtArchivoHiden.Text + ".pdf", 
    txtUsuarioHiden.Text
);

Existing Ministracion Payment

For additional payments to an existing ministracion:
oMinistracion = MngNegocioMinistracion.Objeto_Ministracion(
    txtArchivoHiden.Text, 
    dplMinistracion.SelectedValue.ToString(), 
    "17"
);

if ((clsFuncionesGral.Convert_Double(txtViatpag.Text)) > 0)
{
    viat = clsFuncionesGral.Convert_Double(oCdetalle.Viaticos) + 
           clsFuncionesGral.Convert_Double(txtViatpag.Text);
    
    if (clsFuncionesGral.Convert_Double(oMinistracion.Total_Solicitado) == viat)
    {
        lsEstatusFinancieros = "2"; // Fully paid
    }
    else
    {
        lsEstatusFinancieros = "1"; // Partial payment
    }
}

Payment Status Updates

After payment registration, the system updates status:
// Update ministracion status
MngNegocioMinistracion.UpdateEstatusMinistracion(
    "2", 
    txtArchivoHiden.Text, 
    dplMinistracion.SelectedValue.ToString(), 
    "17"
);

// Update commission financial status
MngNegocioComisionDetalle.UpdateEstatusFinancieros(
    "2", 
    txtArchivoHiden.Text + ".pdf", 
    txtUsuarioHiden.Text, 
    Year
);

Expense Category Codes

The system uses specific codes for each expense type:
CodeCategoryDescription
17ViáticosDaily travel allowances
6CombustibleFuel reimbursement
7PeajesToll fees
8PasajesTransportation costs

Validation Rules

The following validations must pass before payment registration:
  1. Amount Validation: All payment amounts must be numeric and greater than zero
  2. Budget Line Required: Each payment category must have a budget partition code
  3. Bank Details Complete: All bank fields (bank, account, CLABE, reference) are mandatory
  4. Ministracion Selected: Must choose existing or create new ministracion
  5. Payment Date: Date field cannot be empty
  6. Source Bank: Must select originating bank account

Common Error Messages

ErrorCauseResolution
”Esta comisiona fue sin viaticos”Commission has no requested amountsCannot process payment - commission was for zero amount
”Esta Comision ya fue pagada”Financial status is already “2”Use reimbursement module for additional payments
”Debe ingresar un valor de viaticos a pagar”Payment amount field is emptyEnter numeric payment amount
”Partida de Viaticos obligatoria”Budget line code missingEnter budget partition code
”Banco Origen Obligatorio”No source bank selectedSelect originating bank account

Next Steps

Fund Allocations

Learn about ministraciones and budget tracking

Payment Reports

Generate payment reports and reconciliation

Build docs developers (and LLMs) love