Skip to main content

Visión General

El módulo de Métodos de Pago permite configurar las formas de cobro disponibles: efectivo, tarjetas, billeteras digitales (Yape, Plin), transferencias bancarias, etc.
Cada método de pago puede vincularse a una cuenta bancaria específica para facilitar la conciliación automática.

Modelo de Datos

Tabla metodos_pago

MetodoPago.php:15
protected $fillable = [
    'nombre',                  // Ej: "Yape", "POS Visa", "Efectivo"
    'codigo',                  // Código interno: yape, pos_visa, efectivo
    'descripcion',
    'tipo',                    // efectivo, tarjeta, billetera, transferencia
    'id_banco',                // Banco asociado (opcional)
    'id_cuenta',               // Cuenta bancaria destino (opcional)
    'es_efectivo',             // true/false
    'requiere_referencia',     // Requiere número de operación
    'requiere_comprobante',    // Requiere voucher/comprobante
    'activo',
];

Tipos de Método de Pago

Efectivo

  • No requiere banco ni cuenta
  • Se deposita directamente en caja
  • Sin comisiones

Tarjeta

  • POS Visa, Mastercard, AMEX
  • Vinculado a cuenta bancaria
  • Puede tener comisión

Billetera Digital

  • Yape, Plin, Tunki
  • Vinculado a cuenta bancaria
  • Requiere referencia/operación

Transferencia

  • Transferencia interbancaria
  • Requiere número de operación
  • Acreditación instantánea o diferida

API Endpoints

Listar Métodos de Pago

MetodoPagoController.php:13
GET /api/metodos-pago
Respuesta:
{
  "success": true,
  "data": [
    {
      "id_metodo_pago": 1,
      "nombre": "Efectivo",
      "codigo": "efectivo",
      "tipo": "efectivo",
      "es_efectivo": true,
      "requiere_referencia": false,
      "requiere_comprobante": false,
      "activo": true,
      "banco": null,
      "cuentaBancaria": null
    },
    {
      "id_metodo_pago": 7,
      "nombre": "Yape BCP",
      "codigo": "yape",
      "tipo": "billetera",
      "es_efectivo": false,
      "requiere_referencia": true,
      "requiere_comprobante": true,
      "activo": true,
      "banco": {
        "id_banco": 1,
        "nombre": "Banco de Crédito del Perú",
        "codigo_sunat": "003"
      },
      "cuentaBancaria": {
        "id_cuenta": 15,
        "numero_cuenta": "191-2345678-0-12",
        "cci": "00219100234567801212"
      }
    },
    {
      "id_metodo_pago": 10,
      "nombre": "POS Visa",
      "codigo": "pos_visa",
      "tipo": "tarjeta",
      "es_efectivo": false,
      "requiere_referencia": true,
      "requiere_comprobante": false,
      "activo": true,
      "banco": {
        "id_banco": 1,
        "nombre": "Banco de Crédito del Perú"
      },
      "cuentaBancaria": {
        "id_cuenta": 16,
        "numero_cuenta": "191-9876543-0-21"
      }
    }
  ]
}

Crear Método de Pago

MetodoPagoController.php:30
POST /api/metodos-pago
Request (Efectivo):
{
  "nombre": "Efectivo",
  "codigo": "efectivo",
  "descripcion": "Pago en efectivo",
  "tipo": "efectivo",
  "es_efectivo": true,
  "requiere_referencia": false,
  "requiere_comprobante": false,
  "activo": true
}
Request (Yape):
{
  "nombre": "Yape BCP",
  "codigo": "yape",
  "descripcion": "Pagos vía Yape",
  "tipo": "billetera",
  "id_banco": 1,
  "id_cuenta": 15,
  "es_efectivo": false,
  "requiere_referencia": true,
  "requiere_comprobante": true,
  "activo": true
}
Cuando es_efectivo es true, el sistema ignora id_banco e id_cuenta automáticamente.
Lógica de validación:
MetodoPagoController.php:34
if ($data['es_efectivo'] ?? false) {
    $data['id_banco']  = null;
    $data['id_cuenta'] = null;
}

Actualizar Método de Pago

MetodoPagoController.php:65
PUT /api/metodos-pago/{id}

Eliminar Método de Pago

MetodoPagoController.php:84
DELETE /api/metodos-pago/{id}

Configuración por Empresa

La tabla configuracion_metodos_pago permite personalizar cada método por empresa:
protected $fillable = [
    'id_empresa',
    'id_metodo_pago',
    'habilitado',              // Habilitar/deshabilitar
    'comision',                // Comisión en porcentaje
    'limite_minimo',           // Monto mínimo aceptado
    'limite_maximo',           // Monto máximo aceptado
    'requiere_comprobante',    // Override del global
    'requiere_referencia',     // Override del global
];

Obtener Configuración de la Empresa

MetodoPagoController.php:107
GET /api/metodos-pago/configuracion-empresa
Respuesta:
{
  "success": true,
  "data": [
    {
      "id_config": 5,
      "id_empresa": 1,
      "id_metodo_pago": 10,
      "habilitado": true,
      "comision": 2.5,
      "limite_minimo": "10.00",
      "limite_maximo": "5000.00",
      "requiere_comprobante": false,
      "requiere_referencia": true,
      "metodo": {
        "nombre": "POS Visa",
        "tipo": "tarjeta"
      }
    }
  ]
}

Guardar Configuración

MetodoPagoController.php:129
POST /api/metodos-pago/configuracion-empresa
Request:
{
  "id_metodo_pago": 10,
  "habilitado": true,
  "comision": 2.5,
  "limite_minimo": 10.00,
  "limite_maximo": 5000.00,
  "requiere_comprobante": false,
  "requiere_referencia": true
}
La comisión se puede usar para calcular automáticamente el costo de procesar pagos con tarjeta.

Relaciones de Base de Datos

Relación con Cajas

MetodoPago.php:56
public function cajas()
{
    return $this->belongsToMany(
        Caja::class,
        'caja_metodos_pago',
        'id_metodo_pago',
        'id_caja'
    )
    ->withPivot('activo')
    ->withTimestamps();
}
Permite definir qué métodos de pago acepta cada caja.

Billeteras Digitales

La tabla billeteras_digitales almacena números de billetera:
protected $fillable = [
    'id_metodo_pago',
    'id_banco',
    'numero',                  // Número de celular o cuenta
    'titular',                 // Nombre del titular
    'tipo_documento',          // DNI, RUC
    'documento',
    'activa',
];
Ejemplo: Registrar Yape empresarial
BilleteraDigital::create([
    'id_metodo_pago' => 7,  // Yape
    'id_banco' => 1,         // BCP
    'numero' => '987654321',
    'titular' => 'EMPRESA SAC',
    'tipo_documento' => '6',
    'documento' => '20612706702',
    'activa' => true,
]);

Scope de Consulta

MetodoPago.php:63
public function scopeActivo($query)
{
    return $query->where('activo', true);
}
Uso:
// Obtener solo métodos activos con sus cuentas
$metodosActivos = MetodoPago::activo()
    ->with(['banco', 'cuentaBancaria'])
    ->orderBy('nombre')
    ->get();

Integración con Ventas

Cuando se registra una venta, el sistema valida el método de pago:
// Obtener método de pago de la venta
$metodoPago = MetodoPago::find($venta->id_metodo_pago);

if ($metodoPago->requiere_referencia && empty($venta->referencia_pago)) {
    throw new \Exception('Este método de pago requiere número de referencia');
}

if (!$metodoPago->es_efectivo && $metodoPago->id_cuenta) {
    // Registrar movimiento bancario automático
    MovimientoBancario::create([
        'id_cuenta' => $metodoPago->id_cuenta,
        'tipo' => 'ingreso',
        'monto' => $venta->total,
        'concepto' => 'Venta ' . $venta->serie . '-' . $venta->numero,
        'id_venta' => $venta->id_venta,
    ]);
}

Componente React Reutilizable

El sistema incluye un componente MetodoPago.jsx reutilizable:
resources/js/components/shared/MetodoPago.jsx
import MetodoPago from '@/components/shared/MetodoPago';

<MetodoPago
  value={metodoPagoSeleccionado}
  onChange={setMetodoPagoSeleccionado}
  onReferenciaChange={setReferencia}
  monto={total}
  required
/>
Props:
  • value: ID del método seleccionado
  • onChange: Callback al cambiar método
  • onReferenciaChange: Callback para el número de referencia
  • monto: Monto de la transacción (para validar límites)
  • required: Campo obligatorio

Métodos de Pago Comunes en Perú

MétodoTipoRequiere Ref.Banco
EfectivoefectivoNo-
YapebilleteraBCP
PlinbilleteraVarios
TunkibilleteraInterbank
POS VisatarjetaSegún POS
POS MastercardtarjetaSegún POS
TransferenciatransferenciaSegún cuenta
Yape es exclusivo del BCP, mientras que Plin es interoperable entre múltiples bancos.

Integración con Frontend

Componentes ubicados en:
resources/js/components/Finanzas/MetodosPago/
├── page.jsx                  # Lista de métodos
├── MetodoPagoForm.jsx        # Formulario crear/editar
├── ConfiguracionEmpresa.jsx  # Configuración por empresa
└── hooks/
    ├── useMetodosPago.js
    └── useConfiguracion.js
Ejemplo de uso:
import { useMetodosPago } from './hooks';

const { data: metodos } = useMetodosPago();

const crearMetodo = useMutation({
  mutationFn: (datos) => api.post('/metodos-pago', datos),
  onSuccess: () => {
    toast.success('Método de pago creado');
    queryClient.invalidateQueries(['metodos-pago']);
  },
});

Build docs developers (and LLMs) love