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:
Una vez integrado todo comenzamos a testear el modulo corremos el proyecto:
Agregamos un código de barras en nuestro scanner nota el scanner tiene incluido el enter realiza el submit
automaticamente:
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
El ticket impreso es este:
Ahora escaneamos varios producto y pagamos:
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.