Icono del sitio Códigos de Programación

Genera ticket de venta con PHP y MySQL

En el mundo del comercio, la generación de tickets de venta es una tarea esencial para los negocios. En este artículo, te mostraremos cómo crear un ticket de venta utilizando PHP y MySQL, y cómo darle un toque profesional incorporando la librería FPDF para la generación de documentos PDF.

Requisitos previos

Antes de empezar, asegúrate de tener los siguientes elementos:

Base de datos

Después de cumplir con los requisitos previos necesitamos tener una base de datos, para este ejemplo crearemos una base de datos llama «mi_tienda» y crearemos 3 tablas para productos, ventas y detalle de ventas, con la siguiente estructura:

Estructura de tabla para la tabla productos

--
-- Estructura de tabla para la tabla `productos`
--

CREATE TABLE `productos` (
  `id` int NOT NULL,
  `codigo` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
  `nombre` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `precio` decimal(10,2) NOT NULL,
  `existencia` int NOT NULL,
  `activo` tinyint NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `productos`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `codigo` (`codigo`);

Estructura de tabla para la tabla ventas

CREATE TABLE `ventas` (
  `id` int NOT NULL,
  `folio` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `total` decimal(10,2) NOT NULL,
  `id_usuario` smallint NOT NULL,
  `activo` tinyint NOT NULL,
  `fecha` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `ventas`
  ADD PRIMARY KEY (`id`);

Estructura de tabla para la tabla detalle_venta

CREATE TABLE `detalle_venta` (
  `id` int NOT NULL,
  `id_venta` int NOT NULL,
  `id_producto` int NOT NULL,
  `nombre` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `cantidad` int NOT NULL,
  `precio` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `detalle_venta`
  ADD CONSTRAINT `fk_detalle_producto` FOREIGN KEY (`id_producto`) REFERENCES `productos` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  ADD CONSTRAINT `fk_detalle_venta` FOREIGN KEY (`id_venta`) REFERENCES `ventas` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

Si deseas obtener el archivo SQL completo con datos de las tablas, visita el siguiente enlace: https://github.com/mroblesdev/ticket-php-mysql/blob/main/mi_tienda.sql

Crear proyecto de PHP

Para iniciar con la programación, es necesario crear una carpeta dentro del directorio raíz de nuestro servidor web. Ya sea que estés utilizando XAMPP, Laragon u otra plataforma, el directorio raíz puede tener nombres como «www», «htdocs», «public_html», entre otros.

Para este ejemplo el nombre de la carpeta del proyecto la llamaremos «ticket».

Conexión a base de datos

Es hora de establecer la conexión de PHP con MySQL para acceder a la información de las tablas. Para lograr esto, creamos un archivo llamado «conexion.php» dentro de la carpeta de nuestro proyecto.

<?php

$mysqli = new mysqli('localhost', 'root', 'password', 'mi_tienda');

if ($mysqli->connect_error) {
    echo 'Error de Conexión ' . $mysqli->connect_error;
    exit;
}

?>

Asegúrate de reemplazar los datos de conexión a MySQL.

Biblioteca FPDF

Para generar el ticket de venta, utilizaremos un archivo PDF con la biblioteca FPDF. Para comenzar, es necesario descargarla desde el sitio oficial fpdf.org/es/download.php.

Después de descargar el archivo ZIP, creamos una carpeta llamada «fpdf» dentro de nuestro proyecto. Posteriormente, extraemos todo el contenido del archivo ZIP en esta carpeta.

Agregar logotipo

Antes de elaborar el script para la generación del ticket, es necesario incorporar una imagen que se utilizará como logotipo. Para llevar a cabo esto, creamos una carpeta denominada «images» dentro de nuestro proyecto y añadimos en su interior alguna imagen con la extensión .png.

Crear ticket

Hemos alcanzado el punto crucial en el cual elaboraremos nuestro ticket de venta. Para lograrlo, creamos un archivo en nuestro proyecto con el nombre «index.php».

Hasta este momento, la estructura de nuestro proyecto se presenta de la siguiente manera:

A continuación, te proporcionamos el código fuente que utilizarás para generar el ticket de venta. Este código se encarga de recuperar la información de la venta desde la base de datos y utiliza la librería FPDF para crear un documento PDF que representa el ticket.

<?php

// Requiere los archivos necesarios
require 'conexion.php';
require 'fpdf/fpdf.php';

// Definición de constantes
define('MONEDA', '$');

// Obtener el ID de la venta
$idVenta = isset($_GET['id']) ? $mysqli->real_escape_string($_GET['id']) : 1;

// Validar el formato del ID de venta
if (filter_var($idVenta, FILTER_VALIDATE_INT) === false) {
    $idVenta = 1;
}

// Consulta para obtener la información de la venta
$sqlVenta = "SELECT folio, total, DATE_FORMAT(fecha,'%d/%m/%Y') AS fecha_venta, DATE_FORMAT(fecha,'%H:%i') AS hora
FROM ventas WHERE id = $idVenta LIMIT 1";
$resultado = $mysqli->query($sqlVenta);

// Verificar si hay resultados
$numeroFilas = $resultado->num_rows;
if ($numeroFilas == 0) {
    echo 'No hay datos que coincidan con la consulta';
    exit;
}

// Obtener los detalles de la venta
$row_venta = $resultado->fetch_assoc();
$total = number_format($row_venta['total'], 2, '.');

$sqlDetalle = "SELECT nombre, cantidad, precio FROM detalle_venta WHERE id_venta = $idVenta";
$resultadoDetalle = $mysqli->query($sqlDetalle);

// Crear el documento PDF con FPDF
$pdf = new FPDF('P', 'mm', array(80, 200));
$pdf->AddPage();
$pdf->SetMargins(5, 5, 5);
$pdf->SetFont('Arial', 'B', 9);

// Agregar logo
$pdf->Image('images/logo.png', 15, 2, 45);

// Información de la tienda
$pdf->Ln(7);
$pdf->MultiCell(70, 5, 'MI TIENDA CDP', 0, 'C');
$pdf->Ln(1);

// Número de ticket
$pdf->SetFont('Arial', 'B', 8);
$pdf->Cell(17, 5, mb_convert_encoding('Núm ticket: ', 'ISO-8859-1', 'UTF-8'), 0, 0, 'L');
$pdf->SetFont('Arial', '', 8);
$pdf->Cell(53, 5, $row_venta['folio'], 0, 1, 'L');

// Línea divisoria
$pdf->Cell(70, 2, '-------------------------------------------------------------------------', 0, 1, 'L');

// Encabezados de productos
$pdf->Cell(10, 4, 'Cant.', 0, 0, 'L');
$pdf->Cell(30, 4, mb_convert_encoding('Descripción', 'ISO-8859-1', 'UTF-8'), 0, 0, 'L');
$pdf->Cell(15, 4, 'Precio', 0, 0, 'C');
$pdf->Cell(15, 4, 'Importe', 0, 1, 'C');

// Línea divisoria
$pdf->Cell(70, 2, '-------------------------------------------------------------------------', 0, 1, 'L');

// Detalles de cada producto
$totalProductos = 0;
$pdf->SetFont('Arial', '', 7);

while ($row_detalle = $resultadoDetalle->fetch_assoc()) {
    $importe = number_format($row_detalle['cantidad'] * $row_detalle['precio'], 2, '.', ',');
    $totalProductos += $row_detalle['cantidad'];

    $pdf->Cell(10, 4, $row_detalle['cantidad'], 0, 0, 'L');
    $yInicio = $pdf->GetY();
    $pdf->MultiCell(30, 4, mb_convert_encoding($row_detalle['nombre'], 'ISO-8859-1', 'UTF-8'), 0, 'L');
    $yFin = $pdf->GetY();
    $pdf->SetXY(45, $yInicio);
    $pdf->Cell(15, 4, MONEDA . ' ' . number_format($row_detalle['precio'], 2, '.', ','), 0, 0, 'C');
    $pdf->SetXY(60, $yInicio);
    $pdf->Cell(15, 4, MONEDA . ' ' . $importe, 0, 1, 'R');
    $pdf->SetY($yFin);
}

$resultadoDetalle->close();

// Información final
$pdf->Ln();
$pdf->Cell(70, 4, mb_convert_encoding('Número de articulos:  ' . $totalProductos, 'ISO-8859-1', 'UTF-8'), 0, 1, 'L');
$pdf->SetFont('Arial', 'B', 8);
$pdf->Cell(70, 5, sprintf('Total: %s  %s', MONEDA, number_format($total, 2, '.', ',')), 0, 1, 'R');
$pdf->Ln(2);
$pdf->SetFont('Arial', '', 8);

$pdf->Cell(35, 5, 'Fecha: ' . $row_venta['fecha_venta'], 0, 0, 'C');
$pdf->Cell(35, 5, 'Hora: ' . $row_venta['hora'], 0, 1, 'C');
$pdf->Ln();
$pdf->MultiCell(70, 5, 'AGRADECEMOS SU PREFERENCIA VUELVA PRONTO!!!', 0, 'C');

// Cerrar conexiones y generar el PDF
$resultado->close();
$mysqli->close();
$pdf->Output();

Visualizar ticket

Si estás utilizando un entorno de desarrollo local como XAMPP o Laragon, puedes acceder a tu proyecto a través de la URL local, por ejemplo, http://localhost/ticket

En este caso, se muestra la venta con el ID 1, dado que no hemos proporcionado ningún ID y toma el valor predefinido. Para generar el ticket de una venta específica, debes pasar la variable «id» a través de la URL con el valor del ID de la venta que deseamos generar. Por ejemplo, http://localhost/ticket/index.php?id=5

Explicación en vídeo y descarga de código fuente

A continuación, compartimos una explicación en formato de vídeo:

También puedes descargar el código fuente y la base de datos desde nuestro repositorio en GitHub: https://github.com/mroblesdev/ticket-php-mysql

Conclusiones

Con este código, puedes generar fácilmente tickets de venta en formato PDF, personalizados con la información de tu tienda y de cada transacción. Asegúrate de adaptar el código según las especificaciones de tu base de datos y los detalles de tu negocio. ¡Esperamos que esta guía te haya sido útil para mejorar la presentación de tus tickets de venta!


Salir de la versión móvil