Pequeño sistema de ventas con CodeIgniter y MVC

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.

Vídeo relacionado

Si eres de los que prefieren ver un vídeo, mira la demo y la explicación en YT:

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.

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.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

16 comentarios en “Pequeño sistema de ventas con CodeIgniter y MVC”

  1. Que tal amigo mi nombre es Carlos Antonio Rojas Gonzales de la Universidad Politécnica de Pachuca
    En la materia mantenimiento de software de la carreraing en software realice tanto retroalimentacion de tu proyecto como mantenimiento, me gustaria saber si esta interesado en ver mi trabajo y de ser asi podria contactarme

    1. Hola, primero que todo comentarte que es muy bueno y dinámico la plataforma, lo otro como pudiste solucionar que descuente la cantidad del articulo según el stock??

  2. hola, disculpe me sale un error a la hora de ejecutar el código, nose que estoy haciendo mal

    [Running] php “c:\xampp\htdocs\ventasci-master\index.php”
    “php” no se reconoce como un comando interno o externo,
    programa o archivo por lotes ejecutable.

    [Done] exited with code=1 in 0.461 seconds

    1. sale la interfas pero solo vender, cuando selecciono productos o ventas me sale:
      A Database Error Occurred
      SQLSTATE[HY000] [1049] Unknown database ‘ventas’

      Filename: C:/xampp/htdocs/ventasci/system/database/drivers/pdo/pdo_driver.php

      Line Number: 142

    2. Claro, basta con leer el mensaje de error: no existe la base de datos “ventas” recuerda que tienes que crearla, en el repositorio está el esquema para que veas cómo es la creación
      Saludos

  3. Pingback: Eliminar elemento de arreglo en PHP a partir de su índice - Parzibyte's blog

  4. Pingback: Pequeño, muy pequeño sistema de ventas con PHP y MySQL - Parzibyte's blog

Dejar un comentario