/*
   * (non-Javadoc)
   *
   * @see
   * common.bi.GestionUnidadDocumentalBI#modificarSignaturaUDoc(java.lang.
   * String, java.lang.String)
   */
  public void modificarSignaturaUDoc(UnidadDocumentalVO unidadDocumentalVO, String nuevaSignatura) {
    // IElementoCuadroClasificacion elementoUDoc =
    // _elementoCuadroClasificacionDBEntity.getElementoCuadroClasificacion(idUDoc);
    // ElementoCuadroClasificacionVO elementoPadreUDoc =
    // elementoUDoc.getParentElement();
    // NivelCFVO nivelPadre =
    // _nivelDBEntity.getNivelCF(elementoPadreUDoc.getIdNivel());
    //
    // String nuevoCodigoReferencia =
    // _elementoCuadroClasificacionDBEntity.composeCodigoReferencia(nivelPadre,
    // elementoPadreUDoc
    // .getFinalCodRefPadre(), elementoPadreUDoc.getCodigo(),
    // elementoPadreUDoc
    // .getCodRefFondo(), nuevaSignatura);
    String antiguoCodigoReferencia = unidadDocumentalVO.getCodReferencia();
    String antiguaSignatura = unidadDocumentalVO.getCodigo();
    String codigoSinSignatura =
        antiguoCodigoReferencia.substring(
            0, antiguoCodigoReferencia.length() - antiguaSignatura.length());
    StringBuffer nuevoCodigo = new StringBuffer(codigoSinSignatura).append(nuevaSignatura);

    Map colsToUPdate = new HashMap();
    colsToUPdate.put(ElementoCuadroClasificacionDBEntityImpl.CODIGO_FIELD, nuevaSignatura);
    colsToUPdate.put(ElementoCuadroClasificacionDBEntityImpl.CODIGO_REFERENCIA_FIELD, nuevoCodigo);

    _elementoCuadroClasificacionDBEntity.updateFieldsECF(unidadDocumentalVO.getId(), colsToUPdate);
  }
  /**
   * Publica las unidades documentales con acceso restringido que han sobrepasado la fecha de
   * restricción.
   */
  public void publicarUnidadesDocumentales() {
    // Auditoria
    LoggingEvent logEvent = getLogginEvent(ArchivoActions.FONDOS_MODULE_PUBLICACION_ELEMENTO);
    Locale locale = getServiceClient().getLocale();

    // Comprobar permisos
    checkPermission(FondosSecurityManager.PUBLICAR_ELEMENTO_ACTION);

    // Lista de unidades documentales a publicar
    List udocs = _unidadDocumentalDBEntity.getUnidadesDocumentalesPublicacion();

    UnidadDocumentalVO udoc;
    for (int i = 0; i < udocs.size(); i++) {
      udoc = (UnidadDocumentalVO) udocs.get(i);

      iniciarTransaccion();

      // Cambio de nivel de acceso de la unidad documental
      _elementoCuadroClasificacionDBEntity.updateControlAcceso(
          udoc.getIdElementocf(), NivelAcceso.PUBLICO, udoc.getIdLCA());

      // Auditoría
      AuditFondos.addDataLogUpdatePublicacionUdoc(locale, logEvent, udoc);

      if (logger.isDebugEnabled())
        logger.debug("Publicación de la unidad documental con id: " + udoc.getId());

      commit();
    }
  }
  /**
   * Elimina las unidades documentales prestadas que no han sido devueltas tras dos reclamaciones.
   *
   * @throws Exception
   */
  public void eliminarUnidadesDocumentalesPrestadasNoDevueltas() throws Exception {
    // Auditoria
    LoggingEvent logEvent = getLogginEvent(ArchivoActions.FONDOS_MODULE_BAJA_ELEMENTO);
    Locale locale = getServiceClient().getLocale();

    // Comprobar permisos
    checkPermission(FondosSecurityManager.ELIMINACION_ELEMENTO_ACTION);

    // Lista de unidades documentales a publicar
    List udocs = _unidadDocumentalDBEntity.getUnidadesDocumentalesPrestadasNoDevueltas();

    // Eliminar las unidades documentales
    UnidadDocumentalVO udoc;
    for (int i = 0; i < udocs.size(); i++) {
      udoc = (UnidadDocumentalVO) udocs.get(i);

      iniciarTransaccion();

      // Eliminar la unidad documental
      eliminarUnidadDocumental(udoc, MotivoEliminacionUnidadInstalacion.WS_PRESTADAS_NO_DEVUELTAS);

      // Auditoría
      AuditFondos.addDataLogRemove(locale, logEvent, udoc, null);

      if (logger.isDebugEnabled())
        logger.debug("Eliminación de la unidad documental con id: " + udoc.getId());

      commit();
    }
  }
  /**
   * Desinstala una unidad documental de la ubicación que ocupa en el depósito físico
   *
   * @param idUdoc Identificador de unidad documental
   */
  public void desinstalarUnidadDocumental(String idUdoc) {
    // Auditoria
    LoggingEvent logEvent = getLogginEvent(ArchivoActions.FONDOS_MODULE_BAJA_UDOCENUI);
    DataLoggingEvent logData = logEvent.getDataLoggingEvent(ArchivoObjects.OBJECT_UDOC, idUdoc);
    UnidadDocumentalVO udoc = getUnidadDocumental(idUdoc);
    Locale locale = getServiceClient().getLocale();

    logData.addDetalle(locale, ArchivoDetails.SELECCION_COD_UDOC, udoc.getCodigo());
    logData.addDetalle(locale, ArchivoDetails.SELECCION_COD_UDOC, udoc.getNumExp());

    checkPermission(FondosSecurityManager.BAJAUDOC_ENUI_ACTION);
    iniciarTransaccion();
    _udocDepositoDBEntity.deleteUdoc(idUdoc);
    commit();
  }
  private void eliminarUnidadDocumental(UnidadDocumentalVO udoc, Integer motivo) throws Exception {
    // Abrimos la transaccion
    iniciarTransaccion();

    // // TODO Incorporar la udoc al histórico
    // HistoricoUDOCVO historicoUDOC = new HistoricoUDOCVO();
    // historicoUDOC.setCodRefUdoc(udoc.getCodReferencia());
    // historicoUDOC.setIdEliminacion(null); // Error: NOT NULL
    // historicoUDOC.setIdUDOC(udoc.getId());
    // historicoUDOC.setSignaturaUdoc(udoc.getCodigo());
    // historicoUDOC.setTituloUdoc(udoc.getTitulo());
    // historicoUDOC.setNumExpUdoc(udoc.getNumExp());
    // getGestionEliminacionBI().crearHistoricoUDOC( historicoUDOC );

    // Eliminar la descripción
    if (udoc.tieneDescripcion())
      getGestionDescripcionBI().deleteFicha(udoc.getId(), TipoFicha.FICHA_ELEMENTO_CF);

    // Eliminar los documentos electrónicos
    GestionDocumentosElectronicosBI serviceDocumentos = getGestionDocumentosElectronicosBI();
    serviceDocumentos.deleteDocumentos(udoc.getId(), TipoObjeto.ELEMENTO_CF);

    // Eliminamos las referencias a documentos vitales
    getGestionDocumentosVitalesBI()
        .eliminaVinculosExpediente(udoc.getNumExp(), udoc.getCodSistProductor());

    // Eliminar las tareas de captura relacionadas
    serviceDocumentos.eliminarTareas(
        udoc.getId(), ElementoCuadroClasificacion.TIPO_UNIDAD_DOCUMENTAL);

    // Desinstalar la unidad documental
    List partesUdoc = getUdocsEnUI(udoc.getId());
    CollectionUtils.transform(
        partesUdoc,
        new Transformer() {
          public Object transform(Object obj) {
            return ((UDocEnUiDepositoVO) obj).getIduinstalacion();
          }
        });
    desinstalarUnidadDocumental(udoc.getId());

    // Eliminar la unidad documental y el elemento del cuadro
    eliminarUdocBasico(udoc.getId());

    // Comprobar las unidades de instalación distintas
    // y si son vacías las eliminamos.
    int numUnidadesInstalacion = 0;
    // int volumenEliminado = 0;
    double volumenEliminado = 0;
    GestorEstructuraDepositoBI serviceEstructura = getGestorEstructuraDepositoBI();
    for (Iterator itUnidades = partesUdoc.iterator(); itUnidades.hasNext(); ) {
      String idUnidadInstalacion = (String) itUnidades.next();

      List udocsEnUI = getUdocsEnUnidadInstalacion(idUnidadInstalacion);
      if (CollectionUtils.isEmpty(udocsEnUI)) {
        UInsDepositoVO unidadInstalacion = serviceEstructura.getUinsEnDeposito(idUnidadInstalacion);

        FormatoHuecoVO formato =
            serviceEstructura.getFormatoHueco(unidadInstalacion.getIdformato());
        // volumenEliminado += formato.getLongitud().intValue();

        if (formato != null) {
          if (formato.getLongitud() == null
              || formato.getLongitud().doubleValue() == Double.MIN_VALUE)
            volumenEliminado +=
                serviceEstructura.getLongitudHuecosIrregularesXIdUInstalacion(idUnidadInstalacion);
          else volumenEliminado += formato.getLongitud().doubleValue();
        }

        if (unidadInstalacion == null) {
          unidadInstalacion = new UInsDepositoVO();
          unidadInstalacion.setId(idUnidadInstalacion);
        }

        // Obtener el idArchivo
        HuecoVO huecoVO = serviceEstructura.getHuecoUInstalacion(idUnidadInstalacion);

        String idArchivo = null;
        if (huecoVO != null) {
          DepositoVO deposito = serviceEstructura.getUbicacion(huecoVO.getIddeposito());

          if (deposito != null) idArchivo = deposito.getIdArchivo();
        }

        serviceEstructura.deleteUInstDeposito(idArchivo, unidadInstalacion, motivo);
        serviceEstructura.liberaUnidadInstalacion(idUnidadInstalacion);

        numUnidadesInstalacion++;
      }
    }

    // Actualizar los datos de la serie
    GestionSeriesBI serieBI = getGestionSeriesBI();
    serieBI.updateVolumenSerieNoTransaccional(udoc.getIdSerie());
    serieBI.updateContenidoSerieNoTransaccional(udoc.getIdSerie());

    // Cerramos la transaccion
    commit();
  }