Visión General
El módulo de Cuentas por Pagar gestiona las obligaciones de pago con proveedores. Se basa en el modelo DiaCompra que representa las fechas de vencimiento de cada compra.
A diferencia de las cuentas por cobrar que manejan cuotas múltiples, las cuentas por pagar se enfocan en el control de vencimientos por compra completa.
Estructura de Datos
Modelo DiaCompra
La tabla dias_compras almacena las obligaciones de pago:
protected $fillable = [
'id_compra' ,
'monto' , // Monto total a pagar
'fecha' , // Fecha de vencimiento
'estado' , // 1=Pendiente, 0=Pagada, V=Vencida
'fecha_pago' // Fecha efectiva de pago
];
Estados de Obligación
1 (Pendiente) : La compra no ha sido pagada
0 (Pagada) : La compra ha sido pagada completamente
V (Vencida) : El pago está pendiente y el vencimiento ya pasó
Las cuentas por pagar NO permiten pagos parciales. Cada registro representa el monto total de la compra.
API Endpoints
Listar Cuentas por Pagar
CuentasPorPagarController.php:12
GET / api / cuentas - por - pagar
Filtros disponibles:
Estado de la obligación: 1 (Pendiente), 0 (Pagada), V (Vencida)
Filtrar por fecha de vencimiento desde
Filtrar por fecha de vencimiento hasta
Buscar por razón social o RUC del proveedor
Respuesta:
{
"success" : true ,
"data" : [
{
"dias_compra_id" : 89 ,
"id_compra" : 456 ,
"documento" : "FC01-00000456" ,
"proveedor" : "DISTRIBUIDORA XYZ SAC" ,
"proveedor_ruc" : "20123456789" ,
"fecha_emision" : "2026-02-15" ,
"fecha_vencimiento" : "2026-03-15" ,
"monto" : "8500.00" ,
"estado" : "1" ,
"fecha_pago" : null
}
],
"resumen" : {
"total_pendiente" : "45000.00" ,
"total_vencido" : "12000.00" ,
"proximas_vencer" : 8 ,
"total_pagado_mes" : "32000.00"
}
}
Registrar Pago
CuentasPorPagarController.php:98
POST / api / cuentas - por - pagar / { id } / pagar
Request Body:
{
"fecha_pago" : "2026-03-06"
}
Solo se requiere la fecha de pago. El monto es siempre el total de la compra (no hay pagos parciales).
Lógica de pago:
CuentasPorPagarController.php:110
if ( $cuota -> estado === '0' ) {
return response () -> json ([
'success' => false ,
'message' => 'Esta cuota ya está pagada'
], 400 );
}
$cuota -> estado = '0' ;
$cuota -> fecha_pago = $request -> fecha_pago ;
$cuota -> save ();
Scopes de Consulta
public function scopePendientes ( $query )
{
return $query -> where ( 'estado' , '1' );
}
public function scopePagadas ( $query )
{
return $query -> where ( 'estado' , '0' );
}
public function scopeVencidas ( $query )
{
return $query -> where ( 'estado' , '1' )
-> where ( 'fecha' , '<' , now () -> toDateString ());
}
public function scopeProximasVencer ( $query , int $dias = 7 )
{
return $query -> where ( 'estado' , '1' )
-> whereBetween ( 'fecha' , [ now () -> toDateString (), now () -> addDays ( $dias ) -> toDateString ()]);
}
Ejemplos de uso:
// Obtener obligaciones pendientes
$pendientes = DiaCompra :: pendientes ()
-> whereHas ( 'compra' , fn ( $q ) => $q -> where ( 'id_empresa' , 1 ))
-> get ();
// Total de deuda vencida
$totalVencido = DiaCompra :: vencidas ()
-> whereHas ( 'compra' , fn ( $q ) => $q -> where ( 'id_empresa' , 1 ))
-> sum ( 'monto' );
// Pagos que vencen esta semana
$proximasVencer = DiaCompra :: proximasVencer ( 7 )
-> with ( 'compra.proveedor' )
-> get ();
Relaciones de Base de Datos
Comparación con Cuentas por Cobrar
Cuentas por Cobrar
Basadas en modelo DiaVenta
Permiten pagos parciales
Estados: P, C, V
Campo monto_pagado incremental
Múltiples cuotas por venta
Cuentas por Pagar
Basadas en modelo DiaCompra
NO permiten pagos parciales
Estados: 1, 0, V
Sin campo monto_pagado
Una obligación por compra
Integración con Compras
Las cuentas por pagar se generan automáticamente al crear una compra:
// En ComprasController al crear compra a crédito
if ( $request -> tipo_pago === 'credito' ) {
DiaCompra :: create ([
'id_compra' => $compra -> id_compra ,
'monto' => $compra -> total ,
'fecha' => $request -> fecha_vencimiento ,
'estado' => '1' , // Pendiente
]);
}
Permisos Requeridos
Para acceder a este módulo:
Ver cuentas por pagar : cuentas-pagar.view
Registrar pagos : cuentas-pagar.edit
Generar reportes : cuentas-pagar.report
Los usuarios administradores (rol_id = 1) tienen acceso automático a todas las funciones.
Integración con Frontend
Componentes React ubicados en:
resources/js/components/Finanzas/CuentasPorPagar/
├── page.jsx # Vista principal
├── columns/ # Columnas de DataTable
└── hooks/ # useObtenerCuentasPagar
Ejemplo de llamada API:
import { obtenerCuentasPagar , registrarPago } from '@/services/finanzas' ;
const { data : cuentas } = useQuery ({
queryKey: [ 'cuentas-pagar' , filtros ],
queryFn : () => obtenerCuentasPagar ( filtros ),
});
const pagarMutation = useMutation ({
mutationFn : ( id ) => registrarPago ( id , { fecha_pago: new Date () }),
onSuccess : () => {
toast . success ( 'Pago registrado' );
queryClient . invalidateQueries ([ 'cuentas-pagar' ]);
},
});
Reportes Disponibles
Excel : Listado de obligaciones con filtros
PDF : Antigüedad de saldos por proveedor
Dashboard : Indicadores de liquidez y compromisos
// Flujo de caja proyectado
$proximosPagos = DiaCompra :: pendientes ()
-> where ( 'fecha' , '>=' , now ())
-> where ( 'fecha' , '<=' , now () -> addDays ( 30 ))
-> orderBy ( 'fecha' )
-> with ( 'compra.proveedor' )
-> get ();