Desarrollo

Para iniciar el desarrollo de nuestro administrador de consultas. Abrimos nuestro eclipse y creamos un proyecto maven.File->New->MavenProject
Login Test
Seleccionamos en Create a simple project y presionamos Next
Login Test
LLenamos los siguientes campos y presionamos Finish: Medical Consulting
Una vez generado nuestro proyecto maven nos vamos al archivo pom.xml y pegamos el siguiente código esto, para poder compilar con java 1.8.
   <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
           <source>1.8</source>
           <target>1.8</target>
        </configuration>
      </plugin> 
    </plugins>
   </build>

  
Ahora vemos que tenemos un problema nos vamos a nuestro proyecto y le damos clic derecho donde dice Maven->Update Project..
Login Test
Nos marcara un error que no encuentra el archivo web.xml pero lo solucionaremos de la siguiente manera, hacemos clic derecho en el proyecto y selecionamos Properties
Login Test
Selecionamos Project Facets en el recuadro seleccionamos Dynamic Web Module 3.1 y Java Server Faces 2.2 y presionamos Apply posterriormente OK
Medical Consulting
Creamos una carpeta en src/main/webapp llamada WEB-INF.Nota:Si tienes eclipse 2019 te genera el archivo web.xml modificalo por el que esta en el código y luego maven->Update Project...
En el directorio WEB-INF creamos el archivo web.xml y escribimos lo siguiente:
  <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<display-name>medicalconsulting</display-name>
<absolute-ordering />
<!-- load spring configuration -->
	
	
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring-config.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	
 <context-param>
  <param-name>javax.faces.PROJECT_STAGE</param-name>
  <param-value>Development</param-value>
 </context-param>
 <context-param>
  <param-name>primefaces.THEME</param-name>
  <param-value>blitzer</param-value>
 </context-param>
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>/faces/*</url-pattern>
 </servlet-mapping>
 <session-config>
  <session-timeout>30</session-timeout>
 </session-config>
 <welcome-file-list>
  <welcome-file>faces/index.xhtml</welcome-file>
 </welcome-file-list>
</web-app>     
  
   
En el mismo directorio WEB-INF creamos el archivo spring-config.xml y escribimos lo siguiente:
           
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xsi:schemaLocation="http://www.springframework.org/schema/context
          https://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo-2.0.xsd
          http://www.springframework.org/schema/beans
          https://www.springframework.org/schema/beans/spring-beans.xsd">

<context:annotation-config />

<context:component-scan base-package=">mx.com.tutosoftware.medicalconsulting" />
<mongo:mongo-client host="127.0.0.1" port="27017">
    <mongo:client-options write-concern="NORMAL" />
    
  </mongo:mongo-client>

<mongo:db-factory  dbname="medicaldb" mongo-ref="mongoClient" />

<mongo:repositories base-package="mx.com.tutosoftware.medicalconsulting.repository">
</mongo:repositories>

<bean id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate" >

<constructor-arg ref="mongoClient">

</constructor-arg>
<constructor-arg name="databaseName" value="medicaldb"  >
</constructor-arg>
</bean>

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean class="mx.com.tutosoftware.medicalconsulting.service.ProfesionalService" id="profesionalService"/>
<bean class="mx.com.tutosoftware.medicalconsulting.service.PacienteService" id="pacienteService"/>
<bean class="mx.com.tutosoftware.medicalconsulting.service.TurnoService" id="turnoService"/>  
<bean class="mx.com.tutosoftware.medicalconsulting.service.CitaService" id="citaService"/>  
  
</beans>
              
  
El archivo faces-config.xml queda de la siguiente forma:
            
      <?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
    
    
    <application>
		<el-resolver>
			org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
	</application>

<navigation-rule>
<from-view-id>
/index.xhtml
</from-view-id>
<navigation-case>
<from-outcome>
adminMedico
</from-outcome>
<to-view-id>
/adminMedico.xhtml
</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>
adminPaciente
</from-outcome>
<to-view-id>
/adminPaciente.xhtml
</to-view-id>
</navigation-case>
</navigation-rule>

</faces-config>        
              
              
              
  
Ahora creamos todas las dependencias en nuestro archivo pom.xml queda de la siguiente forma:
      
   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mx.com.tutosoftware.medicalconsulting</groupId>
  <artifactId>medicalconsulting</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
   <repositories>
    <repository>
        <id>prime-repo</id>
        <name>PrimeFaces Maven Repository</name>
        <url>http://repository.primefaces.org/</url>
        <layout>default</layout>
    </repository>
</repositories>
  
  
  
  
  <properties>
        <csc.version>0.0.1-SNAPSHOT</csc.version>
        <primefacestheme.version>1.0.10</primefacestheme.version>
		<primefaces.version>7.0</primefaces.version>
		<springdata.version>2.0.8.RELEASE</springdata.version>
		<spring.version>5.0.7.RELEASE</spring.version>
		<jsf2.version>2.2.10</jsf2.version>
		<jackson-core.version>2.9.5</jackson-core.version>
		<jstl.version>1.2</jstl.version>
		<jsp-api.version>2.1</jsp-api.version>
		<servlet-api.version>3.1.0</servlet-api.version>
		
		<itext.version>2.1.7</itext.version>
		<poi.version>3.17</poi.version>
		<elri.version>1.0</elri.version>
		<javaeewebapi.version>7.0</javaeewebapi.version>
	</properties>
  
  
  <dependencies>
  
 
  
  
  <!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
        
        
        <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.7.RELEASE</version>
    <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
</dependency>
   
        
		<!-- Spring ORM support -->
		
		
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
		
		<!-- mongo --> 
		
		<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>${springdata.version}</version>
</dependency>
		
	<dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
          <version>${jackson-core.version}</version>
         </dependency>		
		
		
		<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>${spring.version}</version>
			</dependency>
		
		
		
		
		
		
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>${jsf2.version}</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>${jsf2.version}</version>
		</dependency>
		
		 
        
		
		
		
		 <dependency>
				<groupId>javax.servlet.jsp</groupId>
				<artifactId>jsp-api</artifactId>
				<version>${jsp-api.version}</version>
				<scope>provided</scope>
			</dependency>
			
			
         <dependency>
	     <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	   <version>${servlet-api.version}</version>
        </dependency>
			
			
			
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jstl</artifactId>
				<version>${jstl.version}</version>
			</dependency>
		
     <dependency>
			<groupId>com.sun.el</groupId>
			<artifactId>el-ri</artifactId>
			<version>${elri.version}</version>
		</dependency>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>${javaeewebapi.version}</version>
			<scope>provided</scope>
		</dependency>
  
  
  
  
  
  <dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>${primefaces.version}</version>
     </dependency>
     
     <dependency>
    <groupId>org.primefaces.themes</groupId>
    <artifactId>all-themes</artifactId>
    <version>${primefacestheme.version}</version>
</dependency>
  
  
  <dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>${itext.version}</version>
</dependency>
     
   <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>${poi.version}</version>
</dependency>
</dependencies>
  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
           <source>1.8</source>
           <target>1.8</target>
        </configuration>
      </plugin> 
    </plugins>
   </build>
  
  
  
</project>           
              
  
Comencemos por crear la parte del dominio en src/main/java creamos el paquete mx.com.tutosoftware.medicalconsulting.domain y en ese paquete creamos la clase Domicilio
 
  package mx.com.tutosoftware.medicalconsulting.domain;

import org.springframework.data.mongodb.core.mapping.Document;

@Document
public class Domicilio {
	
	private String calle;
	private String numero;
	private String colonia;
	private String municipio;
	private String estado;
	private String codigoPostal;
	public String getCalle() {
		return calle;
	}
	public void setCalle(String calle) {
		this.calle = calle;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getColonia() {
		return colonia;
	}
	public void setColonia(String colonia) {
		this.colonia = colonia;
	}
	public String getMunicipio() {
		return municipio;
	}
	public void setMunicipio(String municipio) {
		this.municipio = municipio;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	public String getCodigoPostal() {
		return codigoPostal;
	}
	public void setCodigoPostal(String codigoPostal) {
		this.codigoPostal = codigoPostal;
	}

}
  
  
  
 
Ahora creamos la clase Profesional que es para la colección correspondiente:
 
 package mx.com.tutosoftware.medicalconsulting.domain;

import org.springframework.data.mongodb.core.mapping.Document;



@Document(collection="profesional")
public class Profesional {
	
	
	//Esta clave depende del pais donde sea implmentada
		//La aplicación
		private String dni;
		private String nombre;
		private String apellidoPaterno;
		private String apellidoMaterno;
		//el correo va hacer el usuario para loguearse
		private String mail;
		private String telefono;
		private String password;
		private Domicilio domicilio;
		public String getDni() {
			return dni;
		}
		public void setDni(String dni) {
			this.dni = dni;
		}
		public String getNombre() {
			return nombre;
		}
		public void setNombre(String nombre) {
			this.nombre = nombre;
		}
		public String getApellidoPaterno() {
			return apellidoPaterno;
		}
		public void setApellidoPaterno(String apellidoPaterno) {
			this.apellidoPaterno = apellidoPaterno;
		}
		public String getApellidoMaterno() {
			return apellidoMaterno;
		}
		public void setApellidoMaterno(String apellidoMaterno) {
			this.apellidoMaterno = apellidoMaterno;
		}
		public String getMail() {
			return mail;
		}
		public void setMail(String mail) {
			this.mail = mail;
		}
		public String getTelefono() {
			return telefono;
		}
		public void setTelefono(String telefono) {
			this.telefono = telefono;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public Domicilio getDomicilio() {
			return domicilio;
		}
		public void setDomicilio(Domicilio domicilio) {
			this.domicilio = domicilio;
		}

}
  
  
  
  
Este ejemplo lo saque de un desarrollo que competi para realizarlo claro que le falta tal vez un poco mas análisis detallado pero me gusto porque esta sencillo de realizarlo y tal vez nos pueda servir de guía para desarrollar un sistema jsf+primefaces+springframework+spring data mongodb+mongodb. Prosigamos con crear la clase Paciente que es un espejo de la colección profesional.
             
  
  package mx.com.tutosoftware.medicalconsulting.domain;

import org.springframework.data.mongodb.core.mapping.Document;



@Document(collection="paciente")
public class Paciente {
	
	
	//Esta clave depende del pais donde sea implmentada
			//La aplicación
			private String dni;
			private String nombre;
			private String apellidoPaterno;
			private String apellidoMaterno;
			//el correo va hacer el usuario para loguearse
			private String mail;
			private String telefono;
			private String password;
			private Domicilio domicilio;
			public String getDni() {
				return dni;
			}
			public void setDni(String dni) {
				this.dni = dni;
			}
			public String getNombre() {
				return nombre;
			}
			public void setNombre(String nombre) {
				this.nombre = nombre;
			}
			public String getApellidoPaterno() {
				return apellidoPaterno;
			}
			public void setApellidoPaterno(String apellidoPaterno) {
				this.apellidoPaterno = apellidoPaterno;
			}
			public String getApellidoMaterno() {
				return apellidoMaterno;
			}
			public void setApellidoMaterno(String apellidoMaterno) {
				this.apellidoMaterno = apellidoMaterno;
			}
			public String getMail() {
				return mail;
			}
			public void setMail(String mail) {
				this.mail = mail;
			}
			public String getTelefono() {
				return telefono;
			}
			public void setTelefono(String telefono) {
				this.telefono = telefono;
			}
			public String getPassword() {
				return password;
			}
			public void setPassword(String password) {
				this.password = password;
			}
			public Domicilio getDomicilio() {
				return domicilio;
			}
			public void setDomicilio(Domicilio domicilio) {
				this.domicilio = domicilio;
			}

}
  
 
Creamos la clase Turno Aqui vamos generar la colección turno los turno solo se agregan por día y el horario de inicio es menor al horario final.
 
  package mx.com.tutosoftware.medicalconsulting.domain;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;

@Document(collection="turno")
public class Turno {
	
	private String dni;
	@DateTimeFormat(iso = ISO.DATE_TIME)
	@CreatedDate
	private Date horarioInicio;
	@DateTimeFormat(iso = ISO.DATE_TIME)
	@CreatedDate
	private Date horarioFinal;
	private int duracionConsulta;
	
	
	
	public String getDni() {
		return dni;
	}
	public void setDni(String dni) {
		this.dni = dni;
	}
	public Date getHorarioInicio() {
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
		calendar.setTime(horarioInicio);
		return calendar.getTime();
	}
	public void setHorarioInicio(Date horarioInicio) {
		this.horarioInicio = horarioInicio;
	}
	public Date getHorarioFinal() {
		
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
		calendar.setTime(horarioFinal);
		return calendar.getTime();
	}
	public void setHorarioFinal(Date horarioFinal) {
		this.horarioFinal = horarioFinal;
	}
	public int getDuracionConsulta() {
		return duracionConsulta;
	}
	public void setDuracionConsulta(int duracionConsulta) {
		this.duracionConsulta = duracionConsulta;
	}
	
	

}
  
  
  
 
La ultima clase de dominio seria Cita Estos documentos se generan cuando nosotros seleccionamos el turno y la duracion de la consulta.
  package mx.com.tutosoftware.medicalconsulting.domain;

import java.util.Date;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;

@Document(collection="cita")
public class Cita {
	
	private String dni;
	@DateTimeFormat(iso = ISO.DATE_TIME)
	@CreatedDate
	private Date horario;
	private String nombrePaciente;
	private String status;
	public String getDni() {
		return dni;
	}
	public void setDni(String dni) {
		this.dni = dni;
	}
	public Date getHorario() {
		return horario;
	}
	public void setHorario(Date horario) {
		this.horario = horario;
	}
	public String getNombrePaciente() {
		return nombrePaciente;
	}
	public void setNombrePaciente(String nombrePaciente) {
		this.nombrePaciente = nombrePaciente;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}

}