/*
 * Bill.java
 *
 * Created on 11 de agosto de 2004, 18:39 --> fecha de creación del archivo
 */

package com.fenalco.entities;

import java.sql.Date;
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;

/**
 * Esta clase representa la tabla factura 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 Andrés Romero Rodríguez
 * @authorDeLaPlantilla Mario Linares Vásquez
 */
public class Bill
{
	/**
	 * id de la factura en la base de datos
	 */
	private int id;

	/**
	 * id del proveedor sobre el cual se genera la factura
	 */
	private int supplierId;

	/**
	 * nombre del proveedor sobre el cual se genera la factura
	 */
	private String supplierName;

	/**
	 * fecha en la cual fué generada la factura
	 */
	private java.sql.Date date;

	/**
	 * valor de la factura
	 */
	private double value;

	/**
	 * estado de la factura
	 */
	private int statusId;

	/**
	 * estado de la factura en texto
	 */
	private String status;

	/**
	 *  
	 */
	private Hashtable details;

	/**
	 * Constructor por omisión de la clase. Se debe usar para el caso de
	 * insertar una nueva factura en la base de datos.
	 */
	public Bill( )
	{
		details = new Hashtable();
	}

	/**
	 * Constructor que recibe el id de la factura 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
	 * billId 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 billId
	 *            int que representa el id de la factura en la base de datos
	 */
	public Bill( int billId)
	{
		details = new Hashtable();
		loadData(billId);
	}

	/**
	 * Este método carga de la tabla factura de la base de datos todos los
	 * valores de los campos en los atributos de la clase Crea la consulta sql y
	 * llama al método query de la clase SQLUtilities
	 * 
	 * @return boolean que representa el exito del proceso de carga de los datos
	 * @param billId
	 *            identificador de la factura
	 */
	public boolean loadData( int billId )
	{
		boolean respuesta = false;
		String sql = "SELECT esta_fact_id, empr_id, fact_fecha, fact_valor FROM "
				+ "factura WHERE fact_id = " + billId + ";";
		try
		{
			Vector res = SQLUtilities.query(sql);

			Hashtable datos = (Hashtable) res.elementAt(0);

			id = billId;
			supplierId = ((Integer) datos.get("empr_id")).intValue();
			date = (Date) datos.get("fact_fecha");
			value = ((Double) datos.get("fact_valor2")).doubleValue();
			statusId = ((Integer) datos.get("esta_fact_id")).intValue();

			// para obtener el nombre de la empresa: (nombre comercial o razon
			// social????)
			sql = "SELECT empr_nombre_comercial FROM empresa WHERE empr_id="
					+ supplierId + ";";

			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);
			supplierName = (String) datos.get("empr_nombre_comercial");

			// ahora para obtener el nombre del estado de la factura
			sql = "SELECT esta_fact_nombre FROM estado_factura WHERE esta_fact_id="
					+ statusId + ";";
			res = SQLUtilities.query(sql);
			datos = (Hashtable) res.elementAt(0);
			status = (String) datos.get("esta_fact_nombre");

			//TODO: Y LOS DETALLES DE LA FACTURA QUE????????..!!!!!!!!!!!

			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		catch (Exception e)
		{
			respuesta = false;
			System.out.println("Error --> " + e);
		}
		return respuesta;
	}

	/**
	 * Este método guarda los atributos de la factura 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 factura debe construir una
	 * consulta SQL de tipo <B>insert </B>
	 * 
	 * esta consulta se adiciona a la transacción que se recibe usando el método
	 * <CODE>addSql</CODE>
	 * 
	 * @return boolean que representa el exito del proceso de inserción
	 * @param transaction
	 *            Objeto de tipo Transaction que se usa para manejar
	 *            transacciones
	 */
	public boolean saveData( Transaction transaction )
	{
		id = this.hashCode();
		String sql = "INSERT INTO factura (fact_id, esta_fact_id, empr_id, fact_fecha, "
				+ "fact_valor) VALUES("
				+ id
				+ ", "
				+ statusId
				+ ", "
				+ supplierId + ", \'" + date + "\', " + value + ");";

		transaction.addSql(sql);
		return true;
	}

	/**
	 * Realiza una consulta SQL de tipo update con el fin de actualizar los
	 * campos de la factura modificados a través de los métodos setter.Para
	 * actualizar los datos en la tabla factura debe construir una consulta SQL
	 * de tipo <B>update </B>
	 * 
	 * y la adiciona a la transacción que recibe como parámetro
	 * 
	 * @return boolean que representa el exito del proceso de actualización
	 * @param transaction
	 *            transacción que se está ejecutando
	 */
	public boolean update( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "UPDATE factura SET " + "esta_fact_id=" + statusId
					+ ", empr_id=" + supplierId + ", fact_fecha=\'" + date
					+ "\'" + ", fact_valor=" + value + " WHERE fact_id=" + id
					+ ";";
			transaction.addSql(sql);
			res = true;
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * Realiza una consulta SQL de tipo delete con el fin de eliminar la factura
	 * de la base de datos cuando se creo la instancia con el constructor que
	 * recibe el id como parámetro. adiciona la consulta a la transacción que
	 * recibe como parámetro
	 * 
	 * @return boolean que representa el exito del proceso de boorado
	 * @param transaction
	 *            transacción que se está ejecutando
	 */
	public boolean delete( Transaction transaction )
	{
		boolean res = false;
		if( id != 0 )
		{
			String sql = "DELETE FROM factura WHERE fact_id=" + id + ";";
			transaction.addSql(sql);
			res = true;
		}
		else
		{
			res = false;
		}
		return res;
	}

	/**
	 * 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 supplierId.
	 * 
	 * @return Valor del atributo supplierId.
	 */
	public int getSupplierId( )
	{
		return supplierId;
	}

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

	/**
	 * Consultor para el atributo supplierName.
	 * 
	 * @return Valor del atributo supplierName.
	 */
	public String getSupplierName( )
	{
		return supplierName;
	}

	/**
	 * Modificador para el atributo supplierName.
	 * 
	 * @param supplierName
	 *            Nuevo valor del atributo supplierName.
	 */
	public void setSupplierName( java.lang.String supplierName )
	{
		this.supplierName = supplierName;
	}

	/**
	 * 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 value.
	 * 
	 * @return Valor del 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;
	}

	/**
	 * Consultor para el atributo statusId.
	 * 
	 * @return Valor del atributo statusId.
	 */
	public int getStatusId( )
	{
		return statusId;
	}

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

	/**
	 * Consultor para el atributo details.
	 * 
	 * @return Valor del atributo details.
	 */
	public Hashtable getDetails( )
	{
		return details;
	}

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

	/**
	 * Getter for property state.
	 * 
	 * @return Value of property state.
	 */
	public java.lang.String getStatus( )
	{
		return status;
	}

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

}