Documentacion Final

116
PHARMACY CONTROL CENTER Proyecto Final 29 DE MAYO DE 2013 TEAM UMBRELLA Farmacias Torres

description

Documentacion Final

Transcript of Documentacion Final

Page 1: Documentacion Final

PHARMACY CONTROL CENTER Proyecto Final

29 DE MAYO DE 2013 TEAM UMBRELLA Farmacias Torres

Page 2: Documentacion Final

TEAM UMBRELLA 1

Proyecto Final de la materia de Fundamentos de Ingeniería de

Software

Alumno: Emanuel Chablé Concepción

[email protected]

Alumna: Janeth Velázquez Guzmán

[email protected]

Versión: 1.0

Page 3: Documentacion Final

TEAM UMBRELLA 2

Datos del Proyecto

Título del proyecto: Pharmacy Control Center

Nombre del Equipo del proyecto: Team Umbrella

Autores: Emanuel Chablé Concepción y Janeth Velázquez Guzmán

Materia: Fundamentos de Ingeniería de Software

Director: Nicolás Torres Martínez

Empresa: Farmacias Torres

Page 4: Documentacion Final

TEAM UMBRELLA 3

Contenido 1. Introducción ................................................................................................................................ 5

1.1 Organización de la documentación ..................................................................................... 5

1.2 Situación .............................................................................................................................. 6

1.3 Motivación .......................................................................................................................... 6

1.4 Alcance ................................................................................................................................ 7

1.5 Objetivo General ................................................................................................................. 7

1.5.1 Objetivos ..................................................................................................................... 7

2 Datos de la Empresa y/o Organización ....................................................................................... 8

3 Planeación del proyecto de Software ....................................................................................... 10

3.1 Diagrama de Gantt ............................................................................................................ 10

3.2 Informe del Presupuesto ................................................................................................... 10

4 Análisis y Administración de los riesgos del proyecto de software .......................................... 12

5 Desarrollo del proyecto de TI .................................................................................................... 14

5.1 Metodología de desarrollo ................................................................................................ 14

5.1.1 Metodología escogida ............................................................................................... 16

6 Consideración para el desarrollo de proyectos de sistemas de información ........................... 18

6.1 Análisis inicial .................................................................................................................... 18

6.2 Análisis de requerimientos ................................................................................................ 18

6.2.1 Requerimientos funcionales...................................................................................... 18

6.2.2 Requerimientos no funcionales ................................................................................ 19

6.3 Planificación ...................................................................................................................... 19

7 Especificación ............................................................................................................................ 20

7.1 Diagramas de Flujo ............................................................................................................ 20

7.1.1 Actividades del personal ........................................................................................... 21

7.2 Casos de uso ...................................................................................................................... 23

7.2.1 Aplicación de escritorio ............................................................................................. 24

7.3 Diagrama de Clases ........................................................................................................... 36

7.4 Tabla de la Base de Datos.................................................................................................. 37

7.4.1 Diagrama de Entidad – Relación ............................................................................... 38

7.4.2 Diccionario de datos .................................................................................................. 39

8 Construcción y Desarrollo de la Aplicación ............................................................................... 41

8.1 Diagrama de estructura ..................................................................................................... 41

Page 5: Documentacion Final

TEAM UMBRELLA 4

8.2 Descripción de Módulos .................................................................................................... 42

8.3 Diseño de interfaz externa ................................................................................................ 43

8.4 Script (Código del software) .............................................................................................. 46

8.4.1 Código fuente de Inicio de Sesión ............................................................................. 46

8.4.2 Código fuente de la ventana principal con sus módulos. ......................................... 53

9 Prueba del sistema .................................................................................................................. 102

9.1 Matriz de tipos de pruebas ............................................................................................. 102

10 Puesta en Marcha del Proyecto .......................................................................................... 103

10.1 Instalación del proyecto .................................................................................................. 103

11 Documentación ................................................................................................................... 103

11.1 Técnica operativa ............................................................................................................ 103

11.2 Manual técnico ................................................................................................................ 104

11.3 Manual de usuario .......................................................................................................... 104

11.4 Observaciones ................................................................................................................. 111

11.5 Recomendaciones ........................................................................................................... 111

12 Conclusión ........................................................................................................................... 111

13 Anexos ................................................................................................................................. 112

13.1 Cuestionario .................................................................................................................... 112

13.2 Análisis del cuestionario .................................................................................................. 113

Page 6: Documentacion Final

TEAM UMBRELLA 5

1. Introducción

Este documento pretende materializar el trabajo realizado durante el desarrollo del proyecto final

de Pharmacy Control Center. Se ha realizado la documentación conforme el modelo más realista

posible, así como la descripción adecuada de cada una de las fases por las que generalmente pasa

un proyecto de estas características (desarrollo de software).

1.1 Organización de la documentación

La documentación se ha estructurado de la siguiente forma:

En el capítulo introducción se presenta el proyecto y se definen los conceptos importantes que

envuelven su desarrollo, ya sea las principales motivaciones y objetivos, así como la metodología a

seguir durante todo el periodo de desarrollo.

Seguidamente se realiza un análisis inicial de todos los elementos importantes a tener en cuenta

antes de comenzar su desarrollo, incluyendo el análisis de requerimientos del producto, una

planificación de tiempo detallada, así como un análisis sobre las alternativas tecnológicas para llevar

a cabo su implementación. El capítulo finaliza con una descripción detallada del análisis económico

realizado inicialmente.

A continuación encontramos la descripción de cada una de las fases más comunes en el desarrollo

de software. Primero se presenta la especificación, incluyendo los casos de uso de cada una de las

funcionalidades de la aplicación a desarrollar, así como su modelo conceptual y de comportamiento.

Después encontramos toda la fase de diseño, dividida en la arquitectura lógica del sistema.

Finalmente, en el capítulo de implementación y en el de pruebas se documentan todas las

funcionalidades desarrolladas durante el proyecto, y las pruebas realizadas de la aplicación.

Una vez se ha descrito las etapas más comunes en el desarrollo de software, se da un repaso a la

planificación realizada inicialmente analizando las posibles desviaciones y comprobando si los

objetivos iniciales marcados se han cumplido. También se expresan las sensaciones y experiencias

vividas, así como mejoras de la aplicación, todo ello en el capítulo de conclusiones, ampliaciones y

mejoras.

Finalmente, encontramos un glosario, donde se describen los acrónimos utilizados durante toda la

documentación, bibliografía y anexos, donde se encuentran pequeños documentos que permiten la

ampliación y concretización de algunas partes mencionadas durante todo el documento, así como

otra diversa documentación y un manual de usuario.

Page 7: Documentacion Final

TEAM UMBRELLA 6

1.2 Situación

En la era en que vivimos, el rápido avance en el ámbito tecnológico ha permitido mejorar

considerablemente las herramientas de trabajo en el ámbito laboral y, más concretamente en el

ámbito de gestión de negocios, los negocios que están a la vanguardia tecnológica tienden a tener

un mejor control de sus recursos, llevándole la delantera a los negocios que emplean tecnologías

tradicionales, al día de hoy esto es una situación que afecta gravemente a los negocios pequeños

que no son gestionados por tecnologías de la información, esto se debe ya sea porque el negocio

no cuenta con los recursos para implementar la tecnología o por que el dueño del negocio tiene una

resistencia al cambio, esta situación ha provocado que muchos negocios cierren pues sus

competidores les tomaron la delantera al implementar tecnologías de información para optimizar

el control de sus recursos.

Si bien hay negocios que desean implementar estas tecnologías de control, carecen de conocimiento

o personal para implementarlas y/o mantenerlas, a esta situación se le agrega lo costoso que puede

ser para un negocio pequeño la implementación de estas tecnologías.

1.3 Motivación

En estos tiempos, donde el nivel de demanda es muy grande, emplear sistemas tradicionales para

el manejo de comercios dedicados a la venta de fármacos se ha convertido en algo obsoleto y

contraproducente, los clientes requieren de un servicio muy eficiente, las nuevas generaciones

están acostumbradas a un servicio rápido, eficiente y de calidad, es por ello que se crea el software

Pharmacy Control Center, este software de control permitirá al administrador del negocio llevar un

control de: Empleados, Mercancía disponible, Control de proveedores, Ventas más optimas y

Generación de reporte de ventas. Esta herramienta que destaca por ser intuitiva de fácil manejo y

muy eficiente, se propone aumentar el rendimiento en el control de inventarios e empleados,

además de facilitar las ventas.

Agregando que el software Pharmacy Control Center, fue diseñado para ser de bajo costo para los

negocios y que cuenta con la facilidad de poder instalarlo en cualquier sistema, darle mantenimiento

y actualización, ya que fue desarrollado en lenguaje JAVA.

Page 8: Documentacion Final

TEAM UMBRELLA 7

1.4 Alcance

Una de las primeras tareas en todo proyecto, es la definición de su alcance, o dicho de otra forma,

delimitar las funcionalidades a desarrollar (en el caso de un producto de software) para poder

cumplir con todos sus objetivos, al finalizar el proyecto.

Se podría decir que un proyecto que en el que no se defina su alcance de forma correcta, tendría

muchas posibilidades de ser un proyecto condenado a grandes problemas en su planificación,

ejecución y control, por lo que su probabilidad de éxito se reduciría considerablemente. En el caso

de Pharmacy Control Center, es muy importante definir su alcance de forma correcta, ya que una

ampliación considerable de sus funcionalidades, podría convertirlo en un producto no deseado, y

ha de ser una herramienta muy fácil de usar:

Se pretende que los clientes puedan gestionar su negocio y puedan ver una serie de estadísticas de

ventas y control de recursos. Para ello, se pretende desarrollar una aplicación de escritorio

multiplataforma, gestionada por una base de datos que se encontrar en un servidor local dedicado,

cabe mencionar que siendo un solo servidor local dedicado, no se garantiza el 100% de

disponibilidad de este en caso de algún incidente.

1.5 Objetivo General

El objetivo principal de Pharmacy Control Center es facilitar el control de recursos y ventas del

negocio, de tal manera que el dueño puede emplear su tiempo de control del negocio de una

manera más óptima. Para ello, se necesitan alcanzar los siguientes objetivos:

Desarrollar una aplicación de escritorio

Que el software desarrollado sea multiplataforma

1.5.1 Objetivos

De la aplicación de escritorio, soporte multiplataforma:

o Inicio de sesión para cada uno de los empleados, lo que permitirá la realización de

ventas, consultas y reportes.

o Inicio de sesión para administradores, tendrá acceso completo a todo el sistema.

o Interfaz limpia e intuitiva, el software destaca por su facilidad de uso.

o Compatibilidad con todos los sistemas operativos (Windows, Mac y Linux).

Page 9: Documentacion Final

TEAM UMBRELLA 8

2 Datos de la Empresa y/o Organización

Nombre de la Empresa: Farmacias Torres

Ubicación: Calle Abasolo #25, Tila, Chiapas

Antecedentes:

Filosofía Organizacional:

Misión:

Visión:

Objetivos:

Valores:

Organigrama:

Page 10: Documentacion Final

TEAM UMBRELLA 9

Análisis FODA

Se procede a mostrar el análisis de investigación FODA, que se realizó, para una mejor comprensión

sobre la situación actual del cliente.

Fuerzas (+) Debilidades (-)

Internas

Apertura al cambio por parte del personal

Buna ubicación de la “Farmacia”

Buena percepción de la calidad de los servicios y productos ofrecidos

El personal esta desmotivado

El edificio es pequeño

Externas

Oportunidades

Poca competencia

Se cuenta con varios proveedores

Alternativas Fuerzas / Oportunidades

El personal se encuentra capacitado en técnicas iterativas de mejora de calidad.

Existe coordinación con otros proveedores para cubrir todas las necesidades de los usuarios

Alternativas Debilidades /

Oportunidades

Remodelar las instalaciones

Otorgar incentivos por desempeño a los trabajadores

Amenazas

Carreteras en mal estado

Sueldos bajos

Falta de presupuesto

Paradigmas de los proveedores

Alternativas Fuerzas / Amenazas

Recuperación de costos por medicamentos y servicios con ofertas a los usuarios

Alternativas Debilidades /

Amenazas

Revisión de procedimientos para disminuir los costos y tiempos de espera.

Page 11: Documentacion Final

TEAM UMBRELLA 10

3 Planeación del proyecto de Software A continuación se procede a mostrar la información en lo referente a los tiempos que se emplearon

en la elaboración y desarrollo del proyecto, al igual de sus costos.

3.1 Diagrama de Gantt A continuación podemos ver de forma detallada, toda la planificación inicial representada por un

diagrama de Gantt, todas las tareas planificadas inicialmente:

3.2 Informe del Presupuesto Con el cómputo de todas las horas dedicadas al proyecto, se puede llevar a cabo el análisis

económico total. Fundamentalmente va estar compuesto por el valor de los recursos humanos y

recursos materiales. A continuación se va a detallar el coste de cada uno de ellos.

1. Recursos humanos: Durante todo el desarrollo del proyecto, se ha utilizado dos únicos

recursos humanos que han asumido todos los roles que podamos encontrar en un equipo

de desarrollo de software, los trabajos fueron divididos por mitad, aunque en un caso real,

estos roles serian desempeñados por personas calificadas para ello. Los costes han sido

calculados mediante el cómputo total de horas de desarrollo, y la asignación de recursos a

cada una de las tareas realizadas ha sido realizada de forma aproximada, con 30 horas de

carga de trabajo semanal, y sobreesfuerzo los últimos meses del proyecto.

Rol Horas de trabajo $/hora Coste total en $

Gestor de proyecto 55 50 2,750

Analista 80 40 3,200

Programador 180 30 5,400

Diseñador 130 30 3,900

Tester 70 25 3,500

Total recursos 18,750

Tabla 25: Costes totales de recursos humanos

Page 12: Documentacion Final

TEAM UMBRELLA 11

2. Recursos físicos: Podemos clasificar los recursos físicos en recursos software y hardware.

En cuanto a los recursos software, uno de los objetivos era utilizar todo el material gratuito

(software libre) para minimizar costes, y por ello el software utilizado, en gran parte ha sido

libre, a excepción de Microsoft office, Visio y Project (con licencias de estudiante),

CorelDraw y Photoshop (Versiones de Prueba). En cuanto al material hardware, los mayores

costes son el equipo utilizado para el desarrollo de la aplicación, y el servidor beta local,

muy importante para la parte de testeo de funcionalidades. Por otro lado, una vez acabado

y desarrollado todo el proyecto en el servidor beta local (propio), se va a necesitar un

servidor dedicado que cuente con las instalaciones correctas.

Software Tipo Coste total en $

Microsoft Windows 8 Licencia Universitaria 0

Microsoft Visio 2013 Licencia Universitaria 0

Microsoft Project 2013 Licencia Universitaria 0

NetBeans Gratuito 0

CorelDraw X6 Periodo de Prueba 0

Adobe Photoshop CS6 Periodo de Prueba 0

ArgoUML Gratuito 0

Total recursos 0

Tabla 26: Costes del software utilizado

Hardware Cantidad Precio Normal

(por equipo)

Depreciación Coste total en

$

Equipos portátiles 3 12,000 30% 2,307.94

Servidor 1 6,000 30% 246.57

Impresora 1 8,000 30% 394.52

Total recursos 2,949.03

Tabla 27: Costes del hardware utilizado

Otros recursos Cantidad Precio Normal

(por recurso)

Depreciación Coste total en

$

Papelería

(paquete de

cartuchos de

tinta, hojas

blancas, etc.)

2 2,000 30% 82.19

Luz, Teléfono,

etc. 4 5,000 30% 320.54

Total recursos 402.73

Tabla 28: Costes de otros recursos

Entonces, el coste total de los recursos presupuestados a Pharmacy Control Center, asciende a

$ 22,101.76.

Page 13: Documentacion Final

TEAM UMBRELLA 12

4 Análisis y Administración de los riesgos del proyecto de software

A petición de nuestro cliente, se procede a mostrar el análisis de riesgo que se estudió para la

organización, se debe destacar que la inclusión de este análisis es un extra, ya que el mismo no

debe de ir en las documentaciones, solo por esta vez se ofrece una excepción.

No Riesgos Probabilidad Impacto Plan de

Contención Plan de

Contingencia

1 Un mal uso del

cliente 4% Critico

Crear un manual del software

Reparar el daño

2 Abandono de

un miembro del equipo

8%

Catastrófico

Establecer un contrato con

todos los integrantes

Buscar a otro programador

3

El cliente solicita

modificación del software

6%

Catastrófico

Ser claros desde el principio

Modificar el software

4 El cliente viola

el contrato

6%

Catastrófico

Explicar al cliente que no puede

violar el contrato

Tratar de llegar a un

acuerdo

5

Un diseño

inadecuado del sistema

2%

Medio

Hablar con el personal y

establecer un buen diseño de

software

Reparar los errores del software

6

Perdida del proyecto

15%

Catastrófico

Tener varios respaldo del

proyecto

Hablar de lo ocurrido con el cliente y tratar de conseguir más tiempo

7 Accidente de

un miembro del equipo

5%

Critico

Tener el mayor cuidado en la seguridad de

todo el personal

Buscar nuevo

personal

8 El proyecto no es terminado a

tiempo

8%

Catastrófico

Hablar con todo el personal sobre

el tiempo de entrega

Solicitar al cliente tiempo

extra

9

La interfaz gráfica no se

ajusta al software

2%

Medio

Comunicación entre

programador y diseñador

Adaptar la

interfaz

Page 14: Documentacion Final

TEAM UMBRELLA 13

10

El personal tarda en la entrega del

subsistema del proyecto

5%

Critico

Dar a conocer fechas límites de

cada miembro

Presionar a la persona para

la entrega

11 Los recursos no se encuentran

disponibles

6%

Catastrófico

Buscar de antemano todo los recursos a

utilizar

Buscar nuevas alternativas

12

Error en la

estimación del presupuesto

6%

Catastrófico

Planear con

anticipación el gasto

El líder del proyecto

pondrá de su bolsillo el resto

del dinero

13

Falta de comunicación

entre los miembros del

equipo

2%

Medio

Dejar en claro

que es un trabajo de equipo

Buscar maneras más

confiables para una

mejor comunicación

14

Falta de

conocimiento del proyecto

2%

Medio

Dar a conocer la mayor

información de lo que el cliente

ha solicitado

Repasar todo

el informe con el personal

15

Problema familiar de un miembro del

equipo

2%

Medio

Problemas familiares no

mezclarse con el trabajo

Tratar de ayudar al

compañero

16 La muerte de un integrante

del equipo

4%

Critico

Tener el mayor cuidado en la seguridad de

todo el personal

Buscar un

nuevo personal

17

Fallo de todas

la herramientas a utilizar

6%

Catastrófico

Revisar que todo las herramientas

a utilizar se encuentre en buen estado

Buscar nuevas herramientas

18

Falta de interés

por parte del cliente

3%

Critico

Dar a conocer los avances al

cliente para que vaya agarrando

interés en su software

Cancelar el proyecto para el desinterés

del cliente

Page 15: Documentacion Final

TEAM UMBRELLA 14

19

La recolección

de datos en pobre

2%

Critico

Recolectar la mayor

información posible

Buscar información

más extensa y evitar el

fracaso del proyecto

20

El software no cumple con el propósito del

cliente

6%

Catastrófico

Planear con anticipación todo

el funcionamiento

del software

Reparar todas las fallas

encontradas

5 Desarrollo del proyecto de TI

5.1 Metodología de desarrollo

Una vez visto los objetivos que hay que alcanzar, es necesario desarrollar un método de trabajo que

nos permita llevar a cabo todo lo planteado.

Existe una cantidad considerable de modelos de desarrollo de software, por lo que solo se

estudiaran algunos de los más conocidos en ingeniería de software.

Solo se realizara una breve explicación de cada uno de ellos, pero no se hará un análisis extenso ya

que no se ha creído necesario.

Las metodologías se han dividido en dos vértices.

Metodologías genéricas

Las siguientes metodologías son consideradas de enfoque más genérico en el desarrollo de

proyectos de software. Todas ellas pueden clasificarse en frameworks lineales y/o iterativos.

Modelo en cascada (lineal): proceso secuencial de desarrollo de las fases genéricas de

desarrollo de software (análisis de requerimientos, especificación, diseño, implementación,

pruebas y mantenimiento), que permite cierta superposición y flujo entre fases. Hace

hincapié en la utilización de documentación escrita para llevar un control riguroso del

proyecto.

Lo bueno de este modelo es que el tiempo invertido en la especificación y diseño de

software dará más posibilidades al proyecto para alcanzar sus objetivos, así como evitara

posibles desvíos de planificaciones realizadas, además al no haber paralelismo, el cliente

específico como quiere el producto.

Page 16: Documentacion Final

TEAM UMBRELLA 15

Lo malo es su estrecha rigidez, adecuada en casos de desarrollos estables, sin cambios en

requerimientos y desvíos de planificación fácilmente gestionables. Además, si al cliente no

le gusta el producto final, probablemente se tendría que volver a comenzar todo el proceso,

por lo que es una metodología lenta.

Prototipado (iterativo): Es un framework de actividades dedicado al desarrollo de software

prototipo, que debe ser construido en poco tiempo y con el uso de pocos recursos, y una

vez aprobado, cuando se puede iniciar el verdadero desarrollo de software. Se centra en las

necesidades del cliente lo que permite al desarrollador entender mejor lo que se ha de

hacer:

Este modelo es útil cuando el cliente conoce los objetivos generales para el software, pero

no identifica sus requerimientos de entrada o salida. También ofrece un mejor enfoque

cuando los responsables del desarrollo no están seguros de la eficacia de ciertos procesos

de desarrollo.

Lo malo es el tiempo requerido en un proyecto de estas características, y que la rápida

implementación de sistemas para que el cliente pueda ver ciertas funcionalidades, puede

hacer que se desatiendan otros aspectos importantes como la calidad y el mantenimiento

del proyecto a largo plazo.

Incremental (lineal e iterativo): Esta metodología provee de una estrategia para controlar

la complejidad y los riesgos en el desarrollo de un producto, ya que se van desarrollando

ciertas partes que después son revisadas. De esta forma se va produciendo el software de

forma incremental. Para ello se definen los requerimientos antes de proceder con lo

evolutivo y se realiza una mini-cascada de desarrollo de cada uno de los incrementos del

sistema.

Modelo útil, al ser desarrollo incremental donde se va aprendiendo del desarrollo de partes

anteriores.

Espiral (lineal e iterativa): Las tareas a realizar según esta metodología, conforman una

espiral en la que cada bucle e iteración representa un conjunto de actividades no fijadas a

priori, si no que van eligiendo en función del análisis de riesgo. Cada viaje atraviesa cuatro

cuadrantes básicos: (1) determinar objetivos, alternativas y desencadenantes de la

iteración, (2) evaluar alternativas, identificar y resolver riesgos, (3) desarrollar y verificar

resultados de la iteración y (4) plan de la próxima iteración.

Lo positivo del modelo, es que se centra en la evaluación y reducción del riesgo del

proyecto dividiéndolo en segmentos más pequeños y proporcionando más facilidad de

cambio durante el desarrollo.

Page 17: Documentacion Final

TEAM UMBRELLA 16

Metodologías ágiles

Las alternativas a los métodos genéricos, que suelen ser menos adaptativos, pesados y laboriosos,

es el desarrollo ágil de software, un concepto de ingeniería de software que promueve iteraciones

en el desarrollo a lo largo del ciclo de vida del proyecto. La mayoría de las metodologías agiles

minimizan riesgos, mediante el desarrollo en cortos lapsos de tiempo de ciertas funcionalidades.

Cada una de las iteraciones incluye el ciclo de vida genérico de un proyecto (análisis de

requerimientos, especificación…) y al final de cada una de ellas se han de evaluar las prioridades del

proyecto.

Estos métodos enfatizan las comunicaciones entre individuos en vez de la documentación. La

mayoría de equipos agiles mantienen una colaboración con sus clientes de tal forma que prevalezca

sobre la negociación de contratos, además de enfatizar el software funcional como primera medida

del progreso. Es por lo que este tipo de métodos son criticados como “indisciplinados” por la falta

de documentación técnica.

ILUSTRACIÓN 1: DEFINICIÓN GRAFICA PARA LOS MÉTODOS DE DESARROLLO AGILES

Algunas de las metodologías agiles más conocidas son Scrum, Programacion Extrema, Kanban, Test-

Driven Desing y Open Unified Process, la mayoría de ellos basados en principios similares en torno

al proceso iterativo e incremental.

5.1.1 Metodología escogida

La metodología seguida, aunque nunca de forma rigurosa, ha sido la de modelo en cascada con

algunos tintes de metodologías agiles en la parte de diseño.

La realización de una documentación inicial defendiendo el proyecto y su alcance, el análisis de

requerimientos, así como la especificación de funcionalidades, diseño, implementación y pruebas,

se ha realizado acorde al modelo en cascada.

Page 18: Documentacion Final

TEAM UMBRELLA 17

En cuanto a la fase de mantenimiento, se podría decir que hay expectativas puestas en el futuro de

Pharmacy Control Center, por lo que habrá un mantenimiento del producto durante un tiempo

indeterminado.

Debido a pequeñas desviaciones en la toma de decisiones sobre el diseño de la aplicación (como

por ejemplo anexión de módulos en la interfaz del usuario), se han aplicado metodologías agiles, ya

que se tuvo que realizar una iteración de alguna funcionalidad agregada al software y aprobada por

el usuario.

A continuación podemos ver una descripción grafica del modelo en cascada utilizado

Ilustración 2: Descripción grafica del modelo en cascada

Page 19: Documentacion Final

TEAM UMBRELLA 18

6 Consideración para el desarrollo de proyectos de sistemas de

información

6.1 Análisis inicial

En este capítulo se detalla el análisis realizado durante la fase inicial del proyecto. En primer lugar,

y como fase inicial de un proyecto de desarrollo de software, se realizó un análisis de

requerimientos, basados en los objetivos del proyecto, y que nos definen el sistema que tenemos

que construir. Seguidamente se realizó una planificación inicial de las tareas a llevar a cabo, con su

respectivo análisis económico. Finalmente se realizó un análisis de las tecnologías que se podían

utilizar, y así justificar la tecnología que finalmente se escogió.

Ilustración 17: Etapas de desarrollo de software (Análisis de Requerimientos)

6.2 Análisis de requerimientos

6.2.1 Requerimientos funcionales

De la aplicación de escritorio:

Alta, baja y modificación de productos, empleados y proveedores.

Consulta de medicamentos

Consulta de proveedores

Capacidad de gestionar ventas

Generación de reportes de ventas (Día, Semana y Mes)

Page 20: Documentacion Final

TEAM UMBRELLA 19

6.2.2 Requerimientos no funcionales

Genéricos

Es necesaria la elaboración de un manual de usuario, para que todos nuestros clientes, a

pesar de ser una aplicación fácil de usar, conozcan los servicios y funcionalidades que ofrece

el software.

Usabilidad: El software ha de tener una interfaz limpia e intuitiva

Escalabilidad: Ha de ser posible añadir nuevas funcionalidades de forma sencilla

Utilidad: Las funciones de la aplicación han de ser útiles para el usuario

Portabilidad: El software será multiplataforma

Servidor de base de datos: Un servidor local dedicado, que almacenara la base de datos.

6.3 Planificación

Una vez definido el alcance del proyecto y sus requerimientos, la elaboración de la planificación es

más realista. Aunque la planificación ha sido elaborada en fase inicial de proyecto, se incluyen todas

las tareas a llevar a cabo para cumplir con éxito todos los objetivos fijados.

Al tener una fecha fijada con un cliente de antemano, la planificación del tiempo que va a durar todo

el desarrollo, se ha estimado en base al primer día en que el cliente solicito el producto. El tiempo

invertido se puede dividir en dos grandes secciones, detalladas a continuación:

Documentación: La memoria es el documento donde se encuentra toda la información

relacionada con el proyecto. Su elaboración está presente desde el día de inicio del

proyecto, con el fin de entender y justificar todas las decisiones tomadas en las diferentes

fases del proyecto, ya sea el estudio de mercado realizado, o la elección de la tecnología a

utilizar en cada una de las aplicaciones, así como toda la documentación técnica (análisis de

requerimientos, especificación, diseño, etc.).

Desarrollo: De la aplicación de escritorio su desarrollo y testeo depende de la capacidad de

conectividad de la aplicación, existe una gran dependencia entre el programa y la base de

datos que usara, por lo cual las dos serán desarrolladas simultáneamente.

Page 21: Documentacion Final

TEAM UMBRELLA 20

7 Especificación

La especificación es un documento técnico que describe, en la forma más precisa posible y en

términos simples, las necesidades y funciones específicas de un determinado sistema.

Ilustración 31: Etapas de desarrollo de software (Especificación)

En el primer apartado se definirán los diagramas de flujo del personal de la empresa, después los

casos de uso, técnica que sirve para definir interacciones entre un sistema y sus actores, en

respuesta a un evento que inicia un actor principal sobre el sistema y que surgen de la captura de

requisitos funcionales del sistema. Primeramente se mostraran los diagramas de flujo, después los

diagramas de casos de uso, que definirán de forma gráfica los casos de uso, y seguidamente se

describirá cada uno de ellos de forma detallada.

En el segundo apartado se describirán los modelos conceptuales o diagramas de clases, diagramas

estáticos que describen la estructura del sistema, mostrando clases, atributos y relaciones entre

ellos.

Finalmente se describirá el modelo de comportamiento del sistema, formado por los diagramas de

secuencia del sistema y los contratos de las operaciones.

7.1 Diagramas de Flujo

Se procederá a mostrar los diagramas de flujo del personal de la farmacia, estos diagramas ya

fueron previamente aprobados por nuestro cliente y se mostraran para que se lleve una relación

de qué es lo que realiza el personal y como el programa deberá seguir esos patrones, las

funcionalidades específicas del programa se explicaran en los casos de uso.

Page 22: Documentacion Final

TEAM UMBRELLA 21

7.1.1 Actividades del personal

Ilustración 32: Diagrama de flujo del servicio de salud

Ilustración 33: Diagrama de flujo de venta de fármacos

Page 23: Documentacion Final

TEAM UMBRELLA 22

Ilustración 35: Diagrama de flujo de venta de productos

Page 24: Documentacion Final

TEAM UMBRELLA 23

Ilustración 36: Diagrama de flujo de compra a proveedores

7.2 Casos de uso

Acabada de ver la definición de los casos de uso, se va a proceder a mostrar los actores y

diagramas para cada uno de los sistemas. Cabe destacar que hay dos sistemas diferentes, donde

los actores (que son toda entidad externa al sistema que guarda relación con este y que le

demanda una funcionalidad) estarán diferenciados debido a los requerimientos funcionales de

cada uno de los sistemas.

Page 25: Documentacion Final

TEAM UMBRELLA 24

7.2.1 Aplicación de escritorio

Actores

En este sistema encontramos dos actores claramente diferenciados, el empleado que tendrá

acceso a funcionalidades limitadas, el cliente que no tendrá acceso a ninguna funcionalidad y el

administrador que tendrá acceso a las funcionalidades de todo el sistema.

Ilustración 37: Jerarquización de los actores de la aplicación de escritorio

Diagrama de casos de uso

A continuación podemos ver la siguiente figura que ilustra los casos de uso de la aplicación de

escritorio:

Ilustración 38: Diagrama de casos de uso del empleado

Page 26: Documentacion Final

TEAM UMBRELLA 25

Ilustración 39: Diagrama de casos de uso del cliente

Ilustración 40: Diagrama de casos de uso del proveedor

Ilustración 41: Diagrama de casos de uso del administrador

Page 27: Documentacion Final

TEAM UMBRELLA 26

Descripción de casos de uso

Seguidamente se detallan cada uno de los casos de uso de la aplicación de escritorio:

Acerca de la aplicación

Descripción: Se desea conocer más información de la aplicación que se está utilizando.

La información a mostrar se compone de agradecimientos e información de autoría.

Autores: Empleado y/o Administrador.

Precondiciones: -

Flujo Principal:

1. El usuario selecciona la opción “Acerca de” para obtener más información sobre la

aplicación.

2. El sistema muestra la información compuesta por agradecimientos del autor e

información de la empresa autora de la aplicación.

3. Acaba el caso de uso

Acceso al sistema

Descripción: Se desea identificarse en el sistema para acceder a las funciones del mismo.

Autores: Empleado y/o Administrador.

Precondiciones: Contar con una autenticación valida.

Flujo principal:

1. El usuario selecciona la opción de iniciar sesión en el sistema.

2. El sistema muestra una ventana solicitando usuario y contraseña.

3. El usuario introduce usuario y contraseña.

4. El sistema verifica los datos y asigna el nivel de privilegios (limitados o totales).

5. El sistema otorga acceso a las funciones

6. Acaba el caso de uso

Flujo Alternativo (datos incorrectos):

1. Si los datos son incorrectos, el sistema muestra un mensaje de error con la leyenda

“Usuario o Contraseña incorrectos”.

2. El caso de uso vuelve al punto 2 del flujo principal.

Flujo Alternativo (cancelación):

1. El usuario cancela el inicio de sesión del sistema

2. El caso de uso vuelve al punto 1 del flujo principal

Flujo Alternativo (conexión de datos):

1. Durante el inicio de sesión, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 28: Documentacion Final

TEAM UMBRELLA 27

Venta de fármacos

Descripción: Se desea vender un fármaco y/o producto.

Autores: Empleado y/o Administrador (Autentificado).

Precondiciones: -

Flujo principal:

1. El usuario selecciona la opción de ventas.

2. El sistema muestra una ventana solicitando se ingresen los productos y/o fármacos

a vender.

3. El usuario introduce los productos y/o fármacos que desea vender.

4. El sistema va mostrando los productos y/o fármacos, además de su precio conforme

se ingresan.

5. El usuario selecciona la opción vender.

6. El sistema muestra un mensaje de confirmación al usuario.

7. El usuario aprueba la venta.

8. El sistema registra la venta, imprime la información y actualiza la base de datos.

9. Acaba el caso de uso.

Flujo alterno (cancelación):

1. El usuario cancela la venta.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno: (conexión de datos):

1. Durante la venta, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Generación de reporte de ventas

Descripción: Se desea generar el reporte de ventas del día.

Autores: Empleado y/o Administrador (Autentificado).

Precondiciones: El reporte deberá generarse al finalizar el día de labores.

Flujo principal:

1. El usuario selecciona la opción generar reporte.

2. El sistema muestra un mensaje de confirmación al usuario.

3. El usuario confirma la generación del reporte.

4. El sistema muestra al usuario la información de ventas del día, y la almacena en la

base de datos.

5. Acaba el caso de uso.

Flujo alterno (cancelación):

1. El usuario cancela la generación del reporte de ventas del día.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

Page 29: Documentacion Final

TEAM UMBRELLA 28

1. Durante la generación del reporte, el sistema determina que no hay conexión de

datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Consulta de productos y/o fármacos

Descripción: Se desea consultar la información de un producto y/o fármaco.

Autores: Empleado y/o Administrador (Autentificado).

Precondiciones: Conocer el ID o Nombre del producto y/o fármaco.

Flujo principal:

1. El usuario selecciona la opción consultas.

2. El sistema muestra una ventana con opción de búsqueda.

3. El usuario ingresa el ID o Nombre del producto y/o fármaco a consultar.

4. El sistema muestra la información del producto encontrado.

5. Acaba el caso de uso.

Flujo alterno (producto y/o fármaco no encontrado).

1. El sistema muestra un mensaje de error informando que el producto y/o fármaco

buscado no se encuentra en la base de datos.

2. El caso de uso vuelve al punto 2 del flujo principal.

Flujo alterno (Conexión de datos):

1. Durante la búsqueda, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Consulta de proveedores

Descripción: Se desea consultar la lista de proveedores.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción consulta de proveedores.

2. El sistema muestra una ventana que contiene la lista de proveedores con su

respectiva información.

3. Acaba el caso de uso

Flujo alterno (conexión de datos):

1. Durante la consulta de la lista de proveedores, el sistema determina que no hay

conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal

Page 30: Documentacion Final

TEAM UMBRELLA 29

Consulta de empleados

Descripción: Se desea consultar la lista de empleados.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

4. El usuario selecciona la opción consulta de empleados.

5. El sistema muestra una ventana que contiene la lista de empleados con su respectiva

información.

6. Acaba el caso de uso

Flujo alterno (conexión de datos):

3. Durante la consulta de la lista de empleados, el sistema determina que no hay

conexión de datos.

4. El caso de uso vuelve al punto 1 del flujo principal

Alta de fármacos y/o productos

Descripción: Se desea dar de alta nuevos fármacos y/o productos, en la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar

2. En modificar el usuario selecciona la opción fármacos y productos.

3. El sistema muestra una ventana solicitando la información del producto o fármaco

a registrar.

4. El usuario ingresa los datos y le da de alta al producto o fármaco.

5. El sistema muestra un mensaje de confirmación.

6. El usuario confirma el alta del fármaco o producto.

7. El sistema registra el fármaco o producto en la base de datos.

8. Acaba el caso de uso

Flujo alterno (coincidencia de ID):

1. Durante el registro del fármaco o producto, el sistema detecta que el ID coincide

con el ID de otro producto o fármaco, el sistema muestra un mensaje de error

otorgando la información del mismo al usuario.

2. El caso de uso vuelve al punto 2 del flujo principal.

Flujo alterno (cancelación):

1. El usuario cancela el alta del producto o fármaco.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 31: Documentacion Final

TEAM UMBRELLA 30

Flujo alterno (conexión de datos):

1. Durante el alta del producto o fármaco, el sistema determina que no hay conexión

de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Modificación de fármacos y/o productos

Descripción: Se desea modificar los fármacos y/o productos, en la base de datos

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar

2. En modificar el usuario selecciona la opción fármacos y productos.

3. El usuario busca y selecciona el fármaco o producto que desea modificar.

4. El sistema muestra una ventana solicitando la información del producto o fármaco

a modificar.

5. El usuario ingresa los datos y le da modificar al producto o fármaco.

6. El sistema muestra un mensaje de confirmación.

7. El usuario confirma la modificación del fármaco o producto.

8. El sistema actualiza la información del fármaco o producto en la base de datos.

9. Acaba el caso de uso

Flujo alterno (coincidencia de ID):

1. Durante la actualización del fármaco o producto, el sistema detecta que el ID

coincide con el ID de otro producto o fármaco (si se cambió el ID original por otro),

el sistema muestra un mensaje de error otorgando la información del mismo al

usuario.

2. El caso de uso vuelve al punto 2 del flujo principal.

Flujo alterno (cancelación):

1. El usuario cancela la modificación del producto o fármaco.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la modificación del producto o fármaco, el sistema determina que no hay

conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 32: Documentacion Final

TEAM UMBRELLA 31

Baja de fármacos y/o productos

Descripción: Se desea dar de baja a los fármacos y/o productos, en la base de datos

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar

2. En modificar el usuario selecciona la opción fármacos y productos.

3. El usuario busca y selecciona el fármaco o producto que desea dar de baja.

4. El usuario selecciona la opción dar de baja.

5. El sistema muestra un mensaje de confirmación.

6. El usuario confirma la baja del fármaco o producto.

7. El sistema elimina la información del fármaco o producto en la base de datos.

8. Acaba el caso de uso

Flujo alterno (cancelación):

1. El usuario cancela la baja del producto o fármaco.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la baja del producto o fármaco, el sistema determina que no hay conexión

de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Alta de empleados

Descripción: Se desea dar de alta a empleados en la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar el usuario selecciona la opción empleados.

3. En empleados el usuario selecciona la opción alta de empleados.

4. El sistema muestra una ventana solicitando la información del nuevo empleado.

5. El usuario ingresa la información y da de alta al empleado.

6. El sistema muestra una ventana de confirmación.

7. El usuario confirma.

8. El sistema agrega al nuevo empleado en la base de datos.

9. Acaba el caso de uso.

Flujo alterno (coincidencia de matrícula):

1. Durante el alta del empleado el sistema determina que la nueva matricula coincide

con la matrícula de otro empleado.

Page 33: Documentacion Final

TEAM UMBRELLA 32

2. El caso de uso vuelve al punto 5 del flujo principal.

Flujo alterno (cancelación):

1. El usuario cancela el alta de empleado.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante el alta del empleado, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Modificación de empleados

Descripción: Se desea modificar la información de un empleado en la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar selecciona empleados

3. El usuario busca y selecciona al empleado a modificar y da opción en modificar

empleado.

4. El sistema muestra una ventana solicitando al usuario la información a modificar.

5. El usuario ingresa la información y da en modificar empleado.

6. El sistema muestra un mensaje de confirmación.

7. El usuario confirma.

8. El sistema actualiza la información del empleado modificado en la base de datos.

9. Acaba el caso de uso.

Flujo alterno (coincidencia de matrícula):

1. Durante la modificación de la matrícula del empleado el sistema determina que esta

coincide con la matrícula de otro empleado.

2. El caso de uso vuelve al punto 4 del flujo principal.

Flujo alterno (cancelación):

1. El usuario cancela la modificación de empleado.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la modificación de empleado, el sistema determina que no hay conexión

de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 34: Documentacion Final

TEAM UMBRELLA 33

Baja de empleados

Descripción: Se desea dar de baja a un empleado en la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar selecciona empleados.

3. El usuario busca y selecciona al empleado que desea dar de baja, y da en opción

baja de empleado.

4. El sistema muestra una ventana de confirmación.

5. El usuario confirma la baja.

6. El sistema elimina al empleado de la base de datos.

7. Acaba el caso de uso.

Flujo alterno (cancelación):

1. El usuario cancela la baja de empleado.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la baja de empleados, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Alta de proveedores

Descripción: Se desea dar de alta a un proveedor en la base de datos

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar selecciona la opción proveedores.

3. El usuario selecciona la opción alta de proveedores.

4. El sistema muestra una ventana solicitando la información del proveedor que se

desea dar de alta.

5. El usuario ingresa los datos y da de alta al proveedor.

6. El sistema muestra una ventana de confirmación.

7. El usuario confirma el alta.

8. El sistema agrega al nuevo proveedor en la base de datos.

Flujo alterno (cancelación):

1. El usuario cancela el alta de proveedores.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 35: Documentacion Final

TEAM UMBRELLA 34

Flujo alterno (conexión de datos):

1. Durante el alta del nuevo proveedor, el sistema determina que no hay conexión de

datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Modificación de proveedores.

Descripción: Se desea modificar la información de un proveedor en la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador.

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar selecciona la opción proveedores.

3. El usuario busca el proveedor y selecciona modificar proveedor.

4. El sistema muestra una ventana solicitando la información a modificar.

5. El usuario modifica la información del proveedor y da modificar.

6. El sistema muestra una ventana de confirmación.

7. El usuario confirma.

8. El sistema actualiza la nueva información del proveedor en la base de datos.

9. Acaba el caso de uso.

Flujo alterno (cancelación):

1. El usuario cancela la modificación de proveedores.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la modificación del proveedor, el sistema determina que no hay conexión

de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 36: Documentacion Final

TEAM UMBRELLA 35

Baja de proveedores

Descripción: Se desea dar de baja a un proveedor de la base de datos.

Autores: Administrador (Autentificado).

Precondiciones: Estar autentificado como administrador

Flujo principal:

1. El usuario selecciona la opción modificar.

2. En modificar selecciona la opción proveedores.

3. El usuario busca y selección al proveedor que desea dar de baja y selecciona dar de

baja al proveedor.

4. El sistema muestra una ventana de confirmación.

5. El usuario confirma.

6. El sistema elimina al proveedor de la base de datos.

Flujo alterno (cancelación):

1. El usuario cancela la baja del proveedor.

2. El caso de uso vuelve al punto 1 del flujo principal.

Flujo alterno (conexión de datos):

1. Durante la baja de proveedores, el sistema determina que no hay conexión de datos.

2. El caso de uso vuelve al punto 1 del flujo principal.

Page 37: Documentacion Final

TEAM UMBRELLA 36

7.3 Diagrama de Clases

Page 38: Documentacion Final

TEAM UMBRELLA 37

7.4 Tabla de la Base de Datos

Una vez determinados los casos de uso, se procede a mostrar las bases de datos, estas son

detalladas y al mismo tiempo destacan por su simplicidad y eficiencia, al ser un negocio pequeño,

no se requiere de más información, no obstante la portabilidad del software permitiría la anexión

de datos y ampliación de la base de datos.

A continuación se muestra la base de datos para Pharmacy Control Center.

Page 39: Documentacion Final

TEAM UMBRELLA 38

7.4.1 Diagrama de Entidad – Relación

A continuación se muestra el diagrama de Entidad – Relación, con los aspectos básicos en los que

trabajara la base de datos, como se podrá apreciar, destaca por su simplicidad pero al mismo tiempo

por su eficiencia y facilidad de comprensión.

Page 40: Documentacion Final

TEAM UMBRELLA 39

7.4.2 Diccionario de datos

Tabla_Trabajador

Campo Descripción Tipo Longitud Restricciones Función del

dato Ejemplo

Matricula Clave que

identifica al usuario

String Indefinido Matricula

única Clave

primaria M11H80

Nombre Nombre del

usuario Char Indefinido 20 caracteres Campo Juan

Apellido Apellido del

usuario Char Indefinido 30 caracteres Campo Perez

Cargo Rango del

usuario en el sistema

Char Indefinido 20 caracteres Campo Administrador

Contraseña Clave de

acceso del usuario

String indefinido Ninguna Campo JP12#3

Curp Clave de

identificación federal

String Indefinido Ninguna Campo 125M594F584

RFC Clave de registro federal

String Indefinido Ninguna Campo 45741rt5515

Teléfono Teléfono del trabajador

Byte Indefinido 0 – 9 Campo 99-55-66-99

Correo Correo del trabajador

String Indefinido Ninguna Campo [email protected]

Tabla_Ventas

Campo Descripción Tipo Longitud Restricciones Función del dato

Ejemplo

Venta_Dia Genera reporte de ventas del día

Float Indefinido Ninguno Campo 3,598.23

Venta_Semana Genera reporte de ventas de la semana

Float Indefinido Ninguno Campo 15,489.25

Venta_Mes Genera reporte de ventas del mes

Float Indefinido Ninguno Campo 28,598.54

Page 41: Documentacion Final

TEAM UMBRELLA 40

Tabla_Proveedor

Campo Descripció

n Tipo Longitud Restricciones

Función del dato

Ejemplo

Nombre Nombre de la empresa

Char Indefinido 50

caracteres Clave

primaria Laboratorios Astra SA.

De C.V

Servicios Servicios

que ofrece Char Indefinido Ninguno Campo Venta de fármacos

Dirección

Dirección en donde

se encuentra ubicada la empresa

String Indefinido Ninguno Campo AV. Jose gorostiza

num. 206, col. 2 de mayo

Teléfono Teléfono

de la empresa

Byte Indefinido 0-9 Campo 99-35-98-08-25

Correo Correo de la empresa

String Indefinido 20

caracteres campo

[email protected]

Tabla_Productos

Campo Descripción Tipo Longitud Restricciones Función del dato

Ejemplo

ID Identificador

del producto

String Indefinido ninguno Clave

primaria P12564

Nombre Nombre del

producto char indefinido

50 caracteres

Campo Tempra

Categoría Categoría

del producto

Char indefinido 20

caracteres Campo Fármaco

Descripción Datos del producto

Char Indefinido Ninguno Campo Eficaz

contra la fiebre

Precio Precio

unitario del producto

Float Indefinido Ninguno Campo 50.36

Cantidad

Cantidad en existencia

en almacén del

producto

Int Indefinido Ninguno Campo 35

Page 42: Documentacion Final

TEAM UMBRELLA 41

8 Construcción y Desarrollo de la Aplicación

8.1 Diagrama de estructura

Page 43: Documentacion Final

TEAM UMBRELLA 42

8.2 Descripción de Módulos Se procede a mostrar una breve y clara descripción de los principales módulos del sistema,

aclarando que más adelante se procederá a otorgar capturas de pantalla para mejor comprensión

de la funcionalidad del sistema.

Modulo Descripción

Ventas Modulo que se encarga de recibir la id de los productos a vender, otorga precio y

tipo de cobro.

Consultas Módulo de búsqueda rápida, se ingresa la id o nombre de lo que se desea buscar y

este lo muestra.

Reportes Modulo encargado de generar el informe de ventas diarias, semanales y mensuales.

Proveedor Modulo que otorga la información que se tiene de cada proveedor registrado en el

sistema.

Modificar

Módulo especial, de acceso restringido solo al administrador, este módulo

permite dar de alta, baja y modificar la información de la base de datos.

Page 44: Documentacion Final

TEAM UMBRELLA 43

8.3 Diseño de interfaz externa A continuación se procede a mostrar la interface que tendrá el software.

Figura 01: Ventana de inicio de sesión

Figura 02: Modulo de Ventas

Page 45: Documentacion Final

TEAM UMBRELLA 44

Figura 03: Modulo de Consulta

Figura 04: Modulo de Reporte

Page 46: Documentacion Final

TEAM UMBRELLA 45

Figura 05: Modulo de Proveedor

Figura 06: Modulo de Modificar

Page 47: Documentacion Final

TEAM UMBRELLA 46

8.4 Script (Código del software) Se procede a mostrar el código fuente como parte del acuerdo de la licencia del programa (Open

Source). La ventaja de que este código sea en Java y con licencia Open Source, es que puede ser

modificado con mucha facilidad, y tiene una gran capacidad de anexión de funcionalidades.

Cabe aclarar que por cuestiones de tiempo y falta de personal, al ser un equipo conformado por 2

personas, no se logró implementar la funcionalidad al software, el cliente quedo de acuerdo en

que a futuro, se concluirá el proyecto.

8.4.1 Código fuente de Inicio de Sesión Se procede a mostrar el código de la interface de la ventana de inicio de sesión.

/**

* @Author Janeth and Emanuel

* Team: Umbrella

*/

public class AccesoSistema extends javax.swing.JFrame {

public AccesoSistema() {

initComponents();

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jPanel1 = new javax.swing.JPanel();

Titulo = new javax.swing.JLabel();

Usuario = new javax.swing.JLabel();

txtUsuario = new javax.swing.JTextField();

Contraseña = new javax.swing.JLabel();

Imagen1 = new javax.swing.JLabel();

Imagen2 = new javax.swing.JLabel();

txtContraseña = new javax.swing.JPasswordField();

jButton1 = new javax.swing.JButton();

Page 48: Documentacion Final

TEAM UMBRELLA 47

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setAlwaysOnTop(true);

setBackground(new java.awt.Color(102, 102, 255));

setForeground(new java.awt.Color(51, 51, 255));

setPreferredSize(new java.awt.Dimension(640, 400));

setResizable(false);

jPanel1.setBackground(new java.awt.Color(255, 204, 204));

jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(102, 102,

102)));

Titulo.setBackground(new java.awt.Color(255, 255, 255));

Titulo.setFont(new java.awt.Font("Constantia", 0, 48)); // NOI18N

Titulo.setForeground(new java.awt.Color(0, 102, 102));

Titulo.setText("Farmacia Torres");

Usuario.setFont(new java.awt.Font("Constantia", 0, 24)); // NOI18N

Usuario.setForeground(new java.awt.Color(0, 102, 102));

Usuario.setText("Usuario");

txtUsuario.setFont(new java.awt.Font("Constantia", 0, 24)); // NOI18N

Contraseña.setFont(new java.awt.Font("Constantia", 0, 24)); // NOI18N

Contraseña.setForeground(new java.awt.Color(0, 102, 102));

Contraseña.setText("Contraseña");

Imagen1.setBackground(new java.awt.Color(255, 255, 255));

Imagen1.setIcon(new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367307177_gnome-keyring-

manager.png"))); // NOI18N

Page 49: Documentacion Final

TEAM UMBRELLA 48

Imagen2.setBackground(new java.awt.Color(255, 255, 255));

Imagen2.setIcon(new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367306794_heart_love_com

puter.png"))); // NOI18N

txtContraseña.setFont(new java.awt.Font("Constantia", 0, 24)); // NOI18N

jButton1.setBackground(new java.awt.Color(204, 255, 204));

jButton1.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

jButton1.setForeground(new java.awt.Color(0, 102, 102));

jButton1.setText("Entrar");

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(3, 3, 3)

.addComponent(Imagen2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(Contraseña)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

jPanel1Layout.createSequentialGroup()

Page 50: Documentacion Final

TEAM UMBRELLA 49

.addComponent(Titulo)

.addGap(98, 98, 98))

.addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

jPanel1Layout.createSequentialGroup()

.addComponent(Usuario)

.addGap(40, 40, 40)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,

false)

.addComponent(txtContraseña,

javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 160,

Short.MAX_VALUE)

.addComponent(txtUsuario, javax.swing.GroupLayout.Alignment.TRAILING))))

.addGap(18, 18, 18)))

.addComponent(Imagen1, javax.swing.GroupLayout.PREFERRED_SIZE, 137,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(206, 206, 206))

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(18, 18, 18)

.addComponent(Titulo)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(Imagen2, javax.swing.GroupLayout.PREFERRED_SIZE, 156,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(27, 27, 27))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 51: Documentacion Final

TEAM UMBRELLA 50

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(104, 104, 104)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(Usuario)

.addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(21, 21, 21)

.addComponent(Contraseña))

.addGroup(jPanel1Layout.createSequentialGroup()

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(txtContraseña, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(70, 70, 70)

.addComponent(Imagen1, javax.swing.GroupLayout.PREFERRED_SIZE, 143,

javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGap(22, 22, 22)

.addComponent(jButton1)

.addContainerGap(57, Short.MAX_VALUE))

);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 632,

javax.swing.GroupLayout.PREFERRED_SIZE)

);

Page 52: Documentacion Final

TEAM UMBRELLA 51

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);

pack();

}// </editor-fold>

public static void main(String args[]) {

try {

for (javax.swing.UIManager.LookAndFeelInfo info :

javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(AccesoSistema.class.getName()).log(java.util.logging.Level.SEVE

RE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(AccesoSistema.class.getName()).log(java.util.logging.Level.SEVE

RE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(AccesoSistema.class.getName()).log(java.util.logging.Level.SEVE

RE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

Page 53: Documentacion Final

TEAM UMBRELLA 52

java.util.logging.Logger.getLogger(AccesoSistema.class.getName()).log(java.util.logging.Level.SEVE

RE, null, ex);

}

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new AccesoSistema().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JLabel Contraseña;

private javax.swing.JLabel Imagen1;

private javax.swing.JLabel Imagen2;

private javax.swing.JLabel Titulo;

private javax.swing.JLabel Usuario;

private javax.swing.JButton jButton1;

private javax.swing.JPanel jPanel1;

private javax.swing.JPasswordField txtContraseña;

private javax.swing.JTextField txtUsuario;

// End of variables declaration

}

Page 54: Documentacion Final

TEAM UMBRELLA 53

8.4.2 Código fuente de la ventana principal con sus módulos. Se procede a mostrar la totalidad del código fuente de la interface del software.

/**

* @Author Janeth and Emanuel

* Team: Umbrella

*/

public class Ventanas extends javax.swing.JFrame {

public Ventanas() {

initComponents();

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

Fondo = new javax.swing.JPanel();

Pestañas = new javax.swing.JPanel();

Comados = new javax.swing.JTabbedPane();

Ventas = new javax.swing.JPanel();

PublicoG = new javax.swing.JLabel();

jSeparator1 = new javax.swing.JSeparator();

jPanel1 = new javax.swing.JPanel();

jScrollPane1 = new javax.swing.JScrollPane();

tbVenta = new javax.swing.JTable();

Codigo = new javax.swing.JLabel();

txtCodigo = new javax.swing.JTextField();

Page 55: Documentacion Final

TEAM UMBRELLA 54

Total = new javax.swing.JLabel();

txtTotal = new javax.swing.JTextField();

Pago = new javax.swing.JLabel();

Credito = new javax.swing.JButton();

Debito = new javax.swing.JButton();

Efectivo = new javax.swing.JButton();

CancelarV = new javax.swing.JButton();

Consulta = new javax.swing.JPanel();

ConsultaG = new javax.swing.JLabel();

jSeparator2 = new javax.swing.JSeparator();

jPanel2 = new javax.swing.JPanel();

jScrollPane2 = new javax.swing.JScrollPane();

tbConsulta = new javax.swing.JTable();

txtBuscar = new javax.swing.JTextField();

Buscar = new javax.swing.JButton();

Reporte = new javax.swing.JPanel();

ReporteG = new javax.swing.JLabel();

jSeparator3 = new javax.swing.JSeparator();

Dia = new javax.swing.JButton();

Semana = new javax.swing.JButton();

Mes = new javax.swing.JButton();

jPanel3 = new javax.swing.JPanel();

jScrollPane3 = new javax.swing.JScrollPane();

tbReporte = new javax.swing.JTable();

Proveedor = new javax.swing.JPanel();

ProveedorG = new javax.swing.JLabel();

jSeparator4 = new javax.swing.JSeparator();

jPanel4 = new javax.swing.JPanel();

jScrollPane4 = new javax.swing.JScrollPane();

Page 56: Documentacion Final

TEAM UMBRELLA 55

tbProveedor = new javax.swing.JTable();

Modificar = new javax.swing.JPanel();

ModificarDatos = new javax.swing.JLabel();

jSeparator5 = new javax.swing.JSeparator();

jPanel5 = new javax.swing.JPanel();

PestañaModif = new javax.swing.JTabbedPane();

producto = new javax.swing.JPanel();

jPanel6 = new javax.swing.JPanel();

jScrollPane5 = new javax.swing.JScrollPane();

tbProducto = new javax.swing.JTable();

AltaPro = new javax.swing.JButton();

BajaPro = new javax.swing.JButton();

ModifPro = new javax.swing.JButton();

Farmaco = new javax.swing.JPanel();

jPanel8 = new javax.swing.JPanel();

jScrollPane6 = new javax.swing.JScrollPane();

tbFarmaco = new javax.swing.JTable();

AltaFar = new javax.swing.JButton();

BajaFarm = new javax.swing.JButton();

ModifFarm = new javax.swing.JButton();

Empleados = new javax.swing.JPanel();

jPanel7 = new javax.swing.JPanel();

jScrollPane7 = new javax.swing.JScrollPane();

tbEmpleado = new javax.swing.JTable();

AltaEmple = new javax.swing.JButton();

BajaEmple = new javax.swing.JButton();

ModifEmple = new javax.swing.JButton();

Provee = new javax.swing.JPanel();

jPanel9 = new javax.swing.JPanel();

Page 57: Documentacion Final

TEAM UMBRELLA 56

jScrollPane8 = new javax.swing.JScrollPane();

tbProvee = new javax.swing.JTable();

AltaModif = new javax.swing.JButton();

BajaModif = new javax.swing.JButton();

Modifprovee = new javax.swing.JButton();

jComboBox1 = new javax.swing.JComboBox();

jTextField1 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setBackground(new java.awt.Color(255, 255, 255));

setPreferredSize(new java.awt.Dimension(1080, 700));

setResizable(false);

Fondo.setBackground(new java.awt.Color(255, 255, 255));

Fondo.setRequestFocusEnabled(false);

Fondo.setVerifyInputWhenFocusTarget(false);

Pestañas.setBackground(new java.awt.Color(255, 255, 255));

Comados.setBackground(new java.awt.Color(255, 255, 255));

Comados.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

Ventas.setBackground(new java.awt.Color(255, 255, 255));

Ventas.setRequestFocusEnabled(false);

Ventas.setVerifyInputWhenFocusTarget(false);

PublicoG.setBackground(new java.awt.Color(255, 255, 255));

PublicoG.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

PublicoG.setText("Publico General");

Page 58: Documentacion Final

TEAM UMBRELLA 57

PublicoG.setRequestFocusEnabled(false);

PublicoG.setVerifyInputWhenFocusTarget(false);

jPanel1.setBackground(new java.awt.Color(255, 255, 255));

jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));

jScrollPane1.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

tbVenta.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbVenta.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

Page 59: Documentacion Final

TEAM UMBRELLA 58

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null}

},

new String [] {

"Codigo", "Nombre", "Descripción", "Cantidad", "Precio"

}

) {

Class[] types = new Class [] {

java.lang.String.class, java.lang.Object.class, java.lang.String.class, java.lang.String.class,

java.lang.Byte.class

};

boolean[] canEdit = new boolean [] {

false, false, false, false, false

};

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

}

Page 60: Documentacion Final

TEAM UMBRELLA 59

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane1.setViewportView(tbVenta);

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 714,

Short.MAX_VALUE)

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 299,

Short.MAX_VALUE)

);

Codigo.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Codigo.setText("Codigo");

txtCodigo.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

Total.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Total.setText("Total");

txtTotal.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Page 61: Documentacion Final

TEAM UMBRELLA 60

Pago.setBackground(new java.awt.Color(255, 255, 255));

Pago.setFont(new java.awt.Font("Constantia", 0, 24)); // NOI18N

Pago.setForeground(new java.awt.Color(0, 102, 102));

Pago.setIcon(new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367464996_06.png"))); //

NOI18N

Pago.setText("Forma de Pago");

Pago.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);

Credito.setBackground(new java.awt.Color(204, 255, 204));

Credito.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Credito.setForeground(new java.awt.Color(0, 102, 102));

Credito.setText("Tarjeta de Credito");

Debito.setBackground(new java.awt.Color(204, 255, 204));

Debito.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Debito.setForeground(new java.awt.Color(0, 102, 102));

Debito.setText("Tarjeta de Debito");

Efectivo.setBackground(new java.awt.Color(204, 255, 204));

Efectivo.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Efectivo.setForeground(new java.awt.Color(0, 102, 102));

Efectivo.setText("Efectivo");

CancelarV.setBackground(new java.awt.Color(204, 255, 204));

CancelarV.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

CancelarV.setForeground(new java.awt.Color(0, 102, 102));

CancelarV.setText("Cancelar Venta");

javax.swing.GroupLayout VentasLayout = new javax.swing.GroupLayout(Ventas);

Page 62: Documentacion Final

TEAM UMBRELLA 61

Ventas.setLayout(VentasLayout);

VentasLayout.setHorizontalGroup(

VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(VentasLayout.createSequentialGroup()

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(VentasLayout.createSequentialGroup()

.addGap(57, 57, 57)

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(VentasLayout.createSequentialGroup()

.addComponent(Codigo)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(txtCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, 138,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(148, 148, 148)

.addComponent(CancelarV))

.addGroup(VentasLayout.createSequentialGroup()

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(34, 34, 34)

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(Pago)

.addComponent(Credito, javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(Debito, javax.swing.GroupLayout.Alignment.LEADING,

javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(Efectivo, javax.swing.GroupLayout.Alignment.LEADING,

javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)))))

.addGroup(VentasLayout.createSequentialGroup()

.addContainerGap()

Page 63: Documentacion Final

TEAM UMBRELLA 62

.addComponent(PublicoG))

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 1089,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(VentasLayout.createSequentialGroup()

.addGap(517, 517, 517)

.addComponent(Total)

.addGap(54, 54, 54)

.addComponent(txtTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 149,

javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

VentasLayout.setVerticalGroup(

VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(VentasLayout.createSequentialGroup()

.addGap(38, 38, 38)

.addComponent(PublicoG)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(38, 38, 38)

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(Codigo)

.addComponent(txtCodigo, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(CancelarV))

.addGap(42, 42, 42)

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(VentasLayout.createSequentialGroup()

.addComponent(Pago)

Page 64: Documentacion Final

TEAM UMBRELLA 63

.addGap(41, 41, 41)

.addComponent(Credito)

.addGap(18, 18, 18)

.addComponent(Debito)

.addGap(18, 18, 18)

.addComponent(Efectivo))

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(18, 18, 18)

.addGroup(VentasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(Total)

.addComponent(txtTotal, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addContainerGap(108, Short.MAX_VALUE))

);

Comados.addTab("Ventas", new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367303474_shopping_cart_a

dd.png")), Ventas); // NOI18N

Consulta.setBackground(new java.awt.Color(255, 255, 255));

Consulta.setPreferredSize(new java.awt.Dimension(1075, 700));

Consulta.setRequestFocusEnabled(false);

Consulta.setVerifyInputWhenFocusTarget(false);

ConsultaG.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ConsultaG.setText("Consulta General");

jPanel2.setBackground(new java.awt.Color(255, 255, 255));

jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

Page 65: Documentacion Final

TEAM UMBRELLA 64

jScrollPane2.setBackground(new java.awt.Color(255, 255, 255));

tbConsulta.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbConsulta.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

Page 66: Documentacion Final

TEAM UMBRELLA 65

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

},

new String [] {

"ID", "Nombre", "Precio", "Cantidad"

}

) {

Class[] types = new Class [] {

java.lang.Integer.class, java.lang.String.class, java.lang.Float.class, java.lang.Integer.class

};

boolean[] canEdit = new boolean [] {

false, false, false, false

};

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane2.setViewportView(tbConsulta);

Page 67: Documentacion Final

TEAM UMBRELLA 66

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);

jPanel2.setLayout(jPanel2Layout);

jPanel2Layout.setHorizontalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 921,

Short.MAX_VALUE)

);

jPanel2Layout.setVerticalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 362,

Short.MAX_VALUE)

);

txtBuscar.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

Buscar.setIcon(new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367607129_search_b.png")))

; // NOI18N

javax.swing.GroupLayout ConsultaLayout = new javax.swing.GroupLayout(Consulta);

Consulta.setLayout(ConsultaLayout);

ConsultaLayout.setHorizontalGroup(

ConsultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jSeparator2)

.addGroup(ConsultaLayout.createSequentialGroup()

.addGroup(ConsultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ConsultaLayout.createSequentialGroup()

.addContainerGap()

.addComponent(ConsultaG))

.addGroup(ConsultaLayout.createSequentialGroup()

Page 68: Documentacion Final

TEAM UMBRELLA 67

.addGap(68, 68, 68)

.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(ConsultaLayout.createSequentialGroup()

.addGap(145, 145, 145)

.addComponent(txtBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 116,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(Buscar, javax.swing.GroupLayout.PREFERRED_SIZE, 40,

javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(86, Short.MAX_VALUE))

);

ConsultaLayout.setVerticalGroup(

ConsultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ConsultaLayout.createSequentialGroup()

.addGap(40, 40, 40)

.addComponent(ConsultaG)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(26, 26, 26)

.addGroup(ConsultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(Buscar, javax.swing.GroupLayout.PREFERRED_SIZE, 42,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(ConsultaLayout.createSequentialGroup()

.addGap(9, 9, 9)

.addComponent(txtBuscar, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGap(30, 30, 30)

.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

Page 69: Documentacion Final

TEAM UMBRELLA 68

.addContainerGap(103, Short.MAX_VALUE))

);

Comados.addTab("Consulta", new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367303711_add-

notes.png")), Consulta); // NOI18N

Reporte.setBackground(new java.awt.Color(255, 255, 255));

Reporte.setPreferredSize(new java.awt.Dimension(1075, 700));

ReporteG.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ReporteG.setText("Reporte General");

Dia.setBackground(new java.awt.Color(204, 255, 204));

Dia.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Dia.setForeground(new java.awt.Color(0, 102, 102));

Dia.setText("Por Día");

Semana.setBackground(new java.awt.Color(204, 255, 204));

Semana.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Semana.setForeground(new java.awt.Color(0, 102, 102));

Semana.setText("Por Semana");

Mes.setBackground(new java.awt.Color(204, 255, 204));

Mes.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Mes.setForeground(new java.awt.Color(0, 102, 102));

Mes.setText("Por mes");

jPanel3.setBackground(new java.awt.Color(255, 255, 255));

jPanel3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

Page 70: Documentacion Final

TEAM UMBRELLA 69

jScrollPane3.setBackground(new java.awt.Color(255, 255, 255));

tbReporte.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbReporte.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

Page 71: Documentacion Final

TEAM UMBRELLA 70

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null},

{null, null, null, null, null}

},

new String [] {

"ID del Producto", "Nombre del Producto", "Cantidad Vendida", "Ganancia", "Almacen"

}

) {

Class[] types = new Class [] {

java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.Byte.class,

java.lang.Byte.class

};

boolean[] canEdit = new boolean [] {

false, false, false, false, false

};

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane3.setViewportView(tbReporte);

Page 72: Documentacion Final

TEAM UMBRELLA 71

javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);

jPanel3.setLayout(jPanel3Layout);

jPanel3Layout.setHorizontalGroup(

jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 807,

Short.MAX_VALUE)

);

jPanel3Layout.setVerticalGroup(

jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 363,

Short.MAX_VALUE)

);

javax.swing.GroupLayout ReporteLayout = new javax.swing.GroupLayout(Reporte);

Reporte.setLayout(ReporteLayout);

ReporteLayout.setHorizontalGroup(

ReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jSeparator3)

.addGroup(ReporteLayout.createSequentialGroup()

.addGroup(ReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ReporteLayout.createSequentialGroup()

.addContainerGap()

.addComponent(ReporteG))

.addGroup(ReporteLayout.createSequentialGroup()

.addGap(118, 118, 118)

.addComponent(Dia)

.addGap(139, 139, 139)

.addComponent(Semana)

Page 73: Documentacion Final

TEAM UMBRELLA 72

.addGap(155, 155, 155)

.addComponent(Mes))

.addGroup(ReporteLayout.createSequentialGroup()

.addGap(63, 63, 63)

.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(205, Short.MAX_VALUE))

);

ReporteLayout.setVerticalGroup(

ReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ReporteLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(ReporteG)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(13, 13, 13)

.addGroup(ReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(Dia)

.addComponent(Semana)

.addComponent(Mes))

.addGap(28, 28, 28)

.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(133, Short.MAX_VALUE))

);

Comados.addTab("Reporte", new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367303790_todo_list_add.p

ng")), Reporte); // NOI18N

Page 74: Documentacion Final

TEAM UMBRELLA 73

Proveedor.setBackground(new java.awt.Color(255, 255, 255));

ProveedorG.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ProveedorG.setText("Proveedor General");

jPanel4.setBackground(new java.awt.Color(255, 255, 255));

jPanel4.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

jScrollPane4.setBackground(new java.awt.Color(255, 255, 255));

tbProveedor.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbProveedor.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

Page 75: Documentacion Final

TEAM UMBRELLA 74

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

},

new String [] {

"Nombre del Proveedor", "Dirección", "Num. Telefonico", "Tipo de Servicio"

}

) {

Class[] types = new Class [] {

java.lang.String.class, java.lang.String.class, java.lang.Byte.class, java.lang.String.class

};

boolean[] canEdit = new boolean [] {

false, false, false, false

};

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

Page 76: Documentacion Final

TEAM UMBRELLA 75

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane4.setViewportView(tbProveedor);

javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);

jPanel4.setLayout(jPanel4Layout);

jPanel4Layout.setHorizontalGroup(

jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 862,

Short.MAX_VALUE)

);

jPanel4Layout.setVerticalGroup(

jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 366,

Short.MAX_VALUE)

);

javax.swing.GroupLayout ProveedorLayout = new javax.swing.GroupLayout(Proveedor);

Proveedor.setLayout(ProveedorLayout);

ProveedorLayout.setHorizontalGroup(

ProveedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jSeparator4)

.addGroup(ProveedorLayout.createSequentialGroup()

.addGroup(ProveedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ProveedorLayout.createSequentialGroup()

Page 77: Documentacion Final

TEAM UMBRELLA 76

.addContainerGap()

.addComponent(ProveedorG))

.addGroup(ProveedorLayout.createSequentialGroup()

.addGap(59, 59, 59)

.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(154, Short.MAX_VALUE))

);

ProveedorLayout.setVerticalGroup(

ProveedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ProveedorLayout.createSequentialGroup()

.addGap(38, 38, 38)

.addComponent(ProveedorG)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator4, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(42, 42, 42)

.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(157, Short.MAX_VALUE))

);

Comados.addTab("Proveedor", new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367303797_network_add.pn

g")), Proveedor); // NOI18N

Modificar.setBackground(new java.awt.Color(255, 255, 255));

ModificarDatos.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ModificarDatos.setText("Modificación de Datos");

Page 78: Documentacion Final

TEAM UMBRELLA 77

jPanel5.setBackground(new java.awt.Color(255, 255, 255));

jPanel5.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

PestañaModif.setBackground(new java.awt.Color(255, 255, 255));

PestañaModif.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

producto.setBackground(new java.awt.Color(255, 255, 255));

jPanel6.setBackground(new java.awt.Color(255, 255, 255));

jPanel6.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153,

153)));

jScrollPane5.setBackground(new java.awt.Color(255, 255, 255));

tbProducto.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbProducto.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

Page 79: Documentacion Final

TEAM UMBRELLA 78

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

},

new String [] {

"ID", "Nombre", "Cantidad", "Precio"

}

) {

Class[] types = new Class [] {

java.lang.String.class, java.lang.String.class, java.lang.Byte.class, java.lang.Float.class

};

boolean[] canEdit = new boolean [] {

false, false, true, true

};

Page 80: Documentacion Final

TEAM UMBRELLA 79

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane5.setViewportView(tbProducto);

javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);

jPanel6.setLayout(jPanel6Layout);

jPanel6Layout.setHorizontalGroup(

jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane5, javax.swing.GroupLayout.DEFAULT_SIZE, 553,

Short.MAX_VALUE)

);

jPanel6Layout.setVerticalGroup(

jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane5, javax.swing.GroupLayout.DEFAULT_SIZE, 348,

Short.MAX_VALUE)

);

AltaPro.setBackground(new java.awt.Color(204, 255, 204));

AltaPro.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

AltaPro.setForeground(new java.awt.Color(0, 102, 102));

AltaPro.setText("Alta");

BajaPro.setBackground(new java.awt.Color(204, 255, 204));

Page 81: Documentacion Final

TEAM UMBRELLA 80

BajaPro.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

BajaPro.setForeground(new java.awt.Color(0, 102, 102));

BajaPro.setText("Baja");

ModifPro.setBackground(new java.awt.Color(204, 255, 204));

ModifPro.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ModifPro.setForeground(new java.awt.Color(0, 102, 102));

ModifPro.setText("Modificar");

javax.swing.GroupLayout productoLayout = new javax.swing.GroupLayout(producto);

producto.setLayout(productoLayout);

productoLayout.setHorizontalGroup(

productoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(productoLayout.createSequentialGroup()

.addGap(27, 27, 27)

.addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(40, 40, 40)

.addGroup(productoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(AltaPro)

.addComponent(BajaPro)

.addComponent(ModifPro))

.addContainerGap(144, Short.MAX_VALUE))

);

productoLayout.setVerticalGroup(

productoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(productoLayout.createSequentialGroup()

.addGroup(productoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 82: Documentacion Final

TEAM UMBRELLA 81

.addGroup(productoLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(productoLayout.createSequentialGroup()

.addGap(114, 114, 114)

.addComponent(AltaPro)

.addGap(41, 41, 41)

.addComponent(BajaPro)

.addGap(42, 42, 42)

.addComponent(ModifPro)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PestañaModif.addTab("Producto", producto);

Farmaco.setBackground(new java.awt.Color(255, 255, 255));

jPanel8.setBackground(new java.awt.Color(255, 255, 255));

jPanel8.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(102, 102,

102)));

jScrollPane6.setBackground(new java.awt.Color(255, 255, 255));

tbFarmaco.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbFarmaco.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

Page 83: Documentacion Final

TEAM UMBRELLA 82

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

},

new String [] {

Page 84: Documentacion Final

TEAM UMBRELLA 83

"ID", "Nombre", "Cantidad", "Precio"

}

) {

boolean[] canEdit = new boolean [] {

false, false, false, false

};

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane6.setViewportView(tbFarmaco);

javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);

jPanel8.setLayout(jPanel8Layout);

jPanel8Layout.setHorizontalGroup(

jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane6, javax.swing.GroupLayout.DEFAULT_SIZE, 553,

Short.MAX_VALUE)

);

jPanel8Layout.setVerticalGroup(

jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane6, javax.swing.GroupLayout.DEFAULT_SIZE, 348,

Short.MAX_VALUE)

);

AltaFar.setBackground(new java.awt.Color(204, 255, 204));

AltaFar.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

AltaFar.setForeground(new java.awt.Color(0, 102, 102));

AltaFar.setText("Alta");

Page 85: Documentacion Final

TEAM UMBRELLA 84

BajaFarm.setBackground(new java.awt.Color(204, 255, 204));

BajaFarm.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

BajaFarm.setForeground(new java.awt.Color(0, 102, 102));

BajaFarm.setText("Baja");

ModifFarm.setBackground(new java.awt.Color(204, 255, 204));

ModifFarm.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ModifFarm.setForeground(new java.awt.Color(0, 102, 102));

ModifFarm.setText("Modificar");

javax.swing.GroupLayout FarmacoLayout = new javax.swing.GroupLayout(Farmaco);

Farmaco.setLayout(FarmacoLayout);

FarmacoLayout.setHorizontalGroup(

FarmacoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(FarmacoLayout.createSequentialGroup()

.addGap(27, 27, 27)

.addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(40, 40, 40)

.addGroup(FarmacoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(AltaFar)

.addComponent(BajaFarm)

.addComponent(ModifFarm))

.addContainerGap(144, Short.MAX_VALUE))

);

FarmacoLayout.setVerticalGroup(

FarmacoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(FarmacoLayout.createSequentialGroup()

Page 86: Documentacion Final

TEAM UMBRELLA 85

.addGroup(FarmacoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(FarmacoLayout.createSequentialGroup()

.addGap(114, 114, 114)

.addComponent(AltaFar)

.addGap(41, 41, 41)

.addComponent(BajaFarm)

.addGap(42, 42, 42)

.addComponent(ModifFarm))

.addGroup(FarmacoLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PestañaModif.addTab("Farmaco", Farmaco);

Empleados.setBackground(new java.awt.Color(255, 255, 255));

jPanel7.setBackground(new java.awt.Color(255, 255, 255));

jPanel7.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

jScrollPane7.setBackground(new java.awt.Color(255, 255, 255));

tbEmpleado.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

tbEmpleado.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

{null, null, null, null},

Page 87: Documentacion Final

TEAM UMBRELLA 86

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

},

Page 88: Documentacion Final

TEAM UMBRELLA 87

new String [] {

"Matricula", "Nombre", "Apellido", "Cargo"

}

) {

boolean[] canEdit = new boolean [] {

false, false, true, false

};

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane7.setViewportView(tbEmpleado);

javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);

jPanel7.setLayout(jPanel7Layout);

jPanel7Layout.setHorizontalGroup(

jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane7, javax.swing.GroupLayout.DEFAULT_SIZE, 553,

Short.MAX_VALUE)

);

jPanel7Layout.setVerticalGroup(

jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane7, javax.swing.GroupLayout.DEFAULT_SIZE, 348,

Short.MAX_VALUE)

);

AltaEmple.setBackground(new java.awt.Color(204, 255, 204));

AltaEmple.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

AltaEmple.setForeground(new java.awt.Color(0, 102, 102));

Page 89: Documentacion Final

TEAM UMBRELLA 88

AltaEmple.setText("Alta");

BajaEmple.setBackground(new java.awt.Color(204, 255, 204));

BajaEmple.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

BajaEmple.setForeground(new java.awt.Color(0, 102, 102));

BajaEmple.setText("Baja");

ModifEmple.setBackground(new java.awt.Color(204, 255, 204));

ModifEmple.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

ModifEmple.setForeground(new java.awt.Color(0, 102, 102));

ModifEmple.setText("Modificar");

javax.swing.GroupLayout EmpleadosLayout = new javax.swing.GroupLayout(Empleados);

Empleados.setLayout(EmpleadosLayout);

EmpleadosLayout.setHorizontalGroup(

EmpleadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(EmpleadosLayout.createSequentialGroup()

.addGap(27, 27, 27)

.addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(40, 40, 40)

.addGroup(EmpleadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(BajaEmple)

.addComponent(AltaEmple)

.addComponent(ModifEmple))

.addContainerGap(144, Short.MAX_VALUE))

);

EmpleadosLayout.setVerticalGroup(

EmpleadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 90: Documentacion Final

TEAM UMBRELLA 89

.addGroup(EmpleadosLayout.createSequentialGroup()

.addGroup(EmpleadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(EmpleadosLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(EmpleadosLayout.createSequentialGroup()

.addGap(114, 114, 114)

.addComponent(AltaEmple)

.addGap(41, 41, 41)

.addComponent(BajaEmple)

.addGap(42, 42, 42)

.addComponent(ModifEmple)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PestañaModif.addTab("Empleados", Empleados);

Provee.setBackground(new java.awt.Color(255, 255, 255));

jPanel9.setBackground(new java.awt.Color(255, 255, 255));

jPanel9.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(102, 102,

102)));

jScrollPane8.setBackground(new java.awt.Color(255, 255, 255));

tbProvee.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null, null, null},

Page 91: Documentacion Final

TEAM UMBRELLA 90

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null},

{null, null, null, null}

Page 92: Documentacion Final

TEAM UMBRELLA 91

},

new String [] {

"Nombre", "Tipo de Servicio", "Dirección", "Num. Telefono"

}

) {

boolean[] canEdit = new boolean [] {

false, false, false, false

};

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

jScrollPane8.setViewportView(tbProvee);

javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);

jPanel9.setLayout(jPanel9Layout);

jPanel9Layout.setHorizontalGroup(

jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane8, javax.swing.GroupLayout.DEFAULT_SIZE, 553,

Short.MAX_VALUE)

);

jPanel9Layout.setVerticalGroup(

jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane8, javax.swing.GroupLayout.DEFAULT_SIZE, 348,

Short.MAX_VALUE)

);

AltaModif.setBackground(new java.awt.Color(204, 255, 204));

AltaModif.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Page 93: Documentacion Final

TEAM UMBRELLA 92

AltaModif.setForeground(new java.awt.Color(0, 102, 102));

AltaModif.setText("Alta");

BajaModif.setBackground(new java.awt.Color(204, 255, 204));

BajaModif.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

BajaModif.setForeground(new java.awt.Color(0, 102, 102));

BajaModif.setText("Baja");

Modifprovee.setBackground(new java.awt.Color(204, 255, 204));

Modifprovee.setFont(new java.awt.Font("Constantia", 0, 18)); // NOI18N

Modifprovee.setForeground(new java.awt.Color(0, 102, 102));

Modifprovee.setText("Modificar");

javax.swing.GroupLayout ProveeLayout = new javax.swing.GroupLayout(Provee);

Provee.setLayout(ProveeLayout);

ProveeLayout.setHorizontalGroup(

ProveeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ProveeLayout.createSequentialGroup()

.addGap(27, 27, 27)

.addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(40, 40, 40)

.addGroup(ProveeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(AltaModif)

.addComponent(BajaModif)

.addComponent(Modifprovee))

.addContainerGap(144, Short.MAX_VALUE))

);

ProveeLayout.setVerticalGroup(

Page 94: Documentacion Final

TEAM UMBRELLA 93

ProveeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ProveeLayout.createSequentialGroup()

.addGroup(ProveeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ProveeLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(ProveeLayout.createSequentialGroup()

.addGap(114, 114, 114)

.addComponent(AltaModif)

.addGap(41, 41, 41)

.addComponent(BajaModif)

.addGap(42, 42, 42)

.addComponent(Modifprovee)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PestañaModif.addTab("Proveedor", Provee);

javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);

jPanel5.setLayout(jPanel5Layout);

jPanel5Layout.setHorizontalGroup(

jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(PestañaModif)

);

jPanel5Layout.setVerticalGroup(

jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(PestañaModif)

);

Page 95: Documentacion Final

TEAM UMBRELLA 94

javax.swing.GroupLayout ModificarLayout = new javax.swing.GroupLayout(Modificar);

Modificar.setLayout(ModificarLayout);

ModificarLayout.setHorizontalGroup(

ModificarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jSeparator5)

.addGroup(ModificarLayout.createSequentialGroup()

.addGroup(ModificarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ModificarLayout.createSequentialGroup()

.addContainerGap()

.addComponent(ModificarDatos))

.addGroup(ModificarLayout.createSequentialGroup()

.addGap(59, 59, 59)

.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(136, Short.MAX_VALUE))

);

ModificarLayout.setVerticalGroup(

ModificarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(ModificarLayout.createSequentialGroup()

.addGap(35, 35, 35)

.addComponent(ModificarDatos)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator5, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(37, 37, 37)

.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(103, Short.MAX_VALUE))

Page 96: Documentacion Final

TEAM UMBRELLA 95

);

Comados.addTab("Modificar", new

javax.swing.ImageIcon(getClass().getResource("/ImagenesFarmacia/1367303844_cog_add.png")),

Modificar); // NOI18N

jComboBox1.setFont(new java.awt.Font("Constantia", 0, 14)); // NOI18N

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] {

"Administrador", "Perfil", "Salir" }));

jTextField1.setEditable(false);

javax.swing.GroupLayout PestañasLayout = new javax.swing.GroupLayout(Pestañas);

Pestañas.setLayout(PestañasLayout);

PestañasLayout.setHorizontalGroup(

PestañasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(Comados, javax.swing.GroupLayout.PREFERRED_SIZE, 1082,

Short.MAX_VALUE)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

PestañasLayout.createSequentialGroup()

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 42,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(29, 29, 29)

.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(28, 28, 28))

);

PestañasLayout.setVerticalGroup(

PestañasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

PestañasLayout.createSequentialGroup()

Page 97: Documentacion Final

TEAM UMBRELLA 96

.addGroup(PestañasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,

false)

.addGroup(PestañasLayout.createSequentialGroup()

.addContainerGap()

.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addComponent(jTextField1))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(Comados, javax.swing.GroupLayout.PREFERRED_SIZE, 690,

javax.swing.GroupLayout.PREFERRED_SIZE))

);

javax.swing.GroupLayout FondoLayout = new javax.swing.GroupLayout(Fondo);

Fondo.setLayout(FondoLayout);

FondoLayout.setHorizontalGroup(

FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(Pestañas, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

);

FondoLayout.setVerticalGroup(

FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

FondoLayout.createSequentialGroup()

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(Pestañas, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(127, 127, 127))

);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

Page 98: Documentacion Final

TEAM UMBRELLA 97

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(Fondo, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(0, 46, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(Fondo, javax.swing.GroupLayout.PREFERRED_SIZE, 740,

Short.MAX_VALUE)

.addGap(134, 134, 134))

);

pack();

}// </editor-fold>

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

try {

for (javax.swing.UIManager.LookAndFeelInfo info :

javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

Page 99: Documentacion Final

TEAM UMBRELLA 98

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(Ventanas.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(Ventanas.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(Ventanas.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(Ventanas.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

}

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new Ventanas().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton AltaEmple;

private javax.swing.JButton AltaFar;

Page 100: Documentacion Final

TEAM UMBRELLA 99

private javax.swing.JButton AltaModif;

private javax.swing.JButton AltaPro;

private javax.swing.JButton BajaEmple;

private javax.swing.JButton BajaFarm;

private javax.swing.JButton BajaModif;

private javax.swing.JButton BajaPro;

private javax.swing.JButton Buscar;

private javax.swing.JButton CancelarV;

private javax.swing.JLabel Codigo;

private javax.swing.JTabbedPane Comados;

private javax.swing.JPanel Consulta;

private javax.swing.JLabel ConsultaG;

private javax.swing.JButton Credito;

private javax.swing.JButton Debito;

private javax.swing.JButton Dia;

private javax.swing.JButton Efectivo;

private javax.swing.JPanel Empleados;

private javax.swing.JPanel Farmaco;

private javax.swing.JPanel Fondo;

private javax.swing.JButton Mes;

private javax.swing.JButton ModifEmple;

private javax.swing.JButton ModifFarm;

private javax.swing.JButton ModifPro;

private javax.swing.JPanel Modificar;

private javax.swing.JLabel ModificarDatos;

private javax.swing.JButton Modifprovee;

private javax.swing.JLabel Pago;

private javax.swing.JTabbedPane PestañaModif;

private javax.swing.JPanel Pestañas;

Page 101: Documentacion Final

TEAM UMBRELLA 100

private javax.swing.JPanel Provee;

private javax.swing.JPanel Proveedor;

private javax.swing.JLabel ProveedorG;

private javax.swing.JLabel PublicoG;

private javax.swing.JPanel Reporte;

private javax.swing.JLabel ReporteG;

private javax.swing.JButton Semana;

private javax.swing.JLabel Total;

private javax.swing.JPanel Ventas;

private javax.swing.JComboBox jComboBox1;

private javax.swing.JPanel jPanel1;

private javax.swing.JPanel jPanel2;

private javax.swing.JPanel jPanel3;

private javax.swing.JPanel jPanel4;

private javax.swing.JPanel jPanel5;

private javax.swing.JPanel jPanel6;

private javax.swing.JPanel jPanel7;

private javax.swing.JPanel jPanel8;

private javax.swing.JPanel jPanel9;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JScrollPane jScrollPane2;

private javax.swing.JScrollPane jScrollPane3;

private javax.swing.JScrollPane jScrollPane4;

private javax.swing.JScrollPane jScrollPane5;

private javax.swing.JScrollPane jScrollPane6;

private javax.swing.JScrollPane jScrollPane7;

private javax.swing.JScrollPane jScrollPane8;

private javax.swing.JSeparator jSeparator1;

private javax.swing.JSeparator jSeparator2;

Page 102: Documentacion Final

TEAM UMBRELLA 101

private javax.swing.JSeparator jSeparator3;

private javax.swing.JSeparator jSeparator4;

private javax.swing.JSeparator jSeparator5;

private javax.swing.JTextField jTextField1;

private javax.swing.JPanel producto;

private javax.swing.JTable tbConsulta;

private javax.swing.JTable tbEmpleado;

private javax.swing.JTable tbFarmaco;

private javax.swing.JTable tbProducto;

private javax.swing.JTable tbProvee;

private javax.swing.JTable tbProveedor;

private javax.swing.JTable tbReporte;

private javax.swing.JTable tbVenta;

private javax.swing.JTextField txtBuscar;

private javax.swing.JTextField txtCodigo;

private javax.swing.JTextField txtTotal;

// End of variables declaration

}

Page 103: Documentacion Final

TEAM UMBRELLA 102

9 Prueba del sistema Se procedió a realizar una simulación de las funcionalidades del sistema desarrollado, cabe

destacar que los resultados de dicha prueba son ficticios, puesto que el mismo aún no ha sido

concluido.

9.1 Matriz de tipos de pruebas

ID de

prueb

a Tipo Caso a probar

Requerimientos

Descripción amplia del

caso a probar

Resultados esperados

Resultados

obtenidos

Estatus de

la prueb

a

Propietario del

caso de prueba

Observaciones o

Comentarios

111 Funcional Ejecución del software

S.O Windows 7

Se testeara el software en un S.O para probar su rendimiento y consumo de recursos.

El software debe de ejecutarse de forma normal en el sistema, sin consumo excesivo de recursos

El software ejecuto y funciono de una manera normal, el consumo de recursos es mínimo

OK Tester

El consumo de recursos por parte del programa, depende del sistema operativo que se esté usando

112 Aceptación Muestro del software al cliente

Testeo del software por parte del cliente

Se mostrara el software terminado al cliente y este procederá a probarlo, para así verificar que el software cumpla con lo que el contrato establece

El software deberá satisfacer al usuario y cumplir con las funcionalidades que se solicitaron

El cliente ha mostrado satisfacción con el software y ha declarado que este cumple con sus expectativas

OK Cliente

El cliente ha solicitado un "Plus" para el software, la petición es básica así que se puede otorgar

113 Integridad de datos

Testeo de la base de datos

Conectividad con la base de datos

Se procederá a verificar la manera en que la base de datos almacena los datos que recibe

La base de datos tendrá control total de la información que maneja, y la almacenara de forma correcta

La base de datos maneja de manera normal y segura los datos que le son otorgados

OK Tester

La Convergencia de la base de datos depende directamente del tipo de conexión que se maneja

114 Interfaz de

usuario Testeo de calidad intuitiva

Interfaz terminada

Se procederá a verificar si la interfaz del software es de un fácil manejo

La interfaz de usuario será limpia e intuitiva

La interfaz de usuario demostró ser limpia e intuitiva

OK Tester

La interfaz ha pesar de ser de fácil manejo he intuitiva, deja algunos espacios libres que pueden ser usados a futuro

Page 104: Documentacion Final

TEAM UMBRELLA 103

115 Seguridad y control de

acceso

Testeo del sistema de privilegios(usuario, Administrador)

Conectividad con la base de datos

Se procederá a buscar que el software y la base de datos, otorga los privilegios correctamente a cada usuario

El sistema controla bien los privilegios, un usuario normal no tiene privilegios administrativos

El sistema tiene en regla su control sobre los privilegios que tiene cada usuario

OK Tester

Por motivos de seguridad, solo se permite un Administrador

116 Recuperación y falla

Testeo de desconexión y cierre inesperado del software

Software concluido

Se procederá a probar la capacidad del programa ante un fallo del sistema (S.O), y la capacidad que tiene este de recuperar los datos con los que trabajaba.

El sistema es capaz de recuperar la última información con la que estaba trabajando

El sistema fue incapaz de recuperar la información con la que trabajaba, esto es por un factor externo (fallo del S.O)

FALLO Tester

El software demostró no tener la capacidad de recuperar su información, después de un análisis se determinó que la capacidad de recuperación, depende del S.O que se esté usando

10 Puesta en Marcha del Proyecto

10.1 Instalación del proyecto Esta sección queda en fase Alpha, ya que no pertenece a la materia en sí, y el software no ha sido

concluido.

11 Documentación La documentación que se muestra a continuación, está basada en la teoría en la que el software

está finalizado, si bien los documentos referidos al software están completos, servirán como guía

para el diseño de los manuales.

11.1 Técnica operativa La técnica que se empleó para la elaboración de este proyecto fue la de Factibilidad de Fecha, ya

que el proyecto que se necesita está limitado por una fecha, cabe destacar que por la inexperiencia

laboral de los miembros del equipo, se incurrió en capacitarlos y esto tomo tiempo, pero todo estaba

dentro del plan de desarrollo de la documentación, pues gracias a la factibilidad de fecha, se fijaron

periodos en los cuales deberían de estar terminados los documentos, es imprescindible decir que la

documentación está concluida en un 90% y el software desarrollado solo está avanzado en un 15%.

Page 105: Documentacion Final

TEAM UMBRELLA 104

11.2 Manual técnico La siguiente información que se muestra está basada en la emulación del software funcionando, si

bien el software que se planea desarrollar destaca por su facilidad de manejo, es muy importante

dar referencia de las tecnologías que se usaran en él.

Paradigma de programación usada y sus beneficios:

Se decidió emplear el lenguaje de programación JAVA, ya que es un lenguaje fuertemente tipiado,

y destaca por ser orientado a objetos, esto constituye una fortaleza para el desarrollo del software

en este proyecto, ya que se ahorró tiempo al poder dividir el programa por módulos y luego irlos

acoplando, de esta manera, se aseguró el éxito en la funcionalidad del software y una gran

capacidad de actualización o anexión de nuevas funcionalidades

11.3 Manual de usuario El propósito de este Manual es facilitar al usuario la operación de las diferentes Pantallas de captura y consulta de la información que se administra en el Sistema Informático de Contraloría Social.

1) Implementación del sistema:

a) Requerimientos de hardware: Contar con:

Computadora cliente (Sera la computadora cliente)

Computadora servidor (contiene la base de datos)

Conexión intranet

b) Requerimientos de software

Contar con:

Sistema operativo Windows o Linux

2) Ingresando al sistema Importante: Se aclara al usuario que el software se maneja por un sistema de logins con un determinado nivel de privilegios, el único usuario que puede tener acceso a la totalidad del sistema es el Administrador, y el software está configurado para poseer solo un Administrador, por lo que no se puede dar de alta a otro usuario de tipo administrador.

Page 106: Documentacion Final

TEAM UMBRELLA 105

Se procede a ejecutar el software y este mostrara la siguiente ventana.

Como se puede apreciar, la ventana muestra 2 campos, en el campo de usuario se ingresara la Matricula que le fue asignada por el administrador, en el campo contraseña, ingresara la contraseña que de igual manera le fue otorgada por el administrador, cuando haya ingresado los datos en sus respectivos campos, dará clic en el botón entrar. Importante: Si después de insertan iniciar sesión le aparece un mensaje de error de conexión, es posible que el servidor al que se conecta el software no esté trabajando, en ese caso se le pide le comunique al administrador sobre el problema.

3) Funcionalidad General La interface del software se compone de 5 módulos, el módulo de bienvenida por defecto es el de ventas, en la muestra de funcionamiento de los módulos, se ha iniciado sesión como administrador para así, tener acceso a todas las funcionalidades el software.

Page 107: Documentacion Final

TEAM UMBRELLA 106

Módulo de ventas

Como se puede observar, este módulo está constituido por 4 botones, y 3 frames de información, el funcionamiento de estos serán explicados a continuación:

En el recuadro blanco, ingresara el código del producto que desea buscar de forma instantánea, una vez escrito presiona la tecla enter, si el producto se encuentra lo mostrara en el

frame de abajo, si no es así le aparecerá un mensaje con el siguiente mensaje “El producto no está registrado”

Como se puede apreciar, al dar enter en la búsqueda rápida, o bien el software al detectar el código de barras del producto, muestra la información en la pantalla.

En este frame se muestra el total que se cobrara al cliente.

Al hacer clic en este botón, se cancela la venta.

Page 108: Documentacion Final

TEAM UMBRELLA 107

A continuación se describen los botones de formas de pago: Botón que controla la máquina de verificación de crédito. Botón que controla la máquina de verificación de debito Botón que controla la caja registradora

Módulo de Consulta El uso de módulo de consulta se emplea solo cuando se desea obtener la información de algún producto, pero que no será vendido.

Para buscar introduzca el ID del producto y luego haga clic en la lupa o bien presione la tecla enter.

Es importante destacar que en la sección “cantidad”, muestra cuantos productos hay disponibles en el inventario

Estos son los resultados que mostrara al realizar la búsqueda

Page 109: Documentacion Final

TEAM UMBRELLA 108

Módulo de Reporte En este módulo se realizan los reportes de ventas, consta de 3 botones y un frame de información.

Dependiendo del tipo de reporte que se desea generar se seleccionara el botón correspondiente.

Botón que genera y muestra un reporte de las ventas del día

Botón que genera y muestra un reporte de las ventas de la semana

Botón que genera y muestra un reporte de las ventas del mes

Al hacer clic en alguno de los 3 botones aparecerá información del reporte generado como se muestra a continuación:

Page 110: Documentacion Final

TEAM UMBRELLA 109

Módulo de Proveedor La función de este módulo es solo de otorgar la información de los proveedores que se tienen registrados en el sistema, con solo seleccionar el modulo, la información es mostrada en el frame.

Modulo modificar Este módulo solo está disponible para el usuario “Administrador”, dado que la funcionalidad de este módulo es solo dar de alta, baja y modificar datos en la base de datos, se aplican los mismos criterios para todas las opciones de modificación, altas y bajas. Se procede a explicar las pestañas del módulo Proveedor

Pestaña que muestra la información de los proveedores registrados en el sistema Pestaña que muestra la información de los empleados registrados en el sistema

Pestaña que muestra la información de los fármacos registrados en el sistema Pestaña que muestra la información de los productos registrados en el sistema

Page 111: Documentacion Final

TEAM UMBRELLA 110

Se procede a mostrar la interface del módulo Modificar

Como se podrá apreciar, el modulo contiene 3 botones (Alta, Baja y Modificación), estos botones son de uso general, y sus funciones aplican a todas las pestañas (Producto, Fármaco, Empleados y Proveedor). Se procede a describir el funcionamiento de los botones.

Botón que da de alta (dependiendo de la pestaña seleccionada) nueva información en el sistema. Botón que da baja (dependiendo de la pestaña seleccionada) la información que se encuentra en el sistema.

Botón que modifica (dependiendo de la pestaña seleccionada) la información que se encuentra en el sistema.

Para dar de alta, modificar o dar de baja un dato del sistema, solo seleccione la pestaña en la que desea modificar la información, seleccione el botón deseado, le aparecerá una ventana solicitando datos y confirmación, al ingresar la información solicitada solo quedara cliquear en aceptar o pulse enter y la información se actualizara en el sistema.

Page 112: Documentacion Final

TEAM UMBRELLA 111

11.4 Observaciones

Durante el desarrollo de la documentación, se fueron encontrando nuevas necesidades y

modificaciones, es por ello que el software se diseñó con una estructura que le permita añadirle

nuevas funcionalidades y modificar las que este ya posee, al igual que en alguna situación de

actualización, se le podrían quitar funciones que se denominaran ya “obsoletas” sin que esto genere

problemas en el funcionamiento del mismo.

Igualmente, se descubrió que la estabilidad y rendimiento del software, está determinado por el

sistema operativo en el cual se esté ejecutando, por lo que cualquier fallo del sistema operativo,

podría afectar la funcionalidad y rendimiento del software, cabe destacar que esto no es crítico, ya

que el software tiene la capacidad de recuperarse ante estos fallos, pero si es posible que note una

baja de velocidad del sistema durante el primer arranque del software después de un fallo crítico,

esto se debe, a que el software buscara e intentara restaurar la última tarea con la que se estaba

trabajando en él.

11.5 Recomendaciones

Se recomienda al usuario que el equipo en el que se vaya a usar el software, sea un equipo

dedicado, esto quiere decir, que solo sea usado por el software, se debe de evitar también que el

equipo que maneje la base de datos del software sea de uso compartido, esto es por motivos de

seguridad y estabilidad.

También se recomienda que cada 15 días como mínimo se realice una copia de seguridad de la

base de datos del software, pues en caso de falla del servidor y que sus datos se tornen

irrecuperables, podrá continuar trabajando con la copia de seguridad de la base de datos.

Es importante que se capacite de manera básica en el manejo del a los usuarios, no por que este

sea complejo, si no para que de una manera rápida saquen el máximo provecho y experimenten

las grandes ventajas que el software otorga.

12 Conclusión

A lo largo de la creación de esta documentación, se pudo obtener un nuevo aprendizaje, de una

manera nueva, se tocaron temas que tal vez no eran de la materia en sí, pero es de agradecer, pues

ya se tienen los fundamentos necesarios para seguir adelante con el proyecto, la documentación

que aquí se muestra producto del aprendizaje obtenido, tanto del profesor como de los libros,

conforme se iba desarrollando la documentación, surgían dudas y curiosidades acerca de cómo se

gestionaba la misma, aunque se conoce que en la práctica, no se aplican dl todo los métodos de

documentación, se ha obtenido una gran base para mejorarla y entregar trabajos con mejor calidad.

Page 113: Documentacion Final

TEAM UMBRELLA 112

13 Anexos

13.1 Cuestionario

Se procede a mostrar el cuestionario que le fue aplicado a nuestro cliente, para conocer sus

necesidades y en base a ello diseñar el software.

¿Quién está detrás de la solicitud de trabajo?

R = Dra. A. Susana Pérez López

¿Quién usara la solicitud?

R = Dra. A. Susana Pérez

¿Cuál será el beneficio económico de una solicitud exitosa?

R = Obtener mayores ingresos mediante la oferta de fármacos

¿Qué problemas resolverá esta solución?

R = Control de fármacos, agenda paciente, control proveedor.

¿Puede mostrar lo describir el ambiente de negocios en el que se usaría la descripción?

R = Optimización en los procesos de ventas, control de ingresos y egresos.

¿Hay aspectos especiales del desempeño o restricciones que afecten el modo en el que se

enfoque la solución?

R = Las consultas pueden variar de horarios

¿Qué funciones desea que realizar el software?

R = Consulta inventario, empleados, paciente

¿Va a redistribuir el software?

R = No

¿Puede dar otra persona información adicional?

R = No

¿Debería preguntar yo algo más?

R = Funcionalidad

Page 114: Documentacion Final

TEAM UMBRELLA 113

13.2 Análisis del cuestionario

Basados en el cuestionario que contesto nuestro cliente, se procedió a realizar un análisis del

mismo, el resultado de este fue mostrado al cliente y aprobado por el mismo.

Control de Versiones

Versión: 0.1 Aprobada por: NTM

Hecha por: EU Fecha: 08-03-13

Revisada por: NTM Motivo: Versión Alpha

Documentación de Requisitos

Nombre del Proyecto: Gestión de Farmacia Siglas: Apa

Necesidad el negocio u oportunidad a aprovechar: describir las limitaciones de la situación actual

y las razones por las cuales se emprender el proyecto.

Control de fármacos, paciente, control proveedor. La única limitación registrada es: Las consultas pueden variar de horarios. Las razones por las que se emprende el proyecto son para tener un mayor control sobre el

gestionamiento de la farmacia del cliente.

Objetivos del negocio y del proyecto: definir con claridad los objetivos del negocio y del proyecto

para permitir las trazabilidad de estos.

Los objetivos del negocio son: Obtener mayores ingresos mediante la oferta de fármacos. Los objetivos del proyecto son: Optimización total del gestionamiento, control sobre las

ventas, ingresos y egresos.

Page 115: Documentacion Final

TEAM UMBRELLA 114

Requisitos funcionales: Describir procesos del negocio, información con el producto, etc.

Stakeholder

Prioridad otorgada por el Stakeholder

Nicolás Torres Martínez

Muy alta R1 Se dará asesoría del manejo sobre del software.

Alta R2 Interfaz intuitiva y simplicidad en el manejo del software.

Baja R3 Se presentara un avance del proyecto cada 15 días.

Requisitos Funcionales: Describir requisitos tales como nivel de servicio, performance, seguridad,

adecuación, etc.

Stakeholder

Prioridad otorgada por el Stakeholder

Nicolás Torres Martínez

Muy alta R4 El software tendrá un sistema de usuarios con diferentes

privilegios.

Alta R5 El software tendrá capacidad de recuperar su último estado tras

un fallo del sistema.

Baja R6 Se entregaran betas del software al cliente para testeo

de funcionalidad.

Requisitos de calidad: Describir requisitos relativos a normas o estándares de calidad, o la

satisfacción y cumplimiento de factores relevantes de calidad.

Stakeholder

Prioridad otorgada por el Stakeholder

Nicolás Torres

Martínez

Muy alta

R7

El software debe cumplir con las normas de administración.

Requisitos

Código Descripción

Código Descripción

Requerimiento

Código Descripción

Requerimiento

Page 116: Documentacion Final

TEAM UMBRELLA 115

Criterios de aceptación: Especificaciones o requisitos de rendimiento, funcionalidad, etc., que

deben cumplirse antes de aceptar el proyecto.

Conceptos Criterios de Aceptación

1. Técnicos El software deberá tener documentos de cada función. 2. De Calidad Cumplir con una normalización certificada. 3. Administrativos Cumplir con los acuerdos presentes en la propuesta, y respetar los

requerimientos del cliente. 4. Comerciales El software no se distribuirá. 5. Sociales Manejo practico del software 6. Otros Concluir el proyecto en el plazo solicitado por el cliente.

Reglas del negocio: Reglas principales que fijan los principios guías de la organización.

Cuando se registra un inventario menos del 20% se procede a pedir los productos al proveedor.

Se da prioridad a la atención de pacientes.

Impactos en otras áreas organizacionales

Se espera el aumento de la eficiencia de las áreas de ventas y consultas.

Impactos en otras entidades: Dentro o fuera de la organización ejecutante.

Al tener mejor gestionamiento sobre los inventarios se espera mayor eficiencia en los proveedores.

Impacto en otras entidades: Dentro o fuera de la organización ejecutante.

Al tener mejor gestionamiento sobre los inventarios se espera mayor eficiencia en los proveedores.

Requerimiento de soporte y entrenamiento

Se contara con un soporte técnico de 60 días después de la aprobación e implementación del software.

Se capacitara a los trabajadores para el manejo del software.

Supuesto relativos a requisitos

Capacidad para añadir funciones al software en un futuro.

Restricciones relativas a requisitos.

Las consultas pueden varias de horarios.