mx.com.tutosoftware.cleanservice.dao

Ahora vamos a crear el paquete mx.com.tutosoftware.cleanservice.dao en este paquete creamos la Interface HomeCleanDAO
        package mx.com.tutosoftware.cleanservice.dao;

      import mx.com.tutosoftware.cleanservice.entity.HomeClean;

     public interface HomeCleanDAO {
	
	public HomeClean obtenerPaqueteHomeClean();

     }
        
        
        

A continuación vamos a crear el paquete mx.com.tutosoftware.cleanservice.dao.impl y en este paquete vamos implentar el DAO con la clase HomeDAOImpl
clean service
   
  package mx.com.tutosoftware.cleanservice.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import mx.com.tutosoftware.cleanservice.dao.HomeCleanDAO;
import mx.com.tutosoftware.cleanservice.entity.HomeClean;
import mx.com.tutosoftware.cleanservice.util.HibernateUtil;


@Repository
public class HomeCleanDAOImpl implements HomeCleanDAO {
	
	@Autowired
	private HibernateUtil hibernateUtil;

	@Override
	public HomeClean obtenerPaqueteHomeClean() {
		// TODO Auto-generated method stub
		HomeClean hm=new HomeClean();
		long id =1;
		hm = hibernateUtil.fetchById(id,HomeClean.class);
		return hm;
	}

}
  

Lo que sigue son los servicios creamos el package mx.com.tutosoftware.cleanservice.service sobre este paquete creamos la interface HomeCleanService
 
  package mx.com.tutosoftware.cleanservice.service;

import mx.com.tutosoftware.cleanservice.entity.HomeClean;

public interface HomeCleanService {
	
	public HomeClean obtenerPaqueteHomeClean();

} 
   
   
   

Continuamos con la el paquete de implementación mx.com.tutosoftware.cleanservice.service.impl y en este creamos la clase HomeCleanServiceImpl
   
  package mx.com.tutosoftware.cleanservice.service;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import mx.com.tutosoftware.cleanservice.dao.HomeCleanDAO;
import mx.com.tutosoftware.cleanservice.entity.HomeClean;



@Service
@Transactional
public class HomeCleanServiceImpl implements HomeCleanService {
	
	@Autowired
	private HomeCleanDAO homeCleanDAO;

	@Override
	public HomeClean obtenerPaqueteHomeClean() {
		// TODO Auto-generated method stub
		return homeCleanDAO.obtenerPaqueteHomeClean();
	}

}

cleanservice-web

Ahora vamos con la parte de la vista nos vamos al modulo cleanservice-web y el archivo pom.xml nos queda de la siguiente manera:
              
  <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>
  <parent>
    <groupId>mx.com.tutosoftware.cleanservice</groupId>
    <artifactId>cleanservice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>cleanservice-web</artifactId>
  <packaging>war</packaging>
  <name>CleanService Web</name>
   <build>
		<finalName>cleanservice</finalName>
		<plugins>	
			<plugin>            
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
					<webResources>
						<resource>
							<!-- this is relative to the pom.xml directory -->
							<directory>src/main/webapp/WEB-INF</directory>
							<targetPath>WEB-INF</targetPath>
						</resource>
					</webResources>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
	
	<dependency>
  <groupId>mx.com.tutosoftware.cleanservice</groupId>
	<artifactId>cleanservice-core</artifactId>
	</dependency>
	
	
	<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
		</dependency>
	
	 <dependency>
				<groupId>javax.servlet.jsp</groupId>
				<artifactId>jsp-api</artifactId>
				<scope>provided</scope>
			</dependency>
			
			
         <dependency>
	     <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
        </dependency>
			
			
			
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jstl</artifactId>
			</dependency>
		
     <dependency>
			<groupId>com.sun.el</groupId>
			<artifactId>el-ri</artifactId>
		</dependency>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<scope>provided</scope>
		</dependency>
  
  
  
  
  
  <dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
     </dependency>
     
     <dependency>
    <groupId>org.primefaces.themes</groupId>
    <artifactId>all-themes</artifactId>
</dependency>
  
  
  <dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
</dependency>
     
   <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
</dependency>
	
	
	
	
      <!-- Spring 4 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>

       

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        
        
        
         <!-- Hibernate  dependencies -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>
        
        
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
        </dependency>
        
          <!-- mysql  dependencie -->
        
        <dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	   </dependency>
  
  
  </dependencies>
</project>          
            
  

Ahora vamos a la carpeta src/main/webapp/WEB-INF y creamos el archivo spring-config.xml
<?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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">

	<!-- support spring annotation -->
	<context:annotation-config />
	<!-- support annotation transaction -->
	
	<!-- Specifying base package of the Components like Controller, Service, 
		DAO -->
	<context:component-scan base-package="mx.com.tutosoftware.cleanservice" />
		
	<!-- Getting Database properties -->
	<context:property-placeholder location="classpath:application.properties" />
	
	
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${database.driverClass}" />
		<property name="jdbcUrl" value="${database.url}" />
		<property name="user" value="${database.username}" />
		<property name="password" value="${database.password}" />

		<property name="acquireIncrement" value="${connection.acquireIncrement}" />
		<property name="minPoolSize" value="${connection.minPoolSize}" />
		<property name="maxPoolSize" value="${connection.maxPoolSize}" />
		<property name="maxIdleTime" value="${connection.maxIdleTime}" />
	</bean>

	<!-- Hibernate SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
			</props>
		</property>
		<property name="packagesToScan" value="mx.com.tutosoftware.cleanservice.entity"></property>
	</bean>

	<!-- Transaction -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	
	
	
	
</beans>


 

En src/main/webapp/WEB-INF creamos el archivo faces-config.xml
<?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>
    
        

</faces-config>


 

Creamos la conexión con mysql nos vamos a src/main/resources y creamos el archivo application.properties
clean service
database.driverClass=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/cleanservicedb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
database.username=admin
database.password=adminlara

#Hibernate related properties
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true

#Connection pool related properties
connection.acquireIncrement=2
connection.minPoolSize=20
connection.maxPoolSize=50
connection.maxIdleTime=600 
 
 

En src/main/java creamos el paquete mx.com.tutosoftware.cleanservice.bean y creamos la clase DashboardView
 
  package mx.com.tutosoftware.cleanservice.bean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;

import org.primefaces.event.CloseEvent;
import org.primefaces.event.DashboardReorderEvent;
import org.primefaces.event.ToggleEvent;
import org.primefaces.model.DashboardColumn;
import org.primefaces.model.DashboardModel;
import org.primefaces.model.DefaultDashboardColumn;
import org.primefaces.model.DefaultDashboardModel;


@ManagedBean
@ViewScoped
public class DashboardView implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
private DashboardModel model;
	
	@PostConstruct
    public void init() {
        model = new DefaultDashboardModel();
        DashboardColumn column1 = new DefaultDashboardColumn();
        DashboardColumn column2 = new DefaultDashboardColumn();
        DashboardColumn column3 = new DefaultDashboardColumn();
         
        column1.addWidget("home");
        column1.addWidget("sondeo");
         
        column2.addWidget("office");
        
         
        column3.addWidget("working");
 
        model.addColumn(column1);
        model.addColumn(column2);
        model.addColumn(column3);
    }
     
    public void handleReorder(DashboardReorderEvent event) {
        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_INFO);
        message.setSummary("Reordered: " + event.getWidgetId());
        message.setDetail("Item index: " + event.getItemIndex() + ", Column index: " + event.getColumnIndex() + ", Sender index: " + event.getSenderColumnIndex());
         
        addMessage(message);
    }
     
    public void handleClose(CloseEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Panel Closed", "Closed panel id:'" + event.getComponent().getId() + "'");
         
        addMessage(message);
    }
     
    public void handleToggle(ToggleEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, event.getComponent().getId() + " toggled", "Status:" + event.getVisibility().name());
         
        addMessage(message);
    }
     
    private void addMessage(FacesMessage message) {
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
     
    public DashboardModel getModel() {
        return model;
    }

}
  

En el mismo paquete creamos la clase CotizaHome
  
 package mx.com.tutosoftware.cleanservice.bean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.FlowEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import mx.com.tutosoftware.cleanservice.entity.HomeClean;
import mx.com.tutosoftware.cleanservice.service.HomeCleanService;


@ManagedBean
@ViewScoped
@Component
public class CotizaHome implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String tipoVivienda;
	private String numeroHabitacion;
	private boolean skip;
	private String numeroBanos;
	private String tipoDepartamento;
	private boolean enable = true;
	private boolean enableCasa = true;
	private boolean enableResidencia=true;
	private boolean requiredDepartamento=true;
	private boolean requiredCasa=true;
	private boolean requiredResidencia=true;
	private String tipoCasa;
	private String tipoResidencia;
	private String[] tareas;
	private double costoTotal;
	private String costoAproximado;
	private HomeClean homeClean;
	
	

	@Autowired
	private HomeCleanService homeCleanService;
	
	
	@PostConstruct
	public void init() {
		homeClean = homeCleanService.obtenerPaqueteHomeClean();
		
	}
	
	
	
	
	public String getTipoVivienda() {
		return tipoVivienda;
	}
	public void setTipoVivienda(String tipoVivienda) {
		this.tipoVivienda = tipoVivienda;
	}
	public String getNumeroHabitacion() {
		return numeroHabitacion;
	}
	public void setNumeroHabitacion(String numeroHabitacion) {
		this.numeroHabitacion = numeroHabitacion;
	}
	public boolean isSkip() {
        return skip;
    }
 
    public void setSkip(boolean skip) {
        this.skip = skip;
    }
	
	public String getNumeroBanos() {
		return numeroBanos;
	}
	public void setNumeroBanos(String numeroBanos) {
		this.numeroBanos = numeroBanos;
	}
	public String getTipoDepartamento() {
		return tipoDepartamento;
	}
	public void setTipoDepartamento(String tipoDepartamento) {
		this.tipoDepartamento = tipoDepartamento;
	}
	public boolean isEnable() {
		return enable;
	}
	public void setEnable(boolean enable) {
		this.enable = enable;
	}
	public boolean isEnableCasa() {
		return enableCasa;
	}
	public void setEnableCasa(boolean enableCasa) {
		this.enableCasa = enableCasa;
	}
	public boolean isEnableResidencia() {
		return enableResidencia;
	}
	public void setEnableResidencia(boolean enableResidencia) {
		this.enableResidencia = enableResidencia;
	}
	public String getTipoCasa() {
		return tipoCasa;
	}
	public void setTipoCasa(String tipoCasa) {
		this.tipoCasa = tipoCasa;
	}
	public String getTipoResidencia() {
		return tipoResidencia;
	}
	public void setTipoResidencia(String tipoResidencia) {
		this.tipoResidencia = tipoResidencia;
	}
	public String[] getTareas() {
		return tareas;
	}
	public void setTareas(String[] tareas) {
		this.tareas = tareas;
	}
	public double getCostoTotal() {
		return costoTotal;
	}
	public void setCostoTotal(double costoTotal) {
		this.costoTotal = costoTotal;
	}
	public String getCostoAproximado() {
		return costoAproximado;
	}
	public void setCostoAproximado(String costoAproximado) {
		this.costoAproximado = costoAproximado;
	}
	public HomeClean getHomeClean() {
		return homeClean;
	}
	public void setHomeClean(HomeClean homeClean) {
		this.homeClean = homeClean;
	}
	public void setHomeCleanService(HomeCleanService homeCleanService) {
		this.homeCleanService = homeCleanService;
	}
	public boolean isRequiredDepartamento() {
		return requiredDepartamento;
	}




	public void setRequiredDepartamento(boolean requiredDepartamento) {
		this.requiredDepartamento = requiredDepartamento;
	}




	public boolean isRequiredCasa() {
		return requiredCasa;
	}




	public void setRequiredCasa(boolean requiredCasa) {
		this.requiredCasa = requiredCasa;
	}




	public boolean isRequiredResidencia() {
		return requiredResidencia;
	}




	public void setRequiredResidencia(boolean requiredResidencia) {
		this.requiredResidencia = requiredResidencia;
	}




	public HomeCleanService getHomeCleanService() {
		return homeCleanService;
	}
	public String onFlowProcess(FlowEvent event) {
        if(skip) {
            skip = false;   //reset in case user goes back
            return "confirm";
        }
        else {
            return event.getNewStep();
        }
    }
	public void getEnableTipoDaprtamento() {
		
		costoAproximado="";
		
		if(tipoVivienda.equals("departamento")) {
		enable = false;
		enableCasa = true;
		enableResidencia=true;
		}
		if(tipoVivienda.equals("casa")) {
		enableCasa = false;	
		enable=true;
		enableResidencia=true;
		}
		if(tipoVivienda.equals("residencia")) {
			enableResidencia=false;
			enable=true;
			enableCasa=true;
		}
	}
	
	public String cotizar() {
		
		
		
		
		   costoTotal=0;
		
	       if(tipoVivienda.equals("departamento")) {
	    	costoTotal =   costoTotal + homeClean.getDepartamento();
	    	if(tipoDepartamento.equals("Zona Habitacional")) {
	    		costoTotal = costoTotal + homeClean.getZonaHabitacional();
	    	}
	    	if(tipoDepartamento.equals("Zona Habitacional Residencial o Privada")) {
	    		costoTotal = costoTotal + homeClean.getZonaPrivadaDepa();
	    	}
	    	if(tipoDepartamento.equals("Edificio")) {
	    		costoTotal = costoTotal + homeClean.getEdificio();
	    	}
	    	
	       }
	       if(tipoVivienda.equals("casa")) {
	    	 costoTotal = costoTotal + homeClean.getCasa();
	    	 if(tipoCasa.equals("Un piso")) {
	    		 costoTotal = costoTotal + homeClean.getPiso();
	    	 }
	    	 if(tipoCasa.equals("Dos pisos")) {
	    		 costoTotal = costoTotal + homeClean.getDosPisos();
	    	 }
	    	 if(tipoCasa.equals("Dos pisos o más")) {
	    		 costoTotal = costoTotal + homeClean.getMasPisos();
	    	 }
	       }
	       if(tipoVivienda.equals("residencia")) {
	    	 costoTotal = costoTotal + homeClean.getResidencia();
	    	 if(tipoResidencia.equals("Privada Peatonal")) {
	    		 costoTotal = costoTotal + homeClean.getPrivadaAccesoPeatonal();
	    	 }
	    	 if(tipoResidencia.equals("Privada Vehícular")) {
	    		 costoTotal = costoTotal + homeClean.getPrivadaAccesoVehicular();
	    	 }
	    	 if(tipoResidencia.equals("Acceso Abierto")) {
	    		 costoTotal = costoTotal + homeClean.getAccesoAbierto();
	    	 }
	    	 
	       }
	       if(numeroHabitacion.equals("uno")) {
	    	   costoTotal = costoTotal + homeClean.getHabitacion();
	       }
	       if(numeroHabitacion.equals("dos")) {
	    	   costoTotal = costoTotal + homeClean.getHabitacion2();
	       }
	       if(numeroHabitacion.equals("tres")) {
	    	   costoTotal = costoTotal + homeClean.getHabitacion3();
	       }
	       if(numeroHabitacion.equals("más de tres")) {
	    	   costoTotal = costoTotal + homeClean.getHabitacionMas3();
	       }
	       
	       if(numeroBanos.equals("uno")) {
	    	   costoTotal = costoTotal + homeClean.getBano1();
	       }
	       if(numeroBanos.equals("dos")) {
	    	   costoTotal = costoTotal + homeClean.getBano2();
	       }
	       if(numeroBanos.equals("tres")) {
	    	   costoTotal = costoTotal + homeClean.getBano3();
	       }
	       if(numeroBanos.equals("mas de 3")) {
	    	   costoTotal = costoTotal + homeClean.getBanoMas3();
	       }
	       
	       for(int i=0;i<tareas.length;i++) {
	    	   if(tareas[i].equals("barrer pisos")) {
	    		   costoTotal = costoTotal + homeClean.getBarrerPisos();
	    	   }
	    	   if(tareas[i].equals("lavar trastes")) {
	    		   costoTotal = costoTotal + homeClean.getLavarTrastes();
	    	   }
	    	   if(tareas[i].equals("sacudir")) {
	    		   costoTotal = costoTotal + homeClean.getSacudir();
	    	   }
	    	   if(tareas[i].equals("lavar pisos")) {
	    		   costoTotal = costoTotal + homeClean.getLavarPisos();
	    	   }
	    	   if(tareas[i].equals("trapear pisos")) {
	    		   costoTotal = costoTotal + homeClean.getTrapearPisos();
	    	   }
	    	   if(tareas[i].equals("cambiar sabanas")) {
	    		   costoTotal = costoTotal + homeClean.getCambiarSabanas();
	    	   }
	    	   if(tareas[i].equals("tirar basura")) {
	    		   costoTotal = costoTotal + homeClean.getTirarBasura();
	    	   }
	       }
	       
	       
	       
	       costoAproximado="El costo aproximado de tu servicio es de $"+costoTotal+"MX";
	       return costoAproximado;
	}
	
	public void getRequiredDepartamento() {
		
		if(tipoDepartamento != null) {
			requiredCasa=false;
			requiredResidencia=false;
			tipoCasa="";
			tipoResidencia="";
			
			
		}
		
		
		
	}
    public void getRequiredCasa() {
		
		if(tipoCasa != null) {
			requiredDepartamento=false;
			requiredResidencia=false;
			tipoDepartamento="";
			tipoResidencia="";
			
		}
		
		
		
	}
	
     public void getRequiredResidencia() {
		
		if(tipoResidencia != null) {
			requiredDepartamento=false;
			requiredCasa=false;
			tipoDepartamento="";
			tipoCasa="";
			
			
			
		}
		
		
		
	}
     
    public void resetWizard() {
    	tipoVivienda="";
    	tipoCasa="";
    	tipoDepartamento="";
    	tipoResidencia="";
    	numeroHabitacion="";
    	numeroBanos="";
    	
    	
    }
	

} 
  
  

Por último vamos con las vistas creamos en src/main/webapp el archivo index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
     
    <h:head>
    <title>Cleanig Service Online</title>
    </h:head>
 
    <h:body>
    <style type="text/css">
            .ui-panel, div.ui-state-hover {
                margin: 10px;
                width:250px;
            }
             
            .ui-dashboard-column {
                width:270px;
            }
        </style>
        <p:layout style="min-width:200px;min-height:800px;">
    <p:layoutUnit position="west" resizable="true" size="400" minSize="40" maxSize="500">
     <h:form>
    <p:growl>
        <p:autoUpdate />
    </p:growl>
 
    <p:panelMenu style="width:300px">
        <p:submenu label="Clientes">
            
            <p:menuitem value="Ingresar"  />
        </p:submenu>
         <p:submenu label="Admin">
            
            <p:menuitem value="Ingresar"  />
        </p:submenu>
        <p:submenu label="Usuario">
            
            <p:menuitem value="Ingresar"  />
        </p:submenu>
         <p:submenu label="Quieres trabajar?">
            
            <p:menuitem value="Registrate"  />
        </p:submenu>
        
        
        
        
        
    </p:panelMenu>
</h:form>
     
     
     
        
    </p:layoutUnit>
 
    <p:layoutUnit position="center">
       
       
       
       
        <h1>Bienvenido</h1>
        <p>Bienvenido a nuestro servicio en línea de limpieza elige un paquete apropiado
        a tus necesidades.</p>
        <div style="height:500px">
         <h:form>
        
          <p:growl id="msgs" showDetail="true" />
 
        <p:dashboard id="board" model="#{dashboardView.model}">
            <p:ajax event="reorder" listener="#{dashboardView.handleReorder}" update="msgs" />
 
            <p:panel id="home" header="Home Clean">
                <h:outputText value="Este paquete es ideal para la limpieza de tu
                departamento,casa habitación o casa residencial." /><br/>
                <p:linkButton value="Cotizar" outcome="homeCotizador" style="margin-right:20px;">
    
</p:linkButton>
            </p:panel>
 
            <p:panel id="office" header="Office Clean">
                <h:outputText value="Esta paquete esta diseñado para la limpieza de tu despacho,
               piso de oficinas o inclusive el edificio completo de tus instalaciones." />
               <br/>
               <p:linkButton value="Cotizar" style="margin-right:20px;"></p:linkButton>
            </p:panel>
 
            <p:panel id="sondeo" header="Encuesta 2019">
                <h:outputText value="Responde nuestra encuesta sobre los
                paquetes que ofrecemos y llevate un regalo."  />
                 <br/>
                 <p:linkButton value="Responder" style="margin-right:20px;">
                 </p:linkButton>
            </p:panel>
 
            <p:panel id="working" header="Working clean">
                <h:outputText value="Este paquete es ideal cuando tienes una
                remodelación, o una construcción y deseas personal que te limpie
                tu vivienda o construcción." />
                 <br/>
                 <p:linkButton value="Cotizar" style="margin-right:20px;">
                 </p:linkButton>
            </p:panel>
 
           
        </p:dashboard>
 
        <div style="clear:both" />
    </h:form>    
        </div>
    </p:layoutUnit>
</p:layout>
    </h:body>
</html>

 

En el mismo directrio creamos el archivo homeCotizador.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
     
    <h:head>
    <title>Paquete Home Clean</title>
    </h:head>
 
    <h:body>
    <style type="text/css">
    .label {
        width:20%;
        padding:4px;
    }
 
    .value {
        width:80%;
        padding:4px;
    }
 
    .grid {
        width:100%;
    }
 
    .error {
        color: red;
    }
 
    .outputLabel {
        font-weight: bold;
    }
 
    .grid {
        width:33%;
        padding:4px;
    }
    .ui-datalist ul {
        padding: 0px 10px 0 20px;
        margin: 5px 0;
    }
 
    .ui-datalist {
        margin-bottom: 10px
    }
 
    .ui-noborder tr.ui-widget-content {
        background: none;
    }
</style>
    
    
    
    
        <style type="text/css">
    .value {
        font-weight: bold;
    }
</style>
 <h:form>
 <p:breadCrumb>
    <p:menuitem value="Home" action="index" />
   
    
</p:breadCrumb>
 </h:form>
 
        <p:layout style="min-width:200px;min-height:1200px;">
   
  
    <p:layoutUnit position="center">
   
        <p:fieldset legend="Paquete Home Clean" style="margin-bottom:20px">
        <h:panelGrid columns="1" cellpadding="5">
            
            <h:outputText
                value="En esta paquete se forma por 3 categorías: departamento,casa habitación,casa residencial." />
        </h:panelGrid>
    </p:fieldset>
       <h:form id="form1">
       
       
           
             
                <p:growl id="growl" sticky="true" showDetail="true"/>
 
    <p:wizard flowListener="#{cotizaHome.onFlowProcess}" showNavBar="false" widgetVar="wiz" >
   


        <p:tab id="vivienda" title="Tipo Vivienda">
            <p:panel header="Categoría">
                <p:messages />
                <h:panelGrid columns="2" columnClasses="label, value">
                     <h:outputText value="SeleccionarCategoria:" />
        <p:selectOneButton id="tipoVivienda" value="#{cotizaHome.tipoVivienda}" required="true">
            <f:selectItem itemLabel="Departamento" itemValue="departamento" />
            <f:selectItem itemLabel="Casa Habitación" itemValue="casa" />
            <f:selectItem itemLabel="Casa Residencial" itemValue="residencia" />
         <p:ajax listener="#{cotizaHome.getEnableTipoDaprtamento}" process="@this,tipoDepartamento,tipoCasa,tipoResidencia,costo" 
         update="tipoDepartamento,tipoCasa,tipoResidencia,costo"  ></p:ajax>   
        </p:selectOneButton>
         <p:outputLabel for="tipoDepartamento" value="Tipo Departamento:" />
        <p:selectOneRadio id="tipoDepartamento" value="#{cotizaHome.tipoDepartamento}" unselectable="true" 
        disabled="#{cotizaHome.enable}" required="#{cotizaHome.requiredDepartamento}">
            <f:selectItem itemLabel="Zona Habitacional" itemValue="Zona Habitacional" />
            <f:selectItem itemLabel="Zona Habitacional Residencial o Privada" itemValue="Zona Habitacional Residencial o Privada" />
            <f:selectItem itemLabel="Edificio" itemValue="Edificio" />
         <p:ajax listener="#{cotizaHome.getRequiredDepartamento}" process="@this,tipoDepartamento,tipoCasa,tipoResidencia" 
         update="tipoDepartamento,tipoCasa,tipoResidencia"  ></p:ajax>  
        </p:selectOneRadio>
        <p:outputLabel for="tipoCasa" value="Cuantos pisos tiene?:" />
         <p:selectOneRadio id="tipoCasa" value="#{cotizaHome.tipoCasa}" unselectable="true" 
        disabled="#{cotizaHome.enableCasa}" required="#{cotizaHome.requiredCasa}">
            <f:selectItem itemLabel="Un piso" itemValue="Un piso" />
            <f:selectItem itemLabel="Dos pisos" itemValue="Dos pisos" />
            <f:selectItem itemLabel="Dos pisos o más" itemValue="Dos pisos o más" />
         <p:ajax listener="#{cotizaHome.getRequiredCasa}" process="@this,tipoDepartamento,tipoCasa,tipoResidencia" 
         update="tipoDepartamento,tipoCasa,tipoResidencia"  ></p:ajax> 
        </p:selectOneRadio>    
          <p:outputLabel for="tipoResidencia" value="Que tipo de zona resides:" />
         <p:selectOneRadio id="tipoResidencia" value="#{cotizaHome.tipoResidencia}" unselectable="true" 
        disabled="#{cotizaHome.enableResidencia}" required="#{cotizaHome.requiredResidencia}" >
            <f:selectItem itemLabel="Zona privada acceso peatonal" itemValue="Privada Peatonal" />
            <f:selectItem itemLabel="Zona privada acceso vehicular" itemValue="Privada Vehícular" />
            <f:selectItem itemLabel="Acceso abierto" itemValue="Acceso Abierto" />
            <p:ajax listener="#{cotizaHome.getRequiredResidencia}" process="@this,tipoDepartamento,tipoCasa,tipoResidencia" 
         update="tipoDepartamento,tipoCasa,tipoResidencia"  ></p:ajax> 
        </p:selectOneRadio>  
            
                    
                </h:panelGrid>
              <p:commandButton style="..." value="Siguiente" icon="ui-icon-arrow-1-e" 
    iconPos="left" type="button" onclick="PF('wiz').next()" />   
            </p:panel>
        </p:tab>
 
        <p:tab id="habitacion" title="Habitaciones">
            <p:panel header="Número de habitaciones">
                <p:messages />
                <h:panelGrid columns="2" columnClasses="label, value">
                   
                      <h:outputText value="Número de habitaciones:" />
        <p:selectOneButton value="#{cotizaHome.numeroHabitacion}"  id="numeroHabitacion" required="true" >
            <f:selectItem itemLabel="1 habitación" itemValue="uno" />
            <f:selectItem itemLabel="2 habitaciones" itemValue="dos" />
            <f:selectItem itemLabel="3 habitaciones" itemValue="tres" />
            <f:selectItem itemLabel="Más de 3 habitaciones" itemValue="más de tres" />
        </p:selectOneButton>
        
        
                </h:panelGrid>
   
     <p:commandButton style="..." value="Siguiente" icon="ui-icon-arrow-1-e" 
    iconPos="left" type="button" onclick="PF('wiz').next()" />   
   
    <p:commandButton style="..." value="Anterior" icon="ui-icon-arrow-1-w" 
    iconPos="right" type="button" onclick="PF('wiz').back()" />
                
            </p:panel>
        </p:tab>
 
        <p:tab id="banos" title="Baños">
            <p:panel header="Número de baños">
                <p:messages />
                <h:panelGrid columns="2" columnClasses="label, value">
                     <h:outputText value="Número de Baños:" />
        <p:selectOneButton value="#{cotizaHome.numeroBanos}" id="numeroBanos" required="true" >
            <f:selectItem itemLabel="1 baño" itemValue="uno" />
            <f:selectItem itemLabel="2 baños" itemValue="dos" />
            <f:selectItem itemLabel="3 baños" itemValue="tres" />
            <f:selectItem itemLabel="Más de 3 baños" itemValue="mas de 3" />
        </p:selectOneButton>
                    
                </h:panelGrid>
                <p:commandButton style="..." value="Siguiente" icon="ui-icon-arrow-1-e" 
    iconPos="left" type="button" onclick="PF('wiz').next()" />   
   
    <p:commandButton style="..." value="Anterior" icon="ui-icon-arrow-1-w" 
    iconPos="right" type="button" onclick="PF('wiz').back()" />
            </p:panel>
            
            
             
            
            
        </p:tab>
         <p:tab id="tareas1" title="Tareas">
            <p:panel header="Seleccionar Tareas a realizar">
                <p:messages />
                <h:panelGrid columns="2" columnClasses="label, value">
                     <h:outputText value="Seleccionar Tareas:" />
       <p:selectManyCheckbox id="tareas" value="#{cotizaHome.tareas}" layout="grid" columns="3" 
       required="true" >
        <f:selectItem itemLabel="Barrer pisos" itemValue="barrer pisos" />
        <f:selectItem itemLabel="Lavar vidrios interiores" itemValue="lavar vidrios interiores" />
        <f:selectItem itemLabel="Lavar trastes" itemValue="lavar trastes" />
        <f:selectItem itemLabel="Sacudir" itemValue="sacudir" />
        <f:selectItem itemLabel="Lavar pisos" itemValue="lavar pisos" />
         <f:selectItem itemLabel="Trapear pisos" itemValue="trapear pisos" />
         <f:selectItem itemLabel="Cambiar Sábanas" itemValue="cambiar sabanas" />
          <f:selectItem itemLabel="Tirar Basura" itemValue="tirar basura" />
    </p:selectManyCheckbox>
                    
                </h:panelGrid>
                <p:commandButton style="..." value="Siguiente" icon="ui-icon-arrow-1-e" 
    iconPos="left" type="button" onclick="PF('wiz').next()" />   
   
    <p:commandButton style="..." value="Anterior" icon="ui-icon-arrow-1-w" 
    iconPos="right" type="button" onclick="PF('wiz').back()" />
            </p:panel>
            
            
             
            
            
        </p:tab>
 
        <p:tab id="confirm" title="Confirmación">
            <p:panel header="Confirmación">
                <h:panelGrid id="confirmation" columns="3" columnClasses="grid,grid,grid">
                    <h:panelGrid columns="2" columnClasses="label, value">
                        <h:outputText value="Tipo Vivenda: " />
                        <h:outputText value="#{cotizaHome.tipoVivienda}" styleClass="outputLabel"/>
                        
                        <h:outputText value="Ubicación Departamento: " />
                        <h:outputText value="#{cotizaHome.tipoDepartamento}" styleClass="outputLabel"/>
                        
                        <h:outputText value="Pisos de casa habitación: " />
                        <h:outputText value="#{cotizaHome.tipoCasa}" styleClass="outputLabel"/>
                        
                        
                        <h:outputText value="Ubicación de Residencia: " />
                        <h:outputText value="#{cotizaHome.tipoResidencia}" styleClass="outputLabel"/>
                        
                        
                        <h:outputText value="Número de Habitaciones: " />
                        <h:outputText value="#{cotizaHome.numeroHabitacion}" styleClass="outputLabel"/>
 
                        <h:outputText value="Número de baños: " />
                        <h:outputText value="#{cotizaHome.numeroBanos}" styleClass="outputLabel"/>
                    </h:panelGrid>
                   <p:dataList value="#{cotizaHome.tareas}" var="tarea">
                <f:facet name="header">
                    Tareas a realizar
                </f:facet>
                #{tarea}
            </p:dataList>
                    
                </h:panelGrid>
       
       <h3>
       <h:outputText id="costo" value="#{cotizaHome.costoAproximado}" />
       </h3>
       
       
   
    
                <p:commandButton value="Cotizar" action="#{cotizaHome.cotizar}" update="costo" />
                <p:commandButton value="Volver a cotizar" actionListener="#{cotizaHome.resetWizard}" 
            oncomplete="PF('wiz').loadStep('vivienda', false)"  />
            </p:panel>
        </p:tab>
    </p:wizard>
 
    
         
       
       </h:form>
       
       
       
       
       
    </p:layoutUnit>
</p:layout>
    </h:body>
</html>


Probando el ejemplo

No olvidar que para correr el proyecto es en el modulo cleanservice-web y selecionamos el dashboard que dice HomeClean y presionamos cotizar
clean service
Seleccionamos el Tipo de vivienda:Departamento
clean service
Seleccionamos Zona Habitacional y presionamos Siguiente clean service
Ahora selecionamos dos habitaciones y presionamos siguiente clean service
Seleccionamos 1 baño y presionamos siguiente
clean service
Seleccionamos las tareas a realizar y presionamos siguiente
clean service
Nos muestra un resumen de lo que seleccionamos y presionamos cotizar clean service
El resultado de nuestra cotización es el siguiente
clean service
Presionamos volver a cotizar.

Conclusión

Hasta aquí vamos a dejar el proyecto en esta parte aprendimos a montar una infraestructura Spring,Hibernate,JSF Primefaces con anotaciones, la tabla homeclean fue creada para que cuando construyamos el administrador la empresa cambie los precios del cotizador si necesidad de escribir código,logicamente este es un ejemplo para que aprendas a manejar JSF y primefaces y si lo llagar a realizar paso a paso corrijas algunos errores, modifiques y comprendas, en la parte de wizard hay un pequeño error a la hora de resetear o volver a cotizar la manera de correjirlo es seleccionando un radiobutton y elegir otra opción y volver a seleccionar otro radiobutton según convenga las opciones que desees cotizar, se te queda de tarea corregirlo.

Cuando volvamos a publicar mas avances y lleguemos al final del sitio subiremos el código a github pero por lo pronto si tienes tiempo realizalo como va en forma secuencial si tienes dudas manda un corrreo a kapo1978@hotmail.com y si quieres ver el código funcionando puedes concertar una cita en un cafe o en algún espacio público con internet e instalamos el código en tu máquina en la cuidad de México o Estado de México nada mas te cobrariamos el tiempo y el traslado a donde quieras que te llevemos el código todo esto para continuar con la página y realizar mas proyectos.

Ejemplo

El ejemplo lop uedes ver funcionando en la siguiente dirección: