Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INFORME FINAL DE
RESIDENCIA PROFESIONAL
2
Fases del Modelo Incremental .......................................................................................................... 25
Problemas a resolver priorizándolos................................................................................................. 27
Cronograma de Activades. ................................................................................................................ 28
........................................................................................................................................................... 28
Procedimientos y descripción de las actividades realizadas. ............................................................ 28
Conclusión. ........................................................................................................................................ 31
Recomendaciones. ............................................................................................................................ 32
Bibliografía ........................................................................................................................................ 33
Sitios Web.......................................................................................................................................... 33
Anexos.
INDICE DE FIGURAS
Figura 1. Logo de Redytel ....................................................................................... 4
Figura 2. Ubicación de la empresa Redytel. ............................................................ 6
Figura 3. Organigrama de la empresa. .................................................................... 7
Figura 4. Ejemplo aplicación web estática. ........................................................... 14
Figura 5. Ejemplo aplicación web dinámica........................................................... 15
Figura 6. Ejemplo tienda virtual o comercio electrónico ........................................ 16
Figura 7. Ejemplo portal web app .......................................................................... 16
Figura 8. Ejemplo aplicación web animada ........................................................... 17
Figura 9. Ejemplo de aplicación web con “Gestor de Contenidos” ........................ 18
Figura 10. Logo JavaScript.................................................................................... 19
Figura 11. Logo ECMAScript 6. ............................................................................. 20
Figura 12. Logo Node.js ........................................................................................ 20
Figura 13. Logo React.js ....................................................................................... 21
Figura 14. Logo Typescript .................................................................................... 22
Figura 15. Logo SQL Server.................................................................................. 23
Figura 16. Cronograma de actividades ................................................................. 28
INDICE DE TABLAS
Tabla 1. Factibilidad Operativa .............................................................................. 10
Tabla 2. Factibilidad Económica............................................................................ 10
Tabla 3. Procedimientos y descripción de las actividades realizadas. .................. 30
3
CAPÍTULO I. INTRODUCCIÓN
Durante años los sitios web ha sido relegados en los dispositivos móviles sobre las
apps nativas debido a problemas de rendimiento, compatibilidad y, sobre todo, de
conectividad. Las aplicaciones web progresivas (progressive web apps) prometen
resolver estos problemas.
Las aplicaciones web progresivas están a medio camino ya que son básicamente
páginas web, pero mediante el uso de service workers y otras tecnologías se
comportan más como aplicaciones normales que como aplicaciones web. Mediante
los service workers y otras tecnologías las aplicaciones web progresivas pueden
seguir ejecutándose en segundo plano sin tener que vivir dentro del navegador.
Puesto que, en el móvil es posible instalarlas como una aplicación más.
(Spero, 2017)
4
Misión, visión y valores
Misión.
Visión.
Valores.
5
• Innovación y mejora continua: Nos damos cuenta de la importancia de mirar
hacia el futuro, por tanto, ofrecemos lo último del mercado para dar un apoyo
y servicio óptimo a nuestros clientes.
• Transparencia: La implicación y compromiso del personal no sería posible
sin una absoluta transparencia en los procesos, disponiendo el personal de
la máxima información de la empresa.
Croquis.
6
Recursos Humanos
Instalaciones
Jefe de soporte Sistemas Conectividad y
Sistemas
tecnico. Redes
Gerente general Consultoria
Ventas
Almacén
7
1.2 Justificación.
Uno de los motivos principales que impulsaron para realizar este proyecto fue la
falta de eficiencia que tiene la empresa con sus 24 trabajadores a la hora de asignar
las tareas, este proyecto será de gran utilidad para la empresa debido a que podrá
mejorar su eficiencia a la hora de llevar a cabo la asignación de tareas para cada
trabajador, dando como resultado que el gerente de la empresa logré obtener una
analítica de cada trabajador.
La solución propuesta es desarrollar una aplicación web progresiva que permita que
una vez que el usuario tenga en su dispositivo nuestra PWA, podemos enviar push
notificaciones y que esta funcione de manera offline, gracias a algo llamado
los service worker, que básicamente es un script que hace de intermediario entre
nuestra aplicación y el dispositivo móvil, este cachea todos nuestros archivos y nos
permite enviar notificaciones para poder llevar a cabo la administración de tareas de
los empleados de la empresa Redytel Telecomunicaciones logrando así obtener un
mejor control de las tareas. Ya que se pretende que tanto el administrador esté al
tanto de los reportes de cada usuario, así como a los usuarios finales que estarán
pendientes de las tareas que han enviado ellos o sus colaboradores registrados en
la misma tarea asignada, así también como conseguir al final de cada día una
analítica de productividad mediante reportes individuales de cada empleado.
8
1.3 Objetivo.
Objetivo general:
Objetivos específicos.
9
1.4 Factibilidad técnica, económica y operativa
Factibilidad Operativa.
Debido a que el sistema es pequeño, solo se necesitará los siguientes
requerimientos:
Factibilidad Técnica.
En la empresa Redytel Comunicaciones se cuenta con los requisitos, por lo que no
existirá algún factor que pueda intervenir para llevar a cabo su realización,
concluyendo e indicando que si es factible el desarrollar técnicamente el proyecto.
Factibilidad económica.
En el estudio de factibilidad económica, se determina cual es el costo para llevar a
cabo el desarrollo de la aplicación web progresiva de la empresa Redytel
telecomunicaciones.
Total $6160,00
10
Concluyendo que el proyecto es factible, ya que la empresa no cuenta en estos
momentos con una correcta administración de las tareas correspondiente a cada
empleado, así como el conocimiento de la analítica de productividad que logra cada
empleado al mes. Por lo que la realización de esta aplicación web logrará mejorar
la eficiencia y eficacia de la empresa Redytel Telecomunicaciones.
Alcances y limitaciones.
Alcances
• Las notificaciones push son una función de la Web con un gran potencial y,
si se usan con cuidado, se suelen considerar una práctica recomendada en
lo que aplicaciones móviles se refiere.
• La aplicación al ser hibrida podrá evolucionar integrándole nuevos
componentes.
• El acceso podrá hacerse desde cualquier dispositivo con conexión a internet.
Limitaciones
11
CAPITULO II. FUNDAMENTOS TEÓRICOS
Tecnologías de la información.
“Las tecnologías de la información y la comunicación (TIC) está presente en todos
los niveles de nuestra sociedad actual, desde las más grandes corporaciones
multinacionales, a las pymes, gobiernos, administraciones, universidades, centros
educativos, organizaciones socioeconómicas y asociaciones profesionales y
particulares.” (Ramón, 2010)
Las TIC se desarrollan a partir de los avances científicos producidos en los ámbitos
de la informática y las telecomunicaciones. Las TIC son el conjunto de tecnologías
que permiten el acceso, producción, tratamiento y comunicación de información
presentada en diferentes códigos ya sea texto, imagen, sonido. (Noemi Villoria
Liliana, 2009)
Entonces, una Aplicación Web es aquella que debe permitir a los usuarios localizar
información de forma rápida y sencilla en un sitio Web en el que se almacena gran
cantidad de contenido.
12
Características de las aplicaciones web.
Las Aplicaciones Web tienen muchas características que abarcan su
comportamiento, su uso y su complejidad, se nombran algunas de sus
características más sobresalientes de las Apps Web.
13
Aplicación web estática
Esta es una opción más que suficiente para aquellos sitios Web que simplemente
ofrecen una descripción de su empresa, quiénes somos, donde estamos, servicios,
Ideal para empresas que no quieren muchas pretensiones con su sitio Web,
simplemente informar a sus clientes de sus productos y su perfil de empresa.
Por regla general suelen estar desarrolladas en HTML y CSS. Aunque también
pueden mostrar en alguna parte de la aplicación web objetos en movimiento como
por ejemplo banners, GIF animados, vídeos, etc. También pueden desarrollarse
aplicaciones web con jQuery y Ajax.
14
Aplicación web dinámica
Las aplicaciones web dinámicas son mucho más complejas a nivel técnico. Utilizan
bases de datos para cargar a información, y estos contenidos se van actualizando
cada vez que el usuario accede a la web app. Generalmente cuentan con un panel
de administración (llamado CMS) desde dónde los administradores pueden corregir
o modificar los contenidos, ya sean textos o imágenes.
15
Algunos ejemplos de tiendas que tienen una aplicación web comercial podrían ser
la de cualquier gran empresa como el corte inglés en la que la web app se ajusta al
dispositivo móvil como una aplicación móvil, permitiendo interactuar con ella como
si fuera una app nativa.
16
Aplicación web animada.
17
WordPress: Es el más extendido de los gestores de contenidos. Existe mucha
información en la red, tutoriales y guías para personalizarlo, entenderlo y además
es gratuito.
Este tipo de aplicación web es muy común entre páginas de contenidos: blogs
personales, blogs corporativos, blogs profesionales, páginas de noticias, de
artículos, de medios de comunicación.
18
Lenguajes de programación.
Al decidir los lenguajes de programación a utilizar, se nos hizo la recomendación de
utilizar las tecnologías de JavaScript, es por ello que se optó por utilizarlas, dado a
su capacidad para las aplicaciones web.
JavaScript.
¿Qué es?
19
ECMAScript 6.
¿Qué es?
Node.js
¿Qué es?
20
React.js
¿Qué es?
TypeScript.
¿Qué es?
21
TypeScript convierte su código en Javascript común. Es llamado también Superset
de Javascript, lo que significa que, si el navegador está basado en Javascript, este
nunca llegará a saber que el código original fue realizado con TypeScript y ejecutará
el Javascript como lenguaje original.
Características principales:
Tedious.
¿Qué es?
22
Soporte de plataforma
Tedious es JavaScript puro, al igual que sus dependencias. Por lo tanto, debe
ejecutarse sin cambios en cualquier plataforma donde se admita Node.
SQL Server Express es una edición gratuita y muy capaz de SQL Server con la que
se puede desarrollar todo tipo de aplicaciones (de escritorio o web) con las únicas
limitaciones del tamaño de la base de datos y la escalabilidad. Puedes crear tantas
bases de datos como necesites y también crear varias instancias.
Para la mayor parte de las aplicaciones que puede crear una pequeña o mediana
empresa o un startup es más que suficiente en cuanto a tamaño y rendimiento,
incluso en aplicaciones web ya que no hay límite de conexiones simultáneas.
23
Tipo de investigación.
Este tipo de investigación a realizar será de tres tipos; De campo, y experimental.
Será de campo porque dicho tipo de investigación es el proceso que, utilizando el
método científico, permite obtener nuevos conocimientos en el campo de la realidad
social. O bien, estudiar una situación para diagnosticar necesidades y problemas a
efectos de aplicar los conocimientos con fines prácticos.
Por lo que al ser la primera vez que cada uno de nosotros realiza este tipo de
proyecto, se está efectuando un experimento en varios aspectos, se manipulan y se
controlan las diversas variables a utilizar.
24
Modelo Incremental.
1. Inicialización.
25
2. Periodos de Iteración.
26
Problemas a resolver priorizándolos.
Problema 3. Baja eficiencia por parte de los trabajadores por falta de actividades.
27
Cronograma de Activades.
Posteriormente se realizó
un estudio profundo de la
2. Análisis de 22 al 24 de Agosto del empresa, donde se
Requerimientos. 2018. especificó las
características
operacionales que tendrá el
software a desarrollar.
28
Se realizo la recopilación
3. Recopilación de la 27 al 29 de Agosto del de información de la
información. 2018 empresa todo esto a través
de entrevistas,
observación, indagación y
demás técnicas específicas
Todo lo recabado se
4. Organización de la 30 de Agosto al 5 de ordenó de tal manera en la
información Septiembre del 2018 que se pudiera trazar un
plan de desarrollo del
proyecto a realizar.
Se diseñó y se realizó la
8. Creación de los 01 de Octubre al 08 de creación de los modelos de
modelos utilizando Octubre del 2018 nuestra base de datos.
sequelize.
29
Se realizó un algoritmo
11.- Programación de mediante el cual realiza la
algoritmo para selección de 25 de Octubre al 07 de asignación de tareas de
candidatos a las tareas Noviembre del 2018 acuerdo a las habilidades
programadas. del trabajador.
Se realizó la integración de
12.-Integración de la BD en 08 de Noviembre al 14 de consultas y operaciones
sequelize con Graphql Noviembre del 2018 (mutaciones), diseñado
para la que la construcción
de aplicaciones.
Se realizó el modelo de
13.- Creación del modelo 15 de Noviembre al 23 de historial del trabajador de
para historiales Noviembre del 2018. acuerdo a sus horas de
llegadas.
Configuración de los
14.- Configuración de los 26 de Noviembre al 07 de modelos a utilizar de
modelos en Sequelize. Diciembre del 2018 acuerdo a las necesidades
de la aplicación.
15. Pruebas de asignación 10 de Dicembre al 18 de Se realizaron las pruebas
de tareas a usuarios. Diciembre del 2018 para la asignación de
tareas mediante la API
programada
Tabla 3. Procedimientos y descripción de las actividades realizadas.
30
Conclusión.
Las aplicaciones web progresivas ofrecen muchos beneficios para los usuarios de
la empresa, ya que resultan ser accesibles, son adaptables y responsive, no
requieren instalación desde un store de aplicaciones, funcionan offline gracias a los
service workers, una PWA es capaz de trabajar con conectividad limitada o nula.
Esta característica marca una diferencia sustancial con las webs convencionales,
ya que una vez se han instalado los service workers de la PWA, esta tendrá un
funcionamiento similar a una app instalada en el dispositivo. Se contó con una
buena respuesta del cliente sobre el uso de la API.
Dentro de los puntos que considero tiene más importancia dentro de un proyecto de
esta naturaleza son el detectar cuáles son las necesidades reales de las personas
que trabajan día a día con los sistemas, que los procesos operativos de una
empresa se apeguen a la realidad del trabajo diario y no sean un obstáculo
burocrático, que se involucre a los usuarios en el proceso de implementación de los
sistemas de manera que se sepa que es lo que ellos esperan y qué es lo que no
esperan de él, definir de manera clara y lo más tangible posible los beneficios
económicos, laborales, y de cualquier otra índole que se piensan alcanzar con los
sistemas nuevos, de manera que las personas dentro de la empresa sepan cómo
se van a ver beneficiados particularmente.
31
Recomendaciones.
32
Bibliografía
Mario Tamayo. (2004). Proceso de la investigacion cientifica. Editorial Limusa, S.A. De C.V. Grupo
Noriega Editores Balde Ras 9.
Villoría, L. N. (2009). Aplicaciones web 2.0 . En L. N. Villoría, Aplicaciones web 2.0 (pág. pg.15).
Ediciones parainfo, sa.
Sitios Web.
Creador de cronogramas.
https://www.tomsplanner.es/?template=new#doc=AwrNSdOjKWspfrUgGupf
33
Anexos.
34
},dialectOptions: {
instanceName: "SQLEXPRESS"
},
});
Models.sequelize = sequelize;
Models.Sequelize = Sequelize;
35
},
fech_nac: {
type: DataTypes.DATE,
},
estatus: {
type: DataTypes.BOOLEAN,
},
// tslint:disable-next-line:object-literal-sort-keys
habilidades: {
type: DataTypes.STRING,
},
habilidades_desc: {
type: DataTypes.STRING,
},
contrasena: {
type: DataTypes.INTEGER,
}
});
return Huellas;
}
export default huellas;
36
Creación del modelo Historial.
const historial = (sequelize: any, DataTypes: any) => {
const historial = sequelize.define("Historial", {
uuid: {
type: DataTypes.STRING,
primaryKey: true,
},
accion:{
type: DataTypes.STRING,
},
fechAccion: {
type: DataTypes.DATE,
}
});
return historial;
}
export default historial;
Creación de los typedef.
import { gql } from "apollo-server";
const typegql = gql`
scalar Date
type Empleado {
uuid: ID!
nombre: String!
apellido: String!
email: String!
direccion: String!
fech_nac: Date!
estatus: Boolean!
habilidades: String!
habilidades_desc: String!
createAt: Date!
updateAt: Date!
contrasena: ID!
}
type Huellas {
37
huella: String!
uuid: ID!
createAt: String!
updateAt: String!
EmpleadoUuid: String!
}
type Historial {
uuid: ID!
accion: String!
fechAccion: Date!
}
type Query {
hello: String!,
soluc_candidato(preg: String!): [Empleado!]
trabajadores: [Empleado!]!,
login (email: String!, contrasena: Int!):[Empleado!]!,
historial: [Historial!]!,
type Mutation {
Formulario (
nombre: String!,
apellido: String!,
email: String!,
direccion: String!,
fech_nac: String!,
estatus: Boolean!,
habilidades: String!,
habilidades_desc: String!,
contrasena: Int!,
):
Empleado!,
Historial (
uuid: ID!,
accion: String!,
fechAccion: Date!,
):
Historial!,
38
`;
export default typegql;
const resolvers = {
Query: {
hello: () => "hello",
trabajadores: async (_: any, args: any, { db }: { db: any }) => {
const Empleados = await db.models.Empleados.findAll({raw :
true})
console.log(Empleados)
return Empleados;
},
login: async (_: any, args: any, { db }: { db: any }) => {
const Empleados = await db.models.Empleados.findAll({where:
{email:args.email,contrasena:args.contrasena}})
return Empleados;
},
historial: async (_: any, args: any, { db }: { db: any}) => {
console.debug(db.models)
const historial = await db.models.Historial.findAll({raw :
true})
console.log(historial)
return historial;
},
},
// tslint:disable-next-line:object-literal-sort-keys
Mutation: {
Formulario: async (_: any, args: any, { db }: { db: any }) => {
const { Empleados, Huellas } = db.models
try {
const id = uuidv4();
const fecha_nac = moment(args.fech_nac).isValid() ?
moment(args.fech_nac) : false;
console.log(fecha_nac)
const { dataValues } = await Empleados.create({
uuid: id,
nombre: args.nombre,
39
apellido: args.apellido,
email: args.email,
direccion: args.direccion,
fech_nac: fecha_nac,
estatus: args.estatus,
habilidades: args.habilidades,
habilidades_desc: args.habilidades_desc,
contrasena: args.contrasena
});
const res = await Huellas.create({
uuid: id,
huella: id,
EmpleadoUuid: id
});
console.log(res)
return dataValues
} catch (e) {
throw new Error(e)
}
},
Historial: async(_: any,args: any, { db }: { db:any }) => {
const { Historial } = db.models
try{
const { dataValues } = await Historial.create({
uuid: args.uuid,
accion: args.accion,
fechAccion: args.fechAccion
});
return dataValues
} catch (e) {
throw new Error(e)
}
},
},
};
40
const port = 4000;
// tslint:disable-next-line:no-shadowed-variable
async function startServer(port = 5000) {
try {
const models = await SyncModel.sequelize.sync();
const server = new ApolloServer({ typeDefs, resolvers,
context: () => ({
db: models
})
});
const { url } = await server.listen(port);
console.log(`Servidor iniciado en la ruta: ${url}`);
} catch(e) {
throw new Error(e)
}
}
startServer(port);
41
test de conexion.
import coneccion from "../lib/index";
async function testConection() {
try {
const consultar = await coneccion.authenticate();
console.log(consultar);
} catch (e) {
throw new Error(`${e}`);
}
}
export default testConection;
Creación del algoritmo para el reparto de tareas según las habilidades del
trabajador.
import { v4 as uuidv4 } from "uuid";
import moment from "moment";
const resolvers = {
Query: {
hello: () => "hello",
soluc_candidato: async (_: any, args: any, { db }: { db: any }) => {
const Empleados = await db.models.Empleados.findAll({ raw: true
})
const frase = args.preg;
let puntaje = 0;
let mejorOpcion: any = {};
let resultado: {}[] = [];
console.log(Empleados)
const res = Empleados.map((i: any) => {
if (i.habilidades.split(',').length > 1) {
let count = 0
frase.split(" ").map((e: any) => {
i.habilidades.split(',').map((a: any) => a.split('
').map((k: any) => {
if (e == k) {
count += 1
}
}))
console.log(puntaje, count, i.nombre)
if (count > puntaje) {
42
puntaje = count
mejorOpcion = Object.assign({}, mejorOpcion, i)
resultado.pop()
resultado.push(mejorOpcion)
count = 0
} else if ( count == puntaje ) {
puntaje = count
mejorOpcion = Object.assign({}, mejorOpcion, i)
resultado.push(mejorOpcion)
count = 0
}
console.log(resultado)
})
} else {
frase.split(" ").map((e: any) => {
let count = 0
i.habilidades.split(' ').map((k: any) => {
if (e == k) {
count += 1
}
})
console.log(puntaje, i.nombre)
if (count > puntaje) {
puntaje = count
mejorOpcion = Object.assign({}, mejorOpcion, i)
resultado.pop()
resultado.push(mejorOpcion)
count = 0
} else if ( count == puntaje ) {
puntaje = count
mejorOpcion = Object.assign({}, mejorOpcion, i)
resultado.push(mejorOpcion)
count = 0
}
console.log(resultado)
})
}
})
console.log(resultado)
return resultado;
},
},
// tslint:disable-next-line:object-literal-sort-keys
Mutation: {
Formulario: async (_: any, args: any, { db }: { db: any }) => {
43
const { Empleados, Huellas } = db.models
try {
const id = uuidv4();
const fecha_nac = moment(args.fech_nac).isValid() ?
moment(args.fech_nac) : false;
console.log(fecha_nac)
const { dataValues } = await Empleados.create({
uuid: id,
nombre: args.nombre,
apellido: args.apellido,
email: args.email,
direccion: args.direccion,
fech_nac: fecha_nac,
estatus: args.estatus,
habilidades: args.habilidades,
habilidades_desc: args.habilidades_desc,
});
const res = await Huellas.create({
uuid: id,
huella: id,
EmpleadoUuid: id
});
console.log(res)
return dataValues
} catch (e) {
throw new Error(e)
}
},
},
};
44