package com.fenalco.entities;

import java.sql.Date;
import java.sql.Time;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import com.fenalco.utilities.database.QueryException;
import com.fenalco.utilities.database.SQLUtilities;
import com.fenalco.utilities.database.Transaction;
import com.fenalco.utilities.mail.MailHandler;

/**
 * Esta clase representa un pedido, almacenando la informacion de los productos,
 * proveedores y establecimiento al cual va dirigida
 * 
 * @author Mario Linares Vásquez
 */
public class Order
{
	/**
	 * identificador único de cada pedido
	 */
	private int id;

	/**
	 * identificador del establecimiento al cual va a llegar el pedido
	 */
	private int storeId;

	/**
	 * Nombre del establecimiento al cual va a llegar el peido
	 */
	private String storeName;

	/**
	 * identificador de la empresa a la que se realiza el pedido (proveedor)
	 */
	private int companyId;

	/**
	 * Nombre de la empresa a la que se realiza el pedido (proveedor)
	 */
	private String companyName;

	/**
	 * fecha en la que se realizó el pedido
	 */
	private Date date;

	/**
	 * Hora a la que se realizó el pedido
	 */
	private Time time;

	/**
	 * id del estado del pedido
	 */
	private int orderStatus;

	/**
	 * Nombre del estado del pedido
	 */
	private String orderStatusName;

	/**
	 * Número que identifica al tipo de dispositivo desde el que se realizó el
	 * pedido
	 */
	private int orderOriginId;

	/**
	 * Número de serie que identifica al dispositivo desde el que se realizó el
	 * pedido
	 */
	private int device;
        
        /**
         * Almacena el id de la superoferta que se compró con este pedido
         * 0 en caso de que el pedido no sea de una superoferta
         */
        private int superOffer;

	/**
	 * lista de productos en el pedido, el key es el id del producto y el value
	 * es un Hashtable organizado de la siguietne forma: - key: el id del objeto
	 * OrderProduct (id en la tabla producto_pedido) --> OrderProduct - value:
	 * objeto de tipo OrderProduct --> OrderProduct
	 */
	private Hashtable products;

	/**
	 * El valor total del pedido
	 */
	private double value;

	/**
	 * Constructor por omisión
	 */
	public Order( )
	{
		// TODO: implement
		this.companyName = new String();
		this.orderStatusName = new String();
		this.storeName = new String();
		this.date = new Date(0, 0, 0);
		this.time = new Time(0, 0, 0);
		products = new Hashtable();
                
                superOffer = 0;

		id = this.hashCode();
	}

	/**
	 * Constructor que recibe el id del pedido y lo carga de la base de datos
	 * llamando al método LoadData
	 * 
	 * @param orderId
	 *            id del pedido
	 */
	public Order( int orderId)
	{

		this();
		this.id = orderId;
		this.loadData(orderId);

	}

	/**
	 * Carga toda la información del pedido de la base de datos
	 * 
	 * @param orderId
	 *            id del pedido
	 * @return un booleano que indica si se pudieron cargar los datos o no
	 */
	public boolean loadData( int orderId )
	{
		boolean flag = true;
		try
		{
                        
			Vector results = new Vector();
			results = SQLUtilities.query("SELECT pedi_id,esta_id,empr_id,pedi_fecha,pedi_hora,"
							+ "esta_pedi_id,orig_pedi_id,pedi_dispositivo, pedi_superoferta "
							+ "FROM pedido WHERE pedi_id =" + orderId + ";");
                        
			Hashtable temp = new Hashtable();
                        //System.out.println(results.size());
                        boolean historical = false;
                        if(results.size()<1){
                            String sql = "SELECT pedi_hist_id AS pedi_id, pedi_hist_establecimiento_id AS esta_id,"
                                                            + "pedi_hist_empresa_id AS empr_id, pedi_hist_fecha AS pedi_fecha," 
                                                            + "pedi_hist_hora AS pedi_hora, pedi_hist_estado_pedido_id AS esta_pedi_id,"
                                                            + "pedi_hist_origen_pedido_id AS orig_pedi_id,pedi_hist_dispositivo AS pedi_dispositivo, "
                                                            + "pedi_hist_superoferta AS pedi_superoferta "
                                                            + "FROM pedido_historico WHERE pedi_hist_id =" + orderId + ";";
                            
                            results = SQLUtilities.query( sql );
                            historical = true;
                        }
                        
                        //System.out.println(results.size());
                        temp = (Hashtable) results.elementAt(0);

			//ids
			this.setId(((Integer) temp.get("pedi_id")).intValue());
			this.setStoreId(((Integer) temp.get("esta_id")).intValue());
			this.setCompanyId(((Integer) temp.get("empr_id")).intValue());
			this.setOrderStatus(((Integer) temp.get("esta_pedi_id")).intValue());
			this.setOrderOriginId(((Integer) temp.get("orig_pedi_id")).intValue());
			this.setDevice(((Integer) temp.get("pedi_dispositivo")).intValue());
                        
                        if(temp.get( "pedi_superoferta" ) != null){
                            superOffer = ( ( Integer )temp.get( "pedi_superoferta" ) ).intValue();
                        }else{
                            superOffer=0;
                        }
                        

			//fecha y hora
			date = Date.valueOf(temp.get("pedi_fecha").toString());
			time = Time.valueOf(temp.get("pedi_hora").toString());

			//nombres
			results = new Vector();
			results = SQLUtilities.query("SELECT empr_nombre_comercial FROM empresa WHERE empr_id ="
							+ this.getCompanyId() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setCompanyName((String) temp.get("empr_nombre_comercial"));

			results = new Vector();
			results = SQLUtilities
					.query("SELECT esta_nombre FROM establecimiento WHERE esta_id ="
							+ this.getStoreId() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setStoreName((String) temp.get("esta_nombre"));

			results = new Vector();
			results = SQLUtilities
					.query("SELECT esta_pedi_nombre FROM estado_pedido WHERE esta_pedi_id ="
							+ this.getOrderStatus() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setOrderStatusName((String) temp.get("esta_pedi_nombre"));

			//productos
			results = new Vector();
                        
                        if( !historical ){
                            results = SQLUtilities
					.query("SELECT prod_pedi_id FROM producto_pedido WHERE pedi_id="
							+ this.getId() + ";");
                        }else{
                            results = SQLUtilities
					.query("SELECT prod_pedi_hist_id AS prod_pedi_id FROM producto_pedido_historico WHERE pedi_hist_id="
							+ this.getId() + ";");
                        }
			

			for( int i = 0; i < results.size(); i++ )
			{
				temp = new Hashtable();
				temp = (Hashtable) results.elementAt(i);
				Integer key = (Integer) temp.get("prod_pedi_id");
				this.products.put(key, new OrderProduct(key.intValue()));
			}

			this.calculateValue();

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			flag = false;
		}
		return flag;
	}

	/**
	 * Almacena la información del pedido en la base de datos usando el método
	 * <CODE>addSql</CODE> de la transacción que recibe
	 * 
	 * @return un booleano que indica si se pudo salvar la información o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean saveData( Transaction transaction )
	{
		boolean flag = true;

		//pedido
		this.setId(this.hashCode() + storeId + companyId);

		String query = new String("INSERT INTO pedido " + "VALUES("
				+ this.getId() + "," + this.getStoreId() + ","
				+ this.getOrderStatus() + "," + this.getOrderOriginId() + ","
				+ this.getCompanyId() + "," + "\'" + this.getDate().toString()
				+ "\'," + "\'" + this.getTime().toString() + "\',"
				+ this.getDevice() + ", " + superOffer + ");");
		transaction.addSql(query);

		//productos del pedido
		Hashtable temp = this.getProducts();
		Enumeration keys = temp.keys();
		while( keys.hasMoreElements() )
		//       for(int i = 0 ; i < temp.size(); i++)
		{
			OrderProduct op = (OrderProduct) temp.get(keys.nextElement());

			/*
			 * int idOrderProduct = this.hashCode(); int idSupplierProduct =
			 * op.getTableId(); int quantity = op.getQuantity(); double price =
			 * op.getPrice(); query = new String("INSERT INTO producto_pedido
			 * VALUES (" + idOrderProduct +","+ idSupplierProduct +","+
			 * this.getId() +","+ quantity +","+ price +");");
			 * transaction.addSql(query);
			 */
			op.setOrderId(id);
			op.saveData(transaction);
		}

		return flag;
	}

	public boolean update( Transaction t )
	{
		boolean response = true;
		String sqlDelete = "DELETE FROM producto_pedido WHERE pedi_id="
				+ this.getId() + ";";
		//        System.out.println(sqlDelete);

		t.addSql(sqlDelete);

		Enumeration e = this.products.keys();
		while( e.hasMoreElements() )
		{
			((OrderProduct) this.products.get(e.nextElement())).saveData(t);
		}

		return response;
	}

	/**
	 * Envia un correo al proveedor (usando el método estático sendMail)
	 * indicandole acerca del nuevo pedido que se ha realizado con toda la
	 * información necesaria para el proveedor, como es: - Nombre y dirección
	 * del establecimiento al cual debe llegar el pedido - detalles de cada
	 * producto en el pedido
	 * 
	 * @return booleano que indica si se pudo enviar el correo o no
	 */
	public boolean submit( )
	{
		boolean flag = false;
		try
		{

			String message = new String(
					"Usted ha recibido un nuevo pedido del siguiente establecimiento: "
							+ storeName);

			String query = new String(
					"SELECT empr_email FROM empresa WHERE empr_id="
							+ this.getCompanyId() + ";");
			Vector results = new Vector();
			results = SQLUtilities.query(query);

			String supplierEmail = (String) ((Hashtable) results.elementAt(0))
					.get("empr_email");
			query = new String(
					"SELECT empr_email FROM establecimiento,empresa "
							+ "WHERE establecimiento.empr_id = empresa.empr_id;");
			results = new Vector();
			results = SQLUtilities.query(query);
			String clientEmail = (String) ((Hashtable) results.elementAt(0))
					.get("empr_email");

			MailHandler mh = MailHandler.getInstance();
			flag = mh.sendMail(clientEmail, supplierEmail,
					"enviando pedido...", message);
		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
		}

		return flag;

	}

	/**
	 * Este método se usa cuando un proveedor responde un pedido: cambia el
	 * estado del pedido usando el método <CODE>addSql</CODE> de la
	 * transacción que recibe y le envia un correo al minorista confirmandole la
	 * respuesta
	 * 
	 * @return un booleano indicando si se pudo efectuar correctamente la
	 *         operación o no
	 * @param newState
	 *            nuevo estado para el pedido
	 * @param message
	 *            mensaje enviado al minorista
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean orderResponse( Transaction transaction, int newState,
			String subject, String message )
	{
		boolean flag = false;
		try
		{
			this.changeState(transaction, newState);

			String query = new String(
					"SELECT empr_email FROM empresa WHERE empr_id="
							+ this.getCompanyId() + ";");
			Vector results = new Vector();
			results = SQLUtilities.query(query);
			String supplierEmail = (String) ((Hashtable) results.elementAt(0))
					.get("empr_email");

			query = new String(
					"SELECT empr_email FROM establecimiento,empresa "
							+ "WHERE establecimiento.empr_id = empresa.empr_id ;");
			results = new Vector();
			results = SQLUtilities.query(query);
			String clientEmail = (String) ((Hashtable) results.elementAt(0))
					.get("empr_email");
			MailHandler mh = MailHandler.getInstance();
			flag = mh.sendMail(supplierEmail, clientEmail, subject, message);

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
		}

		return flag;
	}

	/**
	 * cambia el estado de un pedido, una vez se ha cambiado el código de estado
	 * busca en la base de datos el nombre del nuevo estado y lo asigna al
	 * atributo <CODE>orderStatusName</CODE>
	 * 
	 * @param transaction
	 *            transaction donde se agrega el query
	 * @param newStatus
	 *            el nuevo estado del pedido
	 */
	public void changeState( Transaction transaction, int newStatus )
	{

		String query = new String("UPDATE pedido SET esta_pedi_id=" + newStatus
				+ " WHERE pedi_id=" + this.getId() + ";");
		this.setOrderStatus(newStatus);
		transaction.addSql(query);

	}

	/**
	 * Elimina el pedido de la base de datos usando el método <CODE>addSql
	 * </CODE> de la transacción que recibe
	 * 
	 * @return un booleano que indica si se pudo eliminar el pedido o no
	 * @param transaction
	 *            la transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		Enumeration en = this.getProducts().keys();
		while( en.hasMoreElements() )
		{
			int productId = ((Integer) en.nextElement()).intValue();
			String query = new String(
					"DELETE FROM producto_pedido WHERE pedi_id=" + this.getId()
							+ ";");
			transaction.addSql(query);
		}

		String query = new String("DELETE FROM pedido WHERE pedi_id ="
				+ this.getId() + ";");
		transaction.addSql(query);
		return true;
	}

	/**
	 * Verifica si el pedido se puede enviar al establecimiento seleccionado,
	 * este establecimiento está representado por el atributo <CODE>storeId
	 * </CODE>
	 * 
	 * @return Vector con los ids de los productos la orden que no pueden ser
	 *         enviados
	 */
	public Vector verifyOrder( )
	{
		Enumeration en = this.getProducts().keys();
		Vector productIds = new Vector();
		boolean flag = true;

		while( en.hasMoreElements() && flag )
		{
			OrderProduct temp = (OrderProduct) this.products.get(en
					.nextElement());
			String productId = (new SupplierProduct(temp.getSupplierProductId()))
					.getCode();

			if( this.verifyProductOrder(productId) != true )
			{
				productIds.add(new Integer(productId));
			}
		}

		return productIds;

	}

	/**
	 * Este método verifica que un producto pueda ser entregado por un proveevor
	 * al establecimiento destino del pedido
	 * 
	 * @param productId
	 *            id del producto
	 * @return boolean que representa el exito del proceso
	 */
	public boolean verifyProductOrder( String productId )
	{
		boolean flag = false;
		try
		{

			String query = new String(
					" SELECT prod_prov_estado "
							+ " FROM producto,producto_proveedor,proveedor_establecimiento "
							+ " WHERE prod_codigo=\'"
							+ productId
							+ "\' AND "
							+ " producto_proveedor.empr_nit = proveedor.empr_nit AND "
							+ " proveedor.empr_nit = proveedor_establecimiento.empr_nit AND "
							+ " proveedor_establecimiento.esta_id ="
							+ this.getId() + ";");
			Vector results = new Vector();
			results = SQLUtilities.query(query);
			if( results.size() > 0 )
			{
				if( (((String) ((Hashtable) results.elementAt(0))
						.get("prod_prov_estado"))).equals("1") )
				{
					flag = true;
				}
			}

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			flag = false;
		}
		return flag;
	}

	/**
	 * Calcula el valor total del pedido basandose en el precio individual de
	 * cada producto y su cantidad
	 *  
	 */

	public void calculateValue( )
	{
		Enumeration en = this.getProducts().keys();
		double total = 0;
		while( en.hasMoreElements() )
		{
			total += ((OrderProduct) this.getProducts().get(en.nextElement()))
					.calculateValue();
		}
		this.setValue(total);
	}

	/**
	 * Este método agrega un objeto de tipo OrderProduct al Hashtable del pedido
	 * 
	 * @param product
	 *            producto a ser agregado
	 */
	public void addProduct( OrderProduct product )
	{
		if( products.get(new Integer(product.getTableId())) == null )
		{
			this.getProducts().put(new Integer(product.getTableId()), product);
		}
		else
		{
			product.setTableId(product.getTableId() + 1);
			addProduct(product);
		}
	}

	/**
	 * Consultor para el atributo id.
	 * 
	 * @return valor del atributo id.
	 */
	public int getId( )
	{
		return id;
	}

	/**
	 * Modificador para el atributo id.
	 * 
	 * @param id
	 *            Nuevo valor del atributo id.
	 */
	public void setId( int id )
	{
		this.id = id;
	}

	/**
	 * Consultor para el atributo storeId.
	 * 
	 * @return valor del atributo storeId.
	 */
	public int getStoreId( )
	{
		return storeId;
	}

	/**
	 * Modificador para el atributo storeId.
	 * 
	 * @param storeId
	 *            Nuevo valor del atributo storeId.
	 */
	public void setStoreId( int storeId )
	{
		this.storeId = storeId;
	}

	/**
	 * Consultor para el atributo storeName.
	 * 
	 * @return valor del atributo storeName.
	 */
	public String getStoreName( )
	{
		return storeName;
	}

	/**
	 * Modificador para el atributo storeName.
	 * 
	 * @param storeName
	 *            Nuevo valor del atributo storeName.
	 */
	public void setStoreName( String storeName )
	{
		this.storeName = storeName;
	}

	/**
	 * Consultor para el atributo companyId.
	 * 
	 * @return valor del atributo companyId.
	 */
	public int getCompanyId( )
	{
		return companyId;
	}

	/**
	 * Modificador para el atributo companyId.
	 * 
	 * @param companyId
	 *            Nuevo valor del atributo companyId.
	 */
	public void setCompanyId( int companyId )
	{
		this.companyId = companyId;
	}

	/**
	 * Consultor para el atributo companyName.
	 * 
	 * @return valor del atributo companyName.
	 */
	public String getCompanyName( )
	{
		return companyName;
	}

	/**
	 * Modificador para el atributo companyName.
	 * 
	 * @param companyName
	 *            Nuevo valor del atributo companyName.
	 */
	public void setCompanyName( String companyName )
	{
		this.companyName = companyName;
	}

	/**
	 * Consultor para el atributo date.
	 * 
	 * @return valor del atributo date.
	 */
	public java.sql.Date getDate( )
	{
		return date;
	}

	/**
	 * Modificador para el atributo date.
	 * 
	 * @param date
	 *            Nuevo valor del atributo date.
	 */
	public void setDate( java.sql.Date date )
	{
		this.date = date;
	}

	/**
	 * Consultor para el atributo time.
	 * 
	 * @return valor del atributo time.
	 */
	public java.sql.Time getTime( )
	{
		return time;
	}

	/**
	 * Modificador para el atributo time.
	 * 
	 * @param time
	 *            Nuevo valor del atributo time.
	 */
	public void setTime( java.sql.Time time )
	{
		this.time = time;
	}

	/**
	 * Consultor para el atributo orderStatus.
	 * 
	 * @return valor del atributo orderStatus.
	 */
	public int getOrderStatus( )
	{
		return orderStatus;
	}

	/**
	 * Modificador para el atributo orderStatus.
	 * 
	 * @param orderStatus
	 *            Nuevo valor del atributo orderStatus.
	 */
	public void setOrderStatus( int orderStatus )
	{
		this.orderStatus = orderStatus;
	}

	/**
	 * Consultor para el atributo orderOriginId.
	 * 
	 * @return valor del atributo orderOriginId.
	 */
	public int getOrderOriginId( )
	{
		return orderOriginId;
	}

	/**
	 * Modificador para el atributo orderOriginId.
	 * 
	 * @param orderOriginId
	 *            Nuevo valor del atributo orderOriginId.
	 */
	public void setOrderOriginId( int orderOriginId )
	{
		this.orderOriginId = orderOriginId;
	}

	/**
	 * Consultor para el atributo device.
	 * 
	 * @return valor del atributo device.
	 */
	public int getDevice( )
	{
		return device;
	}

	/**
	 * Modificador para el atributo device.
	 * 
	 * @param device
	 *            Nuevo valor del atributo device.
	 */
	public void setDevice( int device )
	{
		this.device = device;
	}

	/**
	 * Consultor para el atributo products.
	 * 
	 * @return valor del atributo products.
	 */
	public java.util.Hashtable getProducts( )
	{
		return products;
	}

	/**
	 * Modificador para el atributo products.
	 * 
	 * @param products
	 *            Nuevo valor del atributo products.
	 */
	public void setProducts( java.util.Hashtable products )
	{
		this.products = products;
	}

	/**
	 * Método consultor para el atributo
	 * 
	 * @return Retorna el valor del atributo orderStatusName.
	 */
	public String getOrderStatusName( )
	{
		return orderStatusName;
	}

	/**
	 * Método modificador para el tributo orderStatusName
	 * 
	 * @param orderStatusName
	 *            Nuevo valor para el atributo orderStatusName.
	 */
	public void setOrderStatusName( String orderStatusName )
	{
		this.orderStatusName = orderStatusName;
	}

	/**
	 * Método consultor para el atributo value
	 * 
	 * @return Retorna el atributo value.
	 */
	public double getValue( )
	{
		return value;
	}

	/**
	 * Modificador para el atributo value.
	 * 
	 * @param value
	 *            Nuevo valor del atributo value.
	 */
	public void setValue( double value )
	{
		this.value = value;
	}

	public int hashCode( )
	{
		return (new java.util.Date()).hashCode();
	}

	/*
	 * Método para mandar un pedido a la tabla de pedidos históricos
	 * 
	 * @param booleano que indica el exito de la operación
	 */
	public void makeHistorical( Transaction transaction )
	{

		String query = new String("INSERT INTO pedido_historico " + "VALUES("
				+ this.getId() + "," + this.getStoreId() + ","
				+ this.getOrderStatus() + "," + this.getOrderOriginId() + ","
				+ this.getCompanyId() + "," + "\'" + this.getDate().toString()
				+ "\'," + "\'" + this.getTime().toString() + "\',"
				+ this.getDevice() + "," + this.superOffer + ");");
		transaction.addSql(query);

		Enumeration e = this.products.elements();
		while( e.hasMoreElements() )
		{
			OrderProduct orderProduct = (OrderProduct) e.nextElement();
			orderProduct.makeHistorical(transaction);
		}

		this.delete(transaction);
	}

	/*
	 * Método para cargar un pedido a la tabla de pedidos históricos
	 * 
	 * @param booleano que indica el éxito de la operación
	 */
	public boolean loadHistoricalOrder( int orderId )
	{

		boolean success = true;
		try
		{

			Vector results = new Vector();
			results = SQLUtilities
					.query("SELECT pedi_hist_id,pedi_hist_establecimiento_id,pedi_hist_empresa_id,pedi_hist_fecha,pedi_hist_hora,"
							+ "pedi_hist_estado_pedido_id,pedi_hist_origen_pedido_id,pedi_hist_dispositivo "
							+ "FROM pedido_historico WHERE pedi_hist_id ="
							+ orderId + ";");
			Hashtable temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);

			//ids
			this.setId(((Integer) temp.get("pedi_hist_id")).intValue());
			this
					.setStoreId(((Integer) temp
							.get("pedi_hist_establecimiento_id")).intValue());
			this.setCompanyId(((Integer) temp.get("pedi_hist_empresa_id"))
					.intValue());
			this.setOrderStatus(((Integer) temp
					.get("pedi_hist_estado_pedido_id")).intValue());
			this.setOrderOriginId(((Integer) temp
					.get("pedi_hist_origen_pedido_id")).intValue());
			this.setDevice(((Integer) temp.get("pedi_hist_dispositivo"))
					.intValue());

			//fecha y hora
			date = Date.valueOf(temp.get("pedi_hist_fecha").toString());
			time = Time.valueOf(temp.get("pedi_hist_hora").toString());

			//nombres
			results = new Vector();
			results = SQLUtilities
					.query("SELECT empr_nombre_comercial FROM empresa WHERE empr_id ="
							+ this.getCompanyId() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setCompanyName((String) temp.get("empr_nombre_comercial"));

			results = new Vector();
			results = SQLUtilities
					.query("SELECT esta_nombre FROM establecimiento WHERE esta_id ="
							+ this.getStoreId() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setStoreName((String) temp.get("esta_nombre"));

			results = new Vector();
			results = SQLUtilities
					.query("SELECT esta_pedi_nombre FROM estado_pedido WHERE esta_pedi_id ="
							+ this.getOrderStatus() + ";");
			temp = new Hashtable();
			temp = (Hashtable) results.elementAt(0);
			this.setOrderStatusName((String) temp.get("esta_pedi_nombre"));

			//productos
			results = new Vector();
			results = SQLUtilities
					.query("SELECT prod_pedi_hist_id FROM producto_pedido_historico WHERE pedi_hist_id="
							+ this.getId() + ";");

			for( int i = 0; i < results.size(); i++ )
			{
				temp = new Hashtable();
				temp = (Hashtable) results.elementAt(i);
				Integer key = (Integer) temp.get("prod_pedi_hist_id");
				OrderProduct op = new OrderProduct();
				op.loadHistoricalOrderProduct(key.intValue());
				this.products.put(key, op);
			}

			this.calculateValue();

		}
		catch (QueryException qe)
		{
			System.out.println(qe.getMessage());
			success = false;
		}
		return success;

	}

        /**
         * Getter for property superOffer.
         * @return Value of property superOffer.
         */
        public int getSuperOffer() {
            return superOffer;
        }
        
        /**
         * Setter for property superOffer.
         * @param superOffer New value of property superOffer.
         */
        public void setSuperOffer(int superOffer) {
            this.superOffer = superOffer;
        }
        
}