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
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
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
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
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
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étodo Tipo Requiere Ref. Banco Efectivo efectivo No - Yape billetera Sí BCP Plin billetera Sí Varios Tunki billetera Sí Interbank POS Visa tarjeta Sí Según POS POS Mastercard tarjeta Sí Según POS Transferencia transferencia Sí Segú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' ]);
},
});