Proyecto del curso Programación II, Universidad Católica del Uruguay.
Integrantes: Horacio Díaz, Andrés Charpentié y Andrés Rodriguéz.
La planificación y división de tareas se realiza en Trello
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.
---
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
| 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 |
| 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 |
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.