# gonzaloarre/pa---lafraseinfinita architecture

> Architecture diagram of the GitHub repository gonzaloarre/pa---lafraseinfinita, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gonzaloarre/pa---lafraseinfinita
- Repository: https://github.com/gonzaloarre/pa---lafraseinfinita

## Overview

1. **Tipo de sistema**
   - Es una aplicación local de gestión de biblioteca escrita en Python.
   - El foco funcional está en administrar **socios**, **libros**, **ejemplares** y **préstamos**, con operaciones de alta, modificación, baja y devolución.

2. **Punto de entrada**
   - La ejecución se inicia con `python -m LaFraseInfinita.Main`.
   - `Main.py` actúa como bootstrap de la aplicación y conecta la capa de presentación con el núcleo del sistema.

3. **Capa de presentación**
   - El paquete `Biblio/UI` contiene la interfaz de usuario de consola.
   - `Presentacion.py` y `Menu.py` sugieren un flujo interactivo basado en menú textual, desde donde se disparan las operaciones del sistema.

4. **Núcleo/orquestación del dominio**
   - `Biblio/Biblioteca.py` parece ser el componente central que coordina las operaciones del sistema.
   - Probablemente funciona como fachada de alto nivel: recibe acciones de la UI y delega en catálogo, préstamos, socios y libros.

5. **Modelo de libros y ejemplares**
   - `Biblio/Books/Libro.py` representa la entidad libro.
   - `ejemplar.py` modela copias físicas del libro, lo que implica que un mismo título puede tener varios ejemplares gestionados de forma independiente.

6. **Estados del ejemplar**
   - Los archivos `estado_disponible.py`, `estado_prestado.py`, `estado_en_reparacion.py` y `estado_ejemplar.py` indican un patrón de estado.
   - Esto separa el comportamiento de un ejemplar según su condición actual: disponible para préstamo, prestado o fuera de servicio/reparación.

7. **Personas y roles**
   - `Biblio/People` agrupa el modelo de personas.
   - `Persona.py` funciona como base común, mientras que `Socio.py` y `Autor.py` especializan los roles del dominio.
   - La gestión de socios es una parte central del sistema, confirmada también por el README.

8. **Préstamos**
   - `Biblio/Prestamo.py` encapsula el ciclo de vida del préstamo.
   - La lógica de este módulo probablemente conecta socio + ejemplar + fechas/estado, y controla tanto el alta del préstamo como su devolución.

9. **Catálogo**
   - `Biblio/Catalogo.py` sugiere una capa de consulta y organización de libros.
   - Su función probable es buscar, listar o agrupar títulos/ejemplares para que la UI no acceda directamente a las estructuras internas.

10. **Persistencia local**
   - El directorio `Biblio/Files` contiene tres archivos JSON: `libros.json`, `socios.json` y `prestamos.json`.
   - La persistencia es local y basada en archivos, no en base de datos ni servicios externos.
   - Esto define una arquitectura simple, autocontenida y orientada a escritorio/uso local.

11. **Manejo de errores**
   - `Biblio/Exceptions.py` centraliza excepciones del dominio.
   - Esto permite que reglas como “no prestar un ejemplar prestado” o “dar de baja un socio inválidamente” se expresen como errores de negocio bien definidos.

12. **Flujo general de datos**
   - El usuario interactúa con el menú.
   - La UI invoca operaciones sobre `Biblioteca`.
   - `Biblioteca` coordina `Socio`, `Libro`, `Ejemplar`, `Prestamo` y `Catalogo`.
   - Los cambios se reflejan en memoria y luego en los JSON locales.

13. **Lectura arquitectónica para diagramar**
   - La separación principal es: **UI de consola** → **servicios/dominio** → **persistencia JSON**.
   - Dentro del dominio hay tres subdominios claros: **personas**, **libros/ejemplares** y **préstamos**, con `Biblioteca` como punto de integración.

14. **Resumen estructural**
   - Es una aplicación monolítica pequeña, modularizada por paquetes.
   - No hay evidencia de capas distribuidas, API externa o infraestructura adicional; la arquitectura está pensada para ejecución local y persistencia simple por archivos.

Main entry points: [`LaFraseInfinita/Biblio/Biblioteca.py`](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Biblioteca.py) (Biblioteca), [`LaFraseInfinita/Biblio/Books/estado_ejemplar.py`](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_ejemplar.py) (Estado ejemplar), [`LaFraseInfinita/Biblio/Prestamo.py`](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Prestamo.py) (Préstamo), [`LaFraseInfinita/Biblio/Books/ejemplar.py`](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/ejemplar.py) (Ejemplar)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_group_ui["UI de consola"]
  node_node_main["Main<br/>bootstrap<br/>[Main.py]"]
  node_node_presentacion["Presentación<br/>ui controller<br/>[Presentacion.py]"]
  node_node_menu["Menú<br/>cli menu<br/>[Menu.py]"]
end

subgraph group_group_domain["Dominio"]
  node_node_biblioteca["Biblioteca<br/>facade/orchestrator<br/>[Biblioteca.py]"]
  node_node_catalogo["Catálogo<br/>catalog service<br/>[Catalogo.py]"]
  node_node_prestamo["Préstamo<br/>loan lifecycle<br/>[Prestamo.py]"]
  node_node_exceptions["Excepciones<br/>domain errors<br/>[Exceptions.py]"]
end

subgraph group_group_books["Libros y ejemplares"]
  node_node_libro["Libro<br/>book entity<br/>[Libro.py]"]
  node_node_ejemplar["Ejemplar<br/>copy entity<br/>[ejemplar.py]"]
  node_node_estado_base["Estado ejemplar<br/>state interface<br/>[estado_ejemplar.py]"]
  node_node_estado_disp["Disponible<br/>state"]
  node_node_estado_prestado["Prestado<br/>state<br/>[estado_prestado.py]"]
  node_node_estado_rep["Reparación<br/>state"]
end

subgraph group_group_people["Personas"]
  node_node_persona["Persona<br/>base entity<br/>[Persona.py]"]
  node_node_socio["Socio<br/>member entity<br/>[Socio.py]"]
  node_node_autor["Autor<br/>author entity<br/>[Autor.py]"]
end

subgraph group_group_storage["Persistencia JSON"]
  node_node_libros_json[("libros.json<br/>json store<br/>[libros.json]")]
  node_node_socios_json[("socios.json<br/>json store<br/>[socios.json]")]
  node_node_prestamos_json[("prestamos.json<br/>json store<br/>[prestamos.json]")]
end

node_node_main -->|"arranca"| node_node_presentacion
node_node_presentacion -->|"usa"| node_node_menu
node_node_menu -->|"invoca"| node_node_biblioteca
node_node_biblioteca -->|"consulta/organiza"| node_node_catalogo
node_node_biblioteca -->|"gestiona"| node_node_prestamo
node_node_biblioteca -->|"administra"| node_node_socio
node_node_biblioteca -->|"administra"| node_node_libro
node_node_biblioteca -->|"coordina"| node_node_ejemplar
node_node_prestamo -->|"vincula"| node_node_socio
node_node_prestamo -->|"reserva"| node_node_ejemplar
node_node_ejemplar -->|"usa patrón"| node_node_estado_base
node_node_estado_base -.->|"especializa"| node_node_estado_disp
node_node_estado_base -.->|"especializa"| node_node_estado_prestado
node_node_estado_base -.->|"especializa"| node_node_estado_rep
node_node_libro -->|"referencia"| node_node_autor
node_node_persona -->|"base de"| node_node_socio
node_node_persona -->|"base de"| node_node_autor
node_node_biblioteca -->|"lanza"| node_node_exceptions
node_node_biblioteca -->|"persiste"| node_node_libros_json
node_node_biblioteca -->|"persiste"| node_node_socios_json
node_node_biblioteca -->|"persiste"| node_node_prestamos_json

click node_node_main "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Main.py"
click node_node_presentacion "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/UI/Presentacion.py"
click node_node_menu "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/UI/Menu.py"
click node_node_biblioteca "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Biblioteca.py"
click node_node_catalogo "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Catalogo.py"
click node_node_prestamo "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Prestamo.py"
click node_node_exceptions "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Exceptions.py"
click node_node_libro "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/Libro.py"
click node_node_ejemplar "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/ejemplar.py"
click node_node_estado_base "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_ejemplar.py"
click node_node_estado_disp "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_disponible.py"
click node_node_estado_prestado "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_prestado.py"
click node_node_estado_rep "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_en_reparacion.py"
click node_node_persona "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Persona.py"
click node_node_socio "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Socio.py"
click node_node_autor "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Autor.py"
click node_node_libros_json "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/libros.json"
click node_node_socios_json "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/socios.json"
click node_node_prestamos_json "https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/prestamos.json"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_node_main,node_node_presentacion,node_node_menu toneBlue
class node_node_biblioteca,node_node_catalogo,node_node_prestamo,node_node_exceptions toneAmber
class node_node_libro,node_node_ejemplar,node_node_estado_base,node_node_estado_disp,node_node_estado_prestado,node_node_estado_rep toneMint
class node_node_persona,node_node_socio,node_node_autor toneRose
class node_node_libros_json,node_node_socios_json,node_node_prestamos_json toneIndigo
```

## Components

### UI de consola

Interfaz textual y menú de interacción local.

- [Main](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Main.py): bootstrap · Punto de entrada de la aplicación. · `LaFraseInfinita/Main.py`
- [Presentación](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/UI/Presentacion.py): ui controller · Orquesta el flujo interactivo de consola. · `LaFraseInfinita/Biblio/UI/Presentacion.py`
- [Menú](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/UI/Menu.py): cli menu · Menú textual que dispara operaciones del sistema. · `LaFraseInfinita/Biblio/UI/Menu.py`

### Dominio

Núcleo de reglas y coordinación de la biblioteca.

- [Biblioteca](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Biblioteca.py): facade/orchestrator · Componente central que coordina las operaciones de negocio. · `LaFraseInfinita/Biblio/Biblioteca.py`
- [Catálogo](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Catalogo.py): catalog service · Consulta y organización de libros y ejemplares. · `LaFraseInfinita/Biblio/Catalogo.py`
- [Préstamo](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Prestamo.py): loan lifecycle · Gestiona alta, devolución y estado del préstamo. · `LaFraseInfinita/Biblio/Prestamo.py`
- [Excepciones](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Exceptions.py): domain errors · Errores de negocio centralizados. · `LaFraseInfinita/Biblio/Exceptions.py`

### Libros y ejemplares

Modelo de títulos, copias físicas y estados del ejemplar.

- [Libro](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/Libro.py): book entity · Entidad principal de título bibliográfico. · `LaFraseInfinita/Biblio/Books/Libro.py`
- [Ejemplar](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/ejemplar.py): copy entity · Copia física gestionada de forma independiente. · `LaFraseInfinita/Biblio/Books/ejemplar.py`
- [Estado ejemplar](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_ejemplar.py): state interface · Contrato/base del patrón de estado para ejemplares. · `LaFraseInfinita/Biblio/Books/estado_ejemplar.py`
- [Disponible](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_disponible.py): state · Estado de ejemplar apto para préstamo. · `LaFraseInfinita/Biblio/Books/estado_disponible.py`
- [Prestado](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_prestado.py): state · Estado de ejemplar actualmente prestado. · `LaFraseInfinita/Biblio/Books/estado_prestado.py`
- [Reparación](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Books/estado_en_reparacion.py): state · Estado de ejemplar fuera de servicio. · `LaFraseInfinita/Biblio/Books/estado_en_reparacion.py`

### Personas

Modelos de socios, autores y base común de persona.

- [Persona](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Persona.py): base entity · Base común para actores del dominio. · `LaFraseInfinita/Biblio/People/Persona.py`
- [Socio](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Socio.py): member entity · Usuario que toma préstamos. · `LaFraseInfinita/Biblio/People/Socio.py`
- [Autor](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/People/Autor.py): author entity · Autor asociado a libros. · `LaFraseInfinita/Biblio/People/Autor.py`

### Persistencia JSON

Archivos locales usados para guardar el estado de la aplicación.

- [libros.json](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/libros.json): json store · Persistencia local de libros y ejemplares. · `LaFraseInfinita/Biblio/Files/libros.json`
- [socios.json](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/socios.json): json store · Persistencia local de socios. · `LaFraseInfinita/Biblio/Files/socios.json`
- [prestamos.json](https://github.com/gonzaloarre/pa---lafraseinfinita/blob/main/LaFraseInfinita/Biblio/Files/prestamos.json): json store · Persistencia local de préstamos. · `LaFraseInfinita/Biblio/Files/prestamos.json`

## Connections

- Main → Presentación: arranca · El bootstrap inicia la interfaz de consola.
- Presentación → Menú: usa · La presentación maneja el menú interactivo.
- Menú → Biblioteca: invoca · Las acciones del menú delegan en la fachada central.
- Biblioteca → Catálogo: consulta/organiza · Coordina búsquedas y agrupación de libros.
- Biblioteca → Préstamo: gestiona · Encapsula el ciclo de vida de los préstamos.
- Biblioteca → Socio: administra · Opera sobre altas, bajas y modificaciones de socios.
- Biblioteca → Libro: administra · Opera sobre el catálogo de libros.
- Biblioteca → Ejemplar: coordina · Gestiona copias físicas y sus cambios de estado.
- Préstamo → Socio: vincula · Cada préstamo se asocia a un socio.
- Préstamo → Ejemplar: reserva · El préstamo actúa sobre un ejemplar concreto.
- Ejemplar → Estado ejemplar: usa patrón · El ejemplar delega comportamiento en un estado.
- Estado ejemplar → Disponible: especializa · Estado disponible.
- Estado ejemplar → Prestado: especializa · Estado prestado.
- Estado ejemplar → Reparación: especializa · Estado en reparación.
- Libro → Autor: referencia · Los libros se vinculan con autores.
- Persona → Socio: base de · Socio extiende la entidad persona.
- Persona → Autor: base de · Autor extiende la entidad persona.
- Biblioteca → Excepciones: lanza · Las reglas de negocio se expresan como errores del dominio.
- Biblioteca → libros.json: persiste · Lee y escribe el inventario de libros.
- Biblioteca → socios.json: persiste · Lee y escribe el padrón de socios.
- Biblioteca → prestamos.json: persiste · Lee y escribe el historial de préstamos.
