Skip to main content

Reportes de Compras

El módulo de reportes de compras permite analizar los gastos, proveedores y tendencias de adquisiciones.

Tipos de Reportes

Historial de Compras

Listado completo de todas las compras registradas

Compras por Proveedor

Agrupación de compras por proveedor con totales

Análisis de Gastos

Evolución de gastos por periodo

Compras por Producto

Productos más comprados y costos

Exportar Historial de Compras

1

Acceder al módulo

Navega a Compras en el menú principal y haz clic en Exportar.
2

Seleccionar formato

  • Excel: Hoja de cálculo con formato
  • PDF: Documento imprimible
3

Descargar archivo

El reporte se genera con todas las compras activas de la empresa.

Exportación a Excel

Endpoint: POST /api/compras/export/excel Archivo generado: compras-YYYY-MM-DD-HHMMSS.xlsx

Estructura del Reporte

Columnas incluidas:
ColumnaDescripciónEjemplo
FechaFecha de emisión15/01/2024
DocumentoSerie-NúmeroF001-00000045
ProveedorRazón socialDISTRIBUIDORA XYZ S.A.C.
RUCRUC del proveedor20123456789
MonedaPEN o USDPEN
TotalMonto total5,280.00
EstadoACTIVO/ANULADOACTIVO
Características del formato:
  • Título verde (#10B981) con nombre de la empresa
  • Fecha y hora de generación
  • Encabezados con fondo azul claro (#90BFEB)
  • Bordes en todas las celdas
  • Ancho automático de columnas
// CompraExportController.php:21-101
public function exportExcel(Request $request)
{
    $user = Auth::user();
    
    $compras = Compra::with('proveedor')
        ->where('id_empresa', $user->id_empresa)
        ->orderBy('fecha_emision', 'desc')
        ->get();
    
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    
    // Título
    $sheet->setCellValue('A1', 'HISTORIAL DE COMPRAS');
    $sheet->getStyle('A1')->applyFromArray([
        'font' => ['bold' => true, 'size' => 14, 'color' => ['rgb' => 'FFFFFF']],
        'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '10B981']]
    ]);
    
    // Datos
    $row = 5;
    foreach ($compras as $c) {
        $sheet->setCellValue('A' . $row, $c->fecha_emision->format('d/m/Y'));
        $sheet->setCellValue('B' . $row, $c->serie . '-' . str_pad($c->numero, 8, '0', STR_PAD_LEFT));
        $sheet->setCellValue('C' . $row, $c->proveedor->razon_social ?? 'N/A');
        // ... más columnas
    }
}

Exportación a PDF

Endpoint: POST /api/compras/export/pdf Configuración mPDF:
$mpdf = new Mpdf([
    "mode" => "utf-8",
    "format" => "A4",
    "tempDir" => storage_path("app/mpdf"),
    "margin_left" => 10,
    "margin_right" => 10,
    "margin_top" => 10,
    "margin_bottom" => 10
]);

$mpdf->SetTitle("Reporte General de Compras");
Vista Blade: resources/views/guias/reportes-compras-lista.blade.php El PDF se muestra directamente en el navegador (Output("I")) con nombre Compras-YYYYMMDD.pdf.

Análisis por Proveedor

Aunque no hay un endpoint específico, puedes obtener información agrupada con:
SELECT 
  pr.razon_social,
  pr.ruc,
  COUNT(c.id_compra) as num_compras,
  SUM(c.total) as total_comprado,
  AVG(c.total) as ticket_promedio,
  MAX(c.fecha_emision) as ultima_compra
FROM compras c
JOIN proveedores pr ON pr.id_proveedor = c.id_proveedor
WHERE c.id_empresa = ? AND c.estado = '1'
GROUP BY pr.id_proveedor
ORDER BY total_comprado DESC
Métricas útiles:
  • Total comprado por proveedor
  • Número de compras realizadas
  • Ticket promedio
  • Frecuencia de compra
  • Última fecha de compra

Reportes de Cuentas por Pagar

Para analizar deudas a proveedores, usa el módulo de Cuentas por Pagar. Endpoint: POST /api/cuentas-pagar/export/excel Columnas:
  • Documento (Serie-Número)
  • Proveedor
  • Fecha de Vencimiento
  • Monto
  • Estado (PENDIENTE/VENCIDO/PAGADO)
  • Fecha de Pago
// CuentasPorPagarExportController.php:44-117
public function exportExcel(Request $request)
{
    $cuotas = $this->getCuotas($request);  // Con filtros aplicados
    
    foreach ($cuotas as $c) {
        $compra = $c->compra;
        $esVencido = $c->estado === '1' && $c->fecha->lt(now());
        $estadoLabel = $c->estado === '0' ? 'PAGADO' 
                     : ($esVencido ? 'VENCIDO' : 'PENDIENTE');
        
        // ... llenar celdas
    }
}
Filtros disponibles:
  • estado: 1 (pendiente), 0 (pagado), V (vencido)
  • fecha_desde: Fecha inicio
  • fecha_hasta: Fecha fin
  • proveedor: Búsqueda por nombre o RUC
Las cuentas por pagar se generan automáticamente cuando registras una compra a crédito con cuotas.

Filtros Comunes

Por Fecha

const [filters, setFilters] = useState({
  fecha_desde: '2024-01-01',
  fecha_hasta: '2024-12-31'
});

// Filtrar compras
const comprasFiltradas = compras.filter(c => {
  const fecha = new Date(c.fecha_emision);
  return fecha >= new Date(filters.fecha_desde) 
      && fecha <= new Date(filters.fecha_hasta);
});

Por Proveedor

const [proveedorId, setProveedorId] = useState(null);

// Filtrar por proveedor específico
const comprasProveedor = compras.filter(c => 
  c.id_proveedor === proveedorId
);

Por Estado

// Solo compras activas
const comprasActivas = compras.filter(c => c.estado === '1');

// Solo compras anuladas
const comprasAnuladas = compras.filter(c => c.estado === '0');

Análisis de Gastos

Para un análisis financiero completo, combina los reportes de compras con:

1. Movimientos de Caja

// Obtener egresos del periodo
const gastosCaja = await fetch('/api/caja/movimientos', {
  method: 'POST',
  body: JSON.stringify({
    tipo: 'egreso',
    fecha_desde: '2024-01-01',
    fecha_hasta: '2024-12-31'
  })
});

2. Utilidades

Ve al módulo de Reportes FinancierosUtilidades para ver:
  • Ingresos (ventas)
  • Costos (productos vendidos)
  • Gastos (compras + egresos)
  • Utilidad Neta = Ingresos - Costos - Gastos

Indicadores Clave (KPIs)

Total Comprado

Suma de todas las compras del periodo

Número de Compras

Cantidad de documentos registrados

Ticket Promedio

Monto promedio por compra

Proveedor Principal

Proveedor con mayor volumen de compras

Ejemplo de Cálculo

const calcularKPIs = (compras) => {
  const activas = compras.filter(c => c.estado === '1');
  
  const totalComprado = activas.reduce((sum, c) => sum + c.total, 0);
  const numCompras = activas.length;
  const ticketPromedio = numCompras > 0 ? totalComprado / numCompras : 0;
  
  // Agrupar por proveedor
  const porProveedor = {};
  activas.forEach(c => {
    const id = c.id_proveedor;
    if (!porProveedor[id]) {
      porProveedor[id] = {
        nombre: c.proveedor.razon_social,
        total: 0,
        count: 0
      };
    }
    porProveedor[id].total += c.total;
    porProveedor[id].count++;
  });
  
  // Ordenar y obtener top
  const proveedorPrincipal = Object.values(porProveedor)
    .sort((a, b) => b.total - a.total)[0];
  
  return {
    totalComprado,
    numCompras,
    ticketPromedio,
    proveedorPrincipal
  };
};

Solución de Problemas

Causa: Las compras anuladas no aparecen por defecto.Solución: El endpoint filtra automáticamente por estado = '1'. Si necesitas incluir compras anuladas, modifica el query:
$compras = Compra::where('id_empresa', $user->id_empresa)
    // Remover el filtro ->where('estado', '1')
    ->orderBy('fecha_emision', 'desc')
    ->get();
Causa: El proveedor no tiene RUC registrado.Solución:
  1. Ve a Proveedores
  2. Edita el proveedor y completa el campo RUC
  3. Vuelve a generar el reporte
Causa: Muchas compras en el reporte.Solución: Filtra por periodo o proveedor específico antes de generar el PDF. Para reportes grandes, usa Excel.

Próximos Pasos

Cuentas por Pagar

Gestiona deudas con proveedores

Reportes de Inventario

Analiza el costo de inventario

Reportes de Ventas

Compara ingresos vs gastos

Exportar a Contabilidad

Formatos para sistemas contables

Build docs developers (and LLMs) love