Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer...

81
Proyecto Fin de Carrera Página 21 de 265 Capítulo 3: Memoria de Cálculo

Transcript of Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer...

Page 1: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 21 de 265

Capítulo 3: Memoria de Cálculo

Page 2: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 22 de 265

7. Introducción Este capítulo esta destinado a la explicación de la aplicación diseñada. A modo de introducción se presenta la siguiente figura como el esquema de los pasos que se han seguido en el proyecto:

Análisis situación Inicial, estudio de los Procesos de

Gestión

Diseño BBDD en Microsoft Access

Elección de herramientas de

programación

Diseño BBDD MySQL

Diseño aplicación

Pruebas, Estudio de Mejoras,

Continuación.

Elaboración Documentación

Aplicación, Manual de Usuario

Elaboración Documentación

Final

Elaboración Documentación

de partida

Elaboración Documentación

BBDD

Ilustración 4: Esquema proceso seguido en el desarrollo del proyecto. En un primer instante se hizo un análisis de la situación de partida, cómo estaba almacenada la información, estudio de los procesos de gestión. A continuación, una vez analizado el punto de partida y el objetivo final se procede a la elaboración de un primer boceto de la base de datos final. El siguiente paso sería la elección de las herramientas de programación con las que se iba a desarrollar la aplicación, para lo cual se hizo un estudio vía Internet de las herramientas disponibles que cumplían con los requisitos planteados en el proyecto y que servirían para el diseño de la aplicación. Finalmente se comienza con el desarrollo, paralelamente se desarrolla la base de datos y la aplicación web, se hacen continuas pruebas y se elabora documentación hasta llegar al desarrollo completo de esta aplicación y elaboración de la documentación final.

Page 3: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 23 de 265

8. Estudio de los Procesos de Gestión: Para estudiar la situación de partida y vislumbrar el objetivo final de nuestro proyecto se hace un estudio de los procesos de gestión para analizar las distintas vistas y accesos que ha de tener la aplicación. Esta aplicación contempla el ciclo de vida de un proyecto de investigación, la aplicación ha de permitir introducir, ver y modificar su información almacenada en una base de datos remota. El origen de todo proyecto es la oferta, ya que es en este momento cuando se elabora toda la información que comprende el proyecto. La oferta constituye en realidad nuestro objetivo, es decir se desarrollará una aplicación web que permita al usuario dar de alta nuevas oportunidades (ofertas), e introducir toda la información relaciona con la misma. En los siguientes subapartados se muestra una breve explicación de los siguientes procesos de gestión relacionados con un proyecto.

8.1. Proceso Oferta. Una oferta puede surgir por necesidad interna de una empresa o bien por necesidad de un agente externo, el cliente. Una vez el departamento comercial de la empresa conoce esta necesidad da de alta en el sistema una nueva oportunidad de negocio, la oferta. Una vez dada de alta esta oportunidad, será el departamento comercial quien elabore la oferta en comunicación muy estrecha con el departamento técnico, hasta tal punto que es el responsable de este departamento el encargado de introducir los datos de tipo económico, planificación,.. El siguiente paso es la aceptación por el comité directivo de la empresa, este comité decide si los datos de la oferta son válidos, es importante este paso, ya que el documento oferta tiene carácter contractual. Por último, de nuevo el departamento comercial será el encargado de hacer llegar el documento oferta al cliente final, quien decidirá si acepta la propuesta. En la siguiente figura se muestra de manera esquemática todos estos pasos.

Page 4: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 24 de 265

Ilustración 5: Diagrama ciclo de vida oferta.

8.1.1 Descripción funcional de una oferta En la siguiente figura se muestra la descripción funcional de la oferta, es decir como interactúan los distintos perfiles de usuarios en el ciclo de vida del proceso oferta. Este esquema servirá de guía en el diseño de la aplicación para la generación de las distintas vistas y la concesión de permisos según el perfil del usuario.

Page 5: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 25 de 265

Ilustración 6: Diagrama funcional de una oferta. Interacción de los distintos perfiles.

8.2. Ciclo de Vida Proyecto Cuando una oferta se acepta, surge el proyecto, el ciclo de vida contempla tan solo dos estados, en curso y finalizado, el responsable de todo el ciclo de vida de un proyecto es el departamento técnico encargado de llevar dicho proyecto. Durante el ciclo de vida del proyecto conviven otros procesos de gestión relacionados con el mismo, cumplimiento de los hitos de planificación, realización de pedidos y finalmente facturación del proyecto. El análisis de estos procesos de gestión se hace simplemente para el diseño de la base de datos, ya que el alcance de nuestra aplicación web solo contempla el proceso oferta. Por este motivo su explicación pretende ser más breve.

Page 6: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 26 de 265

Ilustración 7: Ciclo de vida de un proyecto. A continuación de manera análoga que en el apartado anterior, se incluye un diagrama de la interacción de los distintos perfiles con las fases de la vida de un proyecto:

Ilustración 8: Diagrama funcional de un proyecto. Interacción de los distintos perfiles. Como se observa en el esquema, en este proceso intervienen más perfiles ya que en el desarrollo del proyecto intervienen como hemos comentado más subprocesos que a continuación de manera breve se explicarán.

Page 7: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 27 de 265

8.2.1 Hitos de Planificación Los hitos de planificación son las fases previstas para el desarrollo del proyecto, las fases del mismo sólo dependen del departamento técnico. En la siguiente figura se muestra de manera esquemática el ciclo de vida de este proceso.

Ilustración 9: Ciclo de vida de un hito de planificación.

8.2.2 Pedidos Otro de los procesos que intervienen en el ciclo de vida del proyecto son los pedidos de material relacionado con el mismo, de manera muy breve este proceso depende en su fase inicial del departamento técnico, ya que es este el encargado de lanzar los pedidos relacionados con los proyectos. En el resto de fases intervendrá activamente el departamento de compras, ya que es la labor fundamental de este departamento. En la siguiente figura se muestra un esquema del ciclo de vida de los pedidos así como de los distintos perfiles que intervienen en el mismo.

Page 8: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 28 de 265

Ilustración 10: Ciclo de vida de un pedido.

Ilustración 11: Diagrama funcional de un pedido.

Page 9: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 29 de 265

8.2.3 Facturas Otro de los procesos importantes en un proyecto es la facturación, esta depende en su inicio del departamento técnico, pues es quien debe lanzar la solicitud de petición de facturación. El desarrollo de la facturación depende del departamento de administración, encargado de esa labor. A continuación se muestra el diagrama del ciclo de este proceso.

Ilustración 12: Ciclo de vida facturación.

Page 10: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 30 de 265

8.3. Estudio de Perfiles y Usuarios

8.3.1 Agrupación de áreas A continuación de manera muy breve se exponen como se agrupan las distintas áreas que componen una empresa. A grandes rasgos tenemos cinco departamentos: Departamento técnico: Dedicado a la elaboración de la parte técnica de las ofertas y al seguimiento de los proyectos. Departamento de gestión: Encargado de las labores de calidad, recursos humanos y administración, en resumidas cuentas los procesos internos de la empresa. Departamento comercial: Encargado de la captación de nuevas oportunidades de negocio y de todas las relaciones con el cliente. Departamento de compras: Encargado de la gestión de las compras, gestión de proveedores. Departamento financiero: Encargado de las finanzas internas de la empresa.

Ilustración 13: Perfiles por áreas.

Page 11: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 31 de 265

8.3.2 Perfiles A continuación se presenta una figura de los distintos perfiles de usuario por departamento.

Ilustración 14: Perfiles por departamento.

Page 12: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 32 de 265

Estos serán los posibles perfiles de usuario que constituyen la empresa, centrándonos en los perfiles de la aplicación a desarrollar, que como ya se ha comentado anteriormente alcanza a la fase de oferta, se muestra la siguiente figura:

Ilustración 15: Perfiles que interactúan con la oferta.

Page 13: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 33 de 265

Siguiendo este esquema se generan los siguientes perfiles: Administrador: Perfil con todos los permisos, es el encargado de la gestión de la aplicación a nivel de programación, no a nivel de oferta. Dirección: Perfil encargado de revisar ofertas y dar el visto bueno para su salida al cliente. Comercial: Perfil encargado de dar de alta nuevas oportunidades y de entregar las ofertas al cliente final, así como de cambiar su estado a aceptadas/rechazadas. Responsable de Área: En cargado de introducir los datos de las ofertas que pertenecen a su área. Jefe de Proyecto: Perfil encargado a bajo nivel del desarrollo del documento oferta. Tiene acceso a la consulta de la misma. Los datos en la herramienta serán introducidos por el responsable de área.

Page 14: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 34 de 265

9. Diseño de Base de datos. El alcance del diseño de la base de datos comprende a todos los procesos de gestión de una empresa. Para el desarrollo del proyecto se ha partido de una empresa en la que se contaban con distintas bases de datos independientes entre sí, donde se almacenaba la información. Se hace un estudio previo donde se analiza la información que se necesita almacenar, de los distintos sistemas de gestión de bases de datos. En un primer instante se cuenta con la siguiente estructura de partida:

• BBDD Proyectos: Base de datos para almacenar los proyectos en curso, donde se amacena información del estado del proyecto y principales características.

• BBDD Facturas: Base de datos para almacenar las facturaciones de los distintos proyectos.

• BBDD Hojas de Tareas: Base de datos donde se almacena la información sobre las horas que cada empleado destina a cada proyecto.

El siguiente paso es la elaboración de una base de datos conjunta donde se unen todos los procesos de gestión. En un primer momento esta base se construye utilizando Microsoft Access y se comprueba que puede ser utilizada como boceto para la base de datos a diseñar en MySQL. Como se puede apreciar en la figura que se muestra a continuación la tabal origen es la de ofertas, a partir de esta surgen el resto de tablas, siendo el identificador del la tabla oferta IDOferta uno de los campos calves para el presente proyecto. Este diseño se utilizará como primer boceto de nuestra base de datos en MySQL. Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base de datos y de las relaciones que han de existir entre las distintas tablas.

Page 15: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 35 de 265

Ilustración 16: Base de datos conjunta en Access.

Page 16: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 36 de 265

10. Herramientas Utilizadas En el siguiente apartado se hace una explicación de las distintas herramientas utilizadas para la realización del proyecto.

10.1. Macromedia Dreamweaver Programa líder en la edición web es un programa que lleva ya años siendo uno de los mejor valorados dentro del campo de la programación web tanto por profesionales como por aficionados. Facilita enormemente la tarea de realizar sitios webs complejos y bien estructurados. Permite el diseño de páginas con un interfaz completamente gráfico mientras se observa simultáneamente el código generado. Incorpora numerosas herramientas para el tratamiento de tablas y otros componentes avanzados así como para la inserción de objetos no html como películas flash o javascript. A continuación se muestra un ejemplo de una vista del programa con una de las páginas programadas para este proyecto.

Ilustración 17: Ejemplo de uso de la herramienta Macromedia Dreamweaver.

Page 17: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 37 de 265

10.2. WAMP5 Wamp Server, antes conocido como WAMP, es un completo paquete al estilo ’apachefriends’ que permite instalar y configurar fácilmente en tu sistema lo último del servidor Web Apache, el lenguaje de programación PHP y el servidor de base de datos MySQL, todas las herramientas utilizadas en el proyecto. Las versiones que instala de esta aplicaciones son las siguientes: Apache 2.2.6, PHP5, MySQL database, PHPmyadmin y SQLitemanager.

Pero Wamp Server no es simplemente un paquete de programas, esta aplicación instala una interfaz residente en la barra de tareas que permite iniciar, supervisar y detener los distintos servicios. Una de las ventajas de usar Wamp Server es que la instalación modificará los archivos de configuración (*.conf) con la ruta donde finalmente se ubicará el programa. También crea un directorio denominado ’www’ que será la raíz para tus documentos. Un icono en la barra de tareas nos indicará al instante el estado de los diferentes servicios.

10.3. MySQL Administrator Herramienta que permite gestionar de forma gráfica un servidor MySQL. Esta aplicación integra administración y mantenimiento de bases de datos en una única interfaz. Con este programa se puede realizar de forma sencilla todas las acciones que antes se efectuaban introduciendo el código a mano: configuración de servidores, administración de usuarios, creación de tablas y consultas...

Page 18: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 38 de 265

Esta herramienta permite conocer al instante la salud del servidor, el uso que se le está dando, así como su rendimiento. Si éste es bajo se puede mejorar su funcionamiento recurriendo a las opciones de optimización. Esta aplicación será utilizada para las copias de seguridad y la restauración de la base de datos en distintos ordenadores. Es una herramienta muy útil que permite trabajar en varias estaciones de trabajo. A continuación se muestran distintas vista del programa con los distintos usos que se le ha dado. En primer lugar la página de acceso al servidor donde está alojada la base de datos. Como se muestra a continuación en la figura se ha de indicar el servidor, el usuario, que en este caso es root, y la password para acceder a la base de datos.

Ilustración 18: Inicio de MySQL Administrator. Otra de las vistas interesantes es la que nos muestra el catálogo de tablas que contiene la base de datos.

Page 19: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 39 de 265

Ilustración 19: Tablas contenidas en la base de datos. Una de las aplicaciones más utilizadas de esta herramienta para el presente proyecto es la generación de copias de seguridad, la salida de este backup es un archivo de unos 100KB aproximadamente.

Ilustración 20: Generación de backup. La aplicación que complementa al backup es la del restore. De manera sencilla, en apenas unos segundos se puede recuperar el sistema de bases de datos.

Page 20: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 40 de 265

Ilustración 21: Restore base de datos.

10.4. PhpMyAdmin Es una herramienta escrita en PHP con la intención de manejar la administración de MySQL a través de páginas webs, utilizando Internet. Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 50 idiomas. Se encuentra disponible bajo la licencia GPL (Licencia Publica General). Como esta herramienta corre en máquinas con Servidores Webs y Soporte de PHP y MySQL, la tecnología utilizada ha ido variando durante su desarrollo. Esta herramienta ha sido utilizada para la programación de la base de datos. A continuación se muestra una figura de las tablas creadas en el presente proyecto.

Page 21: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 41 de 265

Ilustración 22: Tablas de la base de datos, vista desde phpMyAdmin.

11. Diseño base de datos en MySQL Una vez probado el diseño de la base de datos en Microsoft Access y elegidas las herramientas de programación se procede al diseño de la base de datos en MySQL. Como se puede apreciar en la figura 22 la base de datos diseñada finalmente no exactamente una réplica del boceto inicial debido a que se pretende que la estructura sea lo más genérica y orientada a objeto posible. El alcance de la base de datos engloba todos los procesos de gestión de una empresa ya que aunque para la aplicación web que nos ocupa sólo se utilizan las tabas concernientes a oferta. A continuación se muestra un boceto de toda la base de datos diseñada, como se puede apreciar, contempla todos los sistemas de gestión. En esta figura se muestran las relaciones entre las distintas tablas. Como ya se ha comentado con anterioridad el campo más importante a destacar es el IDOferta, calve principal de la tabla oferta. Este identificador sirve de eje central para la mayoría de las consultas a la base de datos.

Page 22: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 42 de 265

Ilustración 23: Base de datos generada.

Page 23: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 43 de 265

A continuación se muestra en detalle las relaciones de la base de datos referente a ofertas que nos ocupa en el presente proyecto.

Ilustración 24: Base de datos de ofertas. Como se puede observar en la figura anterior la tabla todas las tablas están relacionadas con la tabla oferta, la cual será el origen del resto de tablas. A continuación se muestra una figura en la que se muestran las tablas diseñadas para nuestra aplicación con todos sus campos. Posteriormente se analizan todos los campos de las distintas tablas.

Page 24: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 44 de 265

Ilustración 25: Diagrama de base de datos de ofertas y relaciones de las tablas.

Page 25: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 45 de 265

En la anterior figura se muestra las relaciones que afectan a la información de las ofertas. A continuación se explican los campos de las distintas tablas. Ofertas

IDOferta: Clave principal. Versión, Nombre, Descripción, Fecha Decisión, Fecha presentación,... son campos donde se almacena la información genérica de la oferta. IDCliente: Relación con la tabla de clientes. (Campo para uso futuro) IDComercial: Relación con la tabla de Personal, es el ID de la persona que da de alta la oportunidad de negocio. IDPersonal: Para uso futuro, es el ID del JdP. IDArea: ID del Área en la que se da de alta la nueva oferta, el área es el encargado de la elaboración de la oferta y la realización del proyecto, una vez aceptada la oferta. IDAyuda: Campo para uso futuro, identificador para contemplar la relación con ayudas a proyectos. IDArea: Campo para relacionar la oferta con un área técnica.

Historial Oferta

IDHistorial Oferta: Calve principal. IDOferta: ID para la relación con la tabla oferta. Una oferta tendrá tantos registros en la tabla historial como cambios haya sufrido la oferta. IDEstado: ID para la relación con la tabla estado oferta, con esta estructura se consigue dar un mayora dinamismo al diseño de nuestra base da datos. Descripcion: descripción breve del motivo del cambio. Fecha: Fecha en la que se produce el cambio de estado. IDPersonal: ID del usuario que realiza el cambio. IDEstado Actual: Estado actual de la oferta, este campo se crea para facilitar la búsqueda del estado de la oferta.

Estado Oferta

IDEstadoOferta: Clave principal. EstadoOferta: Campo estado de la oferta (Pendientes de Comité, Aceptada, Rechazada, En realización, A presentar)

ofertas

PK,FK1 IDOferta

Codigo Version Nombre Descripcion IDCliente FechaDecision FechaPresentacion FechaInicioHitos ImportePrevisto IDComercial IDPersonal IDAyuda IDArea

historialoferta

PK IDOferta

IDHistorialOferta Descripcion Fecha IDPersonal IDEstadoActualFK1 IDEstadoOferta

estadooferta

PK IDEstadoOferta

EstadoOferta

Page 26: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 46 de 265

Hito Planificación

IDHitoPlan: Clave principal. FechadeIniciodeHitos: Fecha inicial de hitos, uso futuro cuando el proyecto está en curso. FechadeHito: Fecha de fin de hito. IDTipo: ID para la relación con los distintos tipos de hitos. DescripcionHito: descripción breve del hito. IDOferta: ID para relacionar con la tabla Ofertas. De manera que una oferta puede tener varios hitos, sin embargo un hito sólo puede tener un único IDOferta.

Historial hitos planificación

IDHistorialHitosPlan: Clave Principal. IDEstadoHitoPlan: ID para la relación con la tabla estado hito plan, para usos futuros para usos futuros en la aplicación para el desarrollo del proyecto. Descripción: Descripción del cambio de estado del hito. Fecha: Fecha del cambio del estado del hito. IDEstadoActualPlan: Estado actual del hito de planificación. Para hacer mas fácil la consulta de estado actual del hito.

Tipo Hito Planificación

IDTipo: Clave principal. Tipo: Distintos tipos de hito de planificación (Interno, Entrega, Ajeno, Gestión, Fin de Actividades). IDHitoPlan: ID para la relación con el hito de planificación del cual se indica el tipo.

Estado Hito Planificación

IDEstadoHitoPlan: Calve principal. EstadoHitoPlan: Caracterización de los distintos estados de hitos. Uso futuro en la realización del proyecto.

hitoplanificacion

PK IDHitoPlan

IDTipo FechadeIniciodeHitos FechadeHito DescripcionHitoFK1 IDOferta

historialhitosplan

PK IDHistorialHitosPlan

FK1 IDEstadoHitoPlanFK3 IDHitoPlan Descripcion FechaFK2 IDEstadoActualPlan

tipohitoplanificacion

PK IDTipo

TipoFK1 IDHitoPlan

estadohitoplanificacion

PK IDEstadoHitoPlan

EstadoHitoPlan

Page 27: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 47 de 265

Hitos de facturación

IDHitoFacturacion: Clave principal. IDOferta: Relación con la tabla oferta. Una oferta podrá tener varios hitos de facturación. Número: Número de hito. IDTipoHito: ID para la relación con la tabla que contiene los distintos tipos de hitos de facturación. FechaFacturacion: Fecha prevista para la facturación. ImporteFacturacion: Importe del hito de facturación. Descripcion: Descripción breve del hito de facturación.

Historial Hitos de Facturación

IDHistorialHitosFact: Clave principal. IDEstadoHitosFact: Calve para la relación con la tabla de estado. IDHitoFacturacion: Calve para la relación con el hito de planificación. Descripcion: Comentario de Cambio. Fecha: Fecha en la que se produce el cambio de estado de hito. IDPersonal: Persona que realiza el cambio. IDEstadoActualFact: Campo para facilitar la búsqueda de estado.

Estado Hito Facturación

IDEstadoHitoFact: Clave principal. Estado: Estado hito facturación (uso futuro) Tipo Hito Facturación

Tipo Hito Facturación

IDTipoFacturacion: Calve principal. TipoHito: Distintos tipos de hitos.

hitosfacturacion

PK IDHitoFacturacion

FK1 IDOferta Numero IDTipoFacturacion FechaFacturacion ImporteFacturacion Descripcion

historialhitosfact

PK IDHistorialHitosFact

FK2 IDEstadoHitosFactFK1 IDHitoFacturacion Descripcion Fecha IDPersonal IDEstadoActualFact

estadohitosfact

PK IDEstadoHitosFact

Estado

tipohitofacturacion

PK,FK1 IDTipoFacturacion

TipoHito

Page 28: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 48 de 265

Valoración Económica A continuación se muestra a mayor detalle las relaciones de las distintas tabas que almacenan los gastos de las ofertas:

Ilustración 26: Relación de las tablas que afectan a la valoración económica de la oferta Valoracioneconomica

IDVE: Identificador principal. CosteItems: Identificador de los costes en la tabla de ítems. VentaItems: Identificador de las ventas en la tabla de ítems. AyudaItems: Para uso futuro, similar a los anteriores. IDOferta: Identificado de la oferta a la que pertenecen los datos.

ItemsVE

IDItemsVE: Calve principal. RRHH: Coste total de los RRHH. MaterialRecurrente: Coste total Recurrente. Material no recurrente: Coste total No Recurrente. Subcontrataciones: Total de subcontrataciones. DietasyViajes: Total de dietas y viajes. Otros: Para uso futuro.

valoracioneconomica

PK IDVE

CosteItems VentaItems AyudaItemsFK1 IDOferta

itemsve

PK IDItemsVE

RRHH MaterialRecurrente MaterialNORecurrente Subcontrataciones DietasyViajes Otros

Page 29: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 49 de 265

TareasPlan

IDTareaPlan: Identificador principal de la tabla. IDRRHH: relación con la tabla donde se contemplan los datos de recursos humanos por tarea. IDOferta: Identificador de la oferta a la que pertenece cada uno de los registros de tareas. FechaInicio: Fecha inicio tarea. FechaFin: Fecha fin tarea. CosteIndirecto: Coste indirecto aplicado a los recursos.

Tareasplandie

IDtareaPalnDie: Identificador principal. IDTareaPlan: Identificador de la tarea ala que pertenece el registro. IDDietasyViajes: Identificador que lo relaciona con la tabal de dietas y viajes.

Dietastarea

IDDietasyViajes: Identificador principal. Descripción: Descripción del coste. Coste: Valor del coste.

RRHH

IDRRHH: Identificador de la tabla de recursos. Horastipo1: Horas que dedicará el recurso perfil1 a la tarea. Horastipo2: Horas que dedicará el recurso perfil2 a la tarea. Horastipo3: Horas que dedicará el recurso perfil3 a la tarea. Horastipo4: Horas que dedicará el recurso perfil4 a la tarea. Horastipo5: Horas que dedicará el recurso perfil5 a la tarea.

tareasplan

PK IDTareaPlanPK,FK2 IDRRHH

FK1 IDOferta Descriocion FechaInicio FechaFin CosteIndirecto

tareasplandie

PK IDTareaPlanDie

FK1 IDTareaPlanFK2 IDDietasyViajes

dietastarea

PK IDDietasyViajes

Descricion Coste

RRHH

PK IDRRHH

HorasTipo1 HorasTipo2 HorasTipo3 HorasTipo4 HorasTipo5

Page 30: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 50 de 265

Tareaplanrec

IDTareaPlanRec: Identificador principal. IDTareaPlan: Identificador de la tarea a la que pertenecen estos gastos. IDRecurrente: registro de la tabla recurrente a la que hace referencia.

Recurrente

IDRecurrente: Identificador principal de la tabla recurrente. Descripcion: Descripción del gasto. Coste: Coste.

Tareasplannorec

IDTaraPlanNORec: Identificador principal. IDTareaPLan: Tarea a la que pertenece el gasto. IDNORecurrente: Registro de la tabla no recurrente que contiene el gasto.

Norecurrente

IDNORecurrente: Calve principal. Descripcion: Descripción del gasto. Coste: Coste.

TareasPlansub

IDTareaPlanSub: Clave principal de la tabla. IDSubcontratacion: Relación con la tabla donde se almacenan los gastos. IDTareaPlan: Identificador de la tarea a la que pertenece el gasto.

tareasplanrec

PK IDTareaPlanRec

FK1 IDTareaPlan IDRecurrente

recurrente

PK IDRecurrente

Descripcion Coste

tareasplannorec

PK IDTareaPlanNORec

FK1 IDTareaPlan IDNORecurrente

norecurrente

PK IDNORecurrente

Descripcion Coste

tareasplansub

PK IDTareaPlanSubPK,FK2 IDSubcontratacion

FK1 IDTareaPlan

Page 31: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 51 de 265

Subcontratacion

IDSubcontratacion: Clave principal. Descripcion: Descripción del gasto. Coste: Coste.

DocumentoOferta

IDDocumentoOferta: Clave principal. IDOFerta: Oferta a la que pertenece el documento. Nombre: Nombre del archivo. Tipo: Tipo de archivo. Descripcion: descripción breve acerca del documento.

Subcontratacion

PK IDSubcontratacion

Descripcion Coste

DocumentoOferta

PK IDDocumentoOferta

FK1 IDOferta Nombre Tipo Descripcion

Page 32: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 52 de 265

12. Aplicación web

12.1. Introducción En el presente apartado se explicarán la funcionalidad del código para el desarrollo de este proyecto. Como ya se ha comentado con anterioridad el software utilizado para la programación ha sido la herramienta Macromedia Dreamweaver, cuyo uso por programadores de código en software libre es de uso generalizado. La estructura de este apartado puede resumirse en tres grandes bloques.

• Funciones Principales PHP, apartado en el que se habla de la aplicación de las distintas funciones desarrolladas en un fichero de php, donde se concentra el esqueleto de la aplicación.

• Funciones Principales JavaScript, no solo se ha implementado la herramienta con código PHP, sino también se ha utilizado funciones de JavaScript, para aquellas páginas en las que se necesitaba que del lado cliente se utilizaran los datos introducidos por el usuario sin enviarlos al servidor.

• Páginas diseñadas, en este apartado se habla de las distintas páginas desarrolladas, se explica las funciones que utiliza así como descripción breve de su uso.

El código desarrollado siguiendo la filosofía de la programación orientada a objeto, a continuación antes de entrar en materia se hará una breve introducción a este estilo de programación. La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como se expresarían las cosas en la vida real que otros tipos de programación. Con la POO se tiene que aprender a pensar las cosas de una manera distinta, para escribir los programas en términos de objetos, propiedades, métodos y otras cosas que se verán rápidamente para aclarar conceptos y dar una pequeña base que permita la introducción a este tipo de programación. Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados por otras personas se creó la POO. Que es una serie de normas para programar de manera que otras personas puedan utilizarlas y adelantar su trabajo, de manera que se consiga que el código se pueda reutilizar. La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser diferente según el programador. Aunque se puedan hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Programar bien es importante porque así se pueden aprovechar todas las ventajas de la POO.

Page 33: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 53 de 265

Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO. Se diría que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar. Pues en un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar. Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2. La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, etc. Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de matemáticas harás uso de objetos fracción y en un programa que gestione un taller de coches utilizarás objetos coche. Los programas Orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos también son objetos. Es decir, el taller de coches será un objeto que utilizará objetos coche, herramienta, mecánico, recambios, etc. Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto quiere decir que la definición de un objeto es la clase. Cuando programamos un objeto y definimos sus características y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos anteriores en realidad se hablaba de las clases coche o fracción porque sólo se estuvo definiendo, aunque por encima, sus formas. Las propiedades o atributos son las características de los objetos. Cuando definimos una propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de que las propiedades son algo así como variables donde almacenamos datos relacionados con los objetos. Los métodos son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las llamamos métodos. Los métodos son como funciones que están asociadas a un objeto. Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar tenemos que especificar la clase a partir de la cual se creará. Esta acción de crear un objeto a partir de una clase se llama instanciar (que viene de una mala traducción de la palabra instace que en inglés significa ejemplar). Por ejemplo, un objeto de la clase fracción es por ejemplo 3/5. El concepto o definición de fracción sería la clase, pero cuando ya estamos hablando de una fracción en concreto 4/7, 8/1000 o cualquier otra, la llamamos objeto. Para crear un objeto se tiene que escribir una instrucción especial que puede ser distinta dependiendo el lenguaje de programación que se emplee, pero será algo parecido a esto. miCoche = new Coche()

Page 34: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 54 de 265

Con la palabra new se especifica que se tiene que crear una instancia de la clase que sigue a continuación. Dentro de los paréntesis podríamos colocar parámetros con los que inicializar el objeto de la clase coche. Cuando se tiene un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un coche la propiedad color tomará un valor en concreto, como por ejemplo rojo o gris metalizado. El valor concreto de una propiedad de un objeto se llama estado. Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador punto. En nuestro caso, en php se utiliza el operador-> miCoche->color = rojo El objeto es miCoche, luego colocamos el operador flecha y por último el nombre e la propiedad a la que deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la propiedad del objeto a rojo con una simple asignación. Un mensaje en un objeto es la acción de efectuar una llamada a un método. Por ejemplo, cuando le decimos a un objeto coche que se ponga en marcha estamos pasándole el mensaje “ponte en marcha”. Para mandar mensajes a los objetos utilizamos el operador flecha, seguido del método que deseamos invocar. miCoche->ponerseEnMarcha() En este ejemplo pasamos el mensaje ponerseEnMarcha(). Hay que colocar paréntesis igual que cualquier llamada a una función, dentro irían los parámetros. Hay mucho todavía que conocer de la POO ya que sólo hemos hecho referencia a las cosas más básicas. También existen mecanismos como la herencia y el polimorfismo que son unas de las posibilidades más potentes de la POO. La herencia sirve para crear objetos que incorporen propiedades y métodos de otros objetos. Así podremos construir unos objetos a partir de otros sin tener que reescribirlo todo. El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que estamos trabajando, y abstraernos para definir un código que sea compatible con objetos de varios tipos. Son conceptos avanzados que cuesta explicar en las líneas de esta pequeña introducción. No hay que olvidar que existen libros enteros dedicados a la POO y aquí solo pretendemos dar un repaso a algunas cosas para que sea más fácil la comprensión de los siguientes.

Page 35: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 55 de 265

12.2. Funciones Principales PHP

12.2.1 Introducción La mayor parte del código se desarrolla en lenguaje PHP, en anteriores capítulos se ha mencionado las innumerables ventajas de este tipo de lenguaje para el desarrollo de aplicaciones web. En este apartado se procede a explicar el código y las funciones desarrolladas en el fichero “DefiniciondeClases.php”, este fichero contiene la mayora parte de funciones para la interacción con la base de datos, es decir las funciones para consultar datos, introducir, modificar y eliminar registros en la base de datos. Como se ha comentado en el anterior apartado este fichero ha sido programado bajo la filosofía de la POO.

12.2.2 DefiniciondeClases.php En la siguiente figura se muestra de manera esquemática la definición de las distintas clases que se ha hecho:

+NuevaOferta()() : int+ConsultarOferta()()+ConsultarEstado($IDOferta)()+CambiarEstado($NuevoEstado,$IDOferta,$descripcion,$IDPersonal)()+ListarOfertasRealizacion($IDUsuario)()+ListarOfertasPresentadas()()+ListarOfertasAceptadas()()+ListarOfertasRechazadas()()+ListarOfertasComite()()+ListarOfertaAPresentar()()+VerOferta($IDOferta)()+HistoriaCambios($IDOferta)()+VerHistoriaCambios($IDHistorial)()+AreaporSesion($IDUsuario)()+PerfilporPersonal($IDPersonal)()

+$codigo-$version-$nombre-$descripcion-$fechainiciohitos-$fechapresentacion-$fechadecision-$importeprevisto-$comercial-$area-$estado-$IDOferta

Clase oferta

+ListarHitoPlan($IDOferta)()+VerTipoHito($IDHito)()+VerHitoPlan($IDHitoPlan)()+ModificarHitoPlan($IDHitoPlan)()+InsertarHitoPlan($IDOferta)()+InsertarMultipleHitoPlan()()+EliminarHitoPlan($IDHito)()+VerEstadoHitoPlan($IDHitoPlan)()+CambiarEstadoHito($NuevoEstado,$IDHitoPlan,$descripcion,$IDPersonal)()+RetrasarFecha($NuevaFecha,$IDHitoPlan)()

-$tipo-$FechaInicio-$Oferta-$Estado-$HitoPlan-$FechaHito-$Descripcion

HitoPlan

+ListarHitoFact($IDOferta)()+VerHitoFact($IDHitoFact)()+VerTipoHito($IDHito)()+ModificarHitoFact($IDHitoFact)()+InsertarHitoFact($IDOferta)()+InsertarMultipleHitoFact()()+EliminarHitoFact($IDHito)()

-$tipo-$FechaInicio-$Oferta-$Estado-$FechaHito-$Descripcion-$Importe

HitoFact

+BuscarValoracion($IDOferta)()+InsertarTarea($IDOferta,$Descripcion,$FechaIni,$FechaFin)()+VerTareasPlan($IDOferta)()+ConsultarCosteHora($i)()+CosteRecursos($IDTarea,$costeind,$tipo1,$tipo2,$tipo3,$tipo4,$tipo5)()+InsertarGasto($tabla,$tarea,$coste,$descripcion)()+VerHoras($IDTarea)()+VerCosteRec($IDTarea)()+VerCosteNORec($IDTarea)()+VerCosteSub($IDTarea)()+VerCosteDie($IDTarea)()

-$IDOferta-$descripcion-$FechaIncio-$FechaFin-$IDTarea-$tipo1-$tipo2-$tipo3-$tipo4-$tipo5-$CosteInd

TareaPlan

+InsertarValoracion($Oferta)()+VerValoracion($IDOferta)()

-$Crecursos-$Vrecursos-$CRecurrentes-$VRecurrentes-$CNORecurrentes-$VNORecurrentes-$Csubcontartacion-$Vsubcontratacion-$Cdietas-$Vdietas-$Ctotal-$Vtotal-$Oferta-$IDCoste-$IDVentas

ValoracionEconomica

Ilustración 27: Relación de las distintas clases definidas en le código php.

Page 36: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 56 de 265

12.2.2.1. Clase Oferta La clase oferta es la clase principal, las demás clase de una manera u otra está relacionas con esta clase. Principales atributos: $codigo: Código de la Oferta. $version: Versión de la Oferta. $nombre: Nombre de la Oferta. $descripcion: Descripción general de la Oferta. $fechainiciohitos: Fecha de inicio de hitos. $fechapresentacion: Fecha de presentación. $fechadecision: Fecha de decisión. $importeprevisto: Importe previsto. $comercial: Comercial que de alta la oferta. $area: Área técnica a desarrollar la oferta técnica. $estado: Estado de la Oferta. $IDOferta: Clave principal de la Oferta, atributo importante para la interacción con la base de datos. Métodos: • NuevaOferta(): Método diseñado para dar de alta una nueva oferta, devuelve el IDOferta de la oferta diseñada. Sentencias SQL utilizadas en esta función: “insert into ofertas (Codigo,Version,Nombre,Descripcion,FechaInicioHitos,FechaPresentacion,FechaDecision,ImportePrevisto,IDComercial,IDArea)values('$this->codigo','$this->version','$this->nombre','$this->descripcion','$this->fechainiciohitos','$this->fechapresentacion','$this->fechadecision','$this->importeprevisto','$this->comercial','$this->area')" mysql_insert_id(). Llamadas a otros métodos: CambiarEstado(1,$this->IDOferta,$_GET['comentario'],$_GET['comercial']). • ConsultarOferta(): Método diseñado para buscar una oferta, es genérico, no recibe atributos en su invocación , devuelve un array con el resultado de ofertas que cumplen los criterios. Las sentencias SQL en este caso merecen especial mención, ya que se construye la consulta con varios bucles if, dependiendo de los campos rellenos en le formulario para efectuar la consulta: $consulta="select * from ofertas where"; $and=" "; $this->nombre=$_POST['NombreOferta'];

+NuevaOferta()() : int+ConsultarOferta()()+ConsultarEstado($IDOferta)()+CambiarEstado($NuevoEstado,$IDOferta,$descripcion,$IDPersonal)()+ListarOfertasRealizacion($IDUsuario)()+ListarOfertasPresentadas()()+ListarOfertasAceptadas()()+ListarOfertasRechazadas()()+ListarOfertasComite()()+ListarOfertaAPresentar()()+VerOferta($IDOferta)()+HistoriaCambios($IDOferta)()+VerHistoriaCambios($IDHistorial)()+AreaporSesion($IDUsuario)()+PerfilporPersonal($IDPersonal)()

+$codigo-$version-$nombre-$descripcion-$fechainiciohitos-$fechapresentacion-$fechadecision-$importeprevisto-$comercial-$area-$estado-$IDOferta

Clase oferta

Page 37: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 57 de 265

$this->codigo=$_POST['CodigoOferta']; $this->estado=$_POST['EstadoOferta']; $this->comercial=$_POST['comercial']; $this->area=$_POST['area']; Si se ha rellenado el campo de nombre para filtrar por nombre

if($this->nombre!=NULL) { $aux=$and."Nombre='$this->nombre'"; $consulta=$consulta." ".$aux; $and=" and "; } Si se ha rellenado el campo de código para filtrar por código if($this->codigo!=NULL) { $aux=$and."Codigo='$this->codigo'"; $consulta=$consulta." ".$aux; $and=" and "; } Si se desea filtrar por comercial y se ha rellenado este campo if($this->comercial!=NULL) { $aux=$and."IDComercial='$this->comercial'"; $consulta=$consulta." ".$aux; $and=" and "; } Si se desea filtrar por área y se ha rellenado este campo if($this->area!=NULL) { $aux=$and."IDArea='$this->area'"; $consulta=$consulta." ".$aux; $and=" and "; } Si se desea filtrar por el estado de la oferta y se ha rellenado este campo if($this->estado!=NULL) {

$aux=$and."IDOferta in (select IDOferta from historialoferta where IDEstadoActual='$this->estado')";

$consulta=$consulta." ".$aux; $and=" and "; } De esta manera, según le criterio de búsqueda se construirá una consulta u otra.

• ConsultarEstado($IDOferta): Método para consultar el estado de una oferta, se le pasa como parámetro el ID de la oferta de la que se desea consultar el estado. Devuelve el estado de la oferta. Sentencias SQL: "SELECT * FROM `historialoferta` WHERE IDOferta='$IDOferta'" A partir de esta consulta obtenemos el ID del Estado.

Page 38: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 58 de 265

"SELECT * FROM `estadooferta` WHERE `IDEstadoOferta`='$IDEstado'"

• CambiarEstado($NuevoEstado,$IDOferta,$descripcion,$IDPersonal): Método para cambiar el estado de una oferta, necesita como parámetros el nuevo estado, el ID de la oferta, la descripción del cambio y el ID de la persona que cambia el estado. Modifica el estado y no devuelve ningún parámetro. Sentencia SQL: "insert into historialoferta (IDOferta,IDEstado,Fecha,IDPersonal,Descripcion,IDEstadoActual)values('$this->IDOferta','$this->NuevoEstado','$this->fecha','$this->personal','$this->descripcion','$this->NuevoEstado')" "update historialoferta set IDEstadoActual='$this->NuevoEstado' where IDOferta='$this->IDOferta'".

• ListarOfertasRealizacion($IDUsuario): Método para listar las ofertas en realización que tiene un usuario en concreto. Necesita como parámetro el ID del usuario. Devuelve un array con las ofertas que se encuentran en este estado y estás asignadas a este personal. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='1') and IDArea='$IDArea' and IDPersonal='$IDUsuario'" Funciones a los que se invoca desde esta función: AreaporSesion($IDUsuario).

• ListarOfertasPresentadas(): Método para listar las ofertas presentadas, en este caso no se selecciona usuario, para usos futuros se puede añadir esta aplicación o bien hacer le filtro por áreas. Devuelve el array con las ofertas en este estado. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='2')"

• ListarOfertasAceptadas(): Método para listas las ofertas Aceptadas, en este

caso no se selecciona usuario, para usos futuros se puede añadir esta aplicación o bien hacer le filtro por áreas. Devuelve el array con las ofertas en este estado. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='3')".

• ListarOfertasRechazadas():Método para listas las ofertas Rechazadas, en este caso no se selecciona usuario, para usos futuros se puede añadir esta aplicación o bien hacer le filtro por áreas. Devuelve el array con las ofertas en este estado. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='4')".

• ListarOfertasComite():Método para listas las ofertas pendientes de pasar por el comité. Devuelve el array con las ofertas en este estado. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='5')".

Page 39: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 59 de 265

• ListarOfertaAPresentar():Método para listas las ofertas pendientes de

presentar. Devuelve el array con las ofertas en este estado. Sentencia SQL: "select * from ofertas where IDOferta in(select IDOferta from historialoferta where IDEstadoActual='6')".

• VerOferta($IDOferta): Método para obtener los datos de una oferta y presentarlos por pantalla. Necesita como parámetro el ID de la oferta. No devuelve ningún parámetro ya que carga en los atributos de la clase oferta la información necesaria. Sentencia SQL: "select * from ofertas where IDOferta='$this->IDOferta'". "select * from historialoferta where IDOferta='$this->IDOferta' order by `Fecha` desc". "select * from personal where IDPersonal='$this->comercial'". "select * from area where IDArea='$this->area'". "select * from estadooferta where IDEstadoOferta='".$IDEstado."'”.

• HistoriaCambios($IDOferta): Método para buscar los cambios de estado que ha sufrido una oferta. Necesita como parámetro el ID de la oferta. Devuelve un array con los resultados, registros de la tabla historial oferta que contenga cambios del estado de la oferta que se le pasa como parámetro. Sentencia SQL: "select * from historialoferta where IDOferta='$IDOferta' order by Fecha asc".

• VerHistoriaCambios($IDHistorial): Método para visualizar los cambios de estado que ha sufrido una oferta, con el IDHistorial obtenido de la función HistoriaCambios, podemos llamar a esta función. No devuelve ningún valor ya que modifica los atributos de la oferta en la propia función. Sentencia SQL: Selección de los registros con la sentencia siguiente, "select * from historialoferta where IDHistorialOferta='$IDHistorial'". Para visualizar el estado y no el identificador de estado, "select * from estadooferta where IDEstadoOferta='$this->estado'". Para visualizar la persona responsable del cambio y no su ID, "select * from personal where IDPersonal='$this->personal'". Para visualizar los datos de la oferta como nombre o código, "select * from ofertas where IDOferta='$this->codigo'".

• AreaporSesion($IDUsuario): Método para obtener el área por IDPersonal, es una función útil para dar los permisos para la introducción, eliminación de registros de una oferta. Necesita el parámetro del identificador de usuario. Devuelve el identificador de área a que pertenece. Sentencia SQL: "SELECT IDArea FROM `personalporarea` WHERE IDPersonal='$IDUsuario'".

• PerfilporPersonal($IDPersonal): Método para buscar el perfil por el identificador personal. Necesita como parámetro el identificador personal, devuelve el identificador de perfil, el perfil limita el acceso a las distintas páginas.

Page 40: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 60 de 265

Sentencias SQL: "SELECT * from personal where IDPersonal='$IDPersonal'".

12.2.2.2. Clase HitoPlan En esta clase se definen los atributos y los métodos para trabajar con los hitos de planificación. Principales atributos: $tipo: Tipo de hito de planificación. $FechaInicio: Fecha de inicio de hitos. $Oferta: Identificador de la oferta a la que pertenece el hito de planificación. $Estado: estado del hito de planificación. $HitoPlan: Identificador del hito de planificación. $FechaHito: Fecha del hito de planificación. $Descripcion: Breve descripción del hito de planificación. Métodos:

• ListarHitoPlan($IDOferta): Método para listar los hitos de planificación que pertenecen a una oferta. Necesita como parámetro el identificador de la oferta, Devuelve el array con los registros de la tabla hito de planificación que pertenecen a la oferta. Sentencias SQL: "select * from hitoplanificacion where IDOferta='$this->Oferta'".

• VerTipoHito($IDHito): Método para visualizar el tipo de hito de planificación. Necesita como parámetro el identificador de hito. Devuelve el tipo de hito, no el identificador de tipo de hito. Sentencias SQL: "select* from tipohitoplanificacion where IDTipo in (select IDTipo from hitoplanificacion where IDHitoPlan='$IDHito')".

• VerHitoPlan($IDHitoPlan): Método para visulizar los datos almacenados en un hito de planificación. Necesita como parámetro el identificador de hito. No devuelve parámetros ya que carga el contenido de los datos del hito en los distintos atributos del objeto hito. Sentencias SQL: Para consultar los campos generales, "select * from hitoplanificacion where IDHitoPlan='$this->HitoPlan'". Para consultar el tipo de hito, no el identificador del mismo, "select * from tipohitoplanificacion where IDTipo='$this->Tipo'".

+ListarHitoPlan($IDOferta)()+VerTipoHito($IDHito)()+VerHitoPlan($IDHitoPlan)()+ModificarHitoPlan($IDHitoPlan)()+InsertarHitoPlan($IDOferta)()+InsertarMultipleHitoPlan()()+EliminarHitoPlan($IDHito)()+VerEstadoHitoPlan($IDHitoPlan)()+CambiarEstadoHito($NuevoEstado,$IDHitoPlan,$descripcion,$IDPersonal)()+RetrasarFecha($NuevaFecha,$IDHitoPlan)()

-$tipo-$FechaInicio-$Oferta-$Estado-$HitoPlan-$FechaHito-$Descripcion

HitoPlan

Page 41: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 61 de 265

• ModificarHitoPlan($IDHitoPlan): Método para modificar un hito de

planificación. Necesita como parámetro el identificador del hito a modificar. Se hace un filtro para seleccionar del registro que se desea modificar. No devuelve ningún valor. Sentencias SQL: Selección del registro a modificar, "select * from hitoplanificacion where IDHitoPlan='$this->HitoPlan'". Si deseamos modificar el tipo de hito, if ($_POST['ModificarHito']==1) { $this->Tipo=$_POST['Tipo']; } Si no, introducimos le valor que tiene el hito actualmente en este campo, else { $this->Tipo=$row['IDTipo']; } Si deseamos modificar la descripción del hito, if ($_POST['ModificarDescripcion']==1) { $this->Descripcion=$_POST['modificada_descripcion_hito']; } Si no, cargamos el valor que contiene en ese campo el registro, else {

$this->Descripcion=$row['DescripcionHito']; } Si deseamos modificar la fecha del hito, if ($_POST['ModificarFechaHito']==1) { $this->FechaHito=$_POST['fecha_hitonueva']; } Si no, cargamos el valor que tiene el registro en ese campo, else { $this->FechaHito=$row['FechadeHito']; } Una vez introducidos los valores a cambiar se elabora la consulta SQL, "update hitoplanificacion set IDTipo='$this->Tipo',FechadeHito='$this->FechaHito',DescripcionHito='$this->Descripcion' where IDHitoPlan='$this->HitoPlan'".

• InsertarHitoPlan($IDOferta): Método para insertar nuevos hitos de planificación en la tabla de hitos de planificación. Necesita como parámetro el identificador de oferta. No devuelve ningún parámetro. Sentencias SQL: Si es hito múltiple se invoca al método InsertarMultipleHitoPlan. "insert into hitoplanificacion (IDOferta,IDTipo,DescripcionHito,FechadeHito)values('$this->Oferta','$this->Tipo','$this->Descripcion','$this->FechaHito')".

Page 42: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 62 de 265

Si el hito es de gestión, introducimos estos valores en la tabla hitos de gestión, "insert into hitoplanificacion (IDOferta,IDTipo,DescripcionHito,FechadeHito)values('$this->Oferta','$this->Tipo','$this->Descripcion','$this->FechaHito')"; "select * from faseproyecto where IDFase='$this->Descripcion'". "select * from hitosgestion where IDOferta='$this->Oferta'". "insert into hitosgestion ($campo,IDOferta)values('$IDPlan','$this->Oferta')". "update hitosgestion set $campo='$IDPlan' where IDOferta='$this->Oferta'". "insert into hitoplanificacion (IDOferta,IDTipo,DescripcionHito,FechadeHito)values('$this->Oferta','$this->Tipo','$this->Descripcion','$this->FechaHito')".

• InsertarMultipleHitoPlan(): Método para insertar múltiples hitos de planificación. No necesita parámetros ya que esta función es invocada desde el método de InsertarHitoPlan. No devuelve ningún valor. En este método se construye utilizando un bucle while en el que se insertarán tantos hitos como sea necesario. La fecha de cada hito se calculará mediante la función suma_fechas(FechaInicio, Días), definida en el archivo de funcionesphp.php incluido en el anexo II de código. Sentencias SQL: "insert into hitoplanificacion (IDOferta,IDTipo,FechadeHito,DescripcionHito)values('$this->Oferta','$this->Tipo','$fecha','$this->Descripcion')";

• EliminarHitoPlan($IDHito): Método para eliminar hitos de planificación. Necesita como parámetro el identificador del hito a eliminar. No devuelve ningún valor. Sentencia SQL: Seleccionamos el registro a eliminar, "select * from hitoplanificacion where IDHitoPlan='$this->hitoPlan'". Eliminamos el registro, "delete from hitoplanificacion where IDHitoPlan='$this->hitoPlan'".

• VerEstadoHitoPlan($IDHitoPlan): Método para ver el estado en el que se encuentra un hito de planificación. Esta función es de usos futuro para cuando se desarrolle la aplicación para la gestión del proyecto. Necesita como parámetro de entrada el identificador del hito de planificación. Devuelve el estado del hito de planificación. Sentencias SQL: Seleccionamos el hito a visualizar, "select IDEstadoActualPlan from historialhitosplan where IDHitoPlan='$IDHitoPlan'". Seleccionamos el estado del hito de la tabla que contiene los posibles estados de hitos de planificación, "select EstadoHitoPlan from estadohitoplanificacion where IDEstadoHitoPlan='$Estado'".

• CambiarEstadoHito($NuevoEstado,$IDHitoPlan,$descripcion,$IDPersonal): Método para cambiar el estado de un hito de planificación. Necesita como parámetros el nuevo estado, el identificador del hito que modifica su estado, el identificador del responsable del cambio, y una breve descripción del motivo del cambio de estado. Sentencias SQL: Insertamos un nuevo registro en el historial de los hitos de planificación,

Page 43: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 63 de 265

"insert into historialhitosplan(IDHitoPlan,IDEstadoHitoPlan,Fecha,IDPersonal,Descripcion,IDEstadoActualPlan)values('$this->IDHitoPlan','$this->NuevoEstado','$this->fecha','$this->personal','$this->descripcion','$this->NuevoEstado')". Actualizamos el estado del campo estado actual del hito en todos los registro de historial que hagan referencia a este hito, "update historialhitosplan set IDEstadoActualPlan='$this->NuevoEstado' where IDHitoPlan='$this->IDHitoPlan'".

• RetrasarFecha($NuevaFecha,$IDHitoPlan): Método para retrasar la fecha de cumplimiento de un hito, es decir para retrasar su fecha. Necesita como parámetros la nueva fecha y el identificador del hito. No devuelve ningún valor. Sentencias SQL: "update hitoplanificacion set FechadeHito='$NuevaFecha' where IDHitoPlan='$IDHitoPlan'".

12.2.2.3. Clase hito facturación Esta clase se utiliza para el tratamiento de los hitos de facturación, como se puede observar el tratamiento de estos hitos, salvo alguna pequeña variación, es similar al de la clase de hitos de planificación. Atributos Principales: $tipo: Tipo de hito de facturación. $FechaInicio: Fecha de inicio de hitos. $Oferta: Oferta a la que pertenecen los hitos de facturación. $Estado: Estado del hito de facturación. $FechaHito: Fecha de inicio de hitos de facturación. $Descripcion: descripción breve del hito. $Importe: Importe del hito de facturación. Métodos:

• ListarHitoFact($IDOferta): Método para listar los hitos de facturación pertenecientes a una oferta. Necesita como parámetro el identificador del hito de facturación. Devuelve un array con la referencia a esos hitos. Sentencias SQL: "select * from hitosfacturacion where IDOferta='$this->Oferta'".

• VerHitoFact($IDHitoFact): Método para visualizar los atributos de un hito de facturación. Necesita como parámetro el identificador del hito a visualizar. No devuelve ningún valor ya que el valor de los distintos campos del registro de la base de datos se cargarán en los atributos del objeto. Sentencias SQL: Selección del registro a visualizar, "select * from hitosfacturacion where IDHitoFacturacion='$this->HitoFact'". Selección del tipo de hito, "select * from tipohitofacturacion where IDTipoFacturacion='$this->Tipo'".

+ListarHitoFact($IDOferta)()+VerHitoFact($IDHitoFact)()+VerTipoHito($IDHito)()+ModificarHitoFact($IDHitoFact)()+InsertarHitoFact($IDOferta)()+InsertarMultipleHitoFact()()+EliminarHitoFact($IDHito)()

-$tipo-$FechaInicio-$Oferta-$Estado-$FechaHito-$Descripcion-$Importe

HitoFact

Page 44: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 64 de 265

• VerTipoHito($IDHito): Método para visualizar el tipo de hito, es utilizado en

muchos formularios, ya que en el campo del registro del hito tipo de hito, se almacena el identificador, con idea de hacer lo más flexible y modificable tanto la aplicación como la base de datos. Necesita como parámetro de entrada le identificador del hito. Devuelve el tipo de hito. Sentencias SQL "select* from tipohitofacturacion where IDTipoFacturacion in (select IDTipoFacturacion from hitosfacturacion where IDHitoFacturacion='$IDHito')".

• ModificarHitoFact($IDHitoFact): Método para modificar los hitos de facturación, este método es similar al de la clase hito de planificación. Necesita como parámetro de entrada el identificador de hito de facturación. No devuelve ningún valor. Sentencias SQL: Se selecciona el registro a modificar, "select * from hitosfacturacion where IDHitoFacturacion='$this->HitoFact'". Al igual que en el método homólogo de la clase hito de planificación se carga en los atributos el valor a introducir en este registro, según lo seleccionado en el formulario para modificar los hitos de facturación. Una vez cargados estos valores se actualiza el registro, "update hitosfacturacion set IDTipoFacturacion='$this->Tipo',FechaFacturacion='$this->FechaHito',Descripcion='$this->Descripcion',ImporteFacturacion='$this->Importe' where IDHitoFacturacion='$this->HitoFact'".

• InsertarHitoFact($IDOferta): Método para insertar un hito de facturación. Necesita como parámetro de entrada el identificador de la oferta a la que pertenece. No devuelve ningún valor. Sentencias SQL: Previamente se comprueba si el hito a insertar es múltiple, si es así se invoca al método insertar múltiple hito de facturación. "insert into hitosfacturacion (IDOferta,IDTipoFacturacion,FechaFacturacion,Descripcion,ImporteFacturacion)values('$this->Oferta','$this->tipo','$this->FechaHito','$this->Descripcion','$this->Importe')".

• InsertarMultipleHitoFact(): Método para insertar múltiples hitos de facturación, no necesita parámetro de entrada ya que este método se invoca desde la función insertar hito de facturación. No devuelve ningún valor. Sentencias SQL: Tiene una programación similar al método homólogo de la clase hito de planificación, se construye un bucle while para introducir todos los hitos necesarios. Para calcular las fechas de cada hito se utiliza la función suma_fechas(Fecha inicial, días). "insert into hitosfacturacion (IDOferta,IDTipoFacturacion,FechaFacturacion,Descripcion,ImporteFacturacion)values('$this->Oferta','$this->tipo','$fecha','$this->Descripcion','$this->Importe')".

Page 45: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 65 de 265

• EliminarHitoFact($IDHito): Método para eliminar hitos de facturación. Necesita como parámetro de entrada el identificador del hito a eliminar. No devuelve ningún valor. Sentencias SQL: Selección del registro a eliminar, "select * from hitosfacturacion where IDHitoFacturacion='$this->HitoFact'". Eliminación del hito, "delete from hitosfacturacion where IDHitoFacturacion='$this->HitoFact'".

12.2.2.4. Calse tareaPlan Esta clase es utilizada como complemento a la valoración económica, ya que la valoración económica se divide en tareas. La principal diferencia entre las tareas y los hitos de planificación es que los hitos son más genéricos, mientras que las tareas serán mucho más precias, además un hito puede estar compuesto de varias tareas. Principales atributos: $IDOferta: Identificador de la oferta a la que pertenece la tarea. $descripcion: Descripción breve de la tarea. $FechaIncio: Fecha de inicio de la tarea. $FechaFin: Fecha de fin de la tarea. $IDTarea: Identificador de la tarea. $tipo1: Tipo de los recursos humanos planificados para la tarea. $tipo2: Tipo de los recursos humanos planificados para la tarea. $tipo3: Tipo de los recursos humanos planificados para la tarea. $tipo4: Tipo de los recursos humanos planificados para la tarea. $tipo5: Tipo de los recursos humanos planificados para la tarea. $CosteInd: Coste indirecto asociado a los recursos humanos. Métodos:

• BuscarValoracion($IDOferta): Método para buscar si una oferta tiene ya una valoración económica. Necesita como parámetro de entrada el identificador de la oferta de la cual se está buscando la valoración económica. Devuelve un array con los datos de la valoración o bien false. Sentencias SQL: "select * from tareasplan where IDOferta='$IDOferta'".

• InsertarTarea($IDOferta,$Descripcion,$FechaIni,$FechaFin): Método para insertar una tarea perteneciente a una oferta. Necesita como parámetros de

+BuscarValoracion($IDOferta)()+InsertarTarea($IDOferta,$Descripcion,$FechaIni,$FechaFin)()+VerTareasPlan($IDOferta)()+ConsultarCosteHora($i)()+CosteRecursos($IDTarea,$costeind,$tipo1,$tipo2,$tipo3,$tipo4,$tipo5)()+InsertarGasto($tabla,$tarea,$coste,$descripcion)()+VerHoras($IDTarea)()+VerCosteRec($IDTarea)()+VerCosteNORec($IDTarea)()+VerCosteSub($IDTarea)()+VerCosteDie($IDTarea)()

-$IDOferta-$descripcion-$FechaIncio-$FechaFin-$IDTarea-$tipo1-$tipo2-$tipo3-$tipo4-$tipo5-$CosteInd

TareaPlan

Page 46: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 66 de 265

entrada el identificador de la oferta, la descripción, la fecha de inicio, la fechad e fin y la descripción de la tarea.

Sentencias SQL: "insert into tareasplan(IDOferta,Descripcion,FechaInicio,FechaFin)values('$this->IDOferta','$this->descripcion','$this->FechaInicio','$this->FechaFin')".

• VerTareasPlan($IDOferta): Método para visualizar las tareas de planificación. Este método se invoca en el formulario para insertar la valoración económica, como se ha comentado con anterioridad, los datos económicos se ingresan por tareas. Necesita como parámetro de entrada el identificador de la oferta. Devuelve el array con las tareas de planificación que pertenecen a la oferta. Sentencias SQL: Selección de las tareas de la oferta en orden ascendente, ordenadas por fecha de inicio, "select * from tareasplan where IDOferta='$IDOferta' order by `FechaInicio` ASC, `FechaFin` ASC".

• ConsultarCosteHora($i): Método para consultar el coste hora de cada recurso relacionado con cada tarea. Requiere como parámetro de entrada el perfil de cada recurso. Se hace una consulta a la tabla nómina donde están ingresados el coste hora según el perfil del usuario. Devuelve el coste hora de ese perfil. Sentencias SQL: Consulta a la tabla nóminas, "select * from nomina where IDPerfil='$i'".

• CosteRecursos($IDTarea,$costeind,$tipo1,$tipo2,$tipo3,$tipo4,$tipo5): Método para insertar el coste de recursos relacionado con una tarea. Necesita como parámetros de entrada el identificador de la tarea, el parámetro coste indirecto, y las horas tipo 1, tipo2, tipo3, tipo4 y tipo 5. Sentencias SQL: "insert into rrhh (HorasTipo1,HorasTipo2,HorasTipo3,HorasTipo4,HorasTipo5)values('$tipo1','$tipo2','$tipo3','$tipo4','$tipo5')". Obtenemos el identificador del nuevo registro introducido en la tabla de rrhh. $IDRRHH=mysql_insert_id(). Actualizamos en la tabla tareas plan el identificador de recursos humanos, así como el coste indirecto. "update tareasplan set IDRRHH='$IDRRHH',CosteIndirecto='$costeind' where IDTareaPlan='$IDTarea'".

• InsertarGasto($tabla,$tarea,$coste,$descripcion): Método que inserta los costes por tareas en la Base de datos, todos los costes menos los de recursos humanos que ya han sido insertados. Necesita como parámetros la referencia a la tabla a insertar los datos, es decir si se hace referencia a la tabla material recurrente, material no recurrente, subcontratación o dietas y viajes. Con este método según la llamada se modifican los datos de una tabla u otra. También necesita como parámetros de entrada el identificador de tarea de planificación a la que hace referencia, el coste, y la descripción del coste. Sentencias SQL: "insert into $tabla (Descripcion,Coste) values('$descripcion','$coste')".

Page 47: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 67 de 265

Se selecciona según el tipo del parámetro tabla la tabla de la base de datos a la que se hace referencia, switch ($tabla) {

case "recurrentes": $IDTipo="IDRecurrente"; $tabla2="tareasplanrec"; break; case "norecurrente": $IDTipo="IDNORecurrente"; $tabla2="tareasplannorec"; break; case "subcontratacion": $IDTipo="IDSubcontratacion"; $tabla2="tareasplansub"; break; case "dietastarea": $IDTipo="IDDietasyViajes"; $tabla2="tareasplandie"; break; } A continuación se introducen los datos en la tabla, "insert into $tabla2 (IDTareaPlan,$IDTipo)values('$tarea','$IDGasto')".

• VerHoras($IDTarea): Método para visualizar las horas de los distintos recursos de una tarea almacenados en la base datos. Necesita como parámetro el identificador de tarea con la que está relacionado. No devuelve ningún parámetro ya que los datos los almacena en los atributos del objeto. Sentencias SQL: "select * from rrhh where IDRRHH in (select IDRRHH from tareasplan where IDTareaPlan='$IDTarea')".

• VerCosteRec($IDTarea): Método para visualizar los costes recurrentes vinculados a una tarea. Necesita como parámetro de entrada el identificador de tarea a la que se hace referencia. Devuelve el array con todos los costes recurrentes asociados a esta tarea. Pueden ser varios. Sentencias SQL: "select * from recurrentes where IDRecurrente in (select IDRecurrente from tareasplanrec where IDTareaPlan='$IDTarea')".

• VerCosteNORec($IDTarea): Método para visualizar los costes no recurrentes vinculados a una tarea. Necesita como parámetro de entrada el identificador de tarea a la que se hace referencia. Devuelve el array con todos los costes recurrentes asociados a esta tarea. Pueden ser varios. Sentencias SQL: "select * from norecurrente where IDNORecurrente in (select IDNORecurrente from tareasplannorec where IDTareaPlan='$IDTarea')".

• VerCosteSub($IDTarea): Método para visualizar los costes de subcontratación vinculados a una tarea. Necesita como parámetro de entrada el identificador de tarea a la

Page 48: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 68 de 265

que se hace referencia. Devuelve el array con todos los costes recurrentes asociados a esta tarea. Pueden ser varios. Sentencias SQL: "select * from subcontratacion where IDSubcontratacion in (select IDSubcontratacion from tareasplansub where IDTareaPlan='$IDTarea')".

• VerCosteDie($IDTarea): Método para visualizar los costes de dietas y viajes vinculados a una tarea. Necesita como parámetro de entrada el identificador de tarea a la que se hace referencia. Devuelve el array con todos los costes recurrentes asociados a esta tarea. Pueden ser varios. Sentencias SQL: "select * from dietastarea where IDDietas in (select IDDietasyViajes from tareasplandie where IDTareaPlan='$IDTarea')".

12.2.2.5. Clase ValoracionEconomica: Esta clase se utiliza para la valoración económica global de una oferta, si bien antes se ha explicado que la valoración económica se dividirá en tareas de planificación, esta clase agrupa a todas las tareas y define los atributos con los datos económicos globales de una oferta, tanto los costes, como las ventas. Atributos principales: $Crecursos: Coste de recursos asociados a una oferta. $Vrecursos: Venta de recursos asociados a una oferta. $CRecurrentes: Costes recurrentes asociados a una oferta. $VRecurrentes: Ventas recurrentes asociadas a una oferta. $CNORecurrentes: Costes no recurrentes asociados a una oferta. $VNORecurrentes: Ventas no recurrentes asociadas a una oferta. $Csubcontartacion: Costes de subcontratación asociados a una oferta. $Vsubcontratacion: Ventas de subcontratación asociadas a una oferta. $Cdietas: Costes de dietas y viajes asociados a una oferta. $Vdietas: Ventas de dietas y viajes asociadas a una oferta. $Ctotal: Coste total asociado a una oferta. $Vtotal: Venta total asociada a una oferta. $Oferta: Identificador de la oferta a la que hace referencia un objeto de esta clase. $IDCoste: Atributo que indica el identificador del registro de coste donde están almacenados los datos de la tabla ítems valoración económica. $IDVentas: Atributo que indica el identificador del registro de venta donde están almacenados los datos de la tabla ítems valoración económica.

+InsertarValoracion($Oferta)()+VerValoracion($IDOferta)()

-$Crecursos-$Vrecursos-$CRecurrentes-$VRecurrentes-$CNORecurrentes-$VNORecurrentes-$Csubcontartacion-$Vsubcontratacion-$Cdietas-$Vdietas-$Ctotal-$Vtotal-$Oferta-$IDCoste-$IDVentas

ValoracionEconomica

Page 49: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 69 de 265

Métodos:

• InsertarValoracion($Oferta): Método para insertar la valoración económica de una oferta. Necesita como parámetro de entrada el identificador de la oferta con la que está relacionada la valoración. No devuelve ningún valor. Sentencias SQL: Se introducen los costes, "insert into itemsve (RRHH,MaterialRecurrente,MaterialNORecurrente,Subcontrataciones,DietasyViajes,Otros)values('$this->Crecursos','$this->CRecurrentes','$this->CNORecurrentes','$this->Csubcontratacion','$this->Cdietas','$this->Cotros')". $this->IDCostes=mysql_insert_id(). Se introducen las ventas, "insert into itemsve(RRHH,MaterialRecurrente,MaterialNORecurrente,Subcontrataciones,DietasyViajes,Otros)values('$this->Vrecursos','$this->VRecurrentes','$this->VNORecurrentes','$this->Vsubcontratacion','$this->Vdietas','$this->Votros')". $this->IDVentas=mysql_insert_id(). Por último se introduce el identificador de ambos registros en la tabla de valoracioneconomica, "insert into valoracioneconomica (CosteItems, VentasItems, IDOferta)values('$this->IDCoste','$this->IDVentas','$this->Oferta')".

• VerValoracion($IDOferta): Método para visualizar la valoración económica de una oferta. Necesita como parámetro de entrada el identificador de la oferta. No devuelve ningún valor ya que actualiza el valor de los atributos del objeto con los datos obtenidos de la base de datos. Sentencia SQL: La primera consulta extrae los identificadores que se necesitan de la tabla ítems, "SELECT * FROM `valoracioneconomica` WHERE `IDOferta`='$this->IDOferta'". Ahora se extraen los datos económicos de cada registro, "SELECT * FROM `itemsve` WHERE `IDItemsVE`='$this->IDCoste'". "SELECT * FROM `itemsve` WHERE `IDItemsVE`='$this->IDVentas'".

12.2.2.6. Ampliaciones A continuación de manera muy resumida se explica las clases que se deberían crear como ampliación del proyecto. Clase Proyecto Esta clase será la que posee los atributos y métodos para trabajar con proyectos, sus atributos deberían ser aproximadamente: $IDProyecto; $Area; $CosteReal; $Pedido; $JdP;

Page 50: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 70 de 265

$DietasyViajes; $HitosPlanJdP; $HitosFactJdP; $Tarea; Los métodos de los que se debería proveer a esta clase son: DardeAltaProyecto($IDOferta): función para dar de alta un proyecto una vez aceptada la oferta por el cliente. AsignarJdP($IDProyecto,$IDPersonal,$Descripcion): Función para asignar un jefe de proyecto a un proyecto en curso. MostrarProyectoJdP($IDJdP): Método para consultar los proyectos según el jefe de proyecto. BuscarProyectosAsignar($IDPersonal): Método para consultar los proyectos en estado pendiente de asignación de jefe de proyecto, esta labor de asignación le corresponde al responsable del área técnica del proyecto. MisProyectos($IDPersonal): Método para consultar los proyectos que un usuario tiene asignado. BuscarProyectoporOferta($IDOferta): Método para consultar el proyecto asociado a una oferta. BuscarOfertaporProyecto($IDProyecto): Método para listar el contenido de un proyecto, es decir, si se conoce el identificador del proyecto se puede ver la información de la oferta con la que está relacionado. CambiarEstadoProyecto($NuevoEstado,$IDProyecto,$descripcion,$IDPersonal): Método para modificar el estado de desarrollo de un proyecto. BuscarJDPporOferta($IDOferta): Método para buscar el jefe de proyecto conociendo el identificador de la oferta asociada al proyecto. VerProyectoporIDProyecto($IDProyecto): Método para visualizar los datos de un proyecto. ListarProyectosArea(): Método para listar los proyectos de un área. Clase Pedido Esta será otra de las clases a definir, esta clase hace referencia a los pedidos relacionados con un proyecto, de esta manera se podrá comprobar que los cálculos de la valoración económica de la oferta estaban bien realizados. Los atributos fundamentales de esta clase deberían ser aproximadamente: $IDProyecto; $Estado; $Proveeedor; $FechaPedido; $FechaSolicitud; $FechaRecepcion; $FechaPrevistaRecepcion; $Importe; $IVA; $FormaPago; $Comentario; $Concepto; $Direccion; $Envio;

Page 51: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 71 de 265

$Tipo; $Personal; $Solicitante; Métodos principales: SolicitarPedido($IDProyecto): Método para dar de alta un nuevo pedido en un proyecto. CambiarEstado($NuevoEstado,$IDPedido,$descripcion,$IDPersonal): Método APRA modificar el estado en el que se encuentra un pedido. ListarPedidosPorEstado($IDEstado): Método para listar los pedidos según un estado. MostrarCodigoPedido($IDProyecto): Método para mostrar los pedidos de un proyecto. VerDescripcionHistorialPedido($IDEstado,$IDPedido): Método para visualizar el historial de un pedido. AsignarPedido($IDPedido,$IDResponsable): Método para asignar un pedido a un pedido a algún trabajador del departamento de compras. Esta función le compete a responsable de compras. ListarPedidosPorEstadoPorEmpleado($IDEstado,$IDPersonal): Método para listar los pedidos que tiene en su haber un empleado de compras. Clase Tarea Esta clase será utilizada para que los empleados de la empresa imputen las horas destinadas a cada proyecto, de esta manera se obtendrán los gastos en recursos humanos que tiene un proyecto. Los atributos fundamentales serán: $horas; $Jefe; $Ejecutor; $IDProyecto; $Descripcion; $FechaInicio; $FechaFin; $Fin; $Area; $TareaArea; $IDTarea; $Semana; Los métodos necesarios en esta clase serían: AsignarTarea($Jefe,$Ejecutor,$IDProyecto,$Descripcion,$TareaArea): Método para asignar una tarea de un proyecto a un recurso. ComputarTareas(): Método para computar horas a una tarea de un proyecto. ListarTareasaRealizar(): Método para listar las tareas de un recurso. CambiarEstadoTarea(): Método para cambiar el estado de una tarea.

Page 52: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 72 de 265

12.3. Funciones Principales JavaScript En este apartado se explican algunas de las funciones desarrolladas en java, estas funciones se han desarrolla con le objetivo de apoyo al código php para aquellas páginas que tengan un contenido dinámico. Algunas de las funciones principales son las que siguen: function periodicidad(condicion): Función para hacer visibles lagunas capas en el formulario de hitos de facturación cuando se desea introducir hitos periódicos. function PeriodicidadPlan(condicion): Función similar a la anterior pero en el formulario para introducir hitos de planificación. function VolverAVerOferta(idoferta): Función redirecciona a la página ver oferta, necesita como parámetro el identificador de la oferta. function NewOferta(): Función invocada al dar de alta una nueva oferta, aparece una nueva ventana en la se deberá introducir un comentario si se desea dar de alta una nueva oferta y pulsar el botón de Aceptar. Esta función nos redirecciona a la página en la que se introducen los datos en la base de datos. function IrnuevaOferta(): Función que nos redirecciona al formulario para dar de alta una nueva oferta. function ModificarTipoPlan(): Función que hace visibles capas según se seleccione los campos que se desean modificar de un hito de planificación. function MofifFecha(): Función para modificar la fecha de un hito, hace visibles estos campos en el formulario. function ModifDescripcion(): Función para modificar la descripción de un hito, hace visible las capas. Se invoca desde el formulario de modificación cuando se chequea el botón de modificar la descripción. function InsertarNuevoHitoPlan(idoferta): Función para confirmar la introducción de un nuevo hito de planificación. Aparece una ventana para confirmar lo que se desea. function ModificarTipoFact(): Función para visualizar y ocultar campos en el formulario para modificar el hito de facturación. function ModifImporte(): Función invocada al chequear la opción de modificar importe de facturación. Hace visible unas capas y oculta otras. function MofifFechaFact(): Función invocada al chequear la opción de modificar la fecha de algún hito de facturación. Hace visibles algunas capas. function ModifDescripcionFact(): Función invocada al chequear la opción de modificar la descripción de algún hito de facturación.

Page 53: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 73 de 265

function InsertarNuevoHitoFact(idoferta): Función invocada cuando se pulsa el botón de insertar hito nuevo de facturación. Aparece una ventana para que se pueda comprobar que el botón no se pulsó por error. function ventana(condicion): Función que nos permite introducir los datos en el formulario de introducción de datos de facturación bien como importe exacto o bien como un porcentaje de la cantidad total del importe de la oferta. function CambioEstado(estado): Función para modificar el estado de un hito de planificación. Cuando se desea cambiar su estado aparece una ventana en la se deberá insertar un comentario del cambio y aceptar, o bien cancelar la operación. function SolicitarPedido(): Función para solicitar un pedido. Cuando se solicita dar de alta un nuevo pedido aparece una ventana en la que deberemos introducir el comentario y aceptar o bien cancelar la operación. function AutorizarPedido(idpedido): Función para autorizar un pedido pendiente de aprobación. function AsignarPedido(idpedido,idpersonal): Función que se invoca cuando se asigna un pedido a un recurso, aparece una ventana para insertar un comentario en el cambio de estado del pedido y aceptar o bien rechazar la modificación del estado. function CambioPersonalAsignado(parametro,idpedido): Función para aprobar el cambio de personal asignado a un pedido. Aparece una ventana donde se ha de introducir un comentario para el cambio y aceptar o bien rechazar el cambio. function HitoInterno(): Función que hace visibles la capa de los hitos de gestión cuando se desea introducir un hito de este tipo. function AsignarTarea(codigo): Función para asignar una tarea a un recurso, aparece una ventada en donde se indica que la tarea del proyecto en cuestión se le va a asignar al recurso, da la opción de confirmar o rechazar. function TablaTareasPlan(idoferta): Función para modificar la tabla de tareas de planificación, este formulario es dinámico, esta es la función para modificar el número de filas en la tabla de tareas. function EconomicaPersonal(coste): Función que calcula el coste total de recursos humanos de un proyecto. function CalcularCosteHora(i,j,costehora): Función para calcular el coste hora. Esta función es invocada en el formulario de insertar valoración económica. De manera que cada vez que se insertan las horas que dedicará un recurso a una tarea se invoca a esta función que calcula el coste total aportado al proyecto por ese recurso. En esta función se invocan otras dos funciones que actualizan los totales parciales de la tarea y totales de la valoración económica que se ven afectados por este incremento de coste. Las funciones invocadas son: SubtotalPersonalDietaTarea(i);

Page 54: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 74 de 265

SumaRecursosTotal(); function SubtotalPersonalDietaTarea(i): Función que calcula el subtotal de dietas tareas y viajes, estos gastos se agrupan en una única subcategoría ya que se les aplicará el mismo margen para calcular las ventas. Esta función a su vez invoca a la función SumaCostePersonalDiet(). function SumaRecursosTotal(): Función para sumar el coste total de los recursos, suma de los subtotales de cada tarea y modifica el total. function SumaRecurrentesTotal(): Función para sumar los costes totales de material recurrente, es invocada cuando se produce una variación en estos costes. Se invoca al función para que sume el total de los costes, ya que modifica el valor de estos. La función invocada es:

SumaTotal().

function SumaNORecurrentesTotal(): Función que calcula el subtotal de los costes de material no recurrente, esta función es invocada cada vez que se modifica algún registro de estos costes. Esta función invoca a la función que calcula el coste total ya que su valor será modificado. La función invocada es:

SumaTotal()

function SumaSubcontratacionTotal(): Función que calcula el subtotal de los costes de subcontratación. Esta función es invocada cuando se modifica algún coste de este tipo en el formulario de valoración económica y dinámicamente modifica el valor del subtotal. Como en los casos anteriores, también se hace la llamada a la función de la suma total para modificar el coste total del proyecto. La función invocada desde esta función es: SumaTotal(). function SumaDietasTotal(): Función que calcula el total de los gastos de dietas esta función es invocada cuando se introduce o modifica un registro de este tipo de costes. Desde esta función se invoca a la siguiente función: SumaTotal(). function SumaCosteRecurrente(): Función para sumar los costes recurrentes. Esta función actualiza el subtotal de esta categoría de gastos. Desde esta función se invoca a la función para modificar el total de los costes. La función invocada es: SumaTotal(). function SumaCosteNORecurrente(): Función para sumar los costes no recurrentes. Esta función actualiza el subtotal de esta categoría de gastos. Desde esta función se invoca a la función para modificar el total de los costes. La función invocada es: SumaTotal().

Page 55: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 75 de 265

function SumaCostePersonalDiet():Esta función actualiza el subtotal de esta categoría de gastos. Desde esta función se invoca a la función para modificar el total de los costes. La función invocada es: SumaTotal(). function SumaTotal(): Función que actualiza el total de los costes de una oferta. Esta función es invocada desde las distintas funciones que actualizan los registros de cada uno de los gastos. Esta función a su vez invoca a la función para calcular las ventas totales y calcular el margen bruto de la oferta. La función invocada es: VentaTotalTotal(). function VentaTotalTotal(): Función que calcula las ventas totales de la oferta, según los márgenes elegidos. Desde esta función se invoca la función para calcular el margen bruto: MargenBruto(). function MargenBruto(): Función que calcula el margen bruto de las ventas totales de una oferta. Esta función es invocada desde la función calcula ventas totales. function VerCronograma(IDOferta): Función para visualizar el cronograma de las tareas de una oferta. Esta función abre una nueva ventana donde se puede visualizar la tareas. function ModificarValoracion(IDOferta): Función invocada al pulsar le botón para modificar la valoración económica, permite cambiar los gastos asociados a una oferta. function OfertaRealizada(idoferta): Función para validar el cambio de estado de una oferta a realizada, aparece una ventana en la que se debe anotar una breve descripción del motivo del cambio y aceptar. También existe la posibilidad de cancelar la operación. function OfertaComitada(idoferta): Función para validar el cambio de estado de una oferta a revisada por comité, aparece una ventana en la que se debe anotar una breve descripción del motivo del cambio y aceptar. También existe la posibilidad de cancelar la operación. function OfertaPresentada(idoferta): Función para validar el cambio de estado de una oferta a presentada al cliente, aparece una ventana en la que se debe anotar una breve descripción del motivo del cambio y aceptar. También existe la posibilidad de cancelar la operación. function OfertaAceptada(idoferta): Función para validar el cambio de estado de una oferta a aceptada por el cliente, aparece una ventana en la que se debe anotar una breve descripción del motivo del cambio y aceptar. También existe la posibilidad de cancelar la operación.

Page 56: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 76 de 265

function OfertaRechazada(idoferta): Función para validar el cambio de estado de una oferta a rechazada por el cliente, aparece una ventana en la que se debe anotar una breve descripción del motivo del cambio y aceptar. También existe la posibilidad de cancelar la operación. function adicionarFilaRecurrente(i): Función para adicionar un fila en un tarea en la categoría de gastos recurrentes. Se crea una nueva fila de la tabla. Cada tarea en esta categoría de gastos tiene una tabla dinámica, esta es la función que nos permite añadir una nueva fila para rellenar. Desde esta función cuando se rellena alguno de sus campos se invoca a la función que actualiza el subtotal de estos gastos de la tarea. También se invoca a la función para borrar una fila de gastos recurrentes Las funciones invocadas son:

function SubtotalRec(cont.value,i) function borrarFilaRecurrente(this,i)

function borrarFilaRecurrente(button,i): Función para borrar una fila de una tarea en la categoría de gastos recurrentes. Se modifica el valor del subtotal del gasto de esta tarea. function SubtotalRec(cont,i): Función que modifica el gasto subtotal recurrente de cada tarea. Esta función invoca a las funciones que calculan los totales a los que afecta. Se invoca a las siguientes funciones:

SumaRecurrentesTotal() SumaCosteRecurrente() CambioMargen(). function adicionarFilaNORecurrente(i): Función para adicionar un fila en un tarea en la categoría de gastos no recurrentes. Se crea una nueva fila de la tabla. Cada tarea en esta categoría de gastos tiene una tabla dinámica, esta es la función que nos permite añadir una nueva fila para rellenar. Desde esta función cuando se rellena alguno de sus campos se invoca a la función que actualiza el subtotal de estos gastos de la tarea. También se invoca a la función para borrar una fila de gastos recurrentes Las funciones invocadas son:

function SubtotalNORec(cont.value,i) function borrarFilaNORecurrente(this,i).

function borrarFilaNORecurrente(button,i): Función para borrar una fila de una tarea en la categoría de gastos no recurrentes. Se modifica el valor del subtotal del gasto de esta tarea. function SubtotalNORec(cont,i): Función que modifica el gasto subtotal no recurrente de cada tarea. Esta función invoca a las funciones que calculan los totales a los que afecta. Se invoca a las siguientes funciones:

SumNORecurrentesTotal() SumaCosteNORecurrente() CambioMargen().

Page 57: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 77 de 265

function adicionarFilaSubcontratacion(i): Función para adicionar un fila en un tarea en la categoría de gastos de subcontratación. Se crea una nueva fila de la tabla. Cada tarea en esta categoría de gastos tiene una tabla dinámica, esta es la función que nos permite añadir una nueva fila para rellenar. Desde esta función cuando se rellena alguno de sus campos se invoca a la función que actualiza el subtotal de estos gastos de la tarea. También se invoca a la función para borrar una fila de gastos recurrentes Las funciones invocadas son:

function SubtotalSub(cont.value,i) function borrarFilaSub(this,i).

function borrarFilaSubcontratacion(button,i): Función para borrar una fila de una tarea en la categoría de gastos de subcontratación. Se modifica el valor del subtotal del gasto de esta tarea. function SubtotalSub(cont,i): Función que modifica el gasto subtotal de subcontratación de cada tarea. Esta función invoca a las funciones que calculan los totales a los que afecta. Se invoca a las siguientes funciones: SubtotalPersonalDietaTarea(i)

SumaSubcontratacionTotal() SumaCosteSub() CambioMargen(). function adicionarFilaDietas(i): Función para adicionar un fila en un tarea en la categoría de gastos de dietas y viajes. Se crea una nueva fila de la tabla. Cada tarea en esta categoría de gastos tiene una tabla dinámica, esta es la función que nos permite añadir una nueva fila para rellenar. Desde esta función cuando se rellena alguno de sus campos se invoca a la función que actualiza el subtotal de estos gastos de la tarea. También se invoca a la función para borrar una fila de gastos de dietas y viajes Las funciones invocadas son:

function SubtotalDie(cont.value,i) function borrarFilaDietas(this,i).

function borrarFilaDietas(button,i): Función para borrar una fila de una tarea en la categoría de gastos de dietas y viajes. Se modifica el valor del subtotal del gasto de esta tarea. function SubtotalDie(cont,i): Función que modifica el gasto subtotal de dietas y viajes de cada tarea. Esta función invoca a las funciones que calculan los totales a los que afecta. Se invoca a las siguientes funciones: SubtotalPersonalDietaTarea(i)

SumaDietasTotal() CambioMargen(). function CambioRec(): Función invocada cuando se modifica el margen de las ventas recurrentes. Hace un cambio en campo de subtotal de ventas recurrentes del formulario.

Page 58: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 78 de 265

function CambioNoRec():Función invocada cuando se modifica el margen de las ventas no recurrentes. Hace un cambio en campo de subtotal de ventas no recurrentes del formulario. function CambioPSD():Función invocada cuando se modifica el margen de las ventas de dietas, subcontratación y recursos humanos. Hace un cambio en campo de subtotal de ventas de subcontratación, recursos humanos y dietas y viajes del formulario. function CambioMargen(): Función invocada cuando se produce alguna variación en algún margen. Esta función invoca a las siguientes funciones: CambioRec() CambioNoRec() CambioPSD()

Page 59: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 79 de 265

12.4. Paginas Diseñadas En este apartado se explicaran las páginas diseñadas para la aplicación. Se explicará las partes más interesantes del código desarrollado en dicha página. Las páginas programadas como formulario tienen detrás otra página para ejecutar las consultas con los campos rellenados previamente en el formulario. La nomenclatura seguida es llamar al formulario “pagina_form.php” y a la página en la que se ejecutan las consultas la cual no es visible para el usuario “pagina_cod.php”.

12.4.1 Inicio

Ilustración 28: Vista página de inicio de la aplicación. En esta primera página de inicio es en la que el usuario se debe logar. Las funciones más importantes de esta página son: function autoriza(): Función que recoge los valores introducidos en nuestro formulario y comprueba mediante un acceso a la base de datos alojada en le servidor si estos datos son correctos, si es así permite el paso a la aplicación, si no es así se muestra un mesa de error y se redirecciona a otra página que no pertenece a la aplicación. En esta página se inicia la variable de sesión, es decir se indica el tiempo máximo que permanece una página abierta sin hacer ninguna modificación sin tener que volver a

Page 60: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 80 de 265

logarte, pasado este tiempo al intentar cambiar de página sale un error de sesión ha caducado. Vuelva a logarse. A continuación se muestran las líneas de código más interesantes a destacar: $sw=0;

session_start(); $t=md5($_SESSION["t_parcial"] .getenv("REMOTE_ADDR")); $_SESSION["tiempo"]=1200; $enlace1=mysql_connect("localhost","root","0209"); mysql_select_db("mayte"); $consulta="select * from t_usuarios"; $resultado=mysql_query($consulta,$enlace1); while($row=mysql_fetch_array($resultado)){ if($_POST["i1"]==$row['Login'] && md5($row['Password'].$t)==$_POST["i2"]) { $usu=$row['IDUsuarios']; $consulta1="select * from personal where IDUsuarios='$usu'"; $resultado1=mysql_query($consulta1,$enlace1); $row1=mysql_fetch_array($resultado1); $_SESSION["usuario"]=$row1['IDPersonal']; $sw=1;

?> <script language="javascript" type="text/javascript"> window.location.href = "../gpt/Ofertas_Inicio.php"; </script> <?php } } if($sw==0)

{ /* no estamos autorizados nos redirecciona a otra página ajena a la aplicación*/ session_unset(); session_destroy();

?> <script language="javascript" type="text/javascript"> alert("Usuario o Contraseña incorrectos, intentalo de nuevo"); window.location.href = "inicio.php"; </script> <?php } }

Page 61: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 81 de 265

12.4.2 Consultar Oferta:

Ilustración 29: Vista formulario consultar una oferta. En este formulario los usuarios podrán consultar las distintas ofertas que se encuentran en la aplicación. Este formulario nos permite hacer consultas muy variadas desde introduciendo el nombre de la oferta, introduciendo su código, su estado, el comercial que dio de alta la nueva oportunidad, o bien el área al que pertenece la oferta. Se pueden consultas introduciendo distintos varios criterios de búsqueda. En cuanto a la programación de la página, se hacen varias consultas a la base datos para los menús desplegables, tanto en estado, comercial, y área. A continuación se muestra la codificación del desplegable estado: <?php $consulta2="select * from estadooferta"; $resultado2=mysql_query($consulta2,$enlace); ?> <select name="EstadoOferta" id="EstadoOferta" style="visibility:visible " > <option value="<?php echo $row1['IDEstadoOferta'];?>"><?php echo $row1['EstadoOferta'];?></option> <?php

while($row2=mysql_fetch_array($resultado2)) {

if($row1['EstadoOferta']!=$row2['EstadoOferta']) {

Page 62: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 82 de 265

?> <option value="<?php echo $row2['IDEstadoOferta'];?>"><?php echo $row2['EstadoOferta'];?> </option> <?php } } mysql_free_result($resultado2); ?> </select> Una vez seleccionados los campos para efectuar la consulta la siguiente página que se carga al pulsar el botón de buscar es Consultar_Oferta_cod.php. En esta página se hace una llamada al método ConsultarOferta. A continuación se muestra como se efectúa esta llamada:

$b=new Oferta; $a=$b->ConsultarOferta(); El resultado se muestra en una tabla, en este caso en particular la página cod sí es visible para el usuario. La vista es la que se muestra en la imagen siguiente:

Ilustración 30: Listado de las ofertas consultadas según el criterio de búsqueda. En este caso se han buscado las ofertas que se encontraban en el estado de En realización. En esta página se podrá acceder a la información de la oferta haciendo doble click en el icono de la izquierda de cada oferta. De esta manera saltaremos a la página ver oferta.

Page 63: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 83 de 265

12.4.3 Ver Oferta:

Ilustración 31: Vista general de una oferta. En esta página se visualiza la parte genérica de los datos de la oferta. Lo más destacable en esta página es que según sea la persona que consulta la página no solo tendrá acceso a las distintas páginas de la oferta (menú superior, Valoración Económica, Hitos Planificación, Hitos Facturación, Historia de cambios, Documentos Oferta), sino que además podrá modificar el estado de la oferta. Oferta Realizada: Cuando el usuario que entra en esta página es el responsable del área técnica a quien pertenece la oferta, una vez haya introducido los datos de planificación, valoración económica, facturación y documentos podrá pasar la oferta a pendiente de comité pulsando el botón de oferta realizada. En la figura anterior el botón está disabled, es decir desactivado, solo se activa si se han rellenado todos los datos, la valoración económica en ventas coincide con el total a facturar y el usuario es el responsable de área, en este caso de la figura del área I+D. A continuación se verá la navegación desde esta página al resto del menú superior.

Page 64: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 84 de 265

12.4.4 Valoración Económica

Ilustración 32: Insertar tareas para el cálculo de la valoración económica de la oferta. En este caso hemos entrado en la valoración económica desde un perfil que no nos permite hacer modificaciones. Como se puede apreciar al entrar en la valoración económica lo primero que se debe hacer es insertar las tareas de planificación. Una vez insertadas por el responsable de área competente se pulsará el botón de Calcular valoración económica. Esta página se ha diseñado utilizando funciones dinámicas, es decir JavaScript. Se ha utilizado este lenguaje ya que los elementos que componen la página son totalmente dinámicos del lado del cliente. Cada vez que pulsemos añadir tarea aparece automáticamente una nueva fila con los mismo campos que la anterior a rellenar. Otra característica importante a destacar es el campo de T0, este campo toma como valor por defecto 0, pero si sabemos la fecha de inicio, modificando este campo automáticamente las semanas de inicio y fin se desplazan consecuentemente a esta nueva fecha de inicio. A continuación se muestra una imagen del relleno de la aplicación:

Page 65: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 85 de 265

Ilustración 33: Formulario de tareas relleno. Como se puede apreciar, hemos modificado el inicio a la semana 12 y se han desplazado consecuentemente las semanas, al insertar una tarea a aparecido una nueve fila de la tabla. Este tipo de diseño se conoce como programación de tablas dinámicas. Como se ha comentado anteriormente dado que la información solo pertenece la lado cliente hasta que no se validan las tareas se programa utilizado JavaScript. Al pulsar calcular valoración económica la aplicación se redirecciona a un nuevo formulario donde se ingresaran los datos de los costes y ventas de la oferta. Previamente se pasa por la página InsertarTarea_cod, donde se introducen los datos de las tareas definidas en la tabla de la base de datos. Las funciones principales de esta página son: $numero=$_POST['filas']; $tarea->IDOferta=$_POST['idoferta']; for ($j=1;$j<=$numero;$j++) { $Descripcion=$_POST['descripcion'.$j]; $FechaIni=$_POST['FechaINI'.$j]; $FechaFin=$_POST['FechaFIN'.$j]; $tarea->InsertarTarea($tarea->IDOferta,$Descripcion,$FechaIni,$FechaFin); } Una vez rellenas la tareas e introducidos los valores en la base de datos, aparece el formulario para el cálculo de la valoración económica.

Page 66: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 86 de 265

Ilustración 34: Formulario valoración económica para rellenar. Esta es la imagen del formulario para insertar los costes y el margen que se quiera aplicar a las ventas. Esta página también lleva un alto contenido en código JavaScript, ya que los gastos recurrentes, no recurrentes de subcontratación y de dietas y viajes de cada tarea se recogen en una tabla dinámica, cada vez que se pulsa le botón de insertar nuevo gasto aparece una nueva fila en la aplicación en ese gasto, tal y como se muestra en la figura:

Ilustración 35: Ejemplo de cómo surge una nueva fila al pulsar el botón de nuevo gasto.

Page 67: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 87 de 265

A continuación se muestra un ejemplo de relleno de un formulario de este tipo:

Ilustración 36: Ejemplo de relleno de datos en el formulario de valoración económica. En la imagen se muestran los datos contemplados en la aplicación. A continuación se explicarán cada uno de los gastos: Gastos Recursos humanos:

Ilustración 37: Ejemplo de gastos de recursos humanos.

Page 68: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 88 de 265

En esta parte de la valoración económica, insertamos el coste indirecto que es un porcentaje utilizado para calcular el coste por horas, a continuación se introducen las horas que cada tipo de recurso destinará al proyecto. Automáticamente se invocan a las funciones JavaScript que calculan el coste total tendiendo en cuenta estos datos, también se invocan las llamadas de CosteTotal, VentaTotal y Margen. El tratamiento de los gastos recurrentes, no recurrentes, de subcontratación y de dietas y viajes es similar. Por eso se explicarán conjuntamente. Cuando se pulsa el botón se Nuevo Gasto aparece una nueva fila, en esta fila se inserta el concepto y el importe. Al modificar el importe automáticamente se invocan las funciones en JavaScript que se encargan de calcular el subtotal de la tarea, el subtotal de los gastos de este tipo, el coste total, la venta total y el cálculo del margen bruto.

Page 69: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 89 de 265

Como se puede observar en la siguiente figura se recogen por último los gastos agrupados por tareas y por tipología. Las ventas que se obtienen aplicando el margen de cada tipo. Y por último el margen bruto total calculado. De esta manera, modificando costes y márgenes con esta aplicación no solo se introducirán datos, sino que por su diseño constituye una herramienta que se puede utilizar para recalcular costes hasta que obtengamos el resultado de las ventas a presentar al cliente.

Page 70: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 90 de 265

Ilustración 38: Resumen de costes y ventas de la valoración económica. Otra de las características de esta página es la visualización del cronograma, al pulsar este botón se abre una nueva ventana con la imagen del cronograma:

Ilustración 39: Cronograma de tareas.

Page 71: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 91 de 265

Una vez aprobada la valoración a insertar se redirecciona a la página Insertar_Valoracion_Economica_cod.php. Página donde se interacciona con la base de datos para introducir todos los datos de la valoración de la oferta. En esta página el código a destacar es el que sigue: $tareaplan=new TareaPlan; $costein=$_POST['cindirect']; $num=$_POST['i']; $num++; $i=0; for($i=1;$i<$num;$i++) { $IDTareaPlan=$_POST['idtareaplan'.$i]; $tareaplan->tipo1=$_POST['horatipo1tarea'.$i]; $tareaplan->tipo2=$_POST['horatipo2tarea'.$i]; $tareaplan->tipo3=$_POST['horatipo3tarea'.$i]; $tareaplan->tipo4=$_POST['horatipo4tarea'.$i]; $tareaplan->tipo5=$_POST['horatipo5tarea'.$i]; $tareaplan->CosteRecursos($IDTareaPlan,$costein,$tareaplan->tipo1,$tareaplan->tipo2,$tareaplan->tipo3,$tareaplan->tipo4,$tareaplan->tipo5); $numrec=$_POST['contREC'.$i]; $numnorec=$_POST['contNOREC'.$i]; $numsub=$_POST['contSUB'.$i]; $numdie=$_POST['contDIE'.$i]; $numrec++; $numsub++; $numdie++;

$numnorec++; for($j=1;$j<$numrec;$j++) { $coste++; $descripcion++; $coste=$_POST['costeREC'.$j.$i]; $descripcion=$_POST['descripcionREC'.$j.$i]; $tabla="recurrentes"; $tareaplan->InsertarGasto($tabla,$IDTareaPlan,$coste,$descripcion); } for($j=1;$j<$numnorec;$j++) { $coste=$_POST['costeNOREC'.$j.$i]; $descripcion=$_POST['descripcionNOREC'.$j.$i]; $tabla="norecurrente"; $tareaplan->InsertarGasto($tabla,$IDTareaPlan,$coste,$descripcion); } for($j=1;$j<$numsub;$j++) { $coste=$_POST['costeSUB'.$j.$i]; $descripcion=$_POST['descripcionSUB'.$j.$i]; $tabla="subcontratacion";

Page 72: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 92 de 265

$tareaplan->InsertarGasto($tabla,$IDTareaPlan,$coste,$descripcion); } for($j=1;$j<$numdie;$j++) { $coste=$_POST['costeDIE'.$j.$i]; $descripcion=$_POST['descripcionDIE'.$j.$i]; $tabla="dietastarea"; $tareaplan->InsertarGasto($tabla,$IDTareaPlan,$coste,$descripcion); } } $Valoracion=new ValoracionEconomica; $Valoracion->InsertarValoracion($IDOferta);

12.4.5 Hitos Planificación Esta parte de la aplicación consta de una primar página en la que se muestran los hitos de planificación que contiene la oferta.

Ilustración 40: Vista de hitos de planificación asociados a la oferta. En este caso hemos introducido un nuevo hito. Si se desea introducir más hitos al pulsar el botón de “Insertar Nuevo Hito”, la aplicación nos redirecciona a la página Insertar_Hito_Planicficacion_form.php. El formulario de vista general no solo nos permite visualizar e introducir nuevos datos, sino que también nos permite eliminar hitos. Esta página es un formulario a rellenar, nos permite introducir varios hitos al mismo tiempo si son periódicos y sabemos la periodicidad que tienen. O bien añadir hitos simples. Esta página contiene varios menús desplegables, solo uno es visible durante todo el tiempo. El menú desplegable del tipo de hito, haciendo una consulta a la base de datos a

Page 73: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 93 de 265

la tabla que contiene los distintos tipos hitos permitidos. Si el hito es interno, esta clase de hitos está contemplada y tipificada en otra tabla. Por último el último menú desplegable es el de la periodicidad, se ha insertado como valores posibles periodicidad mensual, bimensual, trimestral, cuatrimestral, semestral y anual. A continuación se muestra una figura ejemplo de introducción de datos.

Ilustración 41: Vista formulario para la inserción de hitos de planificación. El código a destacar de esta página es el que se muestra a continuación: Botón desplegable para los criterios de periodicidad. <select name="peri" class="calendar"> <option value="0"> </option> <option value="30">Mensual</option> <option value="60">Bimensual</option> <option value="90">Trimestral</option> <option value="120">Cuatrimestral</option> <option value="180">Semestral</option> <option value="365">Anual</option> </select> Botón calendario, muy utilizado en muchas páginas: <script type="text/javascript" src="../general/calendario/calendar-setup.js"></script> <input name="fecha_hito" id="<?php echo $date;?>" value="<?php echo $row10['Fecha'];?>" size="15" > <input name="button" type="button" id="<?php echo $lanzador;?>" value="..." /> <script type="text/javascript"> Calendar.setup({ inputField : "<?php echo $date;?>", ifFormat : "%Y/%m/%d", button : "<?php echo $lanzador

Page 74: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 94 de 265

}); </script> Botón de los tipos de hitos: <?php $consulta1="select * from tipohitoplanificacion where IDTipo='".$row1['IDTipo']."'"; $resultado1=mysql_query($consulta1,$enlace); $row1=mysql_fetch_array($resultado1); $consulta2="select * from tipohitoplanificacion"; $resultado2=mysql_query($consulta2,$enlace); ?> <select name="Tipo" id="Tipo" onChange="HitoInterno()" class="calendar">

<option value="<?php echo $row1['IDTipo'];?>"><?php echo $row1['Tipo'];?> </option>

<?php while($row2=mysql_fetch_array($resultado2)) { if($row1['Tipo']!=$row2['Tipo'])

{ ?>

<option value="<?php echo $row2['IDTipo'];?>"><?php echo $row2['Tipo'];?> </option>

<?php } } mysql_free_result($resultado2); ?> Una vez que se tienen todos los datos de los hitos de planificación al pulsar el botón de aceptar la aplicación se redirecciona a la página Insertar_Hito_planificacion_cod.php. En esta página como en casos anteriores, no es visible para el usuario. En esta página se accede a la base de datos remota y se introducen los datos de los nuevos hitos. El código más destacable de esta última página es: <body> <?php $hito=new HitoPlan; $hito->IDOferta=$_POST['oferta']; $hito->InsertarHitoPlan($hito->IDOferta); ?> Una vez insertados los valores en la página, la aplicación se redirecciona automáticamente a la página de vista general de la oferta. <script type="text/javascript"> window.location.href = "menu.php?id=7&IDOferta=<?php echo $hito->IDOferta;?>"; </script> </body>

Page 75: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 95 de 265

12.4.6 Hitos Facturación El diseño de este apartado de la aplicación tiene un tratamiento muy similar al de los hitos de planificación. La primera página es una página de vista general, en esta página se visualizan los hitos de facturación que existen asociados a la oferta. Además se muestran los datos insertados en la valoración económica, en concreto se muestra el total, ya que es muy importante que los hitos de facturación en su total concuerden con la venta de la valoración económica. Si estas cantidades no coinciden no se podrá pasar la oferta a realizada. A continuación se muestra un ejemplo de la vista de esta primera página.

Ilustración 42: Vista de los hitos de facturación pertenecientes a una oferta. La opción que se tiene en esta primera página es la de insertar hitos de facturación. Cabe destacar que el botón para insertar un nuevo hito sólo está activo cuando quien consulta esta página es el responsable de área, del área técnica de la oferta. Es decir el usuario que debe introducir/modificar estos datos. Para el resto de usuarios sólo tienen acceso a la consulta. Esto se consigue con el siguiente código: Condición:: $condicionR=0; if ($listar->IDEstado==1) { if($Perfil==4) { if ($IDAreaOferta==$IDArea)

Page 76: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 96 de 265

{ $condicionR=1; } } } Lo que hace que le botón se active o desactive, la codificación es la que sigue: <input name='submit' type="button" onClick='InsertarNuevoHitoFact(<?php echo $parametro; ?>)' value='Insertar Nuevo Hito' <?php if ($condicionR==0) {?> disabled="disabled" <?php } ?> > Cuando el usuario que tiene el permiso inserta un nuevo hito de facturación, la aplicación le redirige a la página Insertar_Hito_Fact_form.php. La vista general de esta página se muestra a continuación:

Ilustración 43: Formulario para insertar un hito de facturación. En esta ocasión y dado que este formulario es análogo al de planificación, en la figura se muestra cómo se inserta un hito múltiple. La manera de introducir los datos es similar a si fuera simple, la única salvedad reside en que aparecen el campo de número de hitos y la periodicidad. Cabe destacar dentro de este formulario la posibilidad de introducir el importe del hito a facturar bien en importe o bien como un porcentaje de las ventas anteriormente introducidas en la valoración. El código de consultas y menús desplegables es totalmente análogo al de los hitos de planificación.

Page 77: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 97 de 265

Cuando aceptamos los hitos a introducir, una vez pulsado el botón de aceptar la aplicación se redirecciona a la página en donde se cargan todos los datos del formulario en la base de datos remota. Como ya se ha mencionado con anterioridad esta página Insertar_Hitos_Fact_cod.php es transparente al usuario. El código en esta página es análogo a su homólogo en el tratamiento de los hitos de planificación. El código desarrollado: <?php $insertar= new HitoFact; $insertar->Oferta=$_POST['oferta']; $insertar->InsertarHitoFact($insertar->Oferta); ?> Como se aprecia en le código, se define la variable insertar como un objeto de la clase HitoFact, y se invoca al método InsertarHitoFact(), método explicado en el apartado Definición de Clases del presente documento.

12.4.7 Historia de Cambios Esta parte de la aplicación se utiliza para visualizar los distintos cambios que ha sufrido una oferta en todo su ciclo de vida, así como los comentarios insertados.

Ilustración 44. Vista general de la Historia de cambios de la oferta. Como se puede apreciar se almacenan los cambios de estado así como los datos del usuario que han provocado dicho cambio de estado.

Page 78: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 98 de 265

Esta página es sólo de consulta para todos los usuarios, es decir no tiene ningún tipo de interacción. La parte más destacable del código es: $listar=new Oferta; $listar->VerOferta($listar->IDOferta); $historial=$listar->HistoriaCambios($listar->IDOferta); Con este simple código se accede a la información que se muestra en esta página.

12.4.8 Documento Oferta En este apartado de la aplicación se suben al servidor los documentos relacionados con la oferta, tales como documento oferta, etc..., podemos subir todos los que queramos. Se ha diseñado el código para que los documentos se almacenen en el servidor en una carpeta que se crea con el código de la oferta, esta carpeta se creará en el servidor la primera vez que se suba un documento relacionado con la oferta. El resto de los documentos de la misma oferta se almacenarán en el directorio. Para conseguir esto se crea una carpeta para este tipo de archivos con los permisos de escritura y lectura para todos los usuarios, con la aplicación se controlará quien tiene permiso para subir documentos. En este caso, al igual que en las anteriores páginas el permiso para subir documentos sólo lo tiene el responsable de área, encargado de esta labor. Una primera vista de esta página:

Ilustración 45: Formulario de documento oferta. El botón UploadFile, sólo estará habilitado como en casos anteriores para el responsable de área. Una vez seleccionado el archivo a subir el usuario ha de pulsar dicho botón. La aplicación se redirecciona a la página Upload.php. Es esta página se sube el archivo al servidor. El código más reseñable de esta página: Tomamos los datos que llegan del formulario, <?php

Page 79: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 99 de 265

$IDOferta=$_POST['IDOferta']; $Descripcion=$_POST['descripcion']; echo $IDOferta; $status = ""; if ($_POST["action"] == "upload") Obtenemos los datos del archivo { $tamano = $_FILES["archivo"]['size']; $tipo = $_FILES["archivo"]['type']; $archivo = $_FILES["archivo"]['name']; $prefijo = substr(md5(uniqid(rand())),0,6); $enlace=mysql_connect("localhost","root","0209"); mysql_select_db("mayte"); $consulta1="insert into documentooferta (IDOferta,Descripcion,Nombre,Tipo)values('$IDOferta','$Descripcion','$archivo','$tipo' )"; mysql_query($consulta1,$enlace)or die(mysql_error()); if ($archivo != "") { Consultamos si el directorio existe $existe=is_dir("../../tmp/".$IDOferta.""); Si no existe, lo creamos if(!$existe) { mkdir("../../tmp/".$IDOferta."", 0700); } Si existe no lo creamos, simplemente subimos el archivo, calculamos la ruta, $dir="../../tmp/".$IDOferta.""; $destino = "".$dir."/".$archivo; if (copy($_FILES['archivo']['tmp_name'],$destino)) { $status = "Archivo subido: <b>".$archivo."</b>"; } else { $status = "Error al subir el archivo"; } } else { $status = "Error al subir archivo"; } } De esta manera hemos creado la carpeta donde se almacenará el documento y se copia el archivo en el directorio destino.

Page 80: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Capítulo 3: Memoria de Cálculo

Página 100 de 265

12.4.9 Nueva Oferta Esta página de la aplicación sólo será accesible para aquellos usuarios que tengan un perfil de comercial, son estos los encargados de dar de alta las nuevas oportunidades. La siguiente figura muestra el formulario a rellenar que aparece en la página Nueva_Oferta_form.php.

Ilustración 46: Formulario para dar de alta una nueva oferta. En este formulario el usuario ha de rellenar los datos generales que almacenará la oferta. A continuación se muestra un ejemplo de relleno.

Ilustración 47: Ejemplo de relleno de datos de una nueva oferta.

Page 81: Proyecto Fin de Carrerabibing.us.es/proyectos/abreproy/11718/fichero/PFC... · Con este primer boceto se pretende tener una idea de los datos que se han de almacenar en nuestra base

Proyecto Fin de Carrera

Página 101 de 265

Cuando los datos están insertados en el formulario se pulsa el botón Nueva Oferta y aparece una ventana donde se indica que se inserte un comentario de esta nueva oferta, es este comentario donde se puede especificar si la oferta es urgente o si hay que tener especial cuidado con algo. Este comentario podrá ser visualizado en la historia de cambios de la oferta.

Ilustración 48: Proceso de alta de una nueva oferta. Una vez dada de alta la oferta se cargará una página totalmente transparente para el usuario, Nueva_Oferta_cod.php, es este página donde se establece el diálogo con la base de datos para insertar los datos. Con este simple código se introducen los datos en la base de datos: <body> <?php $enlace=mysql_connect("localhost","root","0209"); mysql_select_db("mayte"); $b=new Oferta; $a=$b->NuevaOferta(); ?> </body> En este código se crea una variable de la clase Oferta e invocando al método NuevaOferta() de esta clase ya se han introducido los datos.