# SUPUESTO UML - VIDEOCLUB
## Hecho por: Mario Pérez y Edvin Freyer

### Clases
https://i.imgur.com/ySDaBkh.png
- Videoclub: La clase *Videoclub* es la clase en donde registramos toda la información de la empresa. En ella se encuentran una serie de listas que almacenan todos los objetos. Cómo parámetro tan solo tenemos el nombre del *Videoclub* y las listas como atributos.
- Socio: La clase *Socio* tiene como parámetros DNI, nombre, apellido, dirección y teléfono. Esta clase se relaciona con ejemplar creando una clase de asociación que será explicada posteriormente.
- Ejemplar: La clase *Ejemplar* relacionada con *Socio*, recibe como parámetros numero de ejemplar, estado y nombre de la película.
- Pelicula: La clase *Película* recibe como parámetros el título, género, productor, fecha y reparto. Esta clase tiene una relación de composición son la clase *Ejemplar* que se explicará más adelante.
- Productor: La clase *Productor* se relaciona con la clase *Película*, y esta posee como parámetros el nombre del productor, nacionalidad y sexo del mismo.
- Actor: Al igual que la clase *Productor*, recibe el mismo tipo de parámetros como se puede observar, pero esta clase *Actor* se relaciona con *Reparto*.
- Reparto: La clase *Reparto* tiene una relación de tipo composición con la clase *Pelicula*, y esta recibe como parámetros el titulo de la pelicula y una lista con los actores que participan en este.
- Alquiler: La clase *Alquiler* es una clase de asociación generada de la relación alquilar de las clases *Socio* y *Ejemplar*. Esta almacena el id del alquiler, dias de alquiler, DNI del *Socio*, número del ejemplar y titulo de la película.
### Relaciones y Multiciplidad
- *Relación Videoclub-Socio*: Un videoclub tiene 0 o varios socios (Puede que todavía no se haya registrado ninguno), pero un socio solo pertenece a un videoclub.
- *Relación Videoclub-Ejemplar*: Un videoclub tiene 0 o varios ejemplares (Puede que todavía no haya ningún ejemplar disponible), pero un ejemplar solo pertenece a un videoclub.
- *Relación Socio-Ejemplar (Alquilar)*: Un socio puede alquilar 1 o varios ejemplares, pero un ejemplar solo puede ser alquilado por un socio al mismo tiempo, hasta que no se devuelva, no se podrá volver a alquilar. De esta relación nace una clase/objeto Alquiler, en donde se guardará la información importante. (Clase asociación)
- *Relación Socio-Ejemplar (Devolver)*: Un socio puede devolver 1 o varios ejemplares, pero un ejemplar solo puede ser devuelto por un socio al mismo tiempo.
- *Relación Película-Ejemplar*: De una película pueden existir 0 o varios ejemplares (puede que no haya ejemplares disponibles de dicha pelicula), pero un ejemplar solo puede ser de una sola película. Esta relación es de composición ya que si no existe la película no puede existir un ejemplar de dicha película.
- *Relación Película-Productor*: Una película ha sido producida por 1 productor, y un productor ha producido 0 o varias películas (Puede que todavía no haya producido ninguna película).
- *Relación Película-Reparto*: Una película tiene 0 o 1 reparto (Puede que todavia no se haya actualizado el reparto de la película), y un reparto pertenece a una sola película. Esta relación es de composición ya que si no existe la película esta no puede tener reparto.
- *Relación Reparto-Actor*: Un reparto tiene 1 o varios actores, y un actor participa en 0 o varios repartos (Puede que todavía no haya participado en ninguna película).
### Métodos
#### Los métodos no los hemos incluido en el UML, porque eran demasiados.
#### get_dict() (Está en todas las clases excepto videoclub)
> En todos las clases menos videoclub, existe un metodo llamado **get_dict()** que sirve para devolver los datos de dicha clase en forma de diccionario, para no acceder directamente a la hora de usarlos en otras clases o metodos.
### Clase Videoclub
#### añadir_socio()
> Este metodo recibe un objeto de tipo socio, y sirve para añadir ese objeto de tipo socio en el atributo de videoclub llamado lista_socios, este metodo comprueba que dicho socio no exista, además no solo lo guarda en memoria, también lo guarda en un fichero con json.
#### avalar()
#### eliminar_socio()
> Este metodo recibe de parametro el dni, del socio que se quiere eliminar de la lista_socios del videoclub, comprueba que exista dicho socio, y lo elimina en memoria y en el archivo json.
#### añadir_productor()
> Este metodo recibe un objeto de tipo productor, y sirve para añadir ese objeto de tipo productor en el atributo de videoclub llamado lista_productores, este metodo comprueba que dicho productor no exista, además no solo lo guarda en memoria, también lo guarda en un fichero con json.
#### eliminar_productor()
> Este metodo recibe de parametro el nombre, del productor que se quiere eliminar de la lista_productores del videoclub, comprueba que exista dicho productor, y lo elimina en memoria y en el archivo json.
#### añadir_pelicula()
> Este metodo recibe un objeto de tipo pelicula, y sirve para añadir ese objeto de tipo pelicula en el atributo de videoclub llamado lista_peliculas, este metodo comprueba que dicha pelicula no exista, además no solo lo guarda en memoria, también lo guarda en un fichero con json.
#### eliminar_pelicula()
> Este metodo recibe de parametro el titulo, de la pelicula que se quiere eliminar de la lista_peliculas del videoclub, comprueba que exista dicha pelciula, y lo elimina en memoria y en el archivo json.
#### asignar_ejemplar()
> Este metodo recibe un objeto de tipo ejemplar, y sirve para añadir ese objeto de tipo ejemplar en el atributo de videoclub llamado lista_ejemplares, este metodo comprueba que dicho ejemplar no exista, también comprueba que la pelicula de la que se quiere hacer un ejemplar exista, además no solo lo guarda en memoria, también lo guarda en un fichero con json.
#### eliminar_ejemplar()
> Este método recibe el titulo de una película y el número de ejemplar. Con estos parámetros buscamos el numero de ejemplar y el titulo coincidentes y los eliminamos en memoria y del archivo txt utilizando json.
#### añadir_actor()
> Este método recibe un objeto actor que antes de añadirlo a memoria y al archivo txt, comprobando su nombre lo añadimos si este no existe. Una vez añadido a memoria y al archivo txt, podremos vizualizarlo con la funcion ver(), que esta nos devolverá los nombres de los actores existentes.
#### eliminar_actor()
> Este método recibe el nombre de un actor. Con este parámetros buscamos el nomvbre coincidentee y los eliminamos de la memoria y del archivo txt utilizando json.
>
#### hacer_reparto()
> Este metodo recibe de parametro recibe un objeto reparto, el cual se comprueba primero que nada si la pelicula de este existe, una vez comprobado se añaden a la lista los actores introducidos, de los cuales tambien se comprueba si existen. Una vez completadas todas las verificaciones, se añade al archivo txt y a la memoria.
#### eliminar_reparto()
> Este metodo recibe de parametro el titulo, de la pelicula en la que se quiere eliminar el reparto de la lista_reparto del videoclub, comprueba que exista dicho reparto, y lo elimina en memoria y en el archivo json.
#### alquilar()
> Este metodo recibe un objeto de tipo alquiler, y sirve para añadir ese objeto de tipo alquiler en el atributo de videoclub llamado lista_alquileres, este metodo comprueba que dicho alquiler no exista, además no solo lo guarda en memoria, también lo guarda en un fichero con json.
#### devolver()
> Este metodo recibe de parametro el id, del alquiler que se quiere eliminar de la lista_alquileres del videoclub, comprueba que exista dicho alquiler, y lo elimina en memoria y en el archivo json.