Modulo de caja

Otro modulo importante para una empresa es tener tal vez un punto de venta vamos a realizar un mini punto de venta aqui vamos a escanear lo productos con nuestro scanner y al pagar imprimiremos los productos en un ticket.
Lo primero es crear las tablas venta y ventadetalle que estan al inicio del tutorial.
Nos vamos al proyecto productmarket-core y en el paquete com.tutosoftware.productmarket.entity vamos a crear las entidad o clase Venta.java
package com.tutosoftware.productmarket.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="venta")
public class Venta implements Serializable {
	
private static final long serialVersionUID = 1L;
	
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long idVenta;
	
	

	@Column(name="llaveventa")
	private String llaveVenta;
	
	@Column(name="total")
	private Double total;
	
	@Column(name="fecha")
	private Date fecha;
	
	public long getIdVenta() {
		return idVenta;
	}

	public void setIdVenta(long idVenta) {
		this.idVenta = idVenta;
	}

	public String getLlaveVenta() {
		return llaveVenta;
	}

	public void setLlaveVenta(String llaveVenta) {
		this.llaveVenta = llaveVenta;
	}

	public Double getTotal() {
		return total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	
	

}





 

En el mismo paquete creamos la clase VentaDetalle.java
package com.tutosoftware.productmarket.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="ventadetalle")
public class VentaDetalle implements Serializable {
	
private static final long serialVersionUID = 1L;
	
	
	@Id
	private long idVenta;
	
	

	@Column(name="cantidad")
	private Integer cantidad;
	
	@Column(name="idproducto")
	private long idProducto;
	
	@Column(name="total")
	private Double total;
	
	
	public long getIdVenta() {
		return idVenta;
	}

	public void setIdVenta(long idVenta) {
		this.idVenta = idVenta;
	}

	public Integer getCantidad() {
		return cantidad;
	}

	public void setCantidad(Integer cantidad) {
		this.cantidad = cantidad;
	}

	public long getIdProducto() {
		return idProducto;
	}

	public void setIdProducto(long idProducto) {
		this.idProducto = idProducto;
	}

	public Double getTotal() {
		return total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

}


Lo que sigue a continuación es posicionarnos sobre el paquete com.tutosofware.productmarket.util y creamos la clase llamada Ticket.java esta tambien podría ser un servicio pero lo dejo a tu criterio en este código encontre la manera de imprimir en una impresora térmica de 58mm por 45 Xprinter y si imprime este modulo o war sería instalado en la maquina del punto de venta porque si es intalada en el servidor tal vez no reconozca la impresora o en su defecto se puede realizar este mismo código con spring boot pero ya es tu elección la manera como lo quieras desarrollar y puedes hacer la prueba en servidor por yo no cuento con ese tipo de ambiente de pruebas, pero de manera local me funciona,tambien aparece un dialogo este lo puedes quitar dejando que la impresora sea la que accione por defecto pero queda a tu criterio bueno prosigamos con el código.
package com.tutosoftware.productmarket.util;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.JOptionPane;

public class Ticket {
	private String contentTicket = "PRODUCTMARKET\n"+
		    "DOMICILIO CONOCIDO MEXICO,MEXICO\n"+
		    "=============================\n"+
		    "ATIZAPAN,\n"+
		    "RFC: XXX-999999-XX9\n"+
		    "Caja # {{box}} - Ticket # {{ticket}}\n"+
		    "LE ATENDIO: {{cajero}}\n"+
		    "{{dateTime}}\n"+
		    "=============================\n"+
		    "{{items}}\n"+
		    "=============================\n"+
		    //"SUBTOTAL: {{subTotal}}\n"+
		    //"IVA: {{tax}}\n"+
		    "TOTAL: {{total}}\n\n"+
		    //"RECIBIDO: {{recibo}}\n"+
		    //"CAMBIO: {{change}}\n\n"+
		    "=============================\n"+
		    "GRACIAS POR SU COMPRA...\n"+
		    "ESPERAMOS SU VISITA NUEVAMENTE {{nameLocal}}\n"+
		    "\n"+
		    "\n";
		    
		  //El constructor que setea los valores a la instancia
		  public Ticket(String box, String ticket, String caissier, String dateTime, String items, String total) {
		    this.contentTicket = this.contentTicket.replace("{{box}}", box);
		    this.contentTicket = this.contentTicket.replace("{{ticket}}", ticket);
		    this.contentTicket = this.contentTicket.replace("{{cajero}}", caissier);
		    this.contentTicket = this.contentTicket.replace("{{dateTime}}", dateTime);
		    this.contentTicket = this.contentTicket.replace("{{items}}", items);
		    this.contentTicket = this.contentTicket.replace("{{total}}", total);
		  
		  }
		    
		  public void print() {
		    //Especificamos el tipo de dato a imprimir
		    //Tipo: bytes; Subtipo: autodetectado
		    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
		    
		    //Aca obtenemos el servicio de impresion por defatul
		    //Si no quieres ver el dialogo de seleccionar impresora usa esto
		    //PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
		    
		    
		    //Con esto mostramos el dialogo para seleccionar impresora
		    //Si quieres ver el dialogo de seleccionar impresora usalo
		    //Solo mostrara las impresoras que soporte arreglo de bits
		    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
		    PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
		    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
		    PrintService service = ServiceUI.printDialog(null, 700, 200, printService, defaultService, flavor, pras);
		      
		    //Creamos un arreglo de tipo byte
		    byte[] bytes;

		    //Aca convertimos el string(cuerpo del ticket) a bytes tal como
		    //lo maneja la impresora(mas bien ticketera :p)
		    bytes = this.contentTicket.getBytes();

		    //Creamos un documento a imprimir, a el se le appendeara
		    //el arreglo de bytes
		    Doc doc = new SimpleDoc(bytes,flavor,null);
		      
		    //Creamos un trabajo de impresión
		    DocPrintJob job = service.createPrintJob();

		    //Imprimimos dentro de un try de a huevo
		    try {
		      //El metodo print imprime
		      job.print(doc, null);
		    } catch (Exception er) {
		      JOptionPane.showMessageDialog(null,"Error al imprimir: " + er.getMessage());
		    }
		  }

}



En el paquete com.tutosoftware.productmarket.dao creamos la interface VentasCajaDAO.java.
 
 package com.tutosoftware.productmarket.dao;

import com.tutosoftware.productmarket.entity.Producto;
import com.tutosoftware.productmarket.entity.Venta;
import com.tutosoftware.productmarket.entity.VentaDetalle;

public interface VentasCajaDAO {
	
    public Producto obtenerProducto(String codigoBarras);
	
	public long agregarVenta(Venta venta);
	
	public Venta obtenerVenta(String llaveCaja);
	
	public long agregarVentaDetalle(VentaDetalle ventaDetalle);
	
	public Venta actualizarVenta(Venta venta);

}
 
 
 
 

Ahora creamos la implementación de la interface en paquete com.tutosoftware.productmarket.dao.impl nombremos la clase VentasCajaDAOImpl.java.
 
 package com.tutosoftware.productmarket.dao.impl;

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

import com.tutosoftware.productmarket.dao.VentasCajaDAO;
import com.tutosoftware.productmarket.entity.Producto;
import com.tutosoftware.productmarket.entity.Venta;
import com.tutosoftware.productmarket.entity.VentaDetalle;
import com.tutosoftware.productmarket.util.HibernateUtil;

@Repository
public class VentasCajaDAOImpl implements VentasCajaDAO {
	
	@Autowired
	  private HibernateUtil hibernateUtil;
	
	
	VentasCajaDAOImpl(){
		
	}

	@Override
	public Producto obtenerProducto(String codigoBarras) {
		// TODO Auto-generated method stub
		String hql ="from Producto as p where p.codigoBarras = '"+codigoBarras+"'";
		Producto productoResult = hibernateUtil.fetchByUniqueResult(hql);
		return productoResult;
	}

	@Override
	public long agregarVenta(Venta venta) {
		// TODO Auto-generated method stub
		return (Long) hibernateUtil.create(venta);
	}

	@Override
	public Venta obtenerVenta(String llaveCaja) {
		// TODO Auto-generated method stub
        String hql ="from Venta as p where p.llaveVenta = '"+llaveCaja+"'";
		Venta ventaResult = hibernateUtil.fetchByUniqueResult(hql);
		return ventaResult;
	}

	@Override
	public long agregarVentaDetalle(VentaDetalle ventaDetalle) {
		// TODO Auto-generated method stub
		return (Long) hibernateUtil.create(ventaDetalle);
	}

	@Override
	public Venta actualizarVenta(Venta venta) {
		// TODO Auto-generated method stub
		return hibernateUtil.update(venta);
	}

}
 
 

En el paquete com.tutosoftware.productmarket.service creamos la interface VentasCajaService.java
 
 package com.tutosoftware.productmarket.service;

import com.tutosoftware.productmarket.entity.Producto;
import com.tutosoftware.productmarket.entity.Venta;
import com.tutosoftware.productmarket.entity.VentaDetalle;

public interface VentasCajaService {
	
	public Producto obtenerProducto(String codigoBaras);
	public long agregarVenta(Venta venta);
	public Venta obtenerVenta(String llaveCaja);
	public long agregarVentaDetalle(VentaDetalle ventaDetalle);
    public Venta actualizarVenta(Venta venta);

}
 
 
 

Ahora creamos en el paquete com.tutosoftware.productmarket.service.impl la clase VentasCajaServiceImpl.java
 package com.tutosoftware.productmarket.service.impl;

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

import com.tutosoftware.productmarket.dao.VentasCajaDAO;
import com.tutosoftware.productmarket.entity.Producto;
import com.tutosoftware.productmarket.entity.Venta;
import com.tutosoftware.productmarket.entity.VentaDetalle;
import com.tutosoftware.productmarket.service.VentasCajaService;


@Service
@Transactional
public class VentasCajaServiceImpl implements VentasCajaService {
	
	
	@Autowired
	private VentasCajaDAO ventasCajaDAO;
	
	public VentasCajaServiceImpl(){
		
	}

	@Override
	public Producto obtenerProducto(String codigoBaras) {
		// TODO Auto-generated method stub
		return ventasCajaDAO.obtenerProducto(codigoBaras);
	}

	@Override
	public long agregarVenta(Venta venta) {
		// TODO Auto-generated method stub
		return ventasCajaDAO.agregarVenta(venta);
	}

	@Override
	public Venta obtenerVenta(String llaveCaja) {
		// TODO Auto-generated method stub
		return ventasCajaDAO.obtenerVenta(llaveCaja);
	}

	@Override
	public long agregarVentaDetalle(VentaDetalle ventaDetalle) {
		// TODO Auto-generated method stub
		return ventasCajaDAO.agregarVentaDetalle(ventaDetalle);
	}

	@Override
	public Venta actualizarVenta(Venta venta) {
		// TODO Auto-generated method stub
		return ventasCajaDAO.actualizarVenta(venta);
	}

}

Ahora nos vamos al proyecto productmarket-ventaonline y el archivo pom.xml escribimos lo siguiente:
<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>com.tutosoftware.productmarket</groupId>
    <artifactId>productmarket</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>productmarket-caja</artifactId>
  <packaging>war</packaging>
  <build>
		<finalName>productmarketcaja</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>com.tutosoftware.productmarket</groupId>
				<artifactId>productmarket-core</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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</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>
        
         <!-- Servlet and JSP -->
        <dependency>
				<groupId>javax.servlet.jsp</groupId>
				<artifactId>jsp-api</artifactId>
			</dependency>
			
			
         <dependency>
	     <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
        </dependency>
			
			
			
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jstl</artifactId>
			</dependency>
        
       
        
        
        
        
        
        </dependencies>
</project>


Ahora nos vamos a src/main/webapp/WEB-INF y creamos el arhivo mvc-dispatcher-servlet.xml y escribimos el siguiente código:
<?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:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


	<!-- Specifying base package of the Components like Controller, Service, 
		DAO -->
	<context:component-scan base-package="com.tutosoftware.productmarket" />
		
	<!-- Getting Database properties -->
	<context:property-placeholder location="classpath:application.properties" />


	
	<!-- Specifying the Resource location to load JS, CSS, Images etc -->
	<mvc:annotation-driven />
	<mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:resources mapping="/css/**" location="/css/" />
	<mvc:resources mapping="/fonts/**" location="/fonts/" />
	<mvc:resources mapping="/js/**" location="/js/" />
    
	<!-- View Resolver -->
	
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	
	
   
   
	<!-- DataSource -->
	<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="com.tutosoftware.productmarket.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>


Ahora nos vamos a src/main/resources y creamos el archivo application.resources no olvidar meter tu usuario y password de tu base de datos:
database.driverClass=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/productmarketdb
database.username=usuario
database.password=password

#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

 

Lo que sigue es irnos a src/main/java y creamos el paquete com.tutosoftware.productmarket.controller y en este creamos la clase controlador VentasCajaController.java
 
  package com.tutosoftware.productmarket.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.tutosoftware.productmarket.entity.Item;
import com.tutosoftware.productmarket.entity.Producto;
import com.tutosoftware.productmarket.entity.Venta;
import com.tutosoftware.productmarket.entity.VentaDetalle;
import com.tutosoftware.productmarket.service.ProductoService;
import com.tutosoftware.productmarket.service.VentasCajaService;
import com.tutosoftware.productmarket.util.Ticket;



@Controller
public class VentasCajaController {
	
	@Autowired
	VentasCajaService ventasCajaService;
	
	@Autowired
	private ProductoService productoService;
	
	
	@RequestMapping(value = {"/"})
	public ModelAndView agregarProducto() {
		
		return new ModelAndView("caja");
	}
	
	
	
	
	
	
	
	@SuppressWarnings (value="unchecked")
	@RequestMapping(value ="/agregarProducto")
	 public ModelAndView  ventas(@RequestParam("codigoBarras") String codigoBarras,ModelMap model,HttpSession session){
	    System.out.println("*********Probando**********");
		Producto producto = null;
		
		if(codigoBarras.trim().length() != 0 ){
		
		producto= ventasCajaService.obtenerProducto(codigoBarras);
		
		if(producto != null){
			
		
		
		
		
		long id= producto.getIdProducto();
		
		
		if(session.getAttribute("cart") == null){
			List<Item> cart = new ArrayList<Item>();
			cart.add(new Item(producto,1));
			session.setAttribute("cart",cart);
			
			
		}else{
			List<Item> cart = (List<Item>)session.getAttribute("cart");
			int index = siExisteProductoCompra(id,session);
			if(index == -1)
			  cart.add(new Item(producto,1));
			else{
				int cantidad = cart.get(index).getCantidad()+1;
			    cart.get(index).setCantidad(cantidad);
			}	
			
			session.setAttribute("cart",cart);
		}	
		
			
		}else{
			model.put("vacio","Introduce el producto al inventario");
			return new ModelAndView("caja");
			
		}
		
		
		
		
		return new ModelAndView("caja");
		
		}else{
			model.put("vacio","Introduce el código de barras");
			return new ModelAndView("caja");
		}
		
	}
	
	
	
	
	@SuppressWarnings (value="unchecked")
	private int siExisteProductoCompra(long id,HttpSession session){
		
		List<Item> cart = (List<Item>)session.getAttribute("cart");
		for(int i=0;i < cart.size();i++)
			if(cart.get(i).getProducto().getIdProducto() == id)
				return i;
		  	
		
		return -1;
		
	}
	

	
	@RequestMapping("/cancelarCompra")
	public ModelAndView cancelar(HttpSession session){
		
		
		session.removeAttribute("cart");
		
		return new ModelAndView("buscar");
		
		
	}
	
	
	
	
	
	
	@SuppressWarnings (value="unchecked")
	@RequestMapping("/borrarProducto")
	public ModelAndView eliminarCarritoCompra(@RequestParam long idProducto,HttpSession session) {
		List<Item> cart = (List<Item>)session.getAttribute("cart");
		int index = siExisteProductoCompra(idProducto,session);
		cart.remove(index);
		session.setAttribute("cart",cart);
		return new ModelAndView("caja");
		
	}
	
	
	
	
	@RequestMapping("/pagar")
	public ModelAndView pagarProductos(HttpSession session){
		
		String llaveCaja = UUID.randomUUID().toString();
		agregarVentaBD(llaveCaja);
		Venta venta = ventasCajaService.obtenerVenta(llaveCaja);
		
		agregarVentaDetalleBD(venta,session);
		
		imprimirTicketinicio(venta,session);
		session.removeAttribute("cart");
		
		return new ModelAndView("caja");
		
		
	}
	
	
	private void agregarVentaBD(String llaveCaja){
		
		Venta venta = new Venta();
		double total=0;
		
		venta.setLlaveVenta(llaveCaja);
		venta.setTotal(total);
		venta.setFecha(new Date());
		
		ventasCajaService.agregarVenta(venta);
		
	}

	@SuppressWarnings (value="unchecked")
	private void agregarVentaDetalleBD(Venta venta,HttpSession session){
		
		VentaDetalle ventaDetalle = new VentaDetalle();
		List<Item> cart = (List<Item>)session.getAttribute("cart");
		Producto productoActualizarInventario = new Producto();
		double totalVentas=0;
		for(int i=0;i < cart.size();i++){
			ventaDetalle.setIdVenta(venta.getIdVenta());
			ventaDetalle.setCantidad(cart.get(i).getCantidad());
			ventaDetalle.setIdProducto(cart.get(i).getProducto().getIdProducto());
			ventaDetalle.setTotal(cart.get(i).getProducto().getPrecio() * cart.get(i).getCantidad());
			ventasCajaService.agregarVentaDetalle(ventaDetalle);
			productoActualizarInventario = cart.get(i).getProducto();
			productoActualizarInventario.setCantidad(cart.get(i).getProducto().getCantidad()-cart.get(i).getCantidad());
			productoService.actualizarProducto(productoActualizarInventario);
			totalVentas += cart.get(i).getProducto().getPrecio() * cart.get(i).getCantidad();
			
		}
		
		venta.setTotal(totalVentas);
		
		ventasCajaService.actualizarVenta(venta);
		
		
	}
	
	@SuppressWarnings (value="unchecked")
	private void imprimirTicketinicio(Venta venta,HttpSession session){
		String idVenta =String.valueOf(venta.getIdVenta());
		String fecha = convertirFechaString(venta.getFecha());
		String productos="";
		List<Item> cart = (List<Item>)session.getAttribute("cart");
		String cantidad ="";
		String precio ="";
		String total="";
		double totalVenta=0;
		
		for(int i=0;i < cart.size();i++){
			cantidad = String.valueOf(cart.get(i).getCantidad());
			precio = String.valueOf(cart.get(i).getProducto().getPrecio());
			total=String.valueOf(cart.get(i).getProducto().getPrecio() * cart.get(i).getCantidad());
			productos += cantidad+" "+cart.get(i).getProducto().getNombreProducto()+" "+precio+" "+
			total+"\n";
			
			totalVenta += cart.get(i).getProducto().getPrecio() * cart.get(i).getCantidad();
		}
		
		String totalVentas=String.valueOf(totalVenta);
		
		Ticket ticket = new Ticket("1",idVenta,"JOSE MARTIN",fecha,productos,totalVentas);
		
		
		ticket.print();
	}
	
	    public String convertirFechaString(Date date){
		
		   return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);	
		}

}
  
  
  
  

En src/main/webapp/WEB-INF creamos la carpeta views la primera vista que vamos crear la vamos a nombrar caja.jsp
 
 
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />

<title>Producto market punto de venta</title>
<link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="css/style.css" />
<link type="text/css" rel="stylesheet" href="css/materialize.min.css"  media="screen,projection"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
 <script type="text/javascript" src="js/materialize.min.js"></script>
<style type="text/css">
            .input-error { margin-bottom: 6px !important; }
            .text-error { font-size: 0.8em !important; }
        </style>
</head>

<body>
  <div class="container">

<h3>Product Market-Punto de venta</h3>







<form action="agregarProducto">

<div class="row">
 <div class="input-field col s5">
 
 <h6>Código de barras</h6>
</div>
</div>


<div class="row">
 <div class="input-field col s5">
 <input type='text' name='codigoBarras' id='codigoBarras' autofocus="autofocus" />  
 
</div>
</div>


<div class="row">
                        <div class="input-field col">
                            <input type="submit" value="Registrar" class="btn waves-effect"/>
                            
                        </div>
                    </div>
                    
                    <p><span class="red accent-4">${vacio}</span></p>	

</form>

<table class="bordered">

              <thead>
                    <tr>
                        <th>Eliminar</th>
                        <th>Cantidad</th>
                        <th>Nombre Producto</th>
                        <th>Precio</th>
                        <th>Sub total</th>
                    </tr>
                    </thead>
                    <tbody>
                    <c:set var="t" value="0"></c:set>
                    <c:forEach var="c" items="${sessionScope.cart}">
                    <c:set var="t" value="${t + c.producto.precio * c.cantidad}"></c:set>
                     <tr>
                     <td><a href="borrarProducto?idProducto=${c.producto.idProducto}" class="waves-effect waves-light btn">BorrarProducto</a></td>
                     <td>${c.cantidad}</td>
                     <td>${c.producto.nombreProducto}</td>
                     <td>${c.producto.precio}</td>
                     <td>${c.producto.precio * c.cantidad}</td>
                     
                     </tr>
                    
                    
                    </c:forEach>
                    <tr>
                    <td colspan="4">Total</td>
                    <td>${t}</td>
                    
                    
                    </tr>

                   </tbody>


                 </table>




                 
 </div>
 
			 <div class="row">
                        <div class="input-field col">
                            <a href="pagar" class="waves-effect waves-light btn">Pagar</a>
                            <a href="cancelarCompra" class="waves-effect waves-light btn">Cancelar Compra</a>
                        </div>
                    </div>
			
			
	 		
			
	
 
 

 

</body>
</html>
 

En src/main/webapp creamos los folders css,js/fonts es donde van ir los archivos de hojas estilo,javascript y tipo de letra aquín dejo un link para deecargar:
Descargar archivos

Una vez integrado todo comenzamos a testear el modulo corremos el proyecto:
java project
Agregamos un código de barras en nuestro scanner nota el scanner tiene incluido el enter realiza el submit automaticamente:
java project
Hacemos clic en pagar y aprece el dialogo de mandar a imprimir si le das cancelar arroja error nota: falta validar este error o poner que imprima por defecto
java project
El ticket impreso es este:
java project
Ahora escaneamos varios producto y pagamos:
java project
No se ven muy bien las imagenes pero si imprime solo falta que hagas las pruebas pertinentes para ver si lo instalas en el servidor que todavia no he probado o en la maquina cliente.Ya para terminar nada mas faltan los reportes de ventas y ventas online.

Regresar Inicio Siguiente