public static void index(
      String accion, Long idSolicitud, Long idCEconomico, Long idCEconomicosManuales) {
    if (accion == null) accion = getAccion();
    if (!permiso(accion)) {
      Messages.fatal("No tiene permisos suficientes para realizar esta acción");
      renderTemplate("fap/PaginaCEconomicoManualCopia/PaginaCEconomicoManualCopia.html");
    }

    SolicitudGenerica solicitud =
        PaginaCEconomicoManualCopiaController.getSolicitudGenerica(idSolicitud);
    CEconomico cEconomico =
        PaginaCEconomicoManualCopiaController.getCEconomico(idSolicitud, idCEconomico);

    TipoEvaluacion tipoEvaluacion = TipoEvaluacion.all().first();
    Integer duracion = tipoEvaluacion.duracion - 1;

    CEconomicosManuales cEconomicosManuales = null;
    if ("crear".equals(accion)) {
      cEconomicosManuales = PaginaCEconomicoManualCopiaController.getCEconomicosManuales();
      cEconomicosManuales.valores = new ArrayList<ValoresCEconomico>();
      for (int i = 0; i <= duracion; i++) {
        ValoresCEconomico vCE = new ValoresCEconomico(i);
        cEconomicosManuales.valores.add(vCE);
      }
      if (properties.FapProperties.getBoolean("fap.entidades.guardar.antes")) {

        cEconomicosManuales.save();
        idCEconomicosManuales = cEconomicosManuales.id;
        cEconomico.otros.add(cEconomicosManuales);
        cEconomico.save();

        accion = "editar";
      }

    } else if (!"borrado".equals(accion)) {
      cEconomicosManuales =
          PaginaCEconomicoManualCopiaController.getCEconomicosManuales(
              idCEconomico, idCEconomicosManuales);
      if (cEconomicosManuales == null) {
        cEconomicosManuales = getFlashCEconomicosManuales();
        accion = "crear";
        Messages.clear();
      }
    }

    log.info(
        "Visitando página: " + "fap/PaginaCEconomicoManualCopia/PaginaCEconomicoManualCopia.html");
    renderTemplate(
        "fap/PaginaCEconomicoManualCopia/PaginaCEconomicoManualCopia.html",
        accion,
        idSolicitud,
        idCEconomico,
        idCEconomicosManuales,
        solicitud,
        cEconomico,
        cEconomicosManuales,
        duracion);
  }
  @Util
  // Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
  public static void guardarPCE(
      Long idSolicitud,
      Long idCEconomico,
      Long idCEconomicosManuales,
      CEconomicosManuales cEconomicosManuales,
      String bGuardarPCE) {
    checkAuthenticity();
    if (!permisoGuardarPCE("editar")) {
      Messages.error("No tiene permisos suficientes para realizar la acción");
    }
    CEconomico dbCEconomico =
        PaginaCEconomicoManualCopiaController.getCEconomico(idSolicitud, idCEconomico);
    CEconomicosManuales dbCEconomicosManuales;
    if (idCEconomicosManuales == null) {
      dbCEconomicosManuales = PaginaCEconomicoManualCopiaController.getCEconomicosManuales();
      CustomValidation.required("cEconomicosManuales.tipo.nombre", cEconomicosManuales.tipo.nombre);
      if (!Messages.hasErrors()) {
        // Creamos el Tipo ConceptoEconomico por defecto (el solicitante solo podrá cambiar el
        // atributo nombre)
        TipoCEconomico tipoCEconomico = new TipoCEconomico();
        tipoCEconomico.clase = "manual";
        tipoCEconomico.comentariosAdministracion = true;
        tipoCEconomico.comentariosSolicitante = true;
        tipoCEconomico.descripcion = cEconomicosManuales.tipo.descripcion;
        tipoCEconomico.nombre = cEconomicosManuales.tipo.nombre;
        tipoCEconomico.instrucciones = null; // "Instrucciones";
        tipoCEconomico.tipoOtro = false;
        tipoCEconomico.creadoUsuario = true;
        tipoCEconomico.jerarquia =
            dbCEconomico.tipo.jerarquia + "." + (dbCEconomico.otros.size() + 1);
        tipoCEconomico.save();
        TipoEvaluacion tipoEvaluacion = TipoEvaluacion.all().first();
        tipoEvaluacion.ceconomicos.add(tipoCEconomico);
        tipoEvaluacion.save();

        dbCEconomicosManuales.tipo = tipoCEconomico;
        dbCEconomicosManuales.save();

        CreandoEnModificacionSolicitudes("editar", dbCEconomicosManuales, cEconomicosManuales);

        idCEconomicosManuales = dbCEconomicosManuales.id;
        dbCEconomico.otros.add(dbCEconomicosManuales);
      }
    } else {
      dbCEconomicosManuales =
          PaginaCEconomicoManualCopiaController.getCEconomicosManuales(
              idCEconomico, idCEconomicosManuales);
    }
    PaginaCEconomicoManualCopiaController.guardarPCEBindReferences(cEconomicosManuales);

    if (!Messages.hasErrors()) {
      PaginaCEconomicoManualCopiaController.guardarPCEValidateCopy(
          "editar", dbCEconomicosManuales, cEconomicosManuales);
    }

    if (!Messages.hasErrors()) {
      PaginaCEconomicoManualCopiaController.guardarPCEValidateRules(
          dbCEconomicosManuales, cEconomicosManuales);
    }
    if (!Messages.hasErrors()) {
      SolicitudGenerica solicitud = PaginaCEconomicosController.getSolicitudGenerica(idSolicitud);
      Object miSavePages =
          ModelUtils.invokeMethodClass(SolicitudGenerica.class, solicitud, "getSavePagesCopy");
      ModelUtils.invokeMethodClass(
          miSavePages.getClass(), miSavePages, "setPaginaPCEconomicosCopia", false);
      ModelUtils.invokeMethodClass(miSavePages.getClass(), miSavePages, "save");
      dbCEconomico.save();
      dbCEconomicosManuales.save();
      idCEconomicosManuales = dbCEconomicosManuales.id;
      log.info(
          "Acción Editar de página: "
              + "gen/PaginaCEconomicoManualCopia/PaginaCEconomicoManualCopia.html"
              + " , intentada con éxito");
    } else {
      flash(cEconomicosManuales);
      log.info(
          "Acción Editar de página: "
              + "gen/PaginaCEconomicoManualCopia/PaginaCEconomicoManualCopia.html"
              + " , intentada sin éxito (Problemas de Validación)");
    }
    PaginaCEconomicoManualCopiaController.guardarPCERender(
        idSolicitud, idCEconomico, idCEconomicosManuales);
  }