Documente Academic
Documente Profesional
Documente Cultură
TEMA:
MIGRACIÓN DE APLICACIONES PYMES A TECNOLOGÍAS WEB
PRESENTA:
JOSÉ TRINIDAD LUNA FERNÁNDEZ
Primero que nada, quiero dar gracias Dios por haberme permitido llegar hasta aquí,
por ser mi guía en la vida y brindarme apoyo cada vez que lo necesite, por darme una
vida en la cual las tristezas son opacadas por las alegrías.
También quiero dar gracias a mis padres ya que, sin ellos, sin su apoyo
incondicional y amor nada de esto sería posible, gracias por toda la educación que me
han dado. Gracias a mí padre José Trinidad, por enseñarme como ser un hombre y
una persona de bien en la vida, y a mi madre Martha por enseñarme cómo afrontar la
vida, a mis hermanos y familiares que siempre me apoyaron y dieron ánimos.
Por último, pero no menos importante a todos mis amigos y seres queridos
gracias por las alegrías y cada momento que pasamos juntos y pasaremos. A todos
gracias que sin ustedes nada esto sería posible.
ii
RESUMEN
iii
ÍNDICE
1.2 Descripción de la empresa u organización y del puesto o área del trabajo ....... 3
v
3.3 Tercer Sprint “Construcción del Back-End en el Módulo Categorías” .............. 30
CAPÍTULO IV RESULTADOS
GLOSARIO ............................................................................................................... 55
ACRÓNIMOS ............................................................................................................ 56
ANEXOS ................................................................................................................... 58
vi
Anexo 2. Diseño del Módulo Categorías ............................................................... 60
vii
ÍNDICE DE TABLAS
viii
ÍNDICE DE FIGURAS
ix
MIGRACIÓN DE APLICACIONES PYMES A TECNOLOGÍAS WEB
x
CAPÍTULO I
Desde el último soporte que Microsoft proporcionó a Visual Basic hasta hoy ya
han pasado 10 años, lo que es su tiempo fue considerado innovador ahora está
quedando obsoleto.
2
1.2 Descripción de la empresa u organización y del puesto o área del
trabajo
Dextera es una empresa mexicana con más de 10 años de experiencia en consultoría
especializada en proveer soluciones al área de recursos humanos a través de
tecnología y procesos, orientada a la innovación constante. Es por ello la necesidad
de personal en el área de desarrollo de proyectos tecnológicos, ya que cuenta
productos que son softwares de escritorio para PYMES. Estas aplicaciones
actualmente se están quedando atrás con el surgimiento de nuevas tendencias
tecnológicas, siendo así, la tarea principal es rediseñar los softwares que se están
quedando obsoletos y actualizarlos para traerlos de vuelta como Aplicaciones Web.
Nuestra capacidad para innovar y el compromiso con nuestros clientes son factores
que nos distinguen, además de que proporcionamos servicios y productos de la más
alta calidad, en un entorno altamente colaborativo.
Visión:
Gracias a nuestro enfoque local y global, deseamos ser líderes en la puesta en marcha
de soluciones de capital humano en México y América Latina.
3
1.2.2 Ubicación
La empresa Dextera de México S. De R.L de C.V, se localiza en la calle Mario Paní
400-1, Col. Santa Fé. Del. Cuajimalpa de Morelos, México, CDMX, como se muestra
en la Figura 1.1
Por último, se generará un Sistema que será en divido en dos capas, la Back-
End y la Front-End, ambas capas trabajarán en conjunto. El Sistema será una base
para futuras actualizaciones y mejoras.
4
1.4 Objetivos
5
1.5 Justificación
El uso de nuevas tecnologías de comunicación permite una interacción más asertiva
entre las organizaciones y sus integrantes. La Consultoría Dextera de México S. De
R.L de C.V cuenta con programas desarrollados en Visual Basic 6.0 basadas en
escritorio para Pymes. Estos programas son Sistemas de Inventarios que permiten a
las PYMES mantener un control de su empresa, de sus empleados, de los productos
y servicios que ofrecen. Al ser programas de escritorio estos se encuentran instalados
en la computadora central. Actualmente los usuarios de estos softwares tienen la
necesidad de acceder a los datos desde cualquier lugar y desde cualquier dispositivo
a su alcance, lo cual es imposible al ser solo una aplicación que solo puede ser
manejada desde el lugar que se instaló.
De esta forma, podemos decir que los Sistemas Web a desarrollar serán de
fácil manejo, ya que permitirán administrar todas las características del Sistema de una
manera eficiente desde cualquier dispositivo, así también servirá como un Sistema
Web base que quizá con el tiempo y el surgimiento de nuevas tecnologías éste pueda
ser escalado o actualizado en la parte Front-End o Back-End del proyecto y seguir
funcionando.
6
La migración de estas aplicaciones basadas en escritorio se realiza con el
propósito de rediseñar los softwares que se están quedando obsoletos y actualizarlos
para traerlos de vuelta como Sistemas Web, las cuales son más fáciles de usar y más
amigables con los usuarios.
7
1.6 Alcances
El diseño de este Sistema Web tendrá los siguientes alcances:
Por medio de este Sistema se podrá llevar un control de todos los usuarios,
clientes, productos y ventas.
1.7 Limitaciones
La falta de comunicación del Sistema Front-End con el Sistema Back-End.
8
CAPÍTULO II
9
2.1 Introducción
Este capítulo se abordará toda la información que sustenta el desarrollo del Proyecto,
en el cual se detallan y definen los conceptos básicos, complementarios y específicos.
Primero se parte con definición de lenguajes de programación con el fin de
comprender la diferencia entre lenguaje y un lenguaje de programación, así como
también que tipos de lenguajes serán usados en el desarrollo de la parte Back-End de
este proyecto.
Posteriormente se describe qué es un Framework Web, para qué sirve Laravel,
su uso en el desarrollo de APIs Webs, qué es Eloquent de Laravel, su funcionamiento
en el manejo de Base de Datos y toda la información referente a Sistema de Base de
Datos, también una descripción de la Web y sobre qué es un Servidor Web.
Por último, se define la metodología SCRUM, la cual fue utilizada en el
desarrollo de este Proyecto.
10
2.2 Lenguajes de Programación
Para entender que es un lenguaje de programación primero debemos entender que es
un lenguaje, (Celaya) define que Lenguaje es el empleo de notaciones, señales y
vocales (voz, palabras) para expresar ideas, comunicarse, y establecer relaciones
entre los seres humanos. Un lenguaje no sólo consta de “palabras”, sino también de
su pronunciación y los métodos para combinar las palabras en frases y oraciones; los
lenguajes se forman mediante combinaciones de palabras definidas en un diccionario
terminológico previamente establecido.
Todo lo que suceda dentro del Servidor es llamado procesamiento del lado del
Servidor, o server-side processing. Cuando tu aplicación necesita interactuar con el
Servidor (por ejemplo, para cargar o guardar datos), ésta realiza una petición del lado
del cliente (request) desde el navegador, a través de la red usando invocaciones
remotas a métodos (remote procedure call, RPC). Mientras se está procesando una
llamada RPC, tu servidor está ejecutando código del lado del servidor. (Gerardo, s.f.)
11
2.3.1 PHP
El autor (Arias) define a PHP (acrónimo recursivo de PHP: Hypertext Preprocessor)
como un lenguaje interpretado libre, usado originalmente solamente para el desarrollo
de aplicaciones presentes y actuaran del lado del servidor, capaces de generar
contenido dinámico.
La definición básica de clases comienza con la palabra clave class, seguido por
un nombre de clase, continuado por un par de llaves que encierran las definiciones de
las propiedades y métodos pertenecientes a la clase. El nombre de clase puede ser
cualquier etiqueta válida que no sea una palabra reservada de PHP. Un nombre válido
de clase comienza con una letra o un guion bajo, seguido de la cantidad de letras,
números o guiones bajos que sea.
Los objetos pueden heredar propiedades y métodos de otros objetos. Para ello,
PHP permite la “extensión” (herencia) de clases, cuya característica representa la
relación existente entre diferentes objetos. Para definir una clase como extensión de
una clase “madre” se utiliza la palabra clave extends. (Bahit, 2018)
13
2.4.1 Laravel
Laravel es un framework de código abierto para el desarrollo de aplicaciones web en
PHP 5,6,7 que posee una sintaxis simple, expresiva y elegante. Fue creado en 2011
por Taylor Otwell, inspirándose en Ruby on Rails y Symfony, de los cuales ha adoptado
sus principales ventajas.
14
2.4.2 Laravel en la creación de APIs
(Castelo, s.f.) Primero, se debe entender qué se considera exactamente una API
RESTful. REST significa REpresentational State Transfer y es un estilo arquitectónico
para la comunicación de red entre aplicaciones, que se basa en un protocolo sin estado
(generalmente HTTP) para la interacción, en la Figura 2.2 se muestra el
Funcionamiento General de un API.
Los recursos API presentan una forma de transformar fácilmente los modelos
en respuestas JSON. Actúa como una capa de transformación que se encuentra
entre los modelos Eloquent y las respuestas JSON que realmente son devueltas por
nuestra API. Los recursos API están formados por dos entidades: una clase de
recursos y una colección de recursos. Una clase de recurso representa un modelo
único que debe transformarse en una estructura JSON, mientras que una colección
de recursos se utiliza para transformar colecciones de modelos en una estructura
JSON. (Enyinnaya, 2018)
En las API de REST, se usan los verbos HTTP como acciones y los puntos
finales son los recursos sobre los que se actúa. Los verbos HTTP que existen son:
16
colección de archivos de datos computarizados. Los usuarios del sistema pueden
realizar una variedad de operaciones sobre dichos archivos; por ejemplo:
17
a los eventos de inserción actualización y eliminación, garanticen la integridad
del contenido de la BD en todo momento.
El contenido de una BD puede ser visto a través de múltiples interfaces.
A través del diseño lógico (Tablas relacionales) se esconde, al usuario, la
complejidad del almacenamiento físico que está por detrás de cada sistema de
bases de datos.
Siempre deben existir mecanismos y herramientas que permitan y faciliten el
respaldo y recuperación de una BD.
El diseño de relaciones entre las tablas de una base de datos puede ser la
siguiente:
18
Figura 2.4 Sistemas Gestores De Base De Datos
2.5.4 MySQL
MySQL es un sistema gestor de bases de datos. Pero la virtud fundamental y la clave
de su éxito es que se trata de un sistema de libre distribución y de código abierto. Lo
primero significa que se puede descargar libremente de Internet (por ejemplo, de la
dirección (www.mysql.com); lo segundo (código abierto) significa que cualquier
programador puede remodelar el código de la aplicación para mejorarlo. (Sánchez,
2004)
MySQL es un interpretador de SQL, es un servidor de base de datos. MySQL
permite crear base de datos y tablas, insertar datos, modificarlos, eliminarlos,
ordenarlos, hacer consultas y realizar muchas operaciones, etc., resumiendo:
administrar bases de datos.
2.5.5 PHPMyAdmin
Herramienta web para controlar y manejar bases de datos MySQL. Corre bajo lenguaje
de programación PHP. Actualmente puede crear y eliminar Bases de Datos, crear,
eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia
SQL, administrar claves en campos, administrar privilegios, exportar datos en varios
formatos y está disponible en 50 idiomas. Se encuentra disponible bajo la licencia GPL.
(García, 2007)
19
2.6 La Web
WEB (World Wide Web, o www), es un conjunto de documentos (webs)
interconectados por enlaces de hipertexto, disponibles en Internet que se pueden
comunicar a través de la tecnología digital. Se entiende por “hipertexto” la mezcla de
textos, gráficos y archivos de todo tipo, en un mismo documento. (Latorre, 2018)
Los servidores suelen utilizarse para almacenar archivos digitales. Los clientes,
por lo tanto, se conectan a través de la red con el servidor y acceden a dicha
información. En ocasiones, un ordenador puede cumplir con las funciones de servidor
y de cliente de manera simultánea. (Porto & Gardey, 2010)
Los navegadores Web más utilizados son Google Chrome, Firefox, Opera,
Safari y Internet Explorer. (Carlos, 2018)
20
2.7 Metodología SCRUM
Scrum es una metodología ágil de gestión de proyectos cuyo objetivo primordial es
elevar al máximo la productividad de un equipo. Reduce al máximo la burocracia y
actividades no orientadas a producir software que funcione y produce resultados en
periodos muy breves de tiempo. Como método, Scrum enfatiza valores y prácticas de
gestión, sin pronunciarse sobre los requerimientos, prácticas de desarrollo,
implementación y demás cuestiones técnicas. Más bien delega completamente en el
equipo la responsabilidad de decidir la mejor manera de trabajar para ser lo más
productivos posibles. (Citón, 2006)
Scrum al ser una metodología de desarrollo ágil tiene como base la idea de
creación de ciclos breves para el desarrollo, que comúnmente se llaman iteraciones y
que en Scrum se llamarán “Sprints”.
21
4. Revisión: El equipo revisa todo lo que se ha construido y se contrasta con el
objetivo deseado.
2.8.1 Roles
Scrum tiene una estructura muy simple. Todas las responsabilidades del proyecto se
reparten en 3 Roles: (Citón, 2006)
Product Owner (Dueño del Producto): Es la persona que toma las decisiones,
y es la que realmente conoce el negocio del cliente y su visión del producto. Se
22
encarga de escribir las ideas del cliente, las ordena por prioridad y las coloca
en el Product Backlog.
ScrumMaster (Líder de Proyecto): Es el encargado de comprobar que el
modelo y la metodología funciona. Eliminará todos los inconvenientes que
hagan que el proceso no fluya e interactuará con el cliente y con los gestores.
Development Team (Equipo De Desarrollo): suele ser un equipo pequeño de
unas 5-9 personas y tienen autoridad para organizar y tomar decisiones para
conseguir su objetivo. Está involucrado en la estimación del esfuerzo de las
tareas del Backlog. (Gallego M. T., s.f.)
23
2.8.4 Sprint
Un Sprint es el periodo de tiempo durante el que se desarrolla un incremento de
funcionalidad. Constituye el núcleo de SCRUM, que divide de esta forma el desarrollo
de un proyecto en un conjunto de pequeñas “carreras”. (Citón, 2006)
24
CAPÍTULO III
Capítulo 3 DESARROLLO-METODOLOGÍA
25
En este capítulo se abordará toda la información que hace referencia a la construcción
del Proyecto por medio de la metodología SCRUM en la cual se detallarán los Sprints,
por cada módulo del Proyecto se genera un Sprint, en ellos se describe su alcance,
objetivo y diseño.
Alcance: Construir una Base de Datos con MySQL capaz de almacenar toda la
información necesaria de todos los módulos del Sistema Web.
26
Requerimientos: La BD debe contener 6 tablas: “categorías, clientes,
productos, proveedores, usuarios y ventas”, con los campos necesarios para
almacenar toda la información.
27
Figura 3.2 Esquema de la Base de Datos
28
ID Tareas (Task) Importancia Descripción
Generar el Ingreso al
1 Muy Alta Se debe generar un ingreso al Sistema Web.
Sistema
29
3.3 Tercer Sprint “Construcción del Back-End en el Módulo
Categorías”
El Tercer Sprint del Proyecto está conformado por el Equipo de Trabajo descrito en la
Tabla 3.5, el Product Backlog expresado en la Tabla 3.6 ,el diseño del Tercer Sprint se
encuentra explicado en el Anexo 2. Diseño del Módulo Categorías en dónde se
muestra todo el código del Modelo y Controlador del Módulo Categorías.
30
Objetivo: Crear un controlador y modelo capaz de consultar, modificar, registrar
y eliminar a las Categorías del Sistema.
31
Actualizar los Datos de los El controlador de la parte Back-End debe ser
3 Proveedores en la Base de Alta capaz de Actualizar la información de los
Datos Proveedores registradas en el Sistema.
32
ID Tareas (Task) Importancia Descripción
33
3.6 Sexto Sprint “Construcción del Back-End en el Módulo Clientes”
El Sexto Sprint del Proyecto está conformado por el Equipo de Trabajo descrito en la
Tabla 3.11, el Product Backlog expresado en la Tabla 3.12 y el diseño del Sexto Sprint
se encuentra explicado en el Anexo 5. Diseño del Módulo Clientes en dónde se
muestra todo el código del Modelo y Controlador del Módulo Clientes.
34
Objetivo: Crear un controlador y modelo capaz de consultar, modificar, registrar
y eliminar a los Clientes del Sistema.
35
El controlador de la parte Back-End debe ser
Actualizar los Datos de las
3 Alta capaz de Actualizar la información de las Ventas
Ventas en la Base de Datos
registradas en el Sistema.
36
CAPÍTULO IV
Capítulo 4 RESULTADOS
37
En el capítulo IV se muestran los resultados de las pruebas técnicas realizadas al
implantar el Sistema Web, obteniendo respuestas satisfactorias en los controladores
de cada módulo.
38
La Figura 4.2 muestra el resultado final logrado en el módulo de Usuarios con
todos los datos conseguidos desde el Controlador y reordenados por la parte Front-
End.
39
4.2 Módulo Categorías
La Figura 4.3 muestra la respuesta que proporciona el Controlador del módulo
Categorías la cual es retornada en formato JSON, estos datos serán procesados por
la otra parte del proyecto y mostrados gráficamente.
40
En la Figura 4.4 se muestra la interfaz final del módulo Categorías, en ella esta
una tabla que contiene todos los datos obtenidos desde el Controlador.
41
4.3 Módulo Proveedores
En la Figura 4.5 se muestra el resultado de la respuesta del Controlador encargado
del módulo Proveedores, la cual retorna en formato JSON.
42
En la Figura 4.6 muestra la interfaz final que compone el Módulo Proveedores,
el cual contiene una tabla que describe todos los proveedores registrados en la Base
de Datos, los datos son traídos desde el Controlador y mostrados por la parte Front-
End del proyecto.
43
4.4 Módulo Productos
En la Figura 4.7 se muestra una descripción de la respuesta que retorna el Controlador
encargado del módulo de Productos al acceder a él desde una petición de tipo GET,
este nos regresa todos los datos con un formato JSON.
44
La Figura 4.8 muestra el resultado final de este módulo, el cual se describe una
tabla con todos los productos que se han registrado en el Sistema Web, dicha tabla es
llenada con los datos que retorna el Controlador de este módulo.
45
4.5 Módulo Clientes
En la Figura 4.9 se describe la respuesta que retorna el Controlador del módulo
Clientes, en ella regresan todos los datos en un formato JSON para después ser
interpretados por la otra parte del proyecto.
46
La Figura 4.10 muestra el resultado final obtenido en el módulo Clientes, en el
se describe una tabla que contiene toda la información de los clientes registrados en
el Sistema.
47
4.6 Módulo de Ventas
En la Figura 4.11 se muestra la respuesta que regresa el Controlador encargado del
módulo Ventas, el cual al ser accedido nos retorna todos los datos en un formato
JSON, datos que serán manipulados en la otra parte del proyecto.
48
La Figura 4.12 muestra el resultado final obtenido en el Módulo de ventas. En
el se describe una tabla donde esta toda la información de las ventas hechas en el
Sistema.
49
4.7 Pruebas Técnicas
En la Tabla 4.1 se describen todas las pruebas técnicas que se realizaron en el
Sistema Web.
50
CONCLUSIONES Y RECOMENDACIONES
El objetivo inicial del proyecto era diseñar un Sistema Web de control de inventarios
que sustituyera la aplicación de Escritorio que las PYMES usan, ya que esa aplicación
está construida en lenguajes obsoletos que hoy en día están fuera de soporte.
51
COMPETENCIAS DESARROLLADAS
COMPETENCIA DESARROLLADA Y
¿DÓNDE SE APLICÓ?
APLICADA
Verificar los programas producidos Se aplicó siempre al termino de cada módulo o Sprint
probándolos en forma unitaria. del proyecto.
52
FUENTES DE INFORMACIÓN
Arias, M. Á. (s.f.). Aprende programación Web con PHP y MySQL (Segunda ed.). IT Campus
Academy. Recuperado el 8 de Noviembre de 2018, de
https://books.google.com.mx/books?hl=es&lr=&id=mP00DgAAQBAJ&oi=fnd&pg=PA1
3&dq=Programación+de+php&ots=DLOfqF6MmZ&sig=MHZ1clcARunzuuezp8-
GN6G5zao#v=onepage&q=Programación%20de%20php&f=false
Bahit, E. (09 de 11 de 2018). POO y MVC en PHP: El paradigma de la Programación Orientada
a Objetos en PHP y el patrón de arquitectura de Software MVC. Obtenido de
creativecommons: http://www1.herrera.unt.edu.ar/biblcet/wp-
content/uploads/2014/12/eugeniabahitpooymvcenphp.pdf
Cardoso, L. (2006). Sistemas de bases de datos II: Teoría aplicada para profesores y
estudiantes. Caracas: UCABC.
Castelo, A. (s.f.). Laravel API Tutorial: How to Build and Test a RESTful API. Recuperado el 9
de Noviembre de 2018, de https://www.toptal.com/laravel/restful-laravel-api-tutorial
Celaya, I. T. (s.f.). Lenguajes. Recuperado el 5 de Noviembre de 2018, de
http://www.iqcelaya.itc.mx/~vicente/Programacion/Lenguajes.pdf
Chancusi, T., & Manuel, K. (11 de 2012). Método Ágil Scrum, aplicado a la implantación de un
sistema informático para el proceso de recolección masiva de información con
Tecnología Móvil. Recuperado el 21 de Diciembre de 2018, de
http://repositorio.espe.edu.ec/bitstream/21000/5893/1/T-ESPE-034427.pdf
Citón, M. L. (2006). SlideShare. Recuperado el 21 de Diciembre de 2018, de MÉTODO ÁGIL
SCRUM APLICADO AL DESARROLLO DE UN SOFTWARE DE TRANZABILIDAD:
https://es.slideshare.net/testlucero/metodo-agil-scrum
Cobo, Á. (2005). PHP y MySQL Tecnologías para el desarrollo de. España: Ediciones Díaz de
Santos. Recuperado el 8 de Noviembre de 2018, de
https://books.google.com.mx/books?hl=es&lr=&id=zMK3GOMOpQ4C&oi=fnd&pg=PR
17&dq=Programación+de+php&ots=Fgjr25Cdql&sig=Z-8qAgLR7qzDr2sWb-
49tzCa9FM#v=onepage&q=Programación%20de%20php&f=false
Date, C. (2001). Sistemas de bases de datos. Mexico: PEARSON.
Enyinnaya, C. (28 de Marzo de 2018). Build a REST API with Laravel API resources.
Recuperado el 9 de Noviembre de 2010, de https://blog.pusher.com/build-rest-api-
laravel-api-resources/
53
Gallego, A. J. (2017). Laravel 5. GitBook. Recuperado el 9 de Noviembre de 2018, de
https://ajgallego.gitbooks.io/laravel-5/content/
Gallego, M. T. (s.f.). Gestion de Poryectos Informácios. Recuperado el 21 de Diciembre de
2018, de Metodología Scrum:
http://openaccess.uoc.edu/webapps/o2/bitstream/10609/17885/1/mtrigasTFC0612me
moria.pdf
García, A. A. (Diciembre de 2007). Desarrollo de herramientas web de gestión docente.
Recuperado el 21 de Diciembre de 2018, de
http://repositorio.upct.es/bitstream/handle/10317/179/pfc2475.pdf
Gerardo, A. F. (s.f.). Programación Web. (Universidad Autonoma del Estado de Hidalgo)
Recuperado el 5 de Diciembre de 2018, de 2.1 Procesamiento del Lado del Servidor:
http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro40/21_procesamiento_del_la
do_del_servidor.html
Jeff. (15 de Mayo de 2015). Aprende a usar Eloquent el ORM de Laravel. (Styde) Recuperado
el 9 de Noviembre de 2018, de https://styde.net/aprende-a-usar-eloquent-el-orm-de-
laravel/
Mischook, S. (09 de 11 de 2018). Aprenda Programación Orientada a Objetos (POO) en PHP.
Obtenido de killerphp: https://www.killerphp.com/downloads/object-oriented-
php/downloads/tutorial_oop_en_php_para_killerphp.com.pdf
Pino, J. D. (18 de Diciembre de 2018). Frameworks Web de lado servidor. (M. W. docs, Ed.)
Recuperado el 9 de Noviembre de 2018, de
https://developer.mozilla.org/es/docs/Learn/Server-
side/Primeros_pasos/Web_frameworks
Sánchez, J. (2004). MySQL guía rápida. Recuperado el 9 de Noviembre de 2018, de
http://www.cartagena99.com/recursos/programacion/apuntes/mysql.pdf
Valdés, D. P. (26 de Octubre de 2007). ¿Qué son las bases de datos? Obtenido de Mestros
de la Web by Platzi: http://www.maestrosdelweb.com/que-son-las-bases-de-datos/
54
GLOSARIO
Back-End: Es la parte del desarrollo web que se encarga de que toda la lógica de una
página web funcione.
55
ACRÓNIMOS
56
GLP: Licencia Pública General.
57
ANEXOS
<?php
class ControladorUsuarios {
/* =============================================
INGRESO DE USUARIO
============================================= */
if (isset($_POST["ingUsuario"])) {
$encriptar = crypt($_POST["ingPassword"],
'$2a$07$asxx54ahjppf45sd87a5a4dDDGsystemdev$');
$tabla = "usuarios";
$item = "usuario";
$valor = $_POST["ingUsuario"];
if ($respuesta["estado"] == 1) {
$_SESSION["iniciarSesion"] = "ok";
$_SESSION["id"] = $respuesta["id"];
$_SESSION["nombre"] = $respuesta["nombre"];
$_SESSION["usuario"] = $respuesta["usuario"];
$_SESSION["foto"] = $respuesta["foto"];
$_SESSION["perfil"] = $respuesta["perfil"];
/* =============================================
REGISTRAR FECHA PARA SABER EL ÚLTIMO LOGIN
============================================= */
58
date_default_timezone_set('America/Mexico_City');
$fecha = date('Y-m-d');
$hora = date('H:i:s');
$item1 = "ultimo_login";
$valor1 = $fechaActual;
$item2 = "id";
$valor2 = $respuesta["id"];
if ($ultimoLogin == "ok") {
if ($_SESSION["perfil"] == "Supervisor") {
echo '<script>
window.location = "productos";
</script>';
} else if ($_SESSION["perfil"] == "Vendedor") {
echo '<script>
window.location = "ventas";
</script>';
} else {
echo '<script>
window.location = "inicio";
</script>';
}
}
} else {
echo '<br>
<div class="alert alert-danger">El usuario aún
no está activado</div>';
}
} else {
59
Anexo 2. Diseño del Módulo Categorías
En esta sección se expondrá el código fuente del controlador y modelo utilizado en el
módulo de Categorías.
<?php
class ControladorCategorias{
/*=============================================
CREAR CATEGORIAS
=============================================*/
if(isset($_POST["nuevaCategoria"])){
$tabla = "categorias";
$datos = $_POST["nuevaCategoria"];
if($respuesta == "ok"){
echo'<script>
swal({
type: "success",
title: "La categoría ha sido guardada correctamente",
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location = "categorias";
}
})
</script>';
}else{
60
echo'<script>
swal({
type: "error",
title: "¡La categoría no puede ir vacía o llevar
caracteres especiales!",
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location = "categorias";
}
})
</script>';
<?php
class ControladorProveedores {
/*=============================================
= MOSTRAR PROVEEDORES =
=============================================*/
$tabla = "proveedores";
return $respuesta;
/*=============================================
= CREAR PROVEEDOR =
61
=============================================*/
if(isset($_POST["nuevoProveedor"])){
$tabla = "proveedores";
$datos = array("nombre"=>$_POST["nuevoProveedor"],
"direccion"=>$_POST["nuevaDireccion"],
"telefono"=>$_POST["nuevoTelefono"],
"email"=>$_POST["nuevoEmail"],
"giro"=>$_POST["nuevoGiro"]);
$respuesta = ModeloProveedores::mdlIngresarProveedor($tabla,
$datos);
if($respuesta == "ok"){
echo'<script>
swal({
type: "success",
title: "El proveedor ha sido guardado correctamente",
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location =
"proveedores";
}
})
</script>';
}else{
echo'<script>
swal({
type: "error",
title: "¡El proveedor no puede ir vacío o llevar
caracteres especiales!",
62
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location = "proveedores";
}
})
</script>';
<?php
class ControladorProductos{
/*=============================================
CREAR PRODUCTO
=============================================*/
if(isset($_POST["nuevaDescripcion"])){
/*=============================================
VALIDAR IMAGEN
=============================================*/
63
$ruta = "vistas/img/productos/default/anonymous.png";
if(isset($_FILES["nuevaImagen"]["tmp_name"])){
list($ancho, $alto) =
getimagesize($_FILES["nuevaImagen"]["tmp_name"]);
$nuevoAncho = 500;
$nuevoAlto = 500;
/*=============================================
CREAMOS EL DIRECTORIO DONDE VAMOS A GUARDAR
LA FOTO DEL USUARIO
=============================================*/
$directorio = "vistas/img/productos/".$_POST["nuevoCodigo"];
mkdir($directorio, 0755);
/*=============================================
DE ACUERDO AL TIPO DE IMAGEN APLICAMOS LAS
FUNCIONES POR DEFECTO DE PHP
=============================================*/
if($_FILES["nuevaImagen"]["type"] == "image/jpeg"){
/*=============================================
GUARDAMOS LA IMAGEN EN EL DIRECTORIO
=============================================*/
$aleatorio = mt_rand(100,999);
$ruta =
"vistas/img/productos/".$_POST["nuevoCodigo"]."/".$aleatorio.".jpg";
$origen =
imagecreatefromjpeg($_FILES["nuevaImagen"]["tmp_name"]);
$destino = imagecreatetruecolor($nuevoAncho,
$nuevoAlto);
imagecopyresized($destino, $origen, 0, 0, 0, 0,
$nuevoAncho, $nuevoAlto, $ancho, $alto);
imagejpeg($destino, $ruta);
if($_FILES["nuevaImagen"]["type"] == "image/png"){
/*=============================================
64
GUARDAMOS LA IMAGEN EN EL DIRECTORIO
=============================================*/
$aleatorio = mt_rand(100,999);
$ruta =
"vistas/img/productos/".$_POST["nuevoCodigo"]."/".$aleatorio.".png";
$origen =
imagecreatefrompng($_FILES["nuevaImagen"]["tmp_name"]);
$destino = imagecreatetruecolor($nuevoAncho,
$nuevoAlto);
imagecopyresized($destino, $origen, 0, 0, 0, 0,
$nuevoAncho, $nuevoAlto, $ancho, $alto);
imagepng($destino, $ruta);
$tabla = "productos";
if($respuesta == "ok"){
echo'<script>
swal({
type: "success",
title: "El producto ha sido guardado
correctamente",
showConfirmButton: true,
confirmButtonText: "Cerrar"
}).then((result) => {
if (result.value) {
window.location =
"productos";
65
}
})
</script>';
}else{
echo'<script>
swal({
type: "error",
title: "¡El producto no puede ir con los campos vacíos
o llevar caracteres especiales!",
showConfirmButton: true,
confirmButtonText: "Cerrar"
}).then((result) => {
if (result.value) {
window.location = "productos";
}
})
</script>';
}
}
<?php
class ControladorClientes{
/*=============================================
CREAR CLIENTES
=============================================*/
if(isset($_POST["nuevoCliente"])){
66
if(preg_match('/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚ ]+$/', $_POST["nuevoCliente"]) &&
preg_match('/^[0-9]+$/', $_POST["nuevoDocumentoId"]) &&
preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-
zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $_POST["nuevoEmail"]) &&
preg_match('/^[()\-0-9 ]+$/', $_POST["nuevoTelefono"]) &&
preg_match('/^[#\.\-a-zA-Z0-9 ]+$/', $_POST["nuevaDireccion"])){
$tabla = "clientes";
$datos = array("nombre"=>$_POST["nuevoCliente"],
"documento"=>$_POST["nuevoDocumentoId"],
"email"=>$_POST["nuevoEmail"],
"telefono"=>$_POST["nuevoTelefono"],
"direccion"=>$_POST["nuevaDireccion"],
"fecha_nacimiento"=>$_POST["nuevaFechaNacimiento"]);
if($respuesta == "ok"){
echo'<script>
swal({
type: "success",
title: "El cliente ha sido guardado correctamente",
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location = "clientes";
}
})
</script>';
}else{
echo'<script>
swal({
type: "error",
title: "¡El cliente no puede ir vacío o llevar caracteres
especiales!",
showConfirmButton: true,
confirmButtonText: "Cerrar",
closeOnConfirm: false
}).then((result) => {
if (result.value) {
window.location = "clientes";
67
}
})
</script>';
}
}
}
<?php
class ControladorVentas{
/*=============================================
CREAR VENTA
=============================================*/
if(isset($_POST["nuevaVenta"])){
/*=============================================
ACTUALIZAR LAS COMPRAS DEL CLIENTE Y REDUCIR EL STOCK Y
AUMENTAR LAS VENTAS DE LOS PRODUCTOS
=============================================*/
$totalProductosComprados = array();
array_push($totalProductosComprados, $value["cantidad"]);
$tablaProductos = "productos";
$item = "id";
$valor = $value["id"];
$orden = null;
$traerProducto = ModeloProductos::mdlMostrarProductos($tablaProductos,
$item, $valor, $orden);
$item1a = "ventas";
$valor1a = $value["cantidad"] + $traerProducto["ventas"];
68
$nuevasVentas =
ModeloProductos::mdlActualizarProducto($tablaProductos, $item1a, $valor1a, $valor);
$item1b = "stock";
$valor1b = $value["stock"];
$nuevoStock =
ModeloProductos::mdlActualizarProducto($tablaProductos, $item1b, $valor1b, $valor);
$tablaClientes = "clientes";
$item = "id";
$valor = $_POST["seleccionarCliente"];
$item1a = "compras";
$valor1a = array_sum($totalProductosComprados) + $traerCliente["compras"];
$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes,
$item1a, $valor1a, $valor);
$item1b = "ultima_compra";
date_default_timezone_set('America/Mexico_City');
$fecha = date('Y-m-d');
$hora = date('H:i:s');
$valor1b = $fecha.' '.$hora;
/*=============================================
GUARDAR LA COMPRA
=============================================*/
$tabla = "ventas";
$datos = array("id_vendedor"=>$_POST["idVendedor"],
"id_cliente"=>$_POST["seleccionarCliente"],
"codigo"=>$_POST["nuevaVenta"],
"productos"=>$_POST["listaProductos"],
"impuesto"=>$_POST["nuevoPrecioImpuesto"],
"neto"=>$_POST["nuevoPrecioNeto"],
"total"=>$_POST["totalVenta"],
"metodo_pago"=>$_POST["listaMetodoPago"]);
if($respuesta == "ok"){
69
echo'<script>
localStorage.removeItem("rango");
swal({
type: "success",
title: "La venta ha sido guardada correctamente",
showConfirmButton: true,
confirmButtonText: "Cerrar"
}).then((result) => {
if (result.value) {
window.location = "ventas";
}
})
</script>';
70