Skip to content

ucudal/PII_2025_2_Equipo28

Repository files navigation

Proyecto Programación II — Chatbot

Proyecto del curso Programación II, Universidad Católica del Uruguay.
Integrantes: Horacio Díaz, Andrés Charpentié y Andrés Rodriguéz.

🗂️ Organización del equipo

La planificación y división de tareas se realiza en Trello

🔗 Tablero Trello

🧩 Diagrama de Clases (Mermaid)

El diseño de clases fue hecho con Mermaid para tener una idea de qué clases serían necesarias para llevar a cabo este proyecto previamente a hacerlo.

🔗 Abrir en Mermaid

---
config:
  theme: mc
  look: neo
---
classDiagram
direction TB
    class Cliente {
	    +string Id
	    +string Nombre
	    +string Apellido
	    +string Telefono
	    +string Correo
	    +string Genero
	    +List~string~ Etiquetas
	    +string FechaDeNacimiento
	    +Cliente(id: string, nombre: string, apellido: string, telefono: string, correo: string)
	    +CambiarNombre(nuevoNombre: string) void
	    +CambiarApellido(nuevoApellido: string) void
	    +CambiarTelefono(nuevoTelefono: string) void
	    +CambiarCorreo(nuevoCorreo: string) void
	    +AsignarGenero(nuevoGenero: string) void
	    +AsignarEtiqueta(nuevaEtiqueta: string) void
	    +AsignarFechaDeNacimiento(nuevaFecha: string) void
	    +ToString() string
    }
    class RepoClientes {
	    - List~Cliente~ Clientes
	    + IEnumerable~Cliente~ Clientes2
	    - RepoEtiquetas etiquetas
	    - RepoUsuarios usuarios
	    + RepoClientes(RepoEtiquetas etiquetas, RepoUsuarios usuarios)
	    + AgregaCliente(Cliente cliente)
	    + EliminarCliente(Cliente cliente)
	    + BuscarCliente(string atributo, string valorBusqueda) List~Cliente~
	    + BuscarUnCliente(string ClienteId) Cliente
    }
    class RepoEtiquetas {
	    - List~string~ Etiquetas
	    + void AgregarEtiqueta(string etiqueta)
	    + bool BuscarEtiqueta(string etiqueta)
    }
    class RepoUsuarios {
	    +List Usuarios
	    +List Administradores
	    +List Vendedores
	    +List ClientesTotales
	    +AgregarUsuario(usuario: Usuario) void
	    +EliminarUsuario(usuario: Usuario) void
	    +BuscarUsuario(id: string) Usuario
	    +BuscarVendedor(id: string) Vendedor
	    +BuscarAdministrador(id: string) Administrador
	    +BuscarCliente(id: string) Cliente
    }
    class Vendedor {
	    + List~Cliente~ Clientes
	    + string Id
	    + string NombreCompleto
	    + Vendedor(string id, string nombre)
	    + AsignarCliente(Cliente cliente, Vendedor vendedor)
    }
    class Usuario {
	    - string ID
	    - string Nombre
	    - List~Interaccion~ InteraccionesUsuario
	    - List~Venta~ TotalVentas
	    - List~Venta~ VentaCliente
	    - List~Cotizacion~ CotizacionesUsuario
	    + Usuario(string id, string nombre)
	    + Recordatorio(string que, string cuando) void
	    + VentaClienteAdd(Venta venta) void
	    + AgregarCotizacion(Cotizacion cotizacion) void
	    + AgregarInteraccion(Interaccion interaccion) void
    }
    class Administrador {
	    + List~Usuario~ UsuariosSuspendidos
	    + Administrador(string id, string nombre)
    }
    class Interaccion {
	    + string Notas
	    + Cliente Cliente
	    + Usuario Usuario
	    + string Tema
	    + DateTime Fecha
	    + TipoInterracion Tipo
	    + string Contenido
	    + string Lugar
	    + Interaccion(Usuario usuario, Cliente cliente, string tema, string contenido, string cuando = "00/00/0000")
	    + AgergarNotas(string notas) void
	    # FechaIncorrecta(DateTime fecha) void
    }
    class Venta {
	    +Cliente Cliente
	    +string Producto
	    +DateTime Fecha
	    +string Importe
	    +Venta(cliente: Cliente, producto: string, fecha: DateTime, importe: string)
	    +Resumen() string
    }
    class Cotizacion {
	    + Cliente Cliente
	    + DateTime Fecha
	    + string Importe
	    + Cotizacion(Cliente cliente, DateTime fecha, string importe)
	    + Resumen() string
    }
    class TipoInterracion {
	    Mensaje
	    Llamada
	    Reunion
	    Correo
	    Nada
    }
    class Llamadas {
	    + Llamadas(Usuario usuario, Cliente cliente, string tema, string llamada, string cuando)
    }
    class Mensajes {
	    + Mensajes(Usuario usuario, Cliente cliente, string tema, string mensaje, string cuando)
    }
    class Correos {
	    + Correos(Usuario usuario, Cliente cliente, string tema, string correo, string cuando)
    }
    class Reunion {
	    + Reunion(Usuario usuario, Cliente cliente, string tema, string lugar, string reunion, string cuando)
	    # FechaIncorrecta(DateTime fecha) void
    }
    class RepoCotizaciones {
	    - List~Cotizacion~ Cotizaciones
	    + void AgregarCotizacion(Cliente cliente, string cuando, string precio, Usuario usuario)
    }
    class RepoInteracciones {
	    - List~Interaccion~ Interacciones
	    + IEnumerable~Interaccion~ Interacciones2
	    + Interaccion BuscarInteraccion(Usuario usuario, string tipo, string tema)
	    + List~Interaccion~ BuscarInteraccion(Usuario usuario, Cliente cliente, string tipo="", string fecha1="")
	    + void AgregarInteraccion(Interaccion interaccion, Usuario usuario)
	    + Dictionary~Cliente,Interaccion~ UltimasInteraccionesClientes(Usuario usuario)
	    + void eliminarinteraciones()
    }
    class RepoVentas {
	    - List~Venta~ Ventas
	    + void AgregarVenta(Cliente cliente, string cuando, string precio, string producto, Usuario usuario)
    }
    class Fachada {
	    - instancia : Fachada
	    - ClientesContacto : Dictionary~
	    - Etiquetas : RepoEtiquetas
	    - Clientes : RepoClientes
	    - Interacciones : RepoInteracciones
	    - Cotizaciones : RepoCotizaciones
	    - Ventas : RepoVentas
	    - Usuarios : RepoUsuarios
	    - UsuariosSuspendidos : List
	    + Instancia : Fachada
	    + RegistarMensaje(clienteId, mensaje, tema, usuarioId, cuando) string
	    + RegistrarCorreo(clienteId, correo, tema, usuarioId, cuando) string
	    + RegistarLlamada(clienteId, llamada, tema, usuarioId, cuando) string
	    + RegistarReunion(clienteId, reunion, tema, usuarioId, cuando, lugar) string
	    + AgregarNota(nota, tipointeraccion, tema, usuarioId) string
	    + InteraccionesCliente(clienteId, usuarioId, tipo, fecha) string
	    + InterraccionClienteAusente(usuarioId) string
	    + Panel(usuarioId) string
	    + AgregarClienteContacto(usuarioId, clienteId) string
	    + VerClienteContacto(usuarioId) string
	    + CrearEtiqueta(etiqueta, idUsuario) string
	    + AgregarEtiquetaCliente(clienteId, etiqueta, usuarioId) string
	    + RegistrarVenta(clienteId, producto, fecha, precio, usuarioId) void
	    + RegistarCotizacion(clienteId, fecha, precio, usuarioId) void
	    + CrearUsuario(id, nombre, idAdmin) string
	    + SuspenderUsuario(idSuspender, idAdmin) string
	    + EliminarUsuario(idEliminar, idAdmin) string
	    + AsignarClienteAOtroVendedor(idVendedorActual, idVendedorNuevo, nombreCliente, apellidoCliente) void
	    + BuscarClientesFachada(atributo, valorBusqueda) List~Cliente~
	    + CrearNuevoCliente(id, nombre, apellido, telefono, correo) Cliente
	    + ModificarInfo(id, atributo, nuevoValor) void
	    + EliminarClienteFachada(id) void
	    + VerClientes() RepoClientes
	    + BuscarUsuario(usuarioId) Usuario
	    + RegistrarVentaCliente(clienteId, producto, fecha, precio, usuarioId) string
	    + TotalDeVentasEnPeriodo(usuarioId, fechaInicioTexto, fechaFinTexto) string
    }
    class Excepciones {
    }
    class InvalidDateException {
	    +InvalidDateException(string mensaje = null)
    }
    class EmptyStringException {
	    +EmptyStringException(string mensaje = null)
    }
    class Exception {
    }

	<<enumeration>> TipoInterracion
	<<singleton>> Fachada

    Excepciones <|-- InvalidDateException
    Excepciones <|-- EmptyStringException
    InvalidDateException --|> Exception
    EmptyStringException --|> Exception
    RepoClientes "1" --> "*" Cliente
    RepoClientes "1" --> "1" RepoEtiquetas
    RepoClientes "1" --> "1" RepoUsuarios
    Vendedor --|> Usuario
    Administrador --|> Usuario
    Vendedor "1" --> "*" Cliente
    Administrador "1" --> "*" Usuario
    Usuario "1" o-- "*" Interaccion
    Usuario "1" o-- "*" Venta
    Usuario "1" o-- "*" Cotizacion
    Interaccion "1" o-- "1" Cliente
    Interaccion "1" o-- "1" Usuario
    Interaccion *-- TipoInterracion
    Llamadas --|> Interaccion
    Mensajes --|> Interaccion
    Correos --|> Interaccion
    Reunion --|> Interaccion
    Cotizacion "1" o-- "1" Cliente
    RepoUsuarios --> "0..*" Usuario
    RepoInteracciones --> Interaccion
    RepoInteracciones --> Usuario
    RepoInteracciones --> Cliente
    RepoVentas --> Venta
    RepoVentas --> Cliente
    RepoVentas --> Usuario
    RepoCotizaciones "1" --> "*" Cotizacion

	style Cliente stroke:#FF5978,fill:#FFDFE5,color:#8E2236

	style Vendedor stroke:#46EDC8,fill:#DEFFF8,color:#378E7A
	style Usuario stroke:#374D7C,fill:#E2EBFF,color:#374D7C
	style Administrador stroke:#46EDC8,fill:#DEFFF8,color:#378E7A
	style Venta stroke:#FBB35A,fill:#FFEFDB,color:#8F632D
	style Cotizacion stroke:#46EDC8,fill:#DEFFF8,color:#378E7A

	style Reunion stroke:#FF5978,fill:#FFDFE5,color:#8E2236

	style Fachada stroke:#46EDC8,fill:#DEFFF8,color:#378E7A

	class RepoClientes:::Sky
	class RepoEtiquetas:::Peach
	class RepoUsuarios:::Peach
	class Interaccion:::Peach
	class TipoInterracion:::Sky
	class Llamadas:::Aqua
	class Mensajes:::Rose
	class Correos:::Sky
	class RepoCotizaciones:::Aqua
	class RepoInteracciones:::Peach
	class RepoVentas:::Rose
	class Excepciones:::Peach
	class InvalidDateException:::Rose
	class EmptyStringException:::Sky
	class Exception:::Aqua

	classDef Sky :,stroke-width:1px,stroke-dasharray:none,stroke:#374D7C,fill:#E2EBFF,color:#374D7C,stroke-width:1px,stroke-dasharray:none,stroke:#374D7C,fill:#E2EBFF,color:#374D7C,stroke-width:1px,stroke-dasharray:none,stroke:#374D7C,fill:#E2EBFF,color:#374D7C,stroke-width:1px,stroke-dasharray:none,stroke:#374D7C,fill:#E2EBFF,color:#374D7C
	classDef Peach :,stroke-width:1px,stroke-dasharray:none,stroke:#FBB35A,fill:#FFEFDB,color:#8F632D,stroke-width:1px,stroke-dasharray:none,stroke:#FBB35A,fill:#FFEFDB,color:#8F632D,stroke-width:1px,stroke-dasharray:none,stroke:#FBB35A,fill:#FFEFDB,color:#8F632D,stroke-width:1px,stroke-dasharray:none,stroke:#FBB35A,fill:#FFEFDB,color:#8F632D,stroke-width:1px,stroke-dasharray:none,stroke:#FBB35A,fill:#FFEFDB,color:#8F632D
	classDef Aqua :,stroke-width:1px,stroke-dasharray:none,stroke:#46EDC8,fill:#DEFFF8,color:#378E7A,stroke-width:1px,stroke-dasharray:none,stroke:#46EDC8,fill:#DEFFF8,color:#378E7A,stroke-width:1px,stroke-dasharray:none,stroke:#46EDC8,fill:#DEFFF8,color:#378E7A
	classDef Rose :,stroke-width:1px,stroke-dasharray:none,stroke:#FF5978,fill:#FFDFE5,color:#8E2236,stroke-width:1px,stroke-dasharray:none,stroke:#FF5978,fill:#FFDFE5,color:#8E2236,stroke-width:1px,stroke-dasharray:none,stroke:#FF5978,fill:#FFDFE5,color:#8E2236

Loading

💻 Comandos e historias

Historias Comandos Ejemplo
Como usuario quiero crear un nuevo cliente con su información básica: nombre, apellido, teléfono y correo electrónico, para poder contactarme con ellos cuando lo necesite. !crearCliente clienteId nombre apellido telefono correo !crearCliente C1,Tony,Gonzales,099287345,[email protected]
!verClientes
Como usuario quiero modificar la información de un cliente existente, para mantenerla actualizada. !modfInfo clienteId atributo nuevoValor !crearCliente C2,Juan,Martinez,099287345,[email protected]
!modfInfo C2,nombre,Horacio
!verClientes
Como usuario quiero eliminar un cliente, para mantener limpia la base de datos. !eliminarCliente id !crearCliente C3,Kevin,Rodriguez,099281245,[email protected]
!verClientes
!eliminarCliente C3
!verClientes
Como usuario quiero buscar clientes por nombre, apellido, teléfono o correo electrónico, para identificarlos rápidamente. !buscarCliente atributo busqueda !crearCliente C4,Romualdo,Perez,092287345,[email protected]
!buscarCliente nombre,Romualdo
!verClientes
Como usuario quiero ver una lista de todos mis clientes, para tener una vista general de mi cartera. !verClientes !crearCliente C8,Ronaldo,Rodriguez,099827345,[email protected]
!verClientes
Como usuario quiero registrar llamadas enviadas o recibidas de clientes, incluyendo cuándo fueron y de qué tema trataron, para poder saber mis interacciones con los clientes. !registrarLlamada clienteId llamada tema usuarioId fecha !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarLlamada C1,hola,saludo,U1,10/11/2025
!interaccionCliente C1,U1,llamada,10/11/2025
Como usuario quiero registrar reuniones con los clientes, incluyendo cuándo y dónde fueron, y de qué tema trataron, para poder saber mis interacciones con los clientes. !registrarReunion clienteId reunion tema usuarioId fecha lugar !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarReunion C1,hola todo bien,saludo,U1,10/11/2025,Marte
!interaccionCliente C1,U1,reunion,10/11/2025
Como usuario quiero registrar mensajes enviados a o recibidos de los clientes, incluendo cuándo y de qué tema fueron, para poder saber mis interacciones con los clientes. !registrarMensaje clienteId mensaje tema usuarioId fecha !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarMensaje C1,hola todo bien,saludo,U1,11/11/2025
!interaccionCliente C1,U1,mensaje,11/11/2025
Como usuario quiero registrar correos electrónicos enviados a o recibidos de los clientes, incluendo cuándo y de qué tema fueron, para poder saber mis interacciones con los clientes. !registrarCorreo clienteId correo tema usuarioId fecha !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarCorreo C1,hola todo bien,saludo,U1,12/11/2025
!interaccionCliente C1,U1,correo,12/11/2025
Como usuario quiero agregar notas o comentarios a las llamadas, reuniones, mensajes y correos enviados o recibidos de los clientes, para tener información adicional de mis interacciones con los clientes. !agregarNota tipoInteraccion tema usuarioId !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarCorreo C1,hola todo bien,saludo,U1,12/11/2025
!agregarNota este saludo es fue muy bueno,correo,saludo,U1
!interaccionCliente C1,U1,correo,12/11/2025
Como usuario quiero registrar otros datos de los clientes como género y fecha de nacimiento de los clientes, para realizar campañas y saludarlos en sus cumpleaños. !modfInfo id atributo nuevoValor !crearCliente C5,Jovani,Vazquez,099289455,[email protected]
!modfInfo C5,genero,Mujer
!verClientes
Como usuario quiero poder definir etiquetas para poder organizar y segmentar a mis clientes. !crearEtiqueta etiqueta usuarioId !crearAdministrador A25,Hector
!crearUsuario U1,Franco,A25
!crearEtiqueta etiquetaDePrueba,U1
!verEtiquetas
Como usuario quiero poder agregar una etiqueta a un cliente, para luego organizar y segmentar mi cartera de clientes. !agregarEtiqueta clienteId etiqueta usuarioId !crearAdministrador A32,Liliana
!crearCliente C6,Edmundo,Gutierrez,0982827315,[email protected]
!crearUsuario U20,Alejandro,A32
!crearEtiqueta etiquetaDePrueba,U1
!verEtiquetas
!agregarEtiqueta C6,etiquetaDePrueba,U1
!verClientes
Como usuario quiero poder registrar una venta a un cliente, incluyendo qué le vendí, cuándo se lo vendí y cuánto le cobré, para saber lo que compran los clientes. !registrarVenta clienteId producto fecha precio usuarioId !crearAdministrador A9,Ema9
!crearUsuario U9,Ezequiel9,A9
!crearCliente C9,Jean9,Rodriguez9,099281245,[email protected]
!registrarVenta C9,ATUN,11/12/2025,100,U9
!verVentas
Como usuario quiero poder registrar que le envié una cotización a un cliente, cuándo se la mandé y por qué importe es la cotización, para hacer seguimiento de oportunidades de venta. !registrarCotiz clienteId fecha precio usuarioId !crearAdministrador A10,Ema10
!crearUsuario U10,Ezequiel10,A10
!crearCliente C10,Jean10,Rodriguez10,099281245,[email protected]
!registrarCotiz C10,11/12/2025,100,U10
!verCotizaciones
Como usuario quiero ver todas las interacciones de un cliente, con o sin filtro por tipo de interacción y por fecha, para entender el historial de la relación comercial. !interaccionCliente clienteId usuarioId tipo fecha !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarCorreo C1,hola todo bien,saludo,U1,12/11/2025
!registrarLlamada C1,nos vimos,despedida,U1,10/11/2025
!interaccionCliente C1,U1,,
!interaccionCliente C1,U1,,12/11/2025
!interaccionCliente C1,U1,llamada,
!interaccionCliente C1,U1,correo,12/11/2025
Cómo usuario quiero saber los clientes que hace cierto tiempo que no tengo ninguna interacción con ellos, para no peder contacto con ellos. !clienteAusente usuarioId !crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarReunion C1,hola todo bien,saludo,U1,10/10/2024,Marte
!clienteAusente U1
Como usuario quiero saber los clientes que se pusieron en contacto conmigo y no les contesté hace cierto tiempo, para no dejar de responder mensajes o llamadas. !clienteContactaVer usuarioId
!clienteContactaAgregar usuarioid clienteid
!clienteContactaEliminar usuarioid clienteid
!crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!clienteContactaAgregar U1,C1
!clienteContactaVer U1
Como administrador quiero crear usuarios. !crearUsuario usuarioId nombre adminId !crearAdministrador A1,Pepe
!crearUsuario U1,Ezequiel,A1
!verUsuarios
Como administrador quiero eliminar usuarios. !eliminarUsuario usuarioId adminId !crearAdministrador A2,Andres
!crearUsuario U2,Peter,A2
!verUsuarios
!eliminarUsuario U2,A2
!verUsuarios
Como administrador quiero suspender usuarios. !suspenderUsuario usuarioId adminId !crearAdministrador A3,Juan
!crearUsuario U3,Nahuel,A3
!verUsuarios
!suspenderUsuario U3,A3
!verUsuarios
Como vendedor, quiero poder asignar un cliente a otro vendedor para distribuir el trabajo en el equipo. !asignarCliente clienteId vendedorId !crearVendedor V11,JuanVendedor11
!crearCliente C11,Jean11,Rodriguez11,099281245,[email protected]
!asignarCliente C11,V11
!verClientesVendedor V11
Como usuario quiero ver un panel con clientes totales, interacciones recientes y reuniones próximas, para tener un resumen rápido. !panel usuarioId
(Dato: Este comando mostrará las interacciones de hace una semana o menos de antigüedad a la fecha actual)
!crearAdministrador A1,Pablo
!crearUsuario U1,Lucas,A1
!crearCliente C1,Juan,Pinocho,099765432,[email protected]
!registrarLlamada C1,hola,saludo,U1,29/11/2025
!crearCliente C2,Marta,Mora,099383214,[email protected]
!registrarMensaje C2,tengo una duda,duda,U1,30/11/2025
!registrarReunion C1,Tenemos que discutir sobre los aliens,extraterestres,U1,10/11/2026,Marte
!panel U1
Como usuario quiero saber el total de ventas de un periodo dado, para analizar en rendimiento de mi negocio. !totalVentas usuarioId fechaInicio fechaFin !crearAdministrador A12,Juan12
!crearUsuario U12,Nahuel12,A12
!crearCliente C12,Jean12,Rodriguez12,099281245,[email protected]
!registrarVenta C12,ATUN,11/12/2025,100,U12
!registrarVenta C12,ATUN,12/12/2025,100,U12
!totalVentas U12,11/12/2025,14/12/2025
!verVentas

Comandos no requeridos por las historias de usuario

Comando Descripción Ejemplos
!init Este comando crea un administrador, un usuario, un cliente y un vendedor. Esto para facilitar probar y/o utilizar el resto de comandos. !init
!verUsuarios Muestra los usuarios existentes !crearUsuario U1,Lucas,A1
!verUsuarios
!crearVendedor vendedorId nombre Este comando crea un vendedor !crearVendedor V1,JuanVendedor
!crearAdministrador adminId nombre Este comando crea un Administrador !crearAdministrador A1,Pepe
!verAdministradores
!verEtiquetas Este comando muestra todas las etiquetas existentes !crearAdministrador A27,Andres
!crearUsuario 34,Peter,A27
!crearEtiqueta etiquetaPrueba,U34</br!verEtiquetas
!verAdministradores Este comando muestra una lista con todos los Administradores !verAdministradores

📜 Notas

Los principales desafios que encontramos al trabajar sobre el proyecto fueron la correcta distribución de responsabilidades entre las clases y sus relaciones entre sí, la correcta implementación de los principios SOLID y GRASP, y acostumbrarse a trabajar con Git, que era una herramienta nueva para todos.

En general, el proyecto fue una buena oportunidad para poner en práctica lo visto en clase, tanto lo que se trata de conceptos como de código.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •