Introducción

Hace algunos días hice un ejercicio de un sistema de ventas en PHP. Está escrito en puro PHP, nada de Javascript. Eso sí, para los estilos utilicé una variante de Bootstrap.

Los archivos no tienen una estructura, pero como lo dije, es un ejemplo. También escribo esto porque igual y le sirve a alguien más o me sirve a mí mismo para algunas referencias.

Para la persistencia de datos utiliza MySQL. Guarda productos y ventas. No maneja permisos de usuarios. Almacenamos el carrito de compras en la sesión, y bueno, mejor lo explico por partes.

Actualización

Ya he hecho la versión 2 de este sistema. No cambian muchas cosas en cuanto a su uso, sino a su programación. Lo hice con CodeIgniter usando el patrón MVC. Ver nueva versión aquí.

Nota: si eres principiante, recomiendo ver primero el sistema aquí presente.

Nota 2: mira este sistema pero corriendo sobre Android.

Probar sistema terminado

Vista previa

Así se ve el sistema terminado:

Online

Para darte una pequeña idea, puedes visitar este link para probar el sistema.

Descargar

Si gustas descargarlo y probarlo en tu entorno local, aquí abajo lo dejo:

ventas

Sistema de ventas en PHP

Base de datos

Aquí dejo el esquema que se utilizó. También lleva algunos registros para tener con qué trabajar al inicio.

Y para conectarnos utilizamos PDO. El código para lograr esto es el siguiente:

Productos

Nuevo

Es un simple formulario que pide la información. Sólo pide el código de barras, la descripción, el precio de venta, de compra y la existencia.

Estamos incluyendo algunos archivos que son el encabezado y el pie. Estos archivos serán explicados más abajo.

Al enviar el formulario, los datos son recibidos en un archivo llamado nuevo.php. Este archivo tiene el siguiente código:

Como se ve, no estamos haciendo ninguna validación y estamos insertando los datos tal y como vienen del formulario. En caso de que todo vaya bien, redirigimos a listar.php para que dé la ilusión de que el producto fue guardado ahí mismo y fue añadido a la tabla.

Listar productos

Hablando de listar productos, aquí el código que dibuja la tabla:

Ahí mismo incluimos los botones que sirven para editar y eliminar el producto, que no son más que enlaces a otra página. Por cierto, también pusimos un botón para agregar un nuevo producto; igualmente es un link que lleva al formulario.

Editar producto

Cuando hacemos click en el botón editar, nos redirige a otro archivo. En él, leemos el id utilizando $_GET. Luego, hacemos una consulta a la base de datos en donde el id sea el que leímos.

Si el producto no existe, lo indicamos. En caso de que sí, entonces dibujamos el mismo formulario pero ahora lo llenamos con el atributo value de la etiqueta input. Para el textarea es diferente, pues el contenido debe ir entre las etiquetas, no como atributo.

Notar por favor que para saber el id que estamos editando (con el que haremos el where) lo estoy guardando en un input oculto.

Hay dos botones. Uno de ellos envía el formulario; el otro es simplemente un enlace que lleva a listar.php. El punto de todo esto es proporcionar al usuario unos botones de navegación.

Guardar cambios

Arriba vimos el formulario para editar. Ahora veamos el archivo en donde realmente guardamos los cambios. Es este:

Muy parecido al de insertar uno nuevo, pero éste edita. Si todo sale bien, nos lleva a listar.php que se encargará de mostrar los productos, con los cambios que se hayan hecho.

Eliminar producto

Finalmente veamos el de eliminar. Notar por favor que no pide confirmación, así que hay que hacerlo con cuidado.

Y así terminamos el CRUD de productos en PHP.

Vender

Esta fue la parte que más me gustó. Sólo se trabaja con arreglos y sesiones, pero me agradó el resultado.

Interfaz para vender

Muestra una tabla, que será de los productos que componen la venta. También muestra el total, que al inicio es 0. Y hasta abajo 2 botones que son para terminar de vender o para cancelar la venta. Igualmente hay unos ifs que muestran una alerta como “Producto inexistente” o cosas de esas.

Notemos que tiene un input, eso es para leer el código de barras. En realidad es un input dentro de un formulario. Dicho formulario, al enviarse, se va al archivo que veremos a continuación.

Finalmente, si vemos el encabezado, notaremos que declara el índice carrito en el arreglo superglobal de $_SESSION. Ahí es en donde colocaremos los productos 😉

Agregar al carrito de compra

Repito que esta es la parte que más me gustó. Comenzamos comprobando la existencia del producto, si no existe, regresamos a vender.php y le pasamos el status 5 que dirá que ya no hay existencias del producto.

En caso de que no exista el producto (es decir, que no exista, no que su existencia sea 0) mandamos el status 4.

Pero suponiendo que todo va bien y que el producto existe, iniciamos sesión y recorremos el arreglo carrito para ver si ya habíamos agregado ese producto antes. En caso de que lo hayamos agregado, entonces cambiamos solamente la cantidad.

Es decir, si ya existe “Mermelada de fresa” y vuelven a leer el código que le pertenece a ese producto, no vamos a mostrar en la tabla ambos productos. Mejor mostramos uno e indicamos que su cantidad es 2, y así sucesivamente.

Si no existe en el carrito entonces lo agregamos al arreglo y le ponemos su cantidad que por defecto es 1. También, por defecto, su total será el precio de venta. No es necesario hacer multiplicaciones.

Luego, en caso de que ya exista, calculamos su total, que es el resultado de multiplicar su precio de venta por la cantidad en el carrito.

Quitar del carrito

Ahora veamos cómo quitar productos del carrito. Simplemente eliminamos el elemento que pertenezca al índice que recibimos en $_GET. El código es muy fácil de entender:

Ah, y regresamos a vender.php con el status 3 que creo que dice que fue quitado correctamente.

Terminar venta

Es un simple archivo que insertará en la base de datos los productos vendidos, así como la venta, su fecha y su total. Queda así:

Restamos existencia de productos, tomamos la hora del servidor y guardamos la venta. Luego, limpiamos el carrito.

Si me preguntan por beginTransaction y commit, es para (aunque ni se nota) agilizar el proceso. Es como hacer muchos cambios en la base de datos pero no guardarlos hasta que terminemos. Más información en Bajo rendimiento en sentencias preparadas con PHP y MySQL.

Por cierto, regresamos a listar con un status igualmente.

Cancelar venta

Para cancelar la venta simplemente vaciamos el arreglo y listo. Regresamos a listar con un status.

Y así terminamos de vender.

Ventas

Para terminar este grandioso tutorial veamos el registro de ventas. Se compone de dos cosas: listar ventas y poder eliminarlas.

Listar

Por favor no me culpen, pero no sé cómo (y si alguien lo sabe, que me explique) hacer una consulta que traiga dentro un arreglo. Lo que pasa es que quería algo para mostrar los productos vendidos por venta. Lo único que se me ocurrió fue un group_concat. En fin, el código queda así:

De esta manera, lo concatenamos en la consulta pero lo “desconcatenamos” en PHP. Y queda un lindo resultado.

Eliminar

Para eliminar una venta es como eliminar un producto. Ojo que tampoco pide confirmación. El código queda así:

Encabezado y pie

Como lo prometí, aquí el encabezado y pie. Sólo definen el contendor, el menú de navegación, algunas etiquetas meta y cargan las librerías css.

Encabezado es:

Y pie:

 

Conclusión

Como lo dije, no tiene estructura. Fue hecho rápidamente, pero funciona y eso es lo que cuenta. Cuando pienses que algo funciona pero se ve mal o parece un truco, recuerda que la humanidad hizo que una roca pensara (al inventar los microprocesadores).

No te vayas sin seguirme en Twitter, Facebook y GitHub, así me motivas a escribir más posts.
Igualmente te invito a suscribirte en la parte superior derecha escribiendo tu correo en el formulario.
Si tienes dudas déjalas en un comentario


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB. Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron. Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scripts La plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C. Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

13 Comments

cecilio · agosto 11, 2018 a las 12:30 pm

hola buenas tardes ”
estaba estudiando tu codigo lo y implemente a un sistema para agregar producto.
pero no me agregar los productos.
solo aparece uno y luego uno no se se agrega ala cantida cantidad ++
ayuda?

    parzibyte · agosto 12, 2018 a las 11:14 am

    Hola, si deseas implementar el código en otro sistema debes hacer las adecuaciones necesarias para que funcione sin problemas, ya que está hecho para trabajar así como está, pero no para ser compatible con otros sistemas. Igualmente si lo estudias podrías arreglar el problema. Saludos.

cesar · agosto 31, 2018 a las 11:31 am

como puedo hacer para que me muestre una lista de productos y asi yo pueda elegirlo para agregar al carrito?

    parzibyte · agosto 31, 2018 a las 12:04 pm

    Podrías listar todos los productos como se listan en el apartado producto, y poner en cada uno un link a un archivo que reciba el parámetro por GET. Luego, dependiendo de ese parámetro buscar el producto en la base de datos y añadirlo al carrito.
    El link podría ser algo como agregar_al_carrito.php?idProducto=1
    Y ya dentro podrías tomarlo con $_GET[“idProducto”];
    Luego buscarlo con un WHERE en la base de datos y en caso de existir agregarlo

Luis A. Vega · septiembre 5, 2018 a las 12:17 am

Cual es la licencia de este hermoso sistema?
( quiero modificarlo e implementarlo para mi tienda )

    parzibyte · septiembre 5, 2018 a las 9:38 am

    Hola, qué tal. No tiene licencia. En otras palabras puedes modificarlo a tu gusto e implementarlo donde desees sin tener que preocuparte por nada.
    Te invito a suscribirte a mi blog en la barra lateral derecha. Saludos

everardo · octubre 22, 2018 a las 4:28 pm

Disculpe tendra la parte donde pueda imprimir en una impresora termica, y cual seria el costo seria para una pequeña tienda para control interno, gracias saludos

    parzibyte · octubre 22, 2018 a las 5:18 pm

    Hola. Ya le he respondido a su correo electrónico. Saludos

Elsys Flores · noviembre 12, 2018 a las 6:32 pm

hola felicidades por este maravilloso sistema, quisiera adaptarlo, pero agregando clientes para así poder facturar, ya hice todos los formularios para listar y agregar clientes, pero me falta agregarlo a la venta, nose sí me puedes ayudar, he estado intentando, pero aún no me cuadra la cosa. Agradecida si me puedes ayudar

    parzibyte · noviembre 12, 2018 a las 9:01 pm

    Hola. Solamente tienes que agregar el campo idCliente a las ventas, relacionar las ventas con los clientes; más tarde listar los clientes al hacer la venta, y guardar el id del que esté seleccionado. Luego, al recuperar y listar las ventas haces un join así como está pero ahora también unes la tabla de clientes; y listo. Sé que es más fácil decirlo que hacerlo, pero ese es el principio básico para lograr lo que explicas.

Replace into en MySQL: usos y explicación - Parzibyte's blog · agosto 27, 2018 a las 6:45 pm

[…] ejemplo, si tenemos una base de datos de productos de un punto de venta podríamos tener un registro algo […]

MySQL y PHP con PDO: CRUD (create, read, update, delete) - Parzibyte's blog · septiembre 17, 2018 a las 12:02 pm

[…] Finalmente, si quieres un ejemplo un poco más avanzado, te invito a leer Pequeño, muy pequeño sistema de ventas con PHP […]

Configurar e instalar Apache y PHP 7 en Android con Termux - Parzibyte's blog · noviembre 14, 2018 a las 10:25 pm

[…] sistema que montaremos en Android será el sistema de ventas en PHP con PDO y MySQL. Ya deberías saber que no necesitamos que nuestro teléfono esté rooteado. Dejo el post […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: