/**
   * Procesa la petici\u00F3n HTTP (request) especificada y genera su correspondiente respuesta HTTP
   * (response) (o lo redirige a otro componente web que podr\u00EDa crear) Devuelve una instancia
   * <code>ActionForward</code> que describe d\u00F3nde y c\u00F3mo se redirige el control.
   *
   * @param mapping El mapeo utilizado para seleccionar esta instancia
   * @param form El formulario asociado a esta acci\u00F3n de donde se toman y establecen valores de
   *     campos
   * @param request La petici&oacute;n que estamos procesando
   * @param response La respuesta HTTP que se genera
   * @return ActionForward Acci&oacuten o p&acute;gina jsp donde se redirige el control
   * @throws Exception
   */
  public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {
    // posibles mensajes a usar
    ActionMessages errors = new ActionMessages();

    String forward = "principal";
    HttpSession session = request.getSession();
    // ModificarFechasEntregaForm formulario = (ModificarFechasEntregaForm)form;

    String peticion = request.getParameter(Globals.AYUDA);

    if (request.getParameter("indice") != null) {
      // se forma la consulta para obtener las entregas
      VistaPedidoDTO vistaPedidoDTO =
          (VistaPedidoDTO)
              ((List) session.getAttribute(SessionManagerSISPE.COLECCION_PEDIDOS_GENERAL))
                  .get(Integer.parseInt(request.getParameter("indice")));
      EstadoDetallePedidoDTO estadoDetallePedidoFiltro = new EstadoDetallePedidoDTO();
      estadoDetallePedidoFiltro
          .getId()
          .setCodigoCompania(
              SessionManagerSISPE.getCurrentCompanys(request).getId().getCodigoCompania());
      estadoDetallePedidoFiltro.getId().setCodigoPedido(vistaPedidoDTO.getId().getCodigoPedido());
      estadoDetallePedidoFiltro.getId().setCodigoEstado(vistaPedidoDTO.getId().getCodigoEstado());
      estadoDetallePedidoFiltro
          .getId()
          .setSecuencialEstadoPedido(vistaPedidoDTO.getId().getSecuencialEstadoPedido());
      ArticuloDTO articuloDTO = new ArticuloDTO();
      //			articuloDTO.setArticuloComercialDTO(new ArticuloComercialDTO());
      articuloDTO.setArticuloUnidadManejoCol(new ArrayList<ArticuloUnidadManejoDTO>());
      articuloDTO.getArticuloUnidadManejoCol().add(new ArticuloUnidadManejoDTO());
      DetallePedidoDTO detallePedidoDTO = new DetallePedidoDTO();
      detallePedidoDTO.setArticuloDTO(articuloDTO);

      estadoDetallePedidoFiltro.setDetallePedidoDTO(
          detallePedidoDTO); // obtiene los datos del art\u00EDculo

      EntregaDetallePedidoDTO entregaDetallePedidoDTO = new EntregaDetallePedidoDTO();
      entregaDetallePedidoDTO.setEntregaPedidoDTO(new EntregaPedidoDTO());

      estadoDetallePedidoFiltro.setEntregaDetallePedidoCol(
          new ArrayList<EntregaDetallePedidoDTO>()); // obtiene las entregas de cada detalle
      estadoDetallePedidoFiltro.getEntregaDetallePedidoCol().add(entregaDetallePedidoDTO);

      ContactoUtil.cargarDatosPersonaEmpresa(request, vistaPedidoDTO);
      session.setAttribute(
          COL_ESTADO_DETALLE_PEDIDO,
          SessionManagerSISPE.getServicioClienteServicio()
              .transObtenerEstadoDetallePedido(estadoDetallePedidoFiltro));
      session.setAttribute(VISTA_PEDIDO, vistaPedidoDTO);

      // ----------PRUEBA
      Collection<EstadoDetallePedidoDTO> detalles =
          (Collection<EstadoDetallePedidoDTO>) session.getAttribute(COL_ESTADO_DETALLE_PEDIDO);
      // c\u00E1lculo de los bultos
      for (EstadoDetallePedidoDTO estadoDetallePedidoDTO : detalles) {
        for (EntregaDetallePedidoDTO entDetPedDTO :
            estadoDetallePedidoDTO.getEntregaDetallePedidoCol()) {
          if (entDetPedDTO.getCantidadDespacho() > 0) {
            entDetPedDTO.setNpCantidadBultos(
                UtilesSISPE.calcularCantidadBultos(
                    entDetPedDTO.getCantidadDespacho(),
                    estadoDetallePedidoDTO.getDetallePedidoDTO().getArticuloDTO()));
          }
        }
      }
      // ---------------

      // para obtener la entregas del pedido - cjui\u00F1a
      List<VistaDetallePedidoDTO> detalleVistaPedido = new ArrayList<VistaDetallePedidoDTO>();
      VistaDetallePedidoDTO consultaVistaDetallePedidoDTO = new VistaDetallePedidoDTO();
      consultaVistaDetallePedidoDTO
          .getId()
          .setCodigoCompania(vistaPedidoDTO.getId().getCodigoCompania());
      consultaVistaDetallePedidoDTO
          .getId()
          .setCodigoAreaTrabajo(vistaPedidoDTO.getId().getCodigoAreaTrabajo());
      consultaVistaDetallePedidoDTO
          .getId()
          .setCodigoPedido(vistaPedidoDTO.getId().getCodigoPedido());
      consultaVistaDetallePedidoDTO
          .getId()
          .setCodigoEstado(vistaPedidoDTO.getId().getCodigoEstado());
      consultaVistaDetallePedidoDTO
          .getId()
          .setSecuencialEstadoPedido(vistaPedidoDTO.getId().getSecuencialEstadoPedido());
      consultaVistaDetallePedidoDTO.setArticuloDTO(new ArticuloDTO());
      consultaVistaDetallePedidoDTO.setEntregaDetallePedidoCol(
          new ArrayList<EntregaDetallePedidoDTO>());
      detalleVistaPedido =
          (List<VistaDetallePedidoDTO>)
              SessionManagerSISPE.getServicioClienteServicio()
                  .transObtenerVistaDetallePedido(consultaVistaDetallePedidoDTO);
      session.setAttribute(DETALLELPEDIDOAUX, detalleVistaPedido);
      obtenerEntregas(session);

      LogSISPE.getLog().info("se consult\u00F3 las entregas");
    } else if (peticion != null && peticion.equals("guardar")) {
      LogSISPE.getLog().info("ingresa a guardar");
      try {
        List<EstadoDetallePedidoDTO> detalle =
            (List<EstadoDetallePedidoDTO>)
                request.getSession().getAttribute(COL_ESTADO_DETALLE_PEDIDO);
        for (EstadoDetallePedidoDTO detalleDTO : detalle) {
          detalleDTO.setUserId(SessionManagerSISPE.getDefault().getLoggedUser(request).getUserId());
          DetallePedidoDTO detallePedidoDTO = detalleDTO.getDetallePedidoDTO();
          LogSISPE.getLog()
              .info(
                  "Articulo y sus entregas--{}",
                  detallePedidoDTO.getArticuloDTO().getDescripcionArticulo());
          for (EntregaDetallePedidoDTO entDetPedDTO : detalleDTO.getEntregaDetallePedidoCol()) {
            LogSISPE.getLog()
                .info(
                    "Fecha Entrega cliente--{}",
                    entDetPedDTO.getEntregaPedidoDTO().getFechaEntregaCliente());
            LogSISPE.getLog()
                .info(
                    "Fecha Despacho Bodega--{}",
                    entDetPedDTO.getEntregaPedidoDTO().getFechaDespachoBodega());
            LogSISPE.getLog()
                .info("Direccion--{}", entDetPedDTO.getEntregaPedidoDTO().getDireccionEntrega());
            if (entDetPedDTO.getEntregaPedidoDTO().getNpFechaEntregaInicial() != null
                && entDetPedDTO.getEntregaPedidoDTO().getNpFechaDespachoInicial() != null) {
              LogSISPE.getLog()
                  .info(
                      "Fecha Entrega clienteO--{}",
                      entDetPedDTO.getEntregaPedidoDTO().getNpFechaEntregaInicial());
              LogSISPE.getLog()
                  .info(
                      "Fecha Despacho BodegaO--{}",
                      entDetPedDTO.getEntregaPedidoDTO().getNpFechaDespachoInicial());
            }
          }
        }
        SessionManagerSISPE.getServicioClienteServicio()
            .transModificarFechasDespachoYEntrega(
                (Collection<EstadoDetallePedidoDTO>)
                    session.getAttribute(COL_ESTADO_DETALLE_PEDIDO),
                SessionManagerSISPE.getDefault().getLoggedUser(request).getUserId());
        // mensaje de exito para el registro
        ControlMensajes controlMensajes = new ControlMensajes();
        controlMensajes.setMessages(session, "message.exito.fechasEntregaModificadas");
        session.setAttribute(ListadoPedidosAction.VOLVER_A_BUSQUEDA, "ok");

        session.removeAttribute(SessionManagerSISPE.COLECCION_PEDIDOS_GENERAL);
        forward = "busqueda";
      } catch (SISPEException e) {
        errors.add(
            "registro",
            new ActionMessage(
                "errors.llamadaServicio.registrarDatos", "la modificaci\u00F3n de fechas"));
        errors.add("dinamico", new ActionMessage("errors.SISPEException", e.getMessage()));
      }
    } else if (peticion != null && peticion.equals("cancelar")) {
      LogSISPE.getLog().info("ingresa a cancelar");
      session.setAttribute(ListadoPedidosAction.VOLVER_A_BUSQUEDA, "ok");
      forward = "busqueda";
    }

    saveErrors(request, errors);
    return mapping.findForward(forward);
  }
  /**
   * Procesa la petici\u00F3n HTTP (request) especificada y genera su correspondiente respuesta HTTP
   * (response) (o lo redirige a otro componente web que podr\u00EDa crear) Devuelve una instancia
   * <code>ActionForward</code> que describe d\u00F3nde y c\u00F3mo se redirige el control(si la
   * respuesta se ha completado <code>null</code>) Este m\u00E9todo permite:
   *
   * <ul>
   *   <li>Manejar un listado de art\u00EDculos luego de una b\u00FAsqueda
   *   <li>Acceder a los datos de un determinado art\u00EDculo, para su actualizaci\u00F3n
   *   <li>Guardar los nuevos datos de un conjkunto de art\u00EDculos
   * </ul>
   *
   * @param mapping El mapeo utilizado para seleccionar esta instancia
   * @param form El formulario asociado a esta acci\u00F3n de donde se toman y establecen valores de
   *     campos
   * @param request El request que estamos procesando
   * @param response La respuesta HTTP que se crea
   * @throws Exception
   * @return ActionForward Describe donde y como se redirige el control
   */
  public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {
    // objetos para los mensajes generados
    ActionMessages success = new ActionMessages();
    ActionMessages infos = new ActionMessages();
    ActionMessages errors = new ActionMessages();

    HttpSession session = request.getSession();
    MantenimientoArticulosForm formulario = (MantenimientoArticulosForm) form;

    String salida = "mantenimientoArticulos";

    // se verifica el valor de la petici\u00F3n
    String peticion = request.getParameter("ayuda");
    if (peticion == null) {
      peticion = "";
    }

    try {
      // -------------- cuando se desea actualizar los datos de un pedido ---------------
      if (request.getParameter("indiceArticulo") != null) {
        // se declara el indice seleccionado
        int indice = Integer.parseInt(request.getParameter("indiceArticulo"));
        // se obtiene la colecci\u00F3n de art\u00EDculos
        ArrayList<ArticuloDTO> articulos =
            (ArrayList<ArticuloDTO>) session.getAttribute(LISTA_ARTICULOS);
        ArticuloDTO articuloDTO = articulos.get(indice);

        // se inicializan los datos del formulario
        formulario.setDescripcionArticulo(articuloDTO.getDescripcionArticulo());
        // formulario.setPrecioArticulo(articuloDTO.getPrecioArticulo().toString());
        formulario.setPrecioArticulo(articuloDTO.getPrecioBase().toString());
        formulario.setPrecioCajaArticulo(articuloDTO.getPrecioCaja().toString());
        // formulario.setPesoAproximado(articuloDTO.getPesoAproximado().toString());
        formulario.setPesoAproximado(
            articuloDTO.getArticuloComercialDTO().getPesoAproximadoVenta().toString());
        formulario.setUnidadManejo(articuloDTO.getUnidadManejo().toString());
        formulario.setUnidadManejoCaja(articuloDTO.getUnidadManejo().toString());
        formulario.setEstadoArticulo(articuloDTO.getEstadoArticulo());
        formulario.setTipoArticuloCalculoPrecio(articuloDTO.getTipoCalculoPrecio());

        // se guarda en sesi\u00F3n el art\u00EDculo seleccionado
        session.setAttribute(ARTICULO_SELECCIONADO, articuloDTO);

        // se guardan en sesi\u00F3n los tipos de art\u00EDculo para los c\u00E1lculos
        if (session.getAttribute("ec.com.smx.sic.sispe.articulo.normal") == null) {
          // c\u00F3digos de los tipos de art\u00EDculos para realizar los calculos
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.normal",
              MessagesAplicacionSISPE.getString("ec.com.smx.sic.sispe.articulo.normal"));
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.pavo",
              MessagesAplicacionSISPE.getString("ec.com.smx.sic.sispe.articulo.pavo"));
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.otroPesoVariable",
              MessagesAplicacionSISPE.getString("ec.com.smx.sic.sispe.articulo.otroPesoVariable"));

          // descripci\u00F3n de los tipos de art\u00EDculos para realizar los calculos
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.normal.descripcion",
              MessagesAplicacionSISPE.getString(
                  "ec.com.smx.sic.sispe.articulo.normal.descripcion"));
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.pavo.descripcion",
              MessagesAplicacionSISPE.getString("ec.com.smx.sic.sispe.articulo.pavo.descripcion"));
          session.setAttribute(
              "ec.com.smx.sic.sispe.articulo.otroPesoVariable.descripcion",
              MessagesAplicacionSISPE.getString(
                  "ec.com.smx.sic.sispe.articulo.otroPesoVariable.descripcion"));
        }

        salida = "actualizarArticulo";
      }
      // ------------- cuando se desea agregar un art\u00EDculo por su c\u00F3digo ------------
      else if (request.getParameter("agregarArticulo") != null) {
        // se obtiene la colecci\u00F3n de art\u00EDculos
        Collection<ArticuloDTO> listaArticulos =
            (Collection<ArticuloDTO>) session.getAttribute(LISTA_ARTICULOS);
        if (listaArticulos == null) listaArticulos = new ArrayList<ArticuloDTO>();

        // se verifica que el c\u00F3digo de art\u00EDculo a ingresar no est\u00E9 en el listado
        for (ArticuloDTO articuloDTO : listaArticulos) {
          if (formulario
              .getCodigoArticulo()
              .trim()
              .equals(articuloDTO.getId().getCodigoArticulo())) {
            errors.add(
                "codigoArticulo", new ActionMessage("errors.itemRepetido", "El art\u00EDculo"));
            break;
          }
        }

        // solo si no hubo errores anteriormente
        if (errors.isEmpty()) {
          // se construye el objeto para la condulta
          ArticuloDTO consultaArticuloDTO = new ArticuloDTO();
          consultaArticuloDTO
              .getId()
              .setCodigoCompania(
                  SessionManagerSISPE.getCurrentCompanys(request).getId().getCodigoCompania());
          consultaArticuloDTO.getId().setCodigoArticulo(formulario.getCodigoArticulo().trim());

          // llamada al m\u00E9todo de la capa de servicio que devuelve la colecci\u00F3n de
          // art\u00EDculos
          Collection<ArticuloDTO> articulos =
              SessionManagerSISPE.getServicioClienteServicio()
                  .transObtenerArticuloQBE(consultaArticuloDTO);
          if (!articulos.isEmpty()) {
            Iterator<ArticuloDTO> it = articulos.iterator();
            ArticuloDTO articuloDTO = it.next();

            // se agrega el art\u00EDculo a la colecci\u00F3n
            listaArticulos.add(articuloDTO);
            session.setAttribute(LISTA_ARTICULOS, listaArticulos);
          } else {
            infos.add("articulosInvalido", new ActionMessage("message.codigoBarras.invalido"));
          }
        }
      }
      // ------------- cuando se agregan art\u00EDculos por la b\u00FAsqueda ------------
      else if (request.getParameter("agregarArticulos") != null) {

        // se obtiene la colecci\u00F3n de art\u00EDculos agregados por la b\u00FAsqueda
        Collection<ArticuloDTO> articulosBuscados =
            (Collection<ArticuloDTO>)
                session.getAttribute(BuscarArticuloAction.ARTICULOS_AGREGADOS_MANTENIMIENTO);
        if (articulosBuscados != null) {
          LogSISPE.getLog().info("longitud agregados: " + articulosBuscados.size());
          // se obtiene la colecci\u00F3n de art\u00EDculos
          Collection<ArticuloDTO> listaArticulos =
              (Collection<ArticuloDTO>) session.getAttribute(LISTA_ARTICULOS);
          if (listaArticulos == null) listaArticulos = new ArrayList<ArticuloDTO>();

          // se crea la colecci\u00F3n para agregar los nuevos art\u00EDculos
          Collection<ArticuloDTO> articulosParaAgregar = new ArrayList<ArticuloDTO>();
          // se itera la colecci\u00F3n de art\u00EDculos buscados
          for (ArticuloDTO articuloBuscado : articulosBuscados) {
            boolean seEncontroArticulo = false;
            if (!listaArticulos.isEmpty()) {
              // se verifica que el c\u00F3digo de art\u00EDculo buscado no este en el listado
              // principal
              for (ArticuloDTO articuloDTO : listaArticulos) {
                if (articuloBuscado
                    .getId()
                    .getCodigoArticulo()
                    .equals(articuloDTO.getId().getCodigoArticulo())) {
                  seEncontroArticulo = true;
                  break;
                }
              }

              if (!seEncontroArticulo) articulosParaAgregar.add(articuloBuscado);

            } else {
              articulosParaAgregar.add(articuloBuscado);
            }
          }

          // se agregan todos los art\u00EDculos
          listaArticulos.addAll(articulosParaAgregar);
          session.setAttribute(LISTA_ARTICULOS, listaArticulos);

          // se elimina la colecci\u00F3n de articulos buscados
          session.removeAttribute(BuscarArticuloAction.ARTICULOS_AGREGADOS_MANTENIMIENTO);
        }
      }
      // -------------- caso por omisi\u00F3n ---------------
      else {
        // primero se eliminan las posibles variables de sesi\u00F3n
        SessionManagerSISPE.removeVarSession(request);

        // se inicializa algunos datos del formulario
        formulario.setOpTipoBusqueda(
            MessagesWebSISPE.getString("ec.com.smx.sic.sispe.opcion.numeroClasificacion"));

        // se crea una variable para determinar como se debe manejar la adici\u00F3n de
        // art\u00EDculos por la b\u00FAsqueda
        session.setAttribute("ec.com.smx.sic.sispe.busqueda.porMantenimiento", "ok");
      }

      // se guardan los mensajes generados
      saveMessages(request, success);
      saveInfos(request, infos);
      saveErrors(request, errors);

    } catch (Exception ex) {
      LogSISPE.getLog().error("error de aplicaci\u00F3n", ex);
      salida = "errorGlobal";
    }

    // salida hacia la p\u00E1gina adecuada
    return mapping.findForward(salida);
  }