Más o menos ya te respondí... pero me extiendo con más detalle (en alguna parte, no con todo que es muy largo)
Debes crear una clase que es una colección de análisis, que son internas al objeto clínica.
El médico cuando solicita un análisis, lo crea 'vacío', con los datos del paciente y que se análisis se desea y se inserta en la colección de análisis, con el estado adecuado, y deja en cola del laboratorio un objeto 'notificación', que el laboratorio usará para rescatar la analítica y genera el objeto 'citacion' para citar al paciente. El laboratorio, cuando reciba el objeto notificacion, sabrá que debe hacer con ella, rescatando el objeto analítica creada por el médico, donde constan los datos de lo que se solicita, quien lo solicita y para quien se solicita,
****Entonces el laboratorio dará la cita al paciente, actualiza el estado del objeto análisis (que pasa a fase 'citado') y encola en la agenda del laboratorio, para el día de la cita, la entrega de muestras-extracción,etc.. , cuando las muestras se hayan realizado, se actualiza de nuevo el estado del análisis y ahora ese análisis pasa a la agenda del laboratorio. Cuando el laboratorio procese la muestra, vuelve a actualizar el análisis, ahora además de cambiar el estado, rellena los datos del resultado de la analítica, y el sistema genera otro objeto citación (en el objeto clínica, o médico depende de quien gestiones las citaciones como te dije en el mensaje anterior) para el paciente (ahora para que acuda al médico), y una vez citado a consulta, se actualiza de nuevo los datos de estado del análisis, y se deposita en la agenda del médico para el día de la citación.
Cuando llegue el día de la citación, el médico consulta su agenda y con el id del análisis haría una consulta al análisis... es todo privado, el paciente es un objeto, pero dentro de la clínica, físicamente el paciente no tiene acceso a nada, tan solo se le cita, interacciona con personas... tampoco estaría mal una 'web' de la clínica para consultas, haciendo login y usando su "id de paciente", para revisar sus citaciones, etc...
Así escribiendo sobre la marcha, la cascada de sucesos con los objetos podría ser algo como esto:
paciente p= Clinica.Login(string idPaciente)
citacion c = Clinica.PedirCita(paciente p, especialista e, motivo m)
Motivo podría ser un objeto, un valor enumerado o un simple string con o sin formato.
Al pedirCita, lo que hará esa función puede variar si es atendido por personal humano o es automático. Si se atiende exclusivamente por personal humano, se encola y cuando los operarios de la clínica lleguen a esa petición, llamarán al paciente para concertar día y hora. si es automático, lo lógico es que sacara una ventana con un calendario para elegir día y hora (posibilidad de cambiar mes), desactivando horas ocupadas y tachando días que no se pasa consulta.
Pongamos que el usuario ya rellenó dichos datos, pués ahora se crea un objeto citación y se guarda en la coleccion de citas, se pasa una entrada del íd de cita a la agenda del médico para el día y hora concertada. Retomando desde atrás...
El paciente solicitar una cita en la clínica para el especialista deseado, en una fecha elegible (entre las libres)
Buleano = Funcion SolicitarCita(string idPaciente)
paciente p= Clinica.Login(string idPaciente)
Si (p.Estado=ErrorLogin) luego
// indicar el motivo del error, fallo en id paciente no resgistrado, etc...
Devolver FALSE
Fin si
citacion c = Clinica.PedirCita(paciente p, especialista e, motivo m)
Si (c.estado=EsperandoSeleccionFecha) luego
calendario f = = Clinica.Medicos(Especialista e).GetCalendario //selecciona el calendario disponible para el médico/especialista
f.ShowCalendario // se muestra la ventana al usuario para que elija la fecha.
Si (f.Estado=FechaSeleccionada) luego // otro estado posible sería Cancelado.
c.fecha = f.fecha // copia la fecha elegida a la citación
Clinica.Citaciones.Add(citacion c) // añade la citación a la colección de citaciones
Clinica.Medicos(especialista e).Agenda.add(c.fecha, Id p.IdPaciente) //asienta la cita en la agenda del especialista
Devolver TRUE
sino
// cancelado, el paciente desisitó de seleccionar fecha. Es raro que aquí ocurriera un problema, pero podría pasar, por ejmplo un problrma temporal con el espacialista/médico.
Devolver FALSE
fin si
sino
// cancelado o algún problema responder según corresponda
devolver FALSE
fin si
fin funcion
Tras la citación... y llega el día ...damos por hecho que el médico tiene su programa permanentemente abierto, pero vamos al punto donde toma la citación del paciente de su agenda.
El especialista pulsará en un botón similar a: "Siguiente Cita" y el botón haría algo similar a esto:
Funcion BotonSiguienteCita_Click
citacion c = Agenda.Next
paciente p = Clinica.GetPacienteById(c.IdPaciente)
// mostrar en la ventana certos datos de la cita y el paciente, por ejemplo:
textboxNombrePaciente.Texto = p.Nombre + p.Apellidos
textboxMotivo.Text = c.Motivo
textboxFecha.Text = c.fecha.Tostring
textboxDuracionConsulta= c.Duracion.ToString // según el tipo de consulta puede requerir x minutos.... el médico debe gestionar su tiempo, procurando ajustarse a ello... exacto nunca va a ser, pero le ayudará...
// el especialista, o la enfermera si dispone de ella entonces lee el nombre apellidos, verifica la hora y el tiempo que puede dedicar, lee el motivo de consulta y acto seguido llama al paciente... que se supone que acude
// incluso podría proveerse un sistema de TextToSpeech, conectado a un altavoz:
tts.Talk("Se llama al señor" + textboxNombrePaciente.Texto + "acuda a la consulta nº" + medico.Room + "del Dr." + medico.Alias)
Fin funcion
Si el paciente no entra, lo vuelve a llamar, si no comparece, lo deja (no lo elimina d ela agenda), si la clínica tolera cierta flexibilidad, tovadía podría atenderlo más atarde, mediante un botón no de "siguiente Cita", si no de "cita por nombre", que muestra el listado con al menos dos columnas, el nombre de los pacientes y hora de la cita. Es posible que el médic o vaya adelantado sobre el horario y por tanto haya pacientes que aún no hayan legado, o que uno se retrase, pero al atender al siguien te, el retrasado puede ocupar el puesto del que es atendido...
Damos por hecho que el médico le atiende, y pongamos que al final le tiene que pedir una analiítica...
funcion BotonSolicitarAnalitica_Click
analitica a = ElegirYRellenarAnalitica // se elige el tipo de analítica y se rellenan los datos
Si (a.Estado = creado) luego // Si no hubo problemas, ni se canceló, etc...
string IdAnalitica = Clinica.Analiticas.Add(a) // se añade a la colección de analíticas de la clínica, y devuelve un Id, usado para identificarlo en la colección.
notificacion n = Clinica.GenerarNotificacion(origen="medico", destino="laboratorio", Id=IdAnalitica) // una notificación es para enviar eventos de un objeto a otro,
// se indica un origen y un destino y tendrá más campos, unos genericos y otros específicos,
// un Id que representa el id de una colección de donde se debe rescatar el objeto que versa la notificación
n.ColeccionId= "analitica"
n.Motivo = "citacion muestras"
n.Urgente = FALSE
n.Destino.Notificar(n) // genera un evento en el objeto destino (el laboratorio), que encola la notificación, a la espera de que los operarios puedan atenderla.
fin si
fin funcion
El evento notificar, entrega la notificación, que contiene el objeto remitente (en el ejemplo Medicos), para saber de donde procede, luego se acompaña de otros datos. Por eejmplo como se acompaña de un Id, debe sabersea que colección pertenece el id, por eso el miembro ColeccionId, lo aclara, tomarán de la colección:
Analitica a = Clinica.Analiticas.GetById(n.Id)
el motivo aclara que se está pidiendo al laboratorio, que realicen una citación para extracción/recogida de uestras la paciente que figura en la analítica, solicitada por el médico. Datos que figuran en la analítica...
El objeto Medico, Laboratorio, Clinica, etc... tienen todos un evento o método Notificar(notificacion n), así es posible hacer notificaciones que se encolan de unos a otros. Si es Urgente, al meterse en la cola, antecede a todos los no urgentes en la colección.
Evento Notificar(notificacion n)
string idNotifica = Laboratorio.Notificaciones.Add(n, n.Urgente) // se añade la notificación en la cola de notificaciones.
// Notificaciones es una agenda no preparada, con horario, cuando se atiende una se retira y se atiende la siguiente, sin horario específico.
// tiene a diferencia d ela Agenda, una variacion en el método ADD, la colección mantiene un índice señalando donde terminan las urgentes, s
fin evento
Añadiendo una notificación a una colección (se ha supuesto una colección basada en una lista enlazada).
éste sería un método de la colección 'notificaciones', diferentes objetos mantienen una colección de este tipo...
string = Funcion Add(notificacion n, buleano urgente)
n.IdNotifica = Hash(n, GlobalItems)
GlobalItems +=1
Si (urgente = TRUE) luego
entero k = IndexUrgentes
notificacion u= Notificaciones.GetByIndex(k)
n.Siguiente = u.Siguiente
n.Siguiente.Anterior= n
u.Siguiente = n
n.Anterior = u
IndexUrgentes += 1
sino
notificacion u = Notificaciones.Ultima
u.Siguiente = n
n.Anterior = u
Notificaciones.Ultima = n
fin si
Items +=1
Devolver n.IdNotifica
fin funcion
Eliminado una notificación de una colección...
Buleano = Funcion Delete(entero Index)
notificacion n
Si (Index = 0) luego
n = Primera
Primera = n.Siguiente
n.Siguiente.Anterior = nada
n.Siguiente = nada
oSi (Index= (Items-1)) luego
n = Ultima
Ultima = n.Anterior
n.Anterior.Siguiente = nada
n.Anterior = nada
sino
Si (index>0) y (index < Items) luego
k=1
n= Primera.Siguiente
Mientras k < index
n = n.Siguiente
Repetir
n.Anterior.Siguiente = n.Siguiente
n.Siguiente.Anterior = n.Anterior
n.Siguiente = nada
n.Anterior = nada
sino
Devolver FALSE
fin si
fin si
Si (n.Urgente = TRUE) luego
IndexUrgentes -=1
fin si
Items -=1
n = nada
Devolver TRUE
fin funcion
Alguien en el laboratorio, reclama la siguiente notificación, para procesarla....
funcion BotonSiguienteNotificacion_Click
Si (Items >0) luego
notificacion n = Notificaciones.Primera
Notificaciones.Eliminar(0) // se elimina de la colección, pero reside aún, gracia a al referencia 'n'
DespacharNotificacion(n)
sino
mensaje "no quedan notificaciones pendientes..."
fin si
fin funcion
Ejemplo de una función que despacha notificaciones, en este caso para el laboratorio...
Según el tipo de notificación se abrirá una ventana que se rellena con los datos procedente de la notificación...
Se va a lo rápido asumiendo que las funciones invocadas serealizan desde interfaz de usuario en general... luego aquí son 'pasos'...
funcion DespacharNotificacion(notificacion n)
Seleccionar n.ColeccionId
caso "analitica"
analitica a = Clinica.Analiticas.GetById(n.Id)
Selecionar n.Motivo
caso "citacion muestras", "citacion entregas"
paciente p = Clinica.Pacientes.GetById(a.IdPaciente)
Seleccionar n.Contacto
caso "email"
fecha f = Laboratorio.Agenda.GetPrimeraFechaLibreParaMuestras
rellenarEmail(p.email, textoCitacion, f)
enviarEmail
caso "telefono"
calendario f = Laboratorio.ShowAgenda //se abre una ventana con fechas que un operario ve si está libre y la propone al paciente
llamadaTelefono(p.TelefonoDecontacto, textoCitacion, f) // se informa por teléfono de la fecha de la
cita para recogida de muestras.
Hacer
f= Calendario.OtraFechaLibre
Mientras paciente no acepte f
caso "carta", "mensajero"
fecha f = Laboratorio.Agenda.GetPrimeraFechaLibreParaMuestras
rellenarCarta(p.direccion, p.Nombre + p.Apellidos, textoCitacion, f)
Si (n.Contacto= "carta") luego
EntregarCartaEnBuzon // la carta se introduce en un buzón de correos, se supone que la fecha tiene un plazo mayor que elde entrega de la carta.
sino
Llamaramensajero
EntregarCartaAMensajero // un mensajero lleva la carta al domicilio del paciente.
fin si
Fin seleccion
caso "analizar"
// se lleva a cabo la analítica por el operario correpondiente, quien al término actualiza los datos que correpondan en la analítica.
caso ...
...
... más casos
fin seleccion
a.fecha = f
a.Estado = citado
caso "citacion"
citacion c = Clinica.Citaciones.GetById(n.id)
...
caso "medico"
medico m = Clinica.Medicos.GetById(n.Id)
...
caso "..."
....
.....
fin seleccionar
n.Eliminar
fin funcion
Se elige el tipo de analítica y se rellenan los datos
Analitica a = Funcion ElegirYRellenarAnalitica
Analitica a= Clinica.ShowTiposDeAnalitica //muestra al médico una lista con los tipos de analíticas disponibles, el médico elige la que corresponda
Si (a.Estado=NoCancelado) luego
a.ShowRellenarDatosSolicitud // una ventana emergente con los datos específicos que deben rellenarse,
// algunos serán elegibles haciendo click en sus casillas,
// otros lo rellenará a mano
// y otros se pueden hacer por código, como los siguientes:
a.IdMedico = m.IdMedico // m es el objeto medico del que se loguea cuando prende su ordenador.
a.IdPaciente = p.IdPaciente
... // más cosas
a.Estado = creado
Devolver a
fin si
fin funcion
Esta función sería del objeto clinica.
notificacion n = Funcion GenerarNotificacion(string origen, string destino, string Id)
notificacion n
Seleccionar origen
Si origen = medico luego
n.origen = Medicos // objeto medicos.
oSi origen = "laboratorio" luego
n.Origen = Laboratorio // si hubiera varios, sería la colección.
oSi origen = ....
n.Origen = ....
...
fin si
fin seleccion
Seleccionar destino
Si destino = "medico" luego
n.Destino = Medicos // objeto medicos.
oSi destino = "laboratorio" luego
n.Destino = Laboratorio // si hubiera varios, sería la colección.
oSi destino = ....
n.Destino = ....
...
fin si
fin seleccion
n.Id = Id
n.Fecha = Ahora
Devolver n
Fin funcion
Y aquí lo dejo de momento.... todo el pseudocódigo expuesto, cumple solo el primer párrafo del comienzo (4 líneas), resolver todo (los otros párrafos) con este escaso pero significativo nivel de detalle, me llevaría 2 ó 3 horas... Creo que debieras ser capaz de seguir tú, ya, desde aquí...
Ten en cuenta que a medida que lo vas planteando en pseudocódigo, vas viendo la luz, el camino a seguir... sale solo y acabas corrigiendo pequeños errores en los conceptos previos... también date cuenta que cuando pases a nivel de código, es fácil que vuelvas a cambiar algo que en pseudocódigo se veía bien, por algo que en el lenguaje es más cómodo, dominas mejor, etc... y como te dije puede ser mucho más complejo (por extenso), o sencillo (por breve), por eso la fase previa de análisis de requisitos, es clave para avanzar en la senda que te reclaman... y no profundizar en una jungla si no te lo piden.