Crear Reporte de Ventas FPDF, PHP y MySQL

Vamos a crear un reporte de ventas totales de ejemplo con usando la libreria FPDF , lenguaje PHP y base de datos MySQL.

Este articulo es parte del Centro de Tutoriales y Recursos Tecnicos →

Bienvenido a estar Guia maestra donde vas a aprender a usar PHP y FPDF para crear Reportes de Ventas con datos en la base de datos MySQL.

Para crear el reporte que vamos a usar necesitamos los siguientes requerimientos.

  • Una base de datos de ventas (esta mas abajo en esta Guia)
  • La libreria fpdf

La libreria la pueden descargar de la pagina oficial http://www.fpdf.org/ 

Vamos a empezar que es FPDF ?

Fpdf es una libreria clasica entre las clasicas para generar PDFs con PHP y hay implementaciones para otros lenguajes.

<?php
/**
 * Generación de PDF con Imágenes y Enlaces
 * Librería: FPDF
 * Author: @evilnapsis
 */

// 1. Inclusión de la librería FPDF
include "fpdf/fpdf.php";

// 2. Instancia de la clase y configuración de página
$pdf = new FPDF();
$pdf->AddPage();

// 3. Configuración de título
$pdf->SetFont("Arial", "B", 24); // Fuente Arial, Negrita, Tamaño 24
$pdf->SetY(20);                  // Posición Vertical
$pdf->SetX(10);                  // Posición Horizontal
$pdf->Cell(0, 10, utf8_decode("Insertar Imagen en FPDF PHP"), 0, 1, "C");
// 4. Salida del documento al navegador
$pdf->Output();
?>

Ver Tutorial Crear un PDF con FPDF

Los reportes con FPDF pueden llevar imagenes para ello tenemos la funcion image que agrega una imagen de una ubicacion en la carpeta del proyecto.

$pdf->Image("logo.jpg",60,50, 100, 70);

Parámetros: $pdf->Image()

La sintaxis que proporcionaste se desglosa de la siguiente manera:

  1. "logo.jpg" (Ruta): El nombre o ruta del archivo de imagen (soporta JPG, PNG y GIF).
  2. 60 (Posición X): La distancia en milímetros desde el borde izquierdo de la página.
  3. 50 (Posición Y): La distancia en milímetros desde el borde superior de la página.
  4. 100 (Ancho/Width): El tamaño horizontal que ocupará la imagen en el reporte.
  5. 70 (Alto/Height): El tamaño vertical de la imagen.

Ver Tutorial: Insertar Imagen en un PDF con FPDF y PHP

Base de datos

La base de datos de ventas que vamos a usar sera la del sistema Inventio Lite o Inventio Max ya que ambos tienen registro de ventas, Inventio Max tiene mas campos, pero para el reporte que vamos a hacer solo vamos a usar los campos.

  • id de venta
  • cliente_id
  • monto de la venta
  • descuento
  • fecha

Y listo, si ya tienes descargado el sistema Inventio Lite o Inventio Max ya tienes la base de datos, sino aqui te dejo la tabla SQL.

create table sell(
	id int not null auto_increment primary key,
	person_id int ,
	user_id int ,
	operation_type_id int default 2,
	box_id int,
	total double,
	cash double,
	discount double,
	foreign key (box_id) references box(id),
	foreign key (operation_type_id) references operation_type(id),
	foreign key (user_id) references user(id),
	foreign key (person_id) references person(id),
	created_at datetime
);

La tabla de inventio lite pide que tengas otras tablas relacionadas pero aqui te dejo una version de la tabla sell sin las referencias a otras tablas.

create table sell(
	id int not null auto_increment primary key,
	person_id int ,
	user_id int ,
	operation_type_id int default 2,
	box_id int,
	total double,
	cash double,
	discount double,
	created_at datetime
);

Para usar la version 2 solo vamos a agregar un numero en el campo person_id que sera el id de nuestro cliente.

Para insertar una venta manualmente desde SQL vamos a usar la siguiente consulta.

insert into sell (person_id,operation_type_id, total, discount,created_at) value (1,2,100,0,NOW());
insert into sell (person_id,operation_type_id, total, discount,created_at) value (1,2,200,0,NOW());
insert into sell (person_id,operation_type_id, total, discount,created_at) value (1,2,130,0,NOW());
insert into sell (person_id,operation_type_id, total, discount,created_at) value (1,2,10,0,NOW());
insert into sell (person_id,operation_type_id, total, discount,created_at) value (1,2,300,0,NOW());

El campo operation_type_id si el id es 1 nos referimos a una compra y si el id es 2 nos referimos a una venta.

El campo total hace referencia al total de la compra y el descuento en caso de que se aplique y el campo de fecha o created_at usamos NOW() para guardar la fecha actual.

Crear Reporte de Ventas

Ahora ya que tenemos todos los requerimientos, vamos con el codigo de nuestro reporte de ventas.

Para obtener las ventas vamos a usar la siguiente consulta SQL.

$sql = "SELECT id, person_id, total, discount, created_at FROM sell WHERE operation_type_id = 2 ORDER BY created_at DESC";

El codigo completo en lenguaje PHP para generar el reporte es el siguiente, incluye comentarios.

<?php
/**
 * Reporte de Ventas con FPDF and PDO
 */

// Incluimos la librería FPDF
// Asegúrate de que la ruta sea correcta según tu estructura de carpetas
require('fpdf/fpdf.php');

// Configuración de la base de datos (ajusta según tus credenciales)
$host = 'localhost';
$db   = 'inventiolite'; // Nombre de tu base de datos
$user = 'root';            // Tu usuario de MySQL
$pass = '';                // Tu contraseña de MySQL
$charset = 'utf8mb4';      // Juego de caracteres para evitar problemas con tildes

// DSN (Data Source Name) para la conexión PDO
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    // Intentamos conectar a la base de datos con PDO
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    // Si hay un error en la conexión, lo mostramos y detenemos la ejecución
    die("Error al conectar a la base de datos: " . $e->getMessage());
}

// Creamos una clase que hereda de FPDF para personalizar el encabezado y pie de página
class PDF extends FPDF {
    // Encabezado del reporte
    function Header() {
        // Logo o Título
        $this->SetFont('Arial', 'B', 15);
        $this->Cell(0, 10, 'REPORTE DE VENTAS', 0, 1, 'C');
        $this->Ln(5); // Salto de línea
        
        // Cabecera de la tabla
        $this->SetFillColor(232, 232, 232); // Color de fondo para las celdas
        $this->SetFont('Arial', 'B', 12);
        
        // Celdas: ancho, alto, texto, borde, salto, alineación, relleno
        $this->Cell(20, 10, 'ID', 1, 0, 'C', true);
        $this->Cell(40, 10, 'Cliente', 1, 0, 'C', true);
        $this->Cell(40, 10, 'Total', 1, 0, 'C', true);
        $this->Cell(30, 10, 'Descuento', 1, 0, 'C', true);
        $this->Cell(60, 10, 'Fecha', 1, 1, 'C', true);
    }

    // Pie de página del reporte
    function Footer() {
        // Posición a 1.5 cm del final
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        // Número de página
        $this->Cell(0, 10, 'Pagina ' . $this->PageNo() . '/{nb}', 0, 0, 'C');
    }
}

// Creamos el objeto PDF
$pdf = new PDF();
$pdf->AliasNbPages(); // Para mostrar el total de páginas
$pdf->AddPage();      // Añadimos la primera página
$pdf->SetFont('Arial', '', 10); // Fuente normal para el contenido

// Consulta SQL para obtener las ventas
$sql = "SELECT id, person_id, total, discount, created_at FROM sell WHERE operation_type_id = 2 ORDER BY created_at DESC";

try {
    // Ejecutamos la consulta
    $stmt = $pdo->query($sql);
    
    // Recorremos los resultados (filas de la tabla sell)
    while ($row = $stmt->fetch()) {
        $pdf->Cell(20, 8, $row['id'], 1, 0, 'C');
        $pdf->Cell(40, 8, $row['person_id'], 1, 0, 'C');
        // Formateamos los números a dos decimales y agregamos el símbolo $
        $pdf->Cell(40, 8, '$' . number_format($row['total'], 2), 1, 0, 'R');
        $pdf->Cell(30, 8, '$' . number_format($row['discount'], 2), 1, 0, 'R');
        $pdf->Cell(60, 8, $row['created_at'], 1, 1, 'C');
    }
} catch (\PDOException $e) {
    // Error en la consulta
    $pdf->Ln(10);
    $pdf->SetTextColor(255, 0, 0);
    $pdf->Cell(0, 10, 'Error al consultar datos: ' . $e->getMessage(), 0, 1, 'C');
}

// Salida del archivo PDF directamente al navegador
$pdf->Output('I', 'reporte_ventas.pdf');
?>

Y el resultado al seria.

Descargar

Link de descarga de la libreria y el reporte: https://drive.google.com/file/d/1Ja2b0DNSsVtVHo3FGJ0ZJdyMTO7tVgng/view

Vamos a estar creando reportes personalizados para diferentes sistemas como Inventio Lite, Inventio Max, Megastore Max y otros.

Mas Ejemplos

Aqui te dejo una serie de formatos que he desarrollado y uso para mis proyectos, aunque son los formatos solo con PHP, con lo que aprendiste en esta guia les puedes agregar la conexion a mysql y conectarlos tu mismo a la base de datos.

Tip de Ingeniería: Recuerda que si manejas nombres de clientes con tildes o eñes, es vital usar utf8_decode() en las celdas de FPDF para que los caracteres se muestren correctamente.

¿Necesitas un sistema de reportes más avanzado?

Si en lugar de programar cada reporte prefieres una solución profesional ya lista para usar, conoce Inventio Max. Un sistema completo de Inventario y Ventas con reportes automáticos, gestión de stock y facturación profesional.

Ver Inventio Max: Sistema de Inventario y Ventas Profesional →

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Evilnapsis

Subscribe now to keep reading and get access to the full archive.

Continue reading