{"id":37,"date":"2022-08-31T16:40:31","date_gmt":"2022-08-31T16:40:31","guid":{"rendered":"https:\/\/pacohunterdev.com\/blog\/?p=37"},"modified":"2022-08-31T16:40:31","modified_gmt":"2022-08-31T16:40:31","slug":"sistema-de-ventas-en-php-mysql-y-bootstrap","status":"publish","type":"post","link":"https:\/\/pacohunterdev.com\/blog\/2022\/08\/31\/sistema-de-ventas-en-php-mysql-y-bootstrap\/","title":{"rendered":"Sistema de ventas en PHP, MySQL y Bootstrap"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/2-1024x499.png\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/2-1024x499.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/2-300x146.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/2-768x375.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/2.png 1347w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En este post te mostrar\u00e9 un peque\u00f1o sistema de ventas. Est\u00e1 desarrollado empleando las tecnolog\u00edas que dice en el t\u00edtulo. Adem\u00e1s te dejar\u00e9 los enlaces para que puedas descargarlo y ver una demostraci\u00f3n. Tambi\u00e9n te presentar\u00e9 algunos bloques del c\u00f3digo usado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es un sistema bastante sencillo, permite administrar productos, usuarios, clientes y obviamente las ventas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recuerda que debes de tener instalado PHP y MySQL. Por mi parte uso xampp. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La base de datos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El esquema de la base de datos lo encuentras en el archivo<em> bd.sql<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE DATABASE ventas_php;\n\nUSE ventas_php;\n\nCREATE TABLE productos(\n    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n    codigo VARCHAR(255) NOT NULL,\n    nombre VARCHAR(255) NOT NULL,\n    compra DECIMAL(8,2) NOT NULL,\n    venta DECIMAL(8,2) NOT NULL,\n    existencia INT NOT NULL\n);\n\nCREATE TABLE clientes(\n    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n    nombre VARCHAR(255) NOT NULL,\n    telefono VARCHAR(25) NOT NULL,\n    direccion VARCHAR(255) NOT NULL\n);\n\nCREATE TABLE usuarios(\n    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n    usuario VARCHAR(50) NOT NULL,\n    nombre VARCHAR(255) NOT NULL,\n    telefono VARCHAR(25) NOT NULL,\n    direccion VARCHAR(255) NOT NULL,\n    password VARCHAR(255) NOT NULL\n);\n\nINSERT INTO usuarios (usuario, nombre, telefono, direccion, password) VALUES (\"paco\", \"PacoHunterDev\", \"6667771234\", \"Nowhere\", \"$2y$10$6zeiv5cq4\/HCjWBH5X\/Fd.yxKfDaWa5sJaYfW302n.\/awI\/lQcH0i\");\n\nCREATE TABLE ventas(\n    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n    fecha DATETIME NOT NULL,\n    total DECIMAL(9,2) NOT NULL,\n    idUsuario BIGINT NOT NULL,\n    idCliente BIGINT\n);  \n\nCREATE TABLE productos_ventas(\n    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n    cantidad INT NOT NULL,\n    precio DECIMAL(8,2) NOT NULL,\n    idProducto BIGINT NOT NULL,\n    idVenta BIGINT NOT NULL\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ese es el esquema de la base de datos, al crearla se inserta un usuario y contrase\u00f1a por defecto, en este caso es <em>paco<\/em> y la <em>PacoHunterDev <\/em>respectivamente. Para crearla solo copia el esquema en la consola de mysql.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CRUD de productos, clientes y usuarios<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para todas las partes que forman el sistema, el c\u00f3digo es pr\u00e1cticamente el mismo. Solo cambian peque\u00f1as cosas como son el nombre de los campos. Pero en esencia es lo mismo. A continuaci\u00f3n te presento el HTML y las funciones de php para registrar los productos, como te menciono para las dem\u00e1s partes es similar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Formulario para registrar producto<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"332\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/registrar_productos-1024x332.png\" alt=\"\" class=\"wp-image-42\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/registrar_productos-1024x332.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/registrar_productos-300x97.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/registrar_productos-768x249.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/registrar_productos.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El archivo <em>agregar_producto.php <\/em>contiene el formulario para colocar los datos del producto. En \u00e9l mismo procesamos los datos para insertarlo en la base de datos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\ninclude_once \"encabezado.php\";\ninclude_once \"navbar.php\";\nsession_start();\n\nif(empty($_SESSION&#91;'usuario'])) header(\"location: login.php\");\n\n?&gt;\n&lt;div class=\"container\"&gt;\n    &lt;h3&gt;Agregar producto&lt;\/h3&gt;\n    &lt;form method=\"post\"&gt;\n        &lt;div class=\"mb-3\"&gt;\n            &lt;label for=\"codigo\" class=\"form-label\"&gt;C\u00f3digo de barras&lt;\/label&gt;\n            &lt;input type=\"text\" name=\"codigo\" class=\"form-control\" id=\"codigo\" placeholder=\"Escribe el c\u00f3digo de barras del producto\"&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"mb-3\"&gt;\n            &lt;label for=\"nombre\" class=\"form-label\"&gt;Nombre o descripci\u00f3n&lt;\/label&gt;\n            &lt;input type=\"text\" name=\"nombre\" class=\"form-control\" id=\"nombre\" placeholder=\"Ej. Papas\"&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"row\"&gt;\n            &lt;div class=\"col\"&gt;\n                &lt;label for=\"compra\" class=\"form-label\"&gt;Precio compra&lt;\/label&gt;\n                &lt;input type=\"number\" name=\"compra\" step=\"any\" id=\"compra\" class=\"form-control\" placeholder=\"Precio de compra\" aria-label=\"\"&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"col\"&gt;\n                &lt;label for=\"venta\" class=\"form-label\"&gt;Precio venta&lt;\/label&gt;\n                &lt;input type=\"number\" name=\"venta\" step=\"any\" id=\"venta\" class=\"form-control\" placeholder=\"Precio de venta\" aria-label=\"\"&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"col\"&gt;\n                &lt;label for=\"existencia\" class=\"form-label\"&gt;Existencia&lt;\/label&gt;\n                &lt;input type=\"number\" name=\"existencia\" step=\"any\" id=\"existencia\" class=\"form-control\" placeholder=\"Existencia\" aria-label=\"\"&gt;\n            &lt;\/div&gt;\n            \n        &lt;\/div&gt;\n        &lt;div class=\"text-center mt-3\"&gt;\n            &lt;input type=\"submit\" name=\"registrar\" value=\"Registrar\" class=\"btn btn-primary btn-lg\"&gt;\n            \n            &lt;\/input&gt;\n            &lt;a class=\"btn btn-danger btn-lg\" href=\"productos.php\"&gt;\n                &lt;i class=\"fa fa-times\"&gt;&lt;\/i&gt; \n                Cancelar\n            &lt;\/a&gt;\n        &lt;\/div&gt;\n    &lt;\/form&gt;\n&lt;\/div&gt;\n&lt;?php\nif(isset($_POST&#91;'registrar'])){\n    $codigo = $_POST&#91;'codigo'];\n    $nombre = $_POST&#91;'nombre'];\n    $compra = $_POST&#91;'compra'];\n    $venta = $_POST&#91;'venta'];\n    $existencia = $_POST&#91;'existencia'];\n    if(empty($codigo) \n    || empty($nombre) \n    || empty($compra) \n    || empty($venta)\n    || empty($existencia)){\n        echo'\n        &lt;div class=\"alert alert-danger mt-3\" role=\"alert\"&gt;\n            Debes completar todos los datos.\n        &lt;\/div&gt;';\n        return;\n    } \n    \n    include_once \"funciones.php\";\n    $resultado = registrarProducto($codigo, $nombre, $compra, $venta, $existencia);\n    if($resultado){\n        echo'\n        &lt;div class=\"alert alert-success mt-3\" role=\"alert\"&gt;\n            Producto registrado con \u00e9xito.\n        &lt;\/div&gt;';\n    }\n    \n}\n?&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Primero se incluyen los archivos de <em>encabezado.php<\/em> (que es donde colocamos los encabezados para los archivos de css y esas cosas) y <em>navbar.php <\/em>(el men\u00fa). Al final del archivo incluimos el archivo de <em>funciones.php<\/em>, en este archivo se encuentran todas las funciones que interact\u00faan con la base de datos. En este caso empleamos la funci\u00f3n de <em>registrarProducto() <\/em>que recibe el c\u00f3digo, nombre, precio de compra, precio de venta y la existencia del producto. La funci\u00f3n queda as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function registrarProducto($codigo, $nombre, $compra, $venta, $existencia){\n    $sentencia = \"INSERT INTO productos(codigo, nombre, compra, venta, existencia) VALUES (?,?,?,?,?)\";\n    $parametros = &#91;$codigo, $nombre, $compra, $venta, $existencia];\n    return insertar($sentencia, $parametros);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dentro de las funciones del CRUD usamos otras funciones para <strong>editar, eliminar, insertar y seleccionar <\/strong>los datos. Estas funciones reciben la sentencia a ejecutar y los par\u00e1metros que se deben ejecutar, son las siguientes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function select($sentencia, $parametros = &#91;]){\n    $bd = conectarBaseDatos();\n    $respuesta = $bd-&gt;prepare($sentencia);\n    $respuesta-&gt;execute($parametros);\n    return $respuesta-&gt;fetchAll();\n}\n\nfunction insertar($sentencia, $parametros ){\n    $bd = conectarBaseDatos();\n    $respuesta = $bd-&gt;prepare($sentencia);\n    return $respuesta-&gt;execute($parametros);\n}\n\nfunction eliminar($sentencia, $id ){\n    $bd = conectarBaseDatos();\n    $respuesta = $bd-&gt;prepare($sentencia);\n    return $respuesta-&gt;execute(&#91;$id]);\n}\n\nfunction editar($sentencia, $parametros ){\n    $bd = conectarBaseDatos();\n    $respuesta = $bd-&gt;prepare($sentencia);\n    return $respuesta-&gt;execute($parametros);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y la conexi\u00f3n a la base de datos es la siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function conectarBaseDatos() {\n\t$host = \"localhost\";\n\t$db   = \"ventas_php\";\n\t$user = \"root\";\n\t$pass = \"\";\n\t$charset = 'utf8mb4';\n\n\t$options = &#91;\n\t    \\PDO::ATTR_ERRMODE            =&gt; \\PDO::ERRMODE_EXCEPTION,\n\t    \\PDO::ATTR_DEFAULT_FETCH_MODE =&gt; \\PDO::FETCH_OBJ,\n\t    \\PDO::ATTR_EMULATE_PREPARES   =&gt; false,\n\t];\n\t$dsn = \"mysql:host=$host;dbname=$db;charset=$charset\";\n\ttry {\n\t     $pdo = new \\PDO($dsn, $user, $pass, $options);\n\t     return $pdo;\n\t} catch (\\PDOException $e) {\n\t     throw new \\PDOException($e-&gt;getMessage(), (int)$e-&gt;getCode());\n\t}\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mostrar productos (select)<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/3-1-1024x499.png\" alt=\"\" class=\"wp-image-43\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/3-1-1024x499.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/3-1-300x146.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/3-1-768x374.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/3-1.png 1351w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La tabla y las cartas para mostrar los productos se encuentran en el archivo de <em>productos.php<\/em>. Las partes de usuarios y clientes es lo mismo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las cartas que se muestran al inicio tambi\u00e9n se emplean en el dashboard, se importa el archivo <em>cartas_totales.php<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\ninclude_once \"encabezado.php\";\n?&gt;\n\t&lt;div class=\"card-deck row\"&gt;\n\t\t&lt;?php foreach($cartas as $carta){?&gt;\n\t\t&lt;div class=\"col-xs-12 col-sm-6 col-md-3\" style=\"color: &lt;?=  $carta&#91;'color']?&gt; !important\"&gt;\n\t\t\t&lt;div class=\"card text-center\"&gt;\n\t\t\t\t&lt;div class=\"card-body\"&gt;\n\t\t\t\t\t&lt;h4 class=\"card-title\" &gt;\n\t\t\t\t\t\t&lt;i class=\"fa &lt;?= $carta&#91;'icono']?&gt;\"&gt;&lt;\/i&gt;\n\t\t\t\t\t\t&lt;?= $carta&#91;'titulo']?&gt;\n\t\t\t\t\t&lt;\/h4&gt;\n\t\t\t\t\t&lt;h2&gt;&lt;?= $carta&#91;'total']?&gt;&lt;\/h2&gt;\n\n\t\t\t\t&lt;\/div&gt;\n\n\t\t\t&lt;\/div&gt;\n\t\t&lt;\/div&gt;\n\t\t&lt;?php }?&gt;\n\t&lt;\/div&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y se crear un arreglo colocando el nombre de la carta, el icono, el total que se va a mostrar y el color, algo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$cartas = &#91;\n    &#91;\"titulo\" =&gt; \"No. Productos\", \"icono\" =&gt; \"fa fa-box\", \"total\" =&gt; count($productos), \"color\" =&gt; \"#3578FE\"],\n    &#91;\"titulo\" =&gt; \"Total productos\", \"icono\" =&gt; \"fa fa-shopping-cart\", \"total\" =&gt; obtenerNumeroProductos(), \"color\" =&gt; \"#4F7DAF\"],\n    &#91;\"titulo\" =&gt; \"Total inventario\", \"icono\" =&gt; \"fa fa-money-bill\", \"total\" =&gt; \"$\". obtenerTotalInventario(), \"color\" =&gt; \"#1FB824\"],\n    &#91;\"titulo\" =&gt; \"Ganancia\", \"icono\" =&gt; \"fa fa-wallet\", \"total\" =&gt; \"$\". calcularGananciaProductos(), \"color\" =&gt; \"#D55929\"],\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La tabla para los productos luce as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;table class=\"table\"&gt;\n        &lt;thead&gt;\n            &lt;tr&gt;\n                &lt;th&gt;C\u00f3digo&lt;\/th&gt;\n                &lt;th&gt;Nombre&lt;\/th&gt;\n                &lt;th&gt;Precio compra&lt;\/th&gt;\n                &lt;th&gt;Precio venta&lt;\/th&gt;\n                &lt;th&gt;Ganancia&lt;\/th&gt;\n                &lt;th&gt;Existencia&lt;\/th&gt;\n                &lt;th&gt;Editar&lt;\/th&gt;\n                &lt;th&gt;Eliminar&lt;\/th&gt;\n            &lt;\/tr&gt;\n        &lt;\/thead&gt;\n        &lt;tbody&gt;\n            &lt;?php\n            foreach($productos as $producto){\n            ?&gt;\n                &lt;tr&gt;\n                    &lt;td&gt;&lt;?= $producto-&gt;codigo; ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;&lt;?= $producto-&gt;nombre; ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;&lt;?= '$'.$producto-&gt;compra; ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;&lt;?= '$'.$producto-&gt;venta; ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;&lt;?= '$'. floatval($producto-&gt;venta - $producto-&gt;compra); ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;&lt;?= $producto-&gt;existencia; ?&gt;&lt;\/td&gt;\n                    &lt;td&gt;\n                        &lt;a class=\"btn btn-info\" href=\"editar_producto.php?id=&lt;?= $producto-&gt;id; ?&gt;\"&gt;\n                            &lt;i class=\"fa fa-edit\"&gt;&lt;\/i&gt;\n                            Editar\n                        &lt;\/a&gt;\n                    &lt;\/td&gt;\n                    &lt;td&gt;\n                        &lt;a class=\"btn btn-danger\" href=\"eliminar_producto.php?id=&lt;?= $producto-&gt;id; ?&gt;\"&gt;\n                            &lt;i class=\"fa fa-trash\"&gt;&lt;\/i&gt;\n                            Eliminar\n                        &lt;\/a&gt;\n                    &lt;\/td&gt;\n                &lt;\/tr&gt;\n            &lt;?php } ?&gt;\n        &lt;\/tbody&gt;\n    &lt;\/table&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y la funci\u00f3n para obtener los productos es la siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function obtenerProductos($busqueda = null){\n    $parametros = &#91;];\n    $sentencia = \"SELECT * FROM productos \";\n    if(isset($busqueda)){\n        $sentencia .= \" WHERE nombre LIKE ? OR codigo LIKE ?\";\n        array_push($parametros, \"%\".$busqueda.\"%\", \"%\".$busqueda.\"%\"); \n    } \n    return select($sentencia, $parametros);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Editar producto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En la tabla de productos, se redirecciona en el bot\u00f3n de editar, este lleva al formulario en donde se colocar\u00e1n los nuevos datos del producto.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;td&gt;\n  &lt;a class=\"btn btn-info\" href=\"editar_producto.php?id=&lt;?= $producto-&gt;id; ?&gt;\"&gt;\n     &lt;i class=\"fa fa-edit\"&gt;&lt;\/i&gt;\n       Editar\n  &lt;\/a&gt;\n&lt;\/td&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y la funci\u00f3n para editar la funci\u00f3n es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function editarProducto($codigo, $nombre, $compra, $venta, $existencia, $id){\n    $sentencia = \"UPDATE productos SET codigo = ?, nombre = ?, compra = ?, venta = ?, existencia = ? WHERE id = ?\";\n    $parametros = &#91;$codigo, $nombre, $compra, $venta, $existencia, $id];\n    return editar($sentencia, $parametros);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Eliminar producto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para eliminar un producto es pr\u00e1cticamente lo mismo, en la tabla de productos al presionar sobre el bot\u00f3n, redirecciona al archivo de <em>eliminar_producto.php.<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$id = $_GET&#91;'id'];\nif (!$id) {\n    echo 'No se ha seleccionado el producto';\n    exit;\n}\ninclude_once \"funciones.php\";\n\n$resultado = eliminarProducto($id);\nif(!resultado){\n    echo \"Error al eliminar\";\n    return;\n}\n\nheader(\"Location: productos.php\");\n?&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n es la siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function eliminarProducto($id){\n    $sentencia = \"DELETE FROM productos WHERE id = ?\";\n    return eliminar($sentencia, $id);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Capturas del sistema<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<h2 class=\"wp-block-heading\">Inicio de sesi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El inicio de sesi\u00f3n solo pide el nombre de usuario y la contrase\u00f1a, si los datos son correctos redirecciona a la p\u00e1gina principal.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"492\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/1-1-1024x492.png\" alt=\"\" class=\"wp-image-74\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/1-1-1024x492.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/1-1-300x144.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/1-1-768x369.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/1-1.png 1354w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"497\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/6-1-1024x497.png\" alt=\"\" class=\"wp-image-75\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/6-1-1024x497.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/6-1-300x146.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/6-1-768x373.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/6-1.png 1349w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<h2 class=\"wp-block-heading\">Realizar venta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para realizar la venta, se escribe el c\u00f3digo de barras del producto que se va a vender. Los productos de la lista se pueden eliminar. Puedes seleccionar el cliente que desees. Si no se selecciona la venta se marca como mostrador.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<h2 class=\"wp-block-heading\">Reporte de ventas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el reporte de ventas, al inicio, solo se muestran las ventas realizadas en el d\u00eda, pero se pueden filtrar por fecha, cliente o usuario.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esta parte se emplean las cartas explicadas en la parte de arriba.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/7-2-1024x499.png\" alt=\"\" class=\"wp-image-77\" srcset=\"https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/7-2-1024x499.png 1024w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/7-2-300x146.png 300w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/7-2-768x374.png 768w, https:\/\/pacohunterdev.com\/blog\/wp-content\/uploads\/2022\/08\/7-2.png 1348w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Descargar c\u00f3digo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si deseas usar y probar este sistema puedes descargarlo del siguiente enlace: <a href=\"https:\/\/github.com\/pacohunterdev\/ventas-php\" data-type=\"URL\" data-id=\"https:\/\/github.com\/pacohunterdev\/ventas-php\">https:\/\/github.com\/pacohunterdev\/ventas-php<\/a> adem\u00e1s si deseas ver la demostraci\u00f3n puedes verla en el siguiente v\u00eddeo <a href=\"https:\/\/www.youtube.com\/watch?v=X-3vPQnA_2M&amp;t=43s\" data-type=\"URL\" data-id=\"https:\/\/www.youtube.com\/watch?v=X-3vPQnA_2M&amp;t=43s\">https:\/\/www.youtube.com\/watch?v=X-3vPQnA_2M&amp;t=43s<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este post te mostrar\u00e9 un peque\u00f1o sistema de ventas. Est\u00e1 desarrollado empleando las tecnolog\u00edas que dice en el t\u00edtulo. Adem\u00e1s te dejar\u00e9 los enlaces para que puedas descargarlo y ver una demostraci\u00f3n. Tambi\u00e9n te presentar\u00e9 algunos bloques del c\u00f3digo usado. Es un sistema bastante sencillo, permite administrar productos, usuarios, clientes y obviamente las ventas. Recuerda que debes de tener instalado PHP y MySQL. Por mi parte uso xampp. La base de datos El esquema de la base de datos lo encuentras en el archivo bd.sql CREATE DATABASE ventas_php; USE ventas_php; CREATE TABLE productos( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16,15,14],"tags":[13,12,11],"class_list":["post-37","post","type-post","status-publish","format-standard","hentry","category-bootstrap","category-mysql","category-php","tag-bootstrap","tag-mysql","tag-php"],"_links":{"self":[{"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/posts\/37","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/comments?post=37"}],"version-history":[{"count":3,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions"}],"predecessor-version":[{"id":78,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions\/78"}],"wp:attachment":[{"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/media?parent=37"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/categories?post=37"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pacohunterdev.com\/blog\/wp-json\/wp\/v2\/tags?post=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}