Skip to main content

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:
DiaCompra.php:13
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
string
Estado de la obligación: 1 (Pendiente), 0 (Pagada), V (Vencida)
fecha_desde
date
Filtrar por fecha de vencimiento desde
fecha_hasta
date
Filtrar por fecha de vencimiento hasta
proveedor
string
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

DiaCompra.php:34
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();

Build docs developers (and LLMs) love