/*
 * CompanyDataHandler.java
 *
 * Created on 10 de agosto de 2004, 18:09
 */

package com.fenalco.servlets.supplier;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.fenalco.entities.Company;
import com.fenalco.entities.Log;
import com.fenalco.entities.Supplier;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.database.Transaction;

/**
 * Este servlet recibe las peticiones del usuario sobre <CODE>datosempresa.jsp
 * </CODE> donde tiene la opción de modificar los datos ingresados al registrar
 * la empresa en el sistema.
 * 
 * @author andres
 */
public class CompanyDataHandler extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 *            Parámetro de configuración
	 * @throws ServletException
	 *             Excepción de fallo en la operación de inicialización
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init(config);

	}

	/**
	 * Destruye el servlet.
	 */
	public void destroy( )
	{

	}

	/**
	 * Procesa las peticiones para los métodos HTTP <code>GET</code> y
	 * <code>POST</code>.
	 * 
	 * Este método se encarga de en primera instancia responder ante los cambios
	 * realizados en <CODE>datosempresa.jsp</CODE> (actualización).
	 * 
	 * Para responder a los cambios en los datos de la empresa, este servlet
	 * debe recibir la siguiente información:
	 * 
	 * Datos específicos de la empresa:
	 *  - Identificador de la empresa --> "companyId" - Razón social -->
	 * "socialName" - Nombre Comercial --> "commercialName" - Descripcion -->
	 * "description" - Nit --> "nit" - Dirección --> "address" - Telefono 1 -->
	 * "phoneNumber1" - Telefono 2 --> "phoneNumber2" - Contacto 1 -->
	 * "contact1" - Contacto 2 --> "contact2" - Fax --> "fax" - Email -->
	 * "email" - Número Afiliación Fenalco --> "fenalcoNumber" - Identificador
	 * de la ciudad --> "cityId" - GLN --> "gln"
	 * 
	 * Datos específicos del proveedor:
	 *  - Nombre del proveedor --> "supplierName" - Pedido mínimo -->
	 * "minimumOrder"
	 * 
	 * Almacena los cambios por medio de un llamado al método <CODE>update
	 * </CODE> de los objetos <CODE>Company</CODE> y <CODE>Supplier</CODE>
	 * creados con los datos suministrados
	 * 
	 * Luego de procesar la actualización, este servlet direcciona a <CODE>
	 * datosempresa</CODE> (CompanyDataView)
	 * 
	 * @param request
	 *            Petición del servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones.
	 * @throws IOException
	 *             Excepción de fallo en la operación de escritura por medio del
	 *             flujo <CODE>PrintWriter</CODE> de response.
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		RequestDispatcher dispatcher;

		String url = "";
		String message = "";

		//Validación de sesión
	    try
	    {
	        if( session == null || ( User )session.getAttribute( "user" ) == null || ( ( User )session.getAttribute( "user" ) ).getRoleId() != 2 )
			{
				url = "/logout";
				//message = "Sesión no iniciada";
				message = MessageBuilder.buildMessage(15);
	
			}
			else
			{
	
				if( request.getParameter("operationType").equals("update") )
				{
	
					Transaction t = new Transaction();
	
					if( !saveCompanyData(request, t)
							|| !saveSupplierData(request, t) )
					{
						//Fallo en la actualización de los datos de la empresa
						url = "/proveedor/datosempresa";
						//message = "Error al actualizar los datos de la empresa";
						message = MessageBuilder.buildMessage(7);
	
					}
					else
					{
						if( !t.execute() )
						{
							//Fallo en la actualización de los datos de la empresa
							url = "/proveedor/datosempresa";
							//message = "Error al actualizar los datos de la
							// empresa";
							message = MessageBuilder.buildMessage(7);
	
						}
						else
						{
							//Todo OK
							url = "/proveedor/datosempresa";
							//message = "La operación de actualización finalizó
							// correctamente";
							message = MessageBuilder.buildMessage(4);
							
							// guardo el registro en el log
		                    try
		                    {
		                        Transaction t1 = new Transaction( );
		                        Log l = new Log( );
		                        User user = ( User )session.getAttribute( "user" );
		                        String userId = user.getLogin();
		                        String numberId = user.getIdentificationNumber();
		                        String externalUser = "";
		                        String description = "El proveedor actualizó los datos";
		                        User callcenter = ( User )session.getAttribute( "callcenter" );
		                        if( callcenter != null )
		                        {
		                            externalUser = callcenter.getLogin();
		                        }
		                        l.saveData(userId, numberId, 56, description, externalUser, t1 );
		                        t1.execute();
		                    }
		                    catch( Exception ex )
		                    {
		                        System.out.println( "Error guardando el Log." );
		                    }
	
						}
	
					}
				}
				else
				{
					url = "/proveedor/datosempresa";
				}
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }

		request.setAttribute("message", message);
		dispatcher = getServletContext().getRequestDispatcher(url);
		dispatcher.forward(request, response);

	}

	/**
	 * Este método permite actualizar la información de una empresa
	 *  - Identificador de la empresa --> "companyId" - Razón social -->
	 * "socialName" - Nombre Comercial --> "commercialName" - Descripcion -->
	 * "description" - Nit --> "nit" - Dirección --> "address" - Telefono 1 -->
	 * "phoneNumber1" - Telefono 2 --> "phoneNumber2" - Contacto 1 -->
	 * "contact1" - Contacto 2 --> "contact2" - Fax --> "fax" - Email -->
	 * "email" - Número Afiliación Fenalco --> "fenalcoNumber" - Identificador
	 * de la ciudad --> "cityId" - GLN --> "gln"
	 * 
	 * @param request
	 *            HttpServletRequest que recibe el servlet
	 * @param t
	 *            Transacción que se está ejecutando
	 * @return Valor booleano que indica si la operación tuvo éxito o no.
	 */
	protected boolean saveCompanyData( HttpServletRequest request, Transaction t )
	{
		Company company = new Company(new Integer(request
				.getParameter("companyId")).intValue());

		company.setSocialName(request.getParameter("socialName"));
		company.setCommercialName(request.getParameter("commercialName"));
		company.setDescription(request.getParameter("description"));
		company.setNit(request.getParameter("nit"));
		company.setAddress(request.getParameter("address"));
		company.setSectorCode(new Integer(request.getParameter("sector"))
				.intValue());
		company.setCiiu(new Integer(request.getParameter("ciiu")).intValue());
		company.setPhoneNumber1(request.getParameter("phoneNumber1"));
		company.setPhoneNumber2(request.getParameter("phoneNumber2"));
		company.setContact1(request.getParameter("contact1"));
		company.setContact2(request.getParameter("contact2"));
		company.setFax(request.getParameter("fax"));
		company.setEmail(request.getParameter("email"));
		company.setFenalcoNumber(request.getParameter("fenalcoNumber"));
		company.setCityId(new Integer(request.getParameter("city")).intValue());
		company.setGln(request.getParameter("gln"));

		return company.update(t);

	}

	/**
	 * Este método permite actualizar la información específica del proveedor
	 *  - Nombre del proveedor --> "supplierName" - Pedido mínimo -->
	 * "minimumOrder"
	 * 
	 * @param request
	 *            HttpServletRequest que recibe el servlet
	 * @param t
	 *            Transacción que se está ejecutando
	 * @return Valor booleano que indica si la operación tuvo éxito o no.
	 */
	protected boolean saveSupplierData( HttpServletRequest request,
			Transaction t )
	{
		Supplier supplier = new Supplier(new Integer(request
				.getParameter("companyId")).intValue());

		supplier.setMinimunOrder(new Double(request.getParameter("minOrder"))
				.doubleValue());
		if( request.getParameter("catalogueStatus") != null )
		{
			supplier.setCatalogueStatus(1);
		}
		else
		{
			supplier.setCatalogueStatus(0);
		}

		return supplier.update(t);
	}

	/**
	 * Maneja el método HTTP <code>GET</code>.
	 * 
	 * @param request
	 *            Petición del servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones.
	 * @throws IOException
	 *             Excepción de fallo en la operación de escritura por medio del
	 *             flujo
	 */
	protected void doGet( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Maneja el método HTTP <code>POST</code>.
	 * 
	 * @param request
	 *            Petición del servlet
	 * @param response
	 *            Respuesta del servlet
	 * @throws ServletException
	 *             Excepción de fallo en la operación de procesamiento de
	 *             peticiones.
	 * @throws IOException
	 *             Excepción de fallo en la operación de escritura por medio del
	 *             flujo
	 */
	protected void doPost( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Información general del servlet.
	 * 
	 * @return Retorna una descripción general del servlet.
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

}