Pequeño sistema de ventas con CodeIgniter y MVC

Publicado por parzibyte en

Introducción

Sistema de ventas MVC con PHP y CodeIgniter

Sistema de ventas MVC con PHP y CodeIgniter

Luego de mucho tiempo al fin traigo una versión 2 del sistema de ventas publicado anteriormente. No es un sistema de ventas como tal, pues es un simple ejemplo, pero no lo puedo llamar de otro modo.

En ese post prometí que haría otro tutorial pero siguiendo el patrón MVC y qué mejor que hacerlo con CodeIgniter (para repasar, ya que justo ahora tengo que hacer un proyecto usándolo)

Lo que trae esta versión no es nada diferente en cuanto a su uso, sino a su programación.

Antes de comenzar

Te invito a probar Sublime POS 3, un punto de venta evolutivo, gratuito y que funciona en la nube.

Cambios

Se hicieron muchos cambios. En primera porque siempre hay formas de mejorar el software. Lo que hicimos fue cambiar el tema CSS, además de ser más indicativos en cuanto a mensajes y avisos gracias a los datos temporales en sesión de CodeIgniter.

Por otro lado, se mejoró la base de datos. Se usa una tabla transaccional para los productos vendidos, eliminando la redundancia. Y para las ventas, ahora el total se calcula dependiendo de los productos vendidos.

También se agregó un apartado en donde se ven los detalles de una venta.

Compatibilidad

He puesto esfuerzo en que sea compatible con las versiones más antiguas de PHP. Por ejemplo, no utilicé funciones de tipado fuerte (así les llamo yo) ni definiciones cortas de arreglos.

Hablar es de mal gusto, muéstrame el código

Esta vez he alojado el código en GitHub. Es un repositorio público, tal vez le dé seguimiento más tarde, quién sabe. Pero aquí el link, déjale una estrella si te gusta 😉

https://github.com/parzibyte/ventasci

Se llama ventasci porque quiere decir “ventas con CodeIgniter” es decir, la ci es de CodeIgniter.

Puedes clonarlo si sabes manejar GitHub, o descargarlo como ZIP. Da igual, cualquiera puede usarlo y descargarlo; me he esforzado en hacerlo lo más expresivo posible.

En este post explicaré algunas cosas importantes, pero obviamente no pondré todo el código y configuraciones.

Probar en línea

Al igual que el anterior, puedes probarlo en línea. Lo he subido a mi servidor de pruebas, uno que está separado del principal, pues no sabemos si dejé una vulnerabilidad o cosas de esas (espero que no). Además de que así me ahorro espacio.

En fin, eso no importa. Aquí está el proyecto.

Lecturas recomendadas

Ya deberías saber de PHP y CodeIgniter. Si quieres una pequeña introducción a CodeIgniter haz click aquí.

Recuerda ver el sistema que creamos anteriormente, pues en ese nos basaremos y tal vez nos saltemos cosas básicas.

Por cierto, lee sobre los controladores y modelos, pues explicaré todo suponiendo que ya tienes una base.

Si quieres, explora todos los tutoriales de CodeIgniter que tengo publicados.

Pequeño, muy pequeño sistema de ventas con PHP y MVC usando CodeIgniter

Vamos a crear modelos, controladores y vistas para cada cosa. Pero antes de ello configuraremos nuestra base de datos.

Configuración de base de datos con MySQL

Vamos a usar PDO con MySQL, omitiré explicar la cadena de conexión y esas cosas, pues ya lo he hecho anteriormente.

La configuración de la base de datos queda así:

El usuario es root y la contraseña es una string vacía. Si quieres ver todo el archivo, recuerda que está en GitHub.

La base de datos se llama ventas. El esquema, que puedes encontrar igualmente en el repositorio es el siguiente:

Si cambias el nombre de algo, recuerda cambiarlo en el código. Pongo aquí el esquema como imagen porque se ve bonito.

Esquema de base de datos para sistema de ventas MVC con CodeIgniter

Esquema de base de datos para sistema de ventas MVC con CodeIgniter

Productos

Comenzamos con los productos. Vamos a registrarlos para después poder eliminarlos.

Modelo del producto

Definimos nuestro modelo, y definimos también las funciones que tendrá. Es un simple CRUD:

El método uno obtiene un producto a través de su ID; ojo, su ID, no su código de barras. Para obtenerlo por código de barras usamos el método porCodigoDeBarras.

De ahí, el de eliminar elimina, el de todos devuelve todos los productos (falta una paginación pero eso ya es otra cosa), el que se llama nuevo inserta un nuevo producto y finalmente el de guardarCambios se encarga de realizar un update o actualización.

Controlador

Este es el pegamento que se encarga de realizar acciones dependiendo de la URL. Para que esto funcione cargamos el helper url, como explico en un post que dejé al inicio.

El código es este:

Lo que hace es igualmente un crud, pero renderiza vistas. Las vistas tienen un if dentro de ellas para ver si hay datos en la sesión, dependiendo de ello muestran una alerta, ya veremos más adelante. Recordemos que las alertas son gracias al framework css Bootstrap.

En el método guardar usamos los datos que nos enviaron a través del formulario accediendo a $this->input->post("clave");

Vistas de productos para listar, editar e insertar

Aquí tenemos a la vista que lista los productos:

Como vemos, mostramos una alerta si hay datos en la sesión. De ahí es una simple tabla con enlaces para editar y eliminar, la cual se dibuja gracias a un arreglo de productos traídos por el controlador.

Si queremos insertar un nuevo producto, se dibuja esta vista o view de CodeIgniter. Es un simple formulario que manejamos en el controlador.

Igualmente si hay un mensaje que mostrar, lo muestra.

Finalmente, para editar es el mismo formulario pero con un input oculto de tipo hidden para mandar el id del producto.

Para rellenar el formulario usamos el producto que nos pasa el controlador. La vista se ve así, el código queda abajo.

Editar un producto

Editar un producto

Este es el código que hace a la vista de arriba:

Vender

Este es el segundo apartado, aquí es en donde agregamos productos al carrito de compras. El carrito persiste en la sesión, así no importa si refrescan la página. Usamos igualmente los métodos de CodeIgniter para interactuar con el arreglo superglobal $_SESSION así como para iniciar sesiones.

Modelo

No hay modelo para vender, únicamente un controlador. Se usa el modelo de Ventas, explicado abajo.

Controlador

En este caso este controlador gestiona el carrito de compras. Se comunica con un modelo únicamente al realizar la venta, y solamente para eso, de ahí, la responsabilidad es toda suya.

Usamos a los métodos de sesiones. Aquí una explicación:

  • has_userdata para ver si ya hay carrito, si no, lo ponemos vacío.
  • Para obtener el carrito y hacerle modificaciones usamos los métodos mágicos para acceder a los datos de sesión, usando $this->session->carrito;
  • set_userdata para guardar el carrito, es decir, el arreglo de productos después de haberlo modificado. Ya sea que hayamos agregado o quitado uno, y de igual manera si hemos aumentado la cantidad.

Vale la pena mencionar que para ver si el producto ya está en el carrito usamos una simple búsqueda secuencial en nuestro arreglo de objetos. Y redireccionamos a vender la mayoría de veces, cambiando los mensajes que se muestran.

Para vaciar el carro simplemente definimos un nuevo arreglo en la sesión; bueno, un nuevo arreglo vacío.

Vista para vender

En la vista sólo tenemos un formulario y una tabla. La tabla dibuja los productos que ya existen, y el formulario es uno en donde leemos el código de barras, el cual es enviado al controlador y comparado con el carrito o con la base de datos.

Interfaz para vender

Interfaz para vender

Cada que agregamos un producto, se redirige al mismo lugar y se da la ilusión de que no hubo redirección. También tenemos la opción de quitar del carrito, en donde simplemente pasamos el índice.

Puede que sea una mala práctica, pero no encontré una manera más óptima de calcular el total.

Podríamos calcularlo desde el controlador, pero sería recorrer dos veces el arreglo: una en el controlador y otra en la vista; y como de por sí estamos recorriéndolo en la vista, aprovechamos y vamos sumando en cada iteración.

Modelo para vender

Este modelo se encarga de registrar la venta, pero también de otras cosas relacionadas con las ventas. Aquí lo explicaré, porque tiene que ver tanto con vender y con ventas. Pondré únicamente el método:

El método se llama nueva, ya que pertenece al modelo VentaModel. Lo que hacemos es insertar una venta con la fecha de hoy. La insertamos y más tarde obtenemos el último id insertado, luego recorremos el arreglo de productos y vamos insertando producto a producto en nuestra tabla transaccional.

Ventas

Ya para terminar, veamos cómo funcionan las ventas. Lo que tenemos que hacer es cancelar una venta, listarlas a todas o ver el detalle de una.

Modelo de ventas

El modelo completo es el siguiente, ya explicamos arriba cómo se inserta una venta. De ahí, el único método un poco complejo es en donde se obtiene el detalle de una venta, porque se llaman a dos funciones privadas del modelo.

En los demás casos hacemos algunos inner joins con where, cosas muy interesantes.

Para eliminar ventas hacemos lo mismo que en los otros modelos, y como existen relaciones, no necesitamos eliminar los productos vendidos porque el proceso se hace automáticamente cuando eliminamos la venta.

Controlador de ventas

Este controlador redirige si queremos ver el detalle de una venta que no existe, y manda mensajes a la interfaz. Por defecto listará todas las ventas, únicamente las ventas, no sus detalles.

Cargamos la librería de la sesión en el constructor porque en el método index renderizamos una vista que muestra un mensaje si hay datos en la sesión; y si no la hubiéramos cargado habría errores. El método detalle trae los detalles de una venta a través del modelo, recibe un id como argumento.

Vista de ventas

El lugar en donde listamos todas las ventas es una simple tabla. Esa tabla tiene un botón que permite ver los detalles de la misma, o eliminarla. Para obtener el total de la venta usamos la función SUM de MySQL, y agrupamos. Eso tiene que ver más con bases de datos que con CodeIgniter o PHP.

Ver todas las ventas del sistema

Ver todas las ventas del sistema

La vista en donde se muestran es la siguiente:

La variable $ventas es pasada por el controlador.

Vista para el detalle de venta

Ver detalles de una venta

Ver detalles de una venta

Finalmente aquí está la vista de cuando vemos el detalle de una venta. En grande se muestra el total y la fecha, y más abajo la lista de los productos vendidos.

Por cierto, ponemos un simple enlace que lleva al listado de todas las ventas. Fácil y sencillo.

Conclusión

Espero que algún día pueda seguir con este sistema, no me gusta mucho pero queda bien a modo de ejercicio. Recuerda que arriba dejé el código fuente en GitHub.

 


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 scriptsLa 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 :-)

4 Comments

Mario Alberto · diciembre 11, 2018 a las 11:59 am

me gusta la forma en la que realizaste el punto de venta, muy sencillo y práctico, tengo una pregunta… como se puede adaptar tu código para que al finalizar la venta, se genere e imprima un ticket o recibo..?

Pequeño, muy pequeño sistema de ventas con PHP y MySQL - Parzibyte's blog · octubre 12, 2018 a las 11:33 am

[…] 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í. […]

Eliminar elemento de arreglo en PHP a partir de su índice - Parzibyte's blog · octubre 15, 2018 a las 10:19 am

[…] ejemplo, si tenemos un carrito de compras como el que implementamos en el sistema de ventas MVC tendremos que saber quitar un elemento de un array en […]

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: