package com.fenalco.entities;

import com.fenalco.utilities.database.Transaction;
import java.util.Vector;
import java.util.Hashtable;
import com.fenalco.utilities.database.SQLUtilities;
import com.fenalco.utilities.database.QueryException;


/*
 * Productjava
 *
 * Created on 12 de agosto de 2004, 16:18 
 */



/**
 * Esta clase representa la tabla producto de la base de datos y encapsula cada una de las operaciones que sobre esta
 * se puedan realizar : inserción, actualización, eliminación, consulta. 
 * @author Mario Linares Vásquez
 */

public class Product
{
    /**
     * código de barras del producto
     */    
   private String code;
   /**
    * tipo de producto
    */   
   private String type;
   /**
    * unidad de medida del producto
    */   
   private String measureUnit;
   /**
    * cantidad definida en la unidad de medida
    */   
   private double quantity;
   /**
    * cantidad por paquete
    */   
   private double packQuantity;
   /**
    * id de la categoría a la cual pertenece el producto
    */   
   private int categoryId;
   /**
    * nombre de la categoría del producto
    */   
   private String categoryName;
   /**
    * lugar de procedencia del producto
    */   
   private String origin;
   /**
    * observaciones del producto
    */   
   private String observation;
   /**
    * precio en su mínima expresión
    */   
   private double lowestQuantityPrice;
   /**
    * id del iva que se aplica al producto
    */   
   private int ivaId;
   /**
    * valor del iva que se aplica al producto
    */   
   private double ivaValue;
   /**
    * bandera que indica  si el producto aparece en el nurit
    */   
   private int nurit;
   
   /**
    * Constructor por omisión de la clase. Se debe usar para el caso de insertar un nuevo
    * producto en la base de datos.  
    */   
   public Product()
   {
      // TODO: implement
   }
   
   /**
    * Constructor que recibe el id del  producto en la base de datos. Se debe usar en
    * el caso de actualizaciones, borrado y consulta. Este constructor llama a la
    * función miembro <CODE>loadData</CODE> con el parámetro productId  con el fin de cargar
    * los datos propios de esa factura que residen en la base de datos. Al usar este
    * constructor si se desea modificar el valor de algún campo se deben utilizar los
    * métodos consultores (setter).
    * @param productId int que representa el id del producto en la base de datos
    */
   public Product( String productId)
   {
      // TODO: implement
       this.loadData(productId);
   }
   
   /**
    * Este método carga de la tabla product de la base de datos todos los valores de
    * los campos en los atributos de la clase, a través del método <CODE>query</CODE> de
    * la clase <CODE>SQLUtilities</CODE>
    * @return boolean  que representa el exito del proceso de carga de los datos
    * @param productId identificador del producto
    */   
   public boolean loadData(String productId)
   {
      // TODO: implement
       Vector result = new Vector();
       String sql = "SELECT prod_codigo"+
                    "FROM producto"+
                    "WHERE prod_codigo=\'"+productId+"\';";
       try{
            result = SQLUtilities.query(sql);
            
            Hashtable product = (Hashtable)result.elementAt(0);
            
            this.setCode((String)product.get("prod_codigo"));
            
        }catch(QueryException qe){
            return false;
        }
       
      return true;
   }
   
   /**
    * Este método guarda los atributos del producto en la base de datos. Se debe usar
    * solo cuando se ha creado una instancia con el constructor por omisión. Para
    * almacenar los datos en la tabla product debe construir una consulta SQL de tipo
    * <B>insert</B> y la adiciona a la transacción con el método <CODE>addSql</CODE>
    * @return boolean que representa el exito del proceso de inserción
    * @param transaction la transacción que se está ejecutando
    */   
   public boolean saveData( Transaction transaction )
   {
      // TODO: implement
        String sql = "INSERT INTO producto VALUES("+");";
        
        transaction.addSql(sql);
       
      return true;
   }
   
  
   /**
    * Realiza una consulta SQL de tipo update con el fin de actualizar los campos del
    * producto modificados a través de los métodos setter.Para actualizar los datos
    * en la tabla product debe construir una consulta SQL de tipo <B>update</B>
    * y la adiciona a la transacción con el método <CODE>addSql</CODE>
    * @return boolean que representa el exito del proceso de actualización
    * @param transaction la transacción que se está ejecutando
    */      
   public boolean update( Transaction transaction )
   {
      // TODO: implement
        String sql = "UPDATE producto SET"+";";
       
        transaction.addSql(sql);
       
      return true;
   }
   
   
   /**
    * Realiza una consulta SQL y la adiciona a la transacción con el método <CODE>addSql</CODE>
    * de tipo delete con el fin de eliminar el producto
    * de la base de datos cuando se creo la instancia con el constructor que recibe el id
    * como parámetro.
    * @return boolean que representa el exito del proceso de borrado
    * @param transaction la transacción que se está ejecutando
    */
   public boolean delete( Transaction transaction )
   {
      // TODO: implement
        String sql = "DELETE * FROM producto WHERE prod_codigo="+this.getCode()+";";
        transaction.addSql(sql);
       
      return true;
   }
   
   /**
    * Consultor del atributo code.
    * @return Valor del  atributo code.
    */
   public java.lang.String getCode() {
       return code;
   }   

   /**
    * Modificador para el  atributo code.
    * @param code Nuevo valor  para el  atributo code.
    */
   public void setCode(java.lang.String code) {
       this.code = code;
   }
   
   /**
    * Consultor del atributo type.
    * @return Valor del  atributo type.
    */
   public java.lang.String getType() {
       return type;
   }
   
   /**
    * Modificador para el  atributo type.
    * @param type Nuevo valor  para el  atributo type.
    */
   public void setType(java.lang.String type) {
       this.type = type;
   }
   
   /**
    * Consultor del atributo measureUnit.
    * @return Valor del  atributo measureUnit.
    */
   public java.lang.String getMeasureUnit() {
       return measureUnit;
   }
   
   /**
    * Modificador para el  atributo measureUnit.
    * @param measureUnit Nuevo valor  para el  atributo measureUnit.
    */
   public void setMeasureUnit(java.lang.String measureUnit) {
       this.measureUnit = measureUnit;
   }
   
   /**
    * Consultor del atributo quantity.
    * @return Valor del  atributo quantity.
    */
   public double getQuantity() {
       return quantity;
   }
   
   /**
    * Modificador para el  atributo quantity.
    * @param quantity Nuevo valor  para el  atributo quantity.
    */
   public void setQuantity(double quantity) {
       this.quantity = quantity;
   }
   
   /**
    * Consultor del atributo packQuantity.
    * @return Valor del  atributo packQuantity.
    */
   public double getPackQuantity() {
       return packQuantity;
   }
   
   /**
    * Modificador para el  atributo packQuantity.
    * @param packQuantity Nuevo valor  para el  atributo packQuantity.
    */
   public void setPackQuantity(double packQuantity) {
       this.packQuantity = packQuantity;
   }
   
   /**
    * Consultor del atributo categoryId.
    * @return Valor del  atributo categoryId.
    */
   public int getCategoryId() {
       return categoryId;
   }
   
   /**
    * Modificador para el  atributo categoryId.
    * @param categoryId Nuevo valor  para el  atributo categoryId.
    */
   public void setCategoryId(int categoryId) {
       this.categoryId = categoryId;
   }
   
   /**
    * Consultor del atributo categoryName.
    * @return Valor del  atributo categoryName.
    */
   public java.lang.String getCategoryName() {
       return categoryName;
   }
   
   /**
    * Modificador para el  atributo categoryName.
    * @param categoryName Nuevo valor  para el  atributo categoryName.
    */
   public void setCategoryName(java.lang.String categoryName) {
       this.categoryName = categoryName;
   }
   
   /**
    * Consultor del atributo origin.
    * @return Valor del  atributo origin.
    */
   public java.lang.String getOrigin() {
       return origin;
   }
   
   /**
    * Modificador para el  atributo origin.
    * @param origin Nuevo valor  para el  atributo origin.
    */
   public void setOrigin(java.lang.String origin) {
       this.origin = origin;
   }
   
   /**
    * Consultor del atributo observation.
    * @return Valor del  atributo observation.
    */
   public java.lang.String getObservation() {
       return observation;
   }
   
   /**
    * Modificador para el  atributo observation.
    * @param observation Nuevo valor  para el  atributo observation.
    */
   public void setObservation(java.lang.String observation) {
       this.observation = observation;
   }
   
   /**
    * Consultor del atributo lowestQuantityPrice.
    * @return Valor del  atributo lowestQuantityPrice.
    */
   public double getLowestQuantityPrice() {
       return lowestQuantityPrice;
   }
   
   /**
    * Modificador para el  atributo lowestQuantityPrice.
    * @param lowestQuantityPrice Nuevo valor  para el  atributo lowestQuantityPrice.
    */
   public void setLowestQuantityPrice(double lowestQuantityPrice) {
       this.lowestQuantityPrice = lowestQuantityPrice;
   }
   
   /**
    * Consultor del atributo ivaId.
    * @return Valor del  atributo ivaId.
    */
   public int getIvaId() {
       return ivaId;
   }
   
   /**
    * Modificador para el  atributo ivaId.
    * @param ivaId Nuevo valor  para el  atributo ivaId.
    */
   public void setIvaId(int ivaId) {
       this.ivaId = ivaId;
   }
   
   /**
    * Consultor del atributo ivaValue.
    * @return Valor del  atributo ivaValue.
    */
   public double getIvaValue() {
       return ivaValue;
   }
   
   /**
    * Modificador para el  atributo ivaValue.
    * @param ivaValue Nuevo valor  para el  atributo ivaValue.
    */
   public void setIvaValue(double ivaValue) {
       this.ivaValue = ivaValue;
   }
   
   /**
    * Consultor del atributo nurit.
    * @return Valor del  atributo nurit.
    */
   public int getNurit() {
       return nurit;
   }
   
   /**
    * Modificador para el  atributo nurit.
    * @param nurit Nuevo valor  para el  atributo nurit.
    */
   public void setNurit(int nurit) {
       this.nurit = nurit;
   }
   
}