/*
 * AbstractProduct.java
 *
 * Created on 20 de agosto de 2004, 12:24
 */

package com.fenalco.entities;

import java.util.Enumeration;
import java.util.Vector;

import com.fenalco.utilities.database.Transaction;

/**
 * Esta clase representa un producto abstracto, los productos concretos deben
 * extenderla y adicionarle le funcionalidad requerida asi como los métodos para
 * acceder a la base de datos
 * 
 * @author andres
 */
public abstract class AbstractProduct
{
	protected int tableId;

	protected int supplierProductId;

	protected int supplierId;

	protected String supplierName;

	protected String code;

	protected String name;

	protected int quantity;

	protected PriceScale price;

	/**
	 * Carga los datos del producto de la base de datos a partir del id del
	 * producto en la tabla necesaria
	 * 
	 * @param id
	 *            identificador del producto en la tabla necesaria
	 * @return booleano que indica si se pudo cargar el producto o no
	 */
	public abstract boolean loadData( int id );

	/**
	 * almacena los datos del producto en la base de datos construyendo la
	 * sentencia sql necesaria y adicionandola a la transacción.
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return boolenao que indica si la operación se realizó con éxito
	 */
	public abstract boolean saveData( Transaction transaction );

	/**
	 * actualiza el producto en la base de datos construyendo la instrucción sql
	 * y pasandola a la transacción
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si la operación se pudo ejecutar o no
	 */
	public abstract boolean update( Transaction transaction );

	/**
	 * elimina el producto de la base de datos creando la instrucción sql y la
	 * pasa a la transacción
	 * 
	 * @param transaction
	 *            la transacción que se está ejecutando
	 * @return booleano que indica si se pudo ejecutar la operación o no
	 */
	public abstract boolean delete( Transaction transaction );

	/**
	 * Getter for property supplierProduct.
	 * 
	 * @return Value of property supplierProduct.
	 */

	/**
	 * Getter for property name.
	 * 
	 * @return Value of property name.
	 */
	public java.lang.String getName( )
	{
		return name;
	}

	/**
	 * Setter for property name.
	 * 
	 * @param name
	 *            New value of property name.
	 */
	public void setName( java.lang.String name )
	{
		this.name = name;
	}

	/**
	 * Getter for property quantity.
	 * 
	 * @return Value of property quantity.
	 */
	public int getQuantity( )
	{
		return quantity;
	}

	/**
	 * Setter for property quantity.
	 * 
	 * @param quantity
	 *            New value of property quantity.
	 */
	public void setQuantity( int quantity )
	{
		this.quantity = quantity;
	}

	/**
	 * Getter for property price.
	 * 
	 * @return Value of property price.
	 */
	public double getPrice( )
	{
		double p = 0;
		Vector scales = price.getValues();
		Enumeration enu = scales.elements();
		while( enu.hasMoreElements() )
		{
			Vector scale = (Vector) enu.nextElement();
			int min = 0;
			int max = 0;
			min = ((Integer) scale.elementAt(1)).intValue();
			max = ((Integer) scale.elementAt(2)).intValue();
			p = ((Double) scale.elementAt(3)).doubleValue();
			if( min <= quantity && max >= quantity )
			{
				//                        p = ( ( Double )scale.elementAt( 3 ) ).doubleValue();
				break;
			}
		}

		return p;
	}

	/**
	 * Setter for property price.
	 * 
	 * @param price
	 *            New value of property price.
	 */
	public void setPrice( PriceScale price )
	{
		this.price = price;
	}

	/**
	 * Getter for property code.
	 * 
	 * @return Value of property code.
	 */
	public java.lang.String getCode( )
	{
		return code;
	}

	/**
	 * Setter for property code.
	 * 
	 * @param code
	 *            New value of property code.
	 */
	public void setCode( java.lang.String code )
	{
		this.code = code;
	}

	/**
	 * Getter for property tableId.
	 * 
	 * @return Value of property tableId.
	 */
	public int getTableId( )
	{
		return tableId;
	}

	/**
	 * Setter for property tableId.
	 * 
	 * @param tableId
	 *            New value of property tableId.
	 */
	public void setTableId( int tableId )
	{
		this.tableId = tableId;
	}

	/**
	 * Getter for property supplierProductId.
	 * 
	 * @return Value of property supplierProductId.
	 */
	public int getSupplierProductId( )
	{
		return supplierProductId;
	}

	/**
	 * Setter for property supplierProductId.
	 * 
	 * @param supplierProductId
	 *            New value of property supplierProductId.
	 */
	public void setSupplierProductId( int supplierProductId )
	{
		this.supplierProductId = supplierProductId;
	}

	/**
	 * Getter for property supplierId.
	 * 
	 * @return Value of property supplierId.
	 */
	public int getSupplierId( )
	{
		return supplierId;
	}

	/**
	 * Setter for property supplierId.
	 * 
	 * @param supplierId
	 *            New value of property supplierId.
	 */
	public void setSupplierId( int supplierId )
	{
		this.supplierId = supplierId;
	}

	/**
	 * Getter for property supplierName.
	 * 
	 * @return Value of property supplierName.
	 */
	public java.lang.String getSupplierName( )
	{
		return supplierName;
	}

	/**
	 * Setter for property supplierName.
	 * 
	 * @param supplierName
	 *            New value of property supplierName.
	 */
	public void setSupplierName( java.lang.String supplierName )
	{
		this.supplierName = supplierName;
	}

}