Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / MVC / Proyectos / Gestión de productos – El modelo (Parte 4)

Gestión de productos – El modelo (Parte 4)

Autor jc mouse martes, septiembre 4, 2012

En la estructura del proyecto, nuestro modelo mvc esta compuesto por tres paquetes, la vista, el modelo y controlador. La VISTA, interfaz que interactúa con el usuario ya la desarrollamos en un post anterior, ahora nos toca desarrollar lo que es el MODELO.

El modelo es la representación lógica de nuestra aplicación ademas de contener el sistema de gestión de la base de datos.

mvc netbeans

Nuestro modelo consta de cuatros clases a saber:

database.java : Esta clase es la encargada de conectarse a la base de datos.

package modelo;
import java.sql.*;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class database {

  /* DATOS PARA LA CONEXION */
  /** base de datos por defecto es test*/
  private String db = "dbtest";
  /** usuario */
  private String user = "root";
  /** contraseña de MySql*/
  private String password = "Quienabuenarbolsearrimallegaunperroyleorina";
  /** Cadena de conexion */
  private String url = "jdbc:mysql://localhost/"+db;
  /** variable para trabajar con la conexion a la base de datos */
  private Connection conn = null;

   /** Constructor de clase */
   public database(){
        this.url = "jdbc:mysql://localhost/"+this.db;
       try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection( this.url, this.user , this.password );
         if (conn!=null){
            System.out.println("OK base de datos "+this.db+" listo");
         }
      }catch(SQLException e){
         System.err.println( e.getMessage() );
      }catch(ClassNotFoundException e){
         System.err.println( e.getMessage() );
      }
   }

   public Connection getConexion()
   {
    return this.conn;
   }
}

Tenemos también dos clases para manejar las entidades producto y carrito de compra:

producto.java

package modelo;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class producto {

    private String id="";
    private String descripcion = "";
    private float precio = 0;
    private int stock = 0;
    private String categoria="";

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int value) {
        this.stock = value;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String nombre) {
        this.descripcion = nombre;
    }

    public float getPrecio() {
        return precio;
    }

    public void setPrecio(float precio) {
        this.precio = precio;
    }

}

carrito.java .

package modelo;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class carrito {

    private String idproducto="";
    private String descripcion="";
    private String cantidad="0";
    private String precio="0";

    public String getCantidad() {
        return cantidad;
    }

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

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }    

    public String getIdproducto() {
        return idproducto;
    }

    public void setIdproducto(String idproducto) {
        this.idproducto = idproducto;
    }

    public String getPrecio() {
        return precio;
    }

    public void setPrecio(String precio) {
        this.precio = precio;
    }

}

Por ultimo la clase modelo.java , esta clase es la que engloba a las anteriores clases e interactua con ellas para procesar la información que retornara al controlador.

package modelo;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class modelo extends database {

    private DefaultTableModel tablemodel = new DefaultTableModel();

    /** Constructor de clase */
    public modelo (){}

     /** Metodo privado para validar datos */
    private boolean valida_datos(String id, String nombre , String precio, String cantidad, String categoria)
    {
        if( id.equals(" - ") )
            return false;
        else if( nombre.length() > 0 && precio.length()>0 && cantidad.length() >0  && categoria.length()>0)
        {
            return true;
        }
        else return false;
    }

    /** Añade un nuevo registro a la base de datos */
    public boolean NuevoProducto(String id, String nombre , String precio, String cantidad, String categoria)
    {
        if( valida_datos( id, nombre, precio, cantidad, categoria ) )
        {
            //se reemplaza "," por "." -> OJO ON ESTO
            precio = precio.replace(",", ".");
            //Se arma la consulta
            String q=" INSERT INTO tproducto ( p_id , p_descripcion , p_preciov, p_stock , id_categoria ) "
                + "VALUES ( '" + id + "','" + nombre + "', '" + precio + "'," + cantidad + " , '"+ categoria+"' ) ";
            //se ejecuta la consulta
            try {
                PreparedStatement pstm = this.getConexion().prepareStatement(q);
                pstm.execute();
                pstm.close();
                return true;
            }catch(SQLException e){
                System.err.println( e.getMessage() );
            }
            return false;
        }
        else return false;
    }

    /** Actualiza producto condicional WHERE el ID del producto */
    public boolean ActualizarProducto( String id, String nombre , String precio, String cantidad, String categoria )
    {
        //se reemplaza "," por "."
        precio = precio.replace(",", ".");
        String q= "UPDATE tproducto SET p_descripcion='"+nombre+"', p_preciov='"+precio+"' , p_stock='"+cantidad+"' , id_categoria='"+categoria+"' "
                + " WHERE p_id='"+id+"' ";
         //se ejecuta la consulta
        try {
            PreparedStatement pstm = this.getConexion().prepareStatement(q);
            pstm.execute();
            pstm.close();
            return true;
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return false;
    }

    /**
 * Registra nueva venta ademas de detalle de ventas y actualiza stock de productos
 */
    public boolean RegistrarVenta( String idventa , Map productos , String total, String detalle , String nit )
    {
        try {
            //registra venta
            String q = " INSERT tventa (v_id, v_fecha, v_preciot, v_detalle, v_nit ) "
                + "values( '"+idventa+"', '"+getFecha()+"', '"+total.replace(",", ".")+"', '"+detalle+"' , '"+nit+"' );";
            PreparedStatement pstm = this.getConexion().prepareStatement(q);
            pstm.execute();
            pstm.close();
            //registra venta de productos
            Iterator it = productos.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry e = (Map.Entry)it.next();
                carrito itm = (carrito) e.getValue();
                pstm = this.getConexion().prepareStatement(" INSERT INTO tpv (pv_producto,pv_venta,pv_cantidad,pv_precio)"
                        + " values( '"+itm.getIdproducto()+"' , '"+idventa+"' , '"+itm.getCantidad()+"' , '"+itm.getPrecio().replace(",", ".")+"' );");
                pstm.execute();
                pstm.close();                
                //actualiza stock
                pstm = this.getConexion().prepareStatement(" UPDATE tproducto SET p_stock=p_stock-"+itm.getCantidad()+" WHERE p_id='"+itm.getIdproducto()+"' ");
                pstm.execute();
                pstm.close();
            }
            return true;
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return false;
    }

    /**
 * Obtiene los datos de una venta dado su ID en un DefaultTableModel
 */
    public DefaultTableModel getTablaVenta( String idventa )
    {
      String q1= "SELECT count(*) as total "
              + " FROM tproducto INNER JOIN tpv ON p_id=pv_producto WHERE pv_venta='"+idventa+"'";

      String q2= "SELECT p_id,p_descripcion,pv_cantidad,pv_precio "
              + " FROM tproducto INNER JOIN tpv ON p_id=pv_producto WHERE pv_venta='"+idventa+"'";
     //realizamos la consulta sql y llenamos los datos en la matriz "Object[][] data"
      int registros = 0;
      String[] columNames = {"ID Producto","Descripcion","Cantidad","Precio Unitario","Precio Total"};
      //obtenemos la cantidad de registros existentes en la tabla y se almacena en la variable "registros"
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement( q1 );
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.err.println( e.getMessage() );
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][6];
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement( q2 );
         ResultSet res = pstm.executeQuery();
         int i=0;
         while(res.next()){
                data[i][0] =res.getString( "p_id" );
                data[i][1] = res.getString( "p_descripcion" );
                data[i][2] =res.getString( "pv_cantidad" );
                data[i][3] =res.getString( "pv_precio" );
                data[i][4] = ""+(res.getFloat( "pv_precio" ) * res.getInt( "pv_cantidad" ));
            i++;
         }
         res.close();
         this.tablemodel.setDataVector(data, columNames );
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return this.tablemodel;
    }

    /**
 * Obtiene los datos de ventas segun un rango de fechas de la forma yyyy-MM-dd
 */
    public DefaultTableModel getDatosVentaxFechas( Date fecha1, Date fecha2  )
    {
      SimpleDateFormat _sdf= new SimpleDateFormat("yyyy-MM-dd");
      String q1= "SELECT count(*) as total FROM tventa INNER JOIN tcliente ON c_NIT=v_nit "
            + " WHERE date(v_fecha) BETWEEN '"+_sdf.format(fecha1)+"' and '"+_sdf.format(fecha2)+"' ";
      String q2= "SELECT v_id, v_fecha, c_NIT, c_nombre, v_preciot "
              + " FROM tventa INNER JOIN tcliente ON c_NIT=v_nit "
              + "WHERE date(v_fecha) BETWEEN '"+_sdf.format(fecha1)+"' and '"+_sdf.format(fecha2)+"' ";     
      int registros = 0;
      String[] columNames = {"ID Venta","Fecha","NIT","Cliente","Precio Total"};
      //obtenemos la cantidad de registros existentes en la tabla y se almacena en la variable "registros"
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement( q1 );
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.err.println( e.getMessage() );
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][6];
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement( q2 );
         ResultSet res = pstm.executeQuery();
         int i=0;
         while(res.next()){
                data[i][0] = res.getString( "v_id" );
                data[i][1] = res.getString( "v_fecha" );
                data[i][2] = res.getString( "c_NIT" );
                data[i][3] = res.getString( "c_nombre" );
                data[i][4] = res.getString( "v_preciot" );
            i++;
         }
         res.close();
         this.tablemodel.setDataVector(data, columNames );
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return this.tablemodel;
    }

    /**
 * Obtiene los registros de los productos del inventario en un DefaultTableModel
 */
    public DefaultTableModel getTablaProducto()
    {      
      int registros = 0;
      String[] columNames = {"ID","Descripcion","Precio Venta","Stock","Categoria"};
      //obtenemos la cantidad de registros existentes en la tabla y se almacena en la variable "registros"
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement( "SELECT count(*) as total FROM tproducto");
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.err.println( e.getMessage() );
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][6];
      try{
         PreparedStatement pstm = this.getConexion().prepareStatement("SELECT * FROM tproducto INNER JOIN tcategoria on c_id = id_categoria");
         ResultSet res = pstm.executeQuery();
         int i=0;
         while(res.next()){                         
                data[i][0] =res.getString( "p_id" );
                data[i][1] = res.getString( "p_descripcion" );
                data[i][2] =res.getString( "p_preciov" );
                data[i][3] =res.getString( "p_stock" );
                data[i][4] = res.getString( "c_id" ) + " - " + res.getString( "c_nombre" );
            i++;
         }
         res.close();
         this.tablemodel.setDataVector(data, columNames );
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return this.tablemodel;
    }

    /**
 * Obtiene las categorias del sistema en un DefaultComboBoxModel
 */
    public DefaultComboBoxModel getListaCategorias()
    {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
         try{
         PreparedStatement pstm = this.getConexion().prepareStatement("SELECT * FROM tcategoria ");
         ResultSet res = pstm.executeQuery();
         while(res.next()){
                model.addElement( res.getString( "c_id" ) + " - " + res.getString( "c_nombre" ) );
         }
         res.close();
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return model;
    }

    /**
 * Obtiene los registros de clientes NIT y nombre completo en un DefaultComboBoxModel
 */
    public DefaultComboBoxModel getListaClientes()
    {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
         try{
         PreparedStatement pstm = this.getConexion().prepareStatement("SELECT * FROM tcliente ");
         ResultSet res = pstm.executeQuery();
         while(res.next()){
                model.addElement( "NIT: - " + res.getString( "c_NIT" ) + " - " + res.getString( "c_nombre" ) );
         }
         res.close();
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return model;
    }

    /**
 * Genera un codigo aleatorio alfanumerico de 8 caracteres
 */
    public String getRandomCode()
    {
        String code = "";
        long milis = new java.util.GregorianCalendar().getTimeInMillis();
        Random r = new Random(milis);
        int i = 0;
        while ( i < 8){
            char c = (char)r.nextInt(255);
            if ( (c >= '0' && c <='9') || (c >='A' && c <='Z') ){
                code += c;
                i ++;
            }
        }
        return code;
    }

    /**
 * obtiene la fecha actual del sistema en el formato de MYSQL
 */
    public String getFecha()
    {
        SimpleDateFormat _sdf= new SimpleDateFormat("yyyy-MM-dd");
        return _sdf.format(new Date());
    }

    public DefaultComboBoxModel getListaProductos()
    {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
         try{
         PreparedStatement pstm = this.getConexion().prepareStatement("SELECT p_descripcion FROM tproducto ");
         ResultSet res = pstm.executeQuery();         
         while(res.next()){                                                         
                model.addElement( res.getString( "p_descripcion" ) );
         }
         res.close();         
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }        
        return model;
    }

    /**
 * Dado un MAP que contiene clases "carrito.java" genera un DefaultComboBoxModel y retorna
 */
    public DefaultComboBoxModel ListaProductos( Map carrito_compra )
    {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
        Iterator it = carrito_compra.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry)it.next();
            carrito itm = (carrito) e.getValue();
            model.addElement( itm.getIdproducto() + " | " + itm.getDescripcion() + " | " + itm.getPrecio() + " | " + itm.getCantidad() );
        }
        return model;
    }

    /**
 * dado un MAP que contiene clases "carrito.java" recorre todos los productos contenidos y calcula el total de la venta
 */
    public float getTotalVenta( Map carrito_compra )
    {
        float total=0;
        Iterator it = carrito_compra.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry)it.next();
            carrito itm = (carrito) e.getValue();
            total += Float.valueOf(itm.getPrecio().toString()) * Integer.valueOf(itm.getCantidad().toString()) ;
        }
        return total;
    }

    /**
 * Obtiene los datos de un producto dado su nombre
 */
    public producto getProducto( String nombre )
    {
        producto p = new producto();
        String q = "SELECT * FROM tproducto WHERE p_descripcion = '"+nombre+"' ";
         try{
         PreparedStatement pstm = this.getConexion().prepareStatement(q);
         ResultSet res = pstm.executeQuery();
         while(res.next()){
            p.setId( res.getString( "p_id" ) );
            p.setDescripcion( res.getString( "p_descripcion" ) );
            p.setPrecio( res.getFloat( "p_preciov" ) );
            p.setStock( res.getInt( "p_stock" ) );
            p.setCategoria( res.getString( "id_categoria" ) );
         }
         res.close();
         }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return p;
    }

    /**
 * Obtiene en un string los datos generales de una venta dado su ID
 */
    public String getDatosVenta( String idventa )
    {
        String resultado="";         
        String q = "SELECT * FROM tventa INNER JOIN tcliente ON c_NIT=v_nit"
                + " WHERE v_id = '"+idventa+"' ";
        try{
         PreparedStatement pstm = this.getConexion().prepareStatement(q);
         ResultSet res = pstm.executeQuery();
         while(res.next()){
             resultado += "Cliente: " + res.getString("c_nombre") + "\n";
             resultado += "NIT : " + res.getString("c_nit") + "\n";
             resultado += "Dirección : " + res.getString("c_dir") + "\n";
             resultado += "Fecha : " + res.getString("v_fecha") + "\n";
             resultado +="----------------------------------------\n";
             resultado += "TOTAL [BS.] : " + res.getString("v_preciot") + "\n";
             resultado += "Detalle: " + res.getString("v_detalle") + "\n";
        }
         res.close();
        }catch(SQLException e){
            System.err.println( e.getMessage() );
        }
        return resultado;
    }

}

 

PARTE FINAL: GESTIÓN DE STOCK – El controlador – Parte 5 Fatality

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Personaliza un JComboBox estilo Metro de Windows

Personaliza un JComboBox estilo Metro de Windows

Si bien se pueden encontrar en google estilos java (Look and Feel) listos para cambiar la apariencia de nuestras aplicac...

Botón en java de Windows 8 Modern UI

Botón en java de Windows 8 Modern UI

En este tutorial crearemos un botón con el estilo del nuevo windows 8 Modern UI que primero se conoció como Metro UI.  E...

Aprende CSS Flexbox jugando

Aprende CSS Flexbox jugando

CSS Flexible Box Layout, comúnmente conocido como Flexbox, es un modelo de diseño web CSS que permite que los elementos...

Como capturar cambios del Slider en JavaFX

Como capturar cambios del Slider en JavaFX

En este tutorial veremos como usar el componente Slider de JavaFX , capturas los cambios que realice el usuario y con es...

Biblioteca Matemática avanzada para java

Biblioteca Matemática avanzada para java

Java cuenta con la clase java.lang.Math  la cual contiene métodos para realizar operaciones numéricas básicas como las f...

Ejemplo Cliente-Servidor en Android

Ejemplo Cliente-Servidor en Android

Continuando con estos post de Cliente/Servidor, en esta oportunidad realizaremos un ejemplo usando un dispositivo móvil...

8 comentarios en “Gestión de productos – El modelo (Parte 4)”

  1. VIANEY VARGAS dice:

    amigo Mouse…

    1. Mouse dice:

      siiiiiiiiiiii??? 🙂

  2. Henry Garcia dice:

    Cada vez que veo tus programas, añoro el día que pueda desarrollar esa habilidad de programar, soy estudiante de ingenieria de sistemas en Colombia y bueno, no es que en la universidad se tenga la oportunidad de ver con tanto detalle un programa asì, màs bien es bastante básico lo que se ve.

    Mi inquietud es, si tiene algún código en PHP que haga un maneio de múltiples tablas como este ejemplo que muestra la actualizaciòn del stock y las lineas de detalle de las ventas.

    Muchas gracias por su gran aporte.

  3. stone dice:

    ¿Cómo aprendiste a programar con tanta facilidad?

  4. Ricardo dice:

    esta buenisimo el aporte, soy estudiante y me servira de mucho esto.. Gracias

  5. ENRIQUE OROZCO dice:

    Wow excelente, eres un profesional, de ti eh sacado mucha inspiiracion, actualmente curso Ing. en Sistemas Computacionales en Mexico y nunca nos han ensenado algo como lo que tu has echo, mis respetos para ti. Otra cosita, el link esta muerto, podrias revivirlo o enviarme el proyecto entero, estoy en algo similar y solo quisiera estudiar tu codigo, ya que es exepcional

    1. Mouse dice:

      revisado el link, esta activo 🙂

  6. rolando mendoza dice:

    hola buen trabajo pero tengo una pregunta si la configuracion la introduzco y lo guardo en un txt como puedo llamarla y leer solo una vez dicho archivo de texto?

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp