/*
 * ShopKeeperList.java
 * 
 * Created on 11 de agosto de 2004, 6:30
 */

/**
 *
 * @author  Juan Ernesto Peña Kaltekis
 *
 * Esta clase representa una lista de minoristas
 * 
 * CONTROL DE CAMBIOS:
 *
 * Fecha        Autor       tipo        cambio      descripción
 *
 *
 */
package com.fenalco.entities;

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

import java.sql.Date;

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

/**
 * Esta clase representa una lista de minoristas
 */
public class ShopKeeperList
{
	/**
	 * Es un Hashtable que tiene como llave un int que representa el id de una
	 * empresa minorista, el objeto es de tipo <CODE>ShopKeeper</CODE>
	 */
	private Vector shopKeepers;

	/**
	 * Constructor por omisión de la clase ShopKeeperList
	 */
	public ShopKeeperList( )
	{
		shopKeepers = new Vector();
		loadData();
	}

	/**
	 * Constructor de la clase para cargar la lista con los minoristas que un
	 * proveedor tiene activados
	 * 
	 * @param supplierId
	 *            Identificador del proveedor (empresa)
	 */
	public ShopKeeperList( int supplierId)
	{

		shopKeepers = new Vector();
		loadData(supplierId);
	}
        
	/**
	 * Constructor de la clase para cargar la lista con los minoristas que un
	 * proveedor tiene activados
	 * 
	 * @param supplierId Identificador del proveedor (empresa)
         * @param shopKeeperName Sirve par filtrar los minoristas por nombre
	 */
	public ShopKeeperList( int supplierId, String shopKeeperName)
	{
		shopKeepers = new Vector();
		this.loadData(supplierId, shopKeeperName);
	}
        

	/**
	 * Hace una consulta en la tabla minorista por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * minoristas y llenar la variable shopKeepers con todos los minoristas
	 * registrados en el sistema
	 * 
	 * @return Indica el éxito de la carga de los minoristas
	 */
	public boolean loadData( )
	{
		boolean respuesta = false;
		String sql = "SELECT empresa.empr_nombre_comercial, minorista.empr_id " +
                             "FROM minorista, empresa where minorista.empr_id=empresa.empr_id " +
                             "ORDER BY empresa.empr_nombre_comercial ASC;";
		try
		{
			Vector res = SQLUtilities.query(sql);
			int size = res.size();
			for( int i = 0; i < size; i++ )
			{
				Hashtable datos = (Hashtable) res.elementAt(i);
				int spid = ((Integer) datos.get("empr_id")).intValue();
				ShopKeeper sp = new ShopKeeper(spid);
				shopKeepers.addElement(sp);
			}
			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		return respuesta;
	}

	/**
	 * Hace una consulta en la tabla minorista por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * minoristas y llenar la variable shopKeepers con los minoristas activados
	 * por un proveedor
	 * 
	 * @param supplierId
	 *            Identificador del proveedor
	 * @return booleano que indica el éxito de la carga de los minoristas
	 */
	public boolean loadData( int supplierId )
	{
		boolean respuesta = false;
		/*
		 * String sql = "SELECT establecimiento.empr_id AS minorista FROM " +
		 * "establecimiento, proveedor_establecimiento " + "WHERE
		 * proveedor_establecimiento.empr_id=" + supplierId + " AND " +
		 * "proveedor_establecimiento.esta_id = establecimiento.esta_id;";
		 */

		String sql = "SELECT empresa.empr_nombre_comercial, minorista_proveedor.empr_id AS minorista " +
                             "FROM empresa, minorista_proveedor, ciudad " +
                             "WHERE pro_empr_id="+ supplierId + " AND empresa.empr_id=minorista_proveedor.empr_id " +
                             "AND empresa.ciud_id = ciudad.ciud_id " + 
                             "ORDER BY ciudad.ciud_nombre, empresa.empr_nombre_comercial ASC;";

		try
		{
			Vector res = SQLUtilities.query(sql);
			int size = res.size();
			for( int i = 0; i < size; i++ )
			{
				Hashtable datos = (Hashtable) res.elementAt(i);
				int spid = ((Integer) datos.get("minorista")).intValue();
				ShopKeeper sp = new ShopKeeper(spid);
				shopKeepers.addElement(sp);
			}
			respuesta = true;
		}
		catch (QueryException ex)
		{
			respuesta = false;
		}
		return respuesta;
	}

        
	/**
	 * Hace una consulta en la tabla minorista por medio del método <CODE>query
	 * </CODE> de la clase <CODE>SqlUtilities</CODE> para cargar la lista de
	 * minoristas y llenar la variable shopKeepers con los minoristas activados
	 * por un proveedor
	 * 
	 * @param supplierId Identificador del proveedor
         * @param shopKeeperName Filtro por nombre para los minoristas
	 * @return booleano que indica el éxito de la carga de los minoristas
	 */
	public boolean loadData( int supplierId, String shopKeeperName ){
            boolean success = false;

            String sql = "SELECT empresa.empr_nombre_comercial, minorista_proveedor.empr_id AS minorista " +
                         "FROM empresa, minorista_proveedor, ciudad " +
                         "WHERE empresa.empr_id=minorista_proveedor.empr_id " +
                         "AND pro_empr_id=" + supplierId + " " +
                         "AND empresa.ciud_id = ciudad.ciud_id " +
                         "AND empresa.empr_nombre_comercial LIKE \'%" + shopKeeperName + "%\' " + 
                         "ORDER BY ciudad.ciud_nombre,empresa.empr_nombre_comercial;";
            
            try{
                Vector res = SQLUtilities.query(sql);
                int size = res.size();
                for( int i = 0; i < size; i++ ){
                        Hashtable data = (Hashtable) res.elementAt(i);
                        int spid = ((Integer) data.get("minorista")).intValue();
                        ShopKeeper sp = new ShopKeeper(spid);
                        shopKeepers.addElement(sp);
                }
                success = true;
            }catch (QueryException ex){
                    ex.printStackTrace();
                    success = false;
            }
            return success;
	}
        
        
	public boolean nonClientList(int supplierId, Date startDate, Date endDate, int filterNew ){
        boolean response = true;
        this.shopKeepers.clear();
        
        Vector result = new Vector();
        Hashtable aux = new Hashtable();
        String sql = "";
        
        if( filterNew == 0){
               sql = "SELECT minorista.empr_id, empresa.empr_nombre_comercial " +
                     "FROM minorista, empresa, ciudad " +
                     "WHERE minorista.empr_id NOT IN " +
                     "(SELECT minorista_proveedor.empr_id " +
                     "FROM minorista_proveedor " +
                     "WHERE pro_empr_id="+supplierId+") AND empresa.empr_id=minorista.empr_id " +
                     "AND empresa.esta_empr_id=2 " +
                     "AND empresa.ciud_id = ciudad.ciud_id " +
                     "ORDER BY ciudad.ciud_nombre, empresa.empr_nombre_comercial ASC;";
        }else{
                
               sql = "SELECT minorista.empr_id, empresa.empr_nombre_comercial " +
                     "FROM minorista, empresa, ciudad " +
                     "WHERE minorista.empr_id NOT IN " +
                     "(SELECT minorista_proveedor.empr_id " +
                     "FROM minorista_proveedor " +
                     "WHERE pro_empr_id="+supplierId+") AND empresa.empr_id=minorista.empr_id AND " +
                     "empresa.empr_fecha_activacion BETWEEN \'"+ startDate.toString() +"\' AND \'" + endDate.toString()+ "\' " +
                     "AND empresa.esta_empr_id=2 " +
                     "AND empresa.ciud_id = ciudad.ciud_id " +
                     "ORDER BY ciudad.ciud_nombre, empresa.empr_nombre_comercial ASC;"; 
            
        }
        
        System.out.println( "NonClient SQl=" + sql );
        
        try{
            result = SQLUtilities.query(sql);
            StoreList sl = new StoreList();
            
            for(int i=0;i<result.size();i++){
                aux = (Hashtable)result.elementAt(i);
                int id = ( (Integer)aux.get("empr_id") ).intValue();
                //System.out.println( id );
                if( filterNew == 1 ){
                    sl = new StoreList( id );
                    if( sl.getStores().size() >=1 ){
                        this.shopKeepers.addElement(new ShopKeeper( id ) );
                        //System.out.println( "Add Store New" );
                    }
                    
                }else{
                    this.shopKeepers.addElement( new ShopKeeper( id ) );
                    //System.out.println( "Add Store" );
                }
                
            }
           
        }catch(QueryException qe){
            response = false;
        }
        
        //Deja solamente a las empresas activas y los minoristas que no son exclusivos 
        
        Vector auxResult = new Vector();
        Hashtable auxResult2 = new Hashtable();
        Enumeration enumer = this.shopKeepers.elements();
        
        while(enumer.hasMoreElements()){
            ShopKeeper shopKeeper = ((ShopKeeper)enumer.nextElement());
            if(Company.getCompanyStatus(shopKeeper.getShopKeeperId())==2 && !DataAccess.isExclusive( shopKeeper.getShopKeeperId()) ){
                auxResult.addElement(shopKeeper);
            }
        }
        
        this.setShopKeepers(auxResult);
        return response;
   }

        public boolean nonClientList(int supplierId, String shopKeeperName, Date startDate, Date endDate, int filterNew ){
        boolean response = true;
        this.shopKeepers.clear();
        
        Vector result = new Vector();
        Hashtable aux = new Hashtable();
        String sql = "";
        
        if( filterNew == 0){
               sql = "SELECT minorista.empr_id, empresa.empr_nombre_comercial " +
                     "FROM minorista, empresa, ciudad " +
                     "WHERE minorista.empr_id NOT IN " +
                     "(SELECT minorista_proveedor.empr_id " +
                     "FROM minorista_proveedor " +
                     "WHERE pro_empr_id="+supplierId+") AND empresa.empr_id=minorista.empr_id " +
                     "AND empresa.esta_empr_id=2 " +
                     "AND empresa.empr_nombre_comercial LIKE \'%" + shopKeeperName + "%\' " + 
                     "AND empresa.ciud_id = ciudad.ciud_id " +
                     "ORDER BY ciudad.ciud_nombre, empresa.empr_nombre_comercial ASC;";
        }else{
                
               sql = "SELECT minorista.empr_id, empresa.empr_nombre_comercial " +
                     "FROM minorista, empresa, ciudad " +
                     "WHERE minorista.empr_id NOT IN " +
                     "(SELECT minorista_proveedor.empr_id " +
                     "FROM minorista_proveedor " +
                     "WHERE pro_empr_id="+supplierId+") AND empresa.empr_id=minorista.empr_id AND " +
                     "empresa.empr_fecha_activacion BETWEEN \'"+ startDate.toString() +"\' AND \'" + endDate.toString()+ "\' " +
                     "AND empresa.esta_empr_id=2 " +
                     "AND empresa.empr_nombre_comercial LIKE \'%" + shopKeeperName + "%\' " + 
                     "AND empresa.ciud_id = ciudad.ciud_id " +
                     "ORDER BY ciudad.ciud_nombre, empresa.empr_nombre_comercial ASC;"; 
            
        }
        
        System.out.println( "NonClient SQl=" + sql );
        
        try{
            result = SQLUtilities.query(sql);
            StoreList sl = new StoreList();
            
            for(int i=0;i<result.size();i++){
                aux = (Hashtable)result.elementAt(i);
                int id = ( (Integer)aux.get("empr_id") ).intValue();
                //System.out.println( id );
                if( filterNew == 1 ){
                    sl = new StoreList( id );
                    if( sl.getStores().size() >=1 ){
                        this.shopKeepers.addElement(new ShopKeeper( id ) );
                        //System.out.println( "Add Store New" );
                    }
                    
                }else{
                    this.shopKeepers.addElement( new ShopKeeper( id ) );
                    //System.out.println( "Add Store" );
                }
                
            }
           
        }catch(QueryException qe){
            response = false;
        }
        
        //Deja solamente a las empresas activas y los minoristas que no son exclusivos 
        
        Vector auxResult = new Vector();
        Hashtable auxResult2 = new Hashtable();
        Enumeration enumer = this.shopKeepers.elements();
        
        while(enumer.hasMoreElements()){
            ShopKeeper shopKeeper = ((ShopKeeper)enumer.nextElement());
            if(Company.getCompanyStatus(shopKeeper.getShopKeeperId())==2 && !DataAccess.isExclusive( shopKeeper.getShopKeeperId()) ){
                auxResult.addElement(shopKeeper);
            }
        }
        
        this.setShopKeepers(auxResult);
        return response;
   }
        
	/**
	 * Filtra La lista de minosristas por ciudad
	 * 
	 * @param Id
	 *            de la ciudad por la cual se va a filtrar
	 */
	public void filterByCity( int cityId )
	{

		Vector aux = new Vector();
                Enumeration e = this.shopKeepers.elements();
                
		while( e.hasMoreElements() )
		{
                        ShopKeeper s = (ShopKeeper) e.nextElement();
			int shopKeeperId = s.getShopKeeperId();
			if( cityId != -1 && new Company(shopKeeperId).getCityId() == cityId )
			{
				aux.addElement(s);
			}
		}
                
                if( cityId != -1 ){
                    this.shopKeepers=aux;
                }
                
	}
        
        public void filterByProvince( int provinceId )
        {
            Vector aux = new Vector();
                Enumeration e = this.shopKeepers.elements();
                
		while( e.hasMoreElements() )
		{
                        ShopKeeper s = (ShopKeeper) e.nextElement();
			int shopKeeperId = s.getShopKeeperId();
                        int province = new City( new Company(shopKeeperId).getCityId() ).getProvince();
                        if( provinceId != -1 && province == provinceId )
			{
                                //System.out.println( "FilterProvince: " + province );
				aux.addElement(s);
			}
		}
                
                if( provinceId != -1 ){
                    this.shopKeepers=aux;
                }
            
        }
        
        
        
        /**
	 * Consultor para el atributo shopKeepers.
	 * 
	 * @return Valor para el atributo shopKeepers.
	 */
	public Vector getShopKeepers( )
	{
		return shopKeepers;
	}

	/**
	 * Modificador para el atributo shopKeepers.
	 * 
	 * @param shopKeepers
	 *            Nuevo valor para el atributo shopKeepers.
	 */
	public void setShopKeepers( Vector shopKeepers )
	{
		this.shopKeepers = shopKeepers;
	}
        
        

	
}