<div style="text-align: center"> Universidad de Costa Rica. Escuela de Computación. CI-0113 Programación II<br> 2018a. Grupo 05. <b>Examen 03</b> [20-Jul-2018]. Profesor <a href="mailto:jeisson.hidalgo@ucr.ac.cr">Jeisson Hidalgo-Céspedes</a>. </div> # Rastreo de activos Las organizaciones llevan el control de los activos que poseen. Cada vez que ocurre un evento con un activo, se genera un documento llamado *acta*. Con el apoyo de tecnología, las actas son digitales, es decir, registros (bitácoras) en archivos o bases de datos. Una bitácora en un archivo de texto podría tener la siguiente forma: **Ejemplo de entrada**: ingresado 9806 27/04/11 Pedro 1000 iCon iPad-Air Biologia Pedro trasladado 9806 28/04/12 Pedro Geologia Pamela Marta ingresado 2478 04/02/07 Maria 50 OficentroChecho Escritorio Generales Ramon ingresado 1004 01/05/16 Amadeus 500 CompuCrack CPU Musica Salieri ocioso 2478 05/03/11 Maria trasladado 9806 28/04/13 Marta Medicina Pablo Pedro robado 9806 29/04/13 Pablo Agente86 Marta Vladimir Ana ocioso 1004 11/12/16 Amadeus en_uso 2478 05/03/12 Maria Sam desechado 1004 05/07/17 Amadeus deterioro Beethoven Cada línea de la bitácora contiene el acta de un evento ocurrido a un activo. Los primeros cuatro campos son comunes para todas las actas: el tipo de evento, el número de placa que identifica el activo (que siempre es un entero positivo), la fecha en que ocurrió el cambio en el activo (en formato `dd/mm/aa`), y la persona que firmó el acta. Los demás campos dependen del tipo de evento o acta. Los tipos de actas permiten rastrear los eventos ocurridos a un activo a lo largo de su estadía en la organización, como lo muestra el siguiente diagrama de estados: <p style="text-align: center"><img alt="Diagrama de estados de un activo" src="estados.svg"/></p> Los ciclos en el diagrama se deben a que es frecuente que los activos continúen en el mismo estado cuando la organización realiza inventarios. Los detalles de cada tipo de evento (o tipo de acta) se describen a continuación: 1. `ingresado`: Esta acta es la evidencia de que un activo entró al inventario de la organización, normalmente a través de un proceso de adquisición. Además de los cuatro campos comunes a toda acta, se registra el precio en dólares que costó a la organización la compra del activo, el proveedor donde se realizó la compra (por ejemplo, para efectos de garantía), el nombre del activo, la unidad a la que pertenece el activo, y el responsable a quien se asignó la custodia del activo. 2. `en_uso`: Esta acta se registra cuando un activo pasa a tener el uso para el cual fue adquirido, después de un estado anterior en que no estaba en uso. Por ejemplo, cuando el activo *ingresa* a la organización lo puede hacer en la Oficina de Suministros donde no se le da el uso pretendido aún, sino que cambia a este estado cuando llega al departamento que le da el uso y una persona lo pone en operación. Después de de los cuatro datos comunes a cada acta, se registra la nueva persona responsable del activo. 3. `ocioso`: Esta acta se genera cuando el activo es almacenado por la unidad que lo custodia y no será utilizado mientras se mantenga en este estado. Por convención, durante este período, el responsable del activo es `"bodega"`. Esta acta no tiene campos adicionales. 4. `trasladado`: Esta acta indica que el activo fue transferido a otro departamento de la organización. Tras los cuatro datos comunes, se registra la unidad que recibe el activo, la nueva persona responsable por el activo, y la persona que atestigua el traslado. En la organización nunca se traslada un activo que no va a ser usado. 5. `robado`: Esta acta se genera cuando el activo fue robado de la organización. Se registra el nombre de una autoridad que dará seguimiento al caso. Si se tiene, se registra el nombre de las personas que fueron testigos del hecho para ayudar a la autoridad en la investigación. Tras este evento, el activo ya no puede ser usado y por tanto, no deberán aparecer más actas del mismo en la bitácora. 6. `desechado`: El activo fue desechado permanentemente. Se indica la razón, usualmente porque el activo acabó su vida útil (deterioro, vencimiento). Además se registra el nombre del experto quien determinó que el activo debía desecharse. Tras este evento, el activo no puede ser usado y no se generarán más actas sobre el activo en la bitácora. Las bitácoras son muy útiles porque permiten rastrear un activo y conocer los eventos que ayudan a explicar fenómenos o tomar decisiones. Sin embargo, en la organización las bitácoras en papel están descentralizadas y levantar un rastreo de un activo es un trabajo arduo y muy propenso de errores para la persona encargada de esta labor. Por tanto, se quiere un programa informático que cargue una bitácora de actas como la presentada en el ejemplo de entrada, y para cada activo imprima su rastro de eventos con el siguiente formato: **Ejemplo de salida**: Placa 1004: CPU desechado en Musica a cargo de bodega 1. Ingreso a Musica el 01-may-16. Comprado a CompuCrack por $500. Salieri responsable. Firma Amadeus 2. Ocioso el 11-dic-16. Firma Amadeus 3. Desechado el 05-jul-17 por deterioro. Dictaminado por Beethoven. Firma Amadeus Placa 2478: Escritorio en_uso en Generales a cargo de Sam 1. Ingreso a Generales el 04-feb-07. Comprado a OficentroChecho por $50. Ramon responsable. Firma Maria 2. Ocioso el 05-mar-11. Firma Maria 3. En uso el 05-mar-12 a cargo de Sam. Firma Maria Placa 9806: iPad-Air robado en Medicina a cargo de Pablo 1. Ingreso a Biologia el 27-abr-11. Comprado a iCon por $1000. Pedro responsable. Firma Pedro 2. Trasladado a Geologia el 28-abr-12. Asignado a Pamela. Marta atestigua. Firma Pedro 3. Trasladado a Medicina el 28-abr-13. Asignado a Pablo. Pedro atestigua. Firma Marta 4. Robado el 29-abr-13. Investigado por Agente86. Testigos: Marta, Vladimir, Ana. Firma: Pablo Como se observa en el ejemplo de salida los activos se deben imprimir en orden ascendente de placa. Cada activo se imprime en dos partes. La primera es una *descripción* del activo en una línea que ayuda rápidamente al usuario a conocer el estado del activo. Consta de la placa del activo, su nombre, la última unidad (departamento) de la organización y persona responsable del activo. La segunda parte en la impresión del activo es el *historial* de eventos, numerados uno por línea. Cada número en un campo de 3 espacios. El formato varía de acuerdo a cada tipo de evento (acta), como se puede ver en el ejemplo de salida. Es importante observar que los meses deben imprimirse con las primeras tres letras del mes (`ene`, `feb`, ...). Diseñe su solución para que sea fácil agregar nuevos tipos de actas en el futuro, como pérdidas de activos, activos en mantenimiento, o veredictos de robo. Se quiere en el futuro permitir búsquedas de activos por placa, por tanto, debe almacenar los activos en un contenedor que permita acceso eficiente por placa. La bitácora podría estar almacenada en un archivo cuyo nombre se indica por argumento en la línea de comandos, de lo contrario, el programa debe asumir que se lee en la entrada estándar. ## Evaluación Recuerde que en cada punto siguiente se evaluarán buenas prácticas de programación, como comentarios de código no trivial, identificadores significativos, indentación, convenciones de estilo, prácticas recomendadas de C++ (ej: `const`, `override`, `explicit`, regla de los 5), reutilización de código, y eficiencia. 1. [25%] Clase controladora. Función `main()`. Abre la bitácora desde un archivo indicado por argumento de línea de comandos o de la entrada estándar. Administra la colección de objetos modelo. Controla el cargado e impresión de los activos y sus historiales. Evita fugas de memoria. 2. [25%] Representa adecuadamente la jerarquía de modelos. Obliga desde la clase base a nuevos eventos (actas) a implementar funcionalidad requerida. Eventos (actas) se comportan polimórficamente. Implementa otras clases modelo requeridas para resolver el problema. 3. [25%] Carga modelos (actas o eventos) polimórficamente. Hace a los objetos modelo colaborar para reflejar el inventario y su historial de eventos. 4. [25%] Imprime los activos y su historial de eventos de la forma solicitada. --- Aporte de Julián Moya Zeledón, julio 2017. Adaptación de Jeisson Hidalgo, julio 2018.