private static object RemoveDateiRef(DossierDIP dossier, string dateiRef)
        {
            if (dossier.DateiRef.Remove(dateiRef))
            {
                return(dossier);
            }

            foreach (var dokument in dossier.Dokument)
            {
                if (dokument.DateiRef.Remove(dateiRef))
                {
                    return(dokument);
                }
            }

            foreach (var subDossier in dossier.Dossier)
            {
                var dossierOderDokument = RemoveDateiRef(subDossier, dateiRef);
                if (dossierOderDokument != null)
                {
                    return(dossierOderDokument);
                }
            }

            return(null);
        }
        private void ProcessDossier(DossierDIP dossier)
        {
            // A dossier can have attached files, without having a document
            ProcessDateiRefList(dossier.DateiRef);

            foreach (var dokument in dossier.Dokument)
            {
                ProcessDocuments(dokument);
            }

            foreach (var subDossier in dossier.Dossier)
            {
                ProcessDossier(subDossier);
            }
        }
        private DokumentDIP AddDokumentData(DossierDIP dossier, IList <ICmisExtensionElement> extensions, ElasticArchiveRecord documentRecord,
                                            List <RepositoryFile> filesToIgnore)
        {
            Log.Verbose("Adding Dokument data with metadata: {extensions}", JsonConvert.SerializeObject(extensions));

            var dokument = new DokumentDIP
            {
                Titel = string.IsNullOrEmpty(documentRecord?.Title)
                    ? metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Titel")
                    : documentRecord.Title,
                Id = metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:dokument/dokument@id"),
                Erscheinungsform =
                    Enum.TryParse(metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Erscheinungsform"), true,
                                  out ErscheinungsformDokument ef)
                        ? ef
                        : ErscheinungsformDokument.nichtdigital,
                Registrierdatum     = metadataAccess.GetHistorischerZeitpunkt(extensions, "ARELDA:Dokument/Dokument/Registrierdatum"),
                Entstehungszeitraum = documentRecord?.CreationPeriod == null
                    ? metadataAccess.GetHistorischerZeitraum(extensions, "ARELDA:Dokument/Dokument/Entstehungszeitraum")
                    : GetEntstehungszeitraum(documentRecord.CreationPeriod),
                Klassifizierungskategorie = metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Klassifizierungskategorie"),
                Datenschutz = bool.TryParse(metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Datenschutz"),
                                            out var datenschutz) && datenschutz,
                Oeffentlichkeitsstatus            = metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Oeffentlichkeitsstatus"),
                OeffentlichkeitsstatusBegruendung =
                    metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/OeffentlichkeitsstatusBegruendung"),
                SonstigeBestimmungen = metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/SonstigeBestimmungen"),
                Bemerkung            = string.IsNullOrEmpty(documentRecord?.ZusätzlicheInformationen())
                    ? metadataAccess.GetExtendedPropertyValue(extensions, "ARELDA:Dokument/Dokument/Bemerkung")
                    : documentRecord.ZusätzlicheInformationen(),
                DateiRef = GetFilteredDateiRef(metadataAccess.GetExtendedPropertyValues(extensions, "ARELDA:Dokument/Dokument/DateiRef"),
                                               filesToIgnore)
            };

            // Add optional data
            if (!string.IsNullOrEmpty(documentRecord?.ReferenceCode))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Signatur", Value = documentRecord.ReferenceCode
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Level))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Stufe", Value = documentRecord.Level
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.FormerReferenceCode))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Frühere Signaturen", Value = documentRecord.FormerReferenceCode
                });
            }

            if (documentRecord?.ArchiveplanContext.Count > 0)
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal
                {
                    Name = "Archivplankontext", Value = JsonConvert.SerializeObject(documentRecord.ArchiveplanContext)
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Form()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Form", Value = documentRecord.Form()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.WithinInfo))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Darin", Value = documentRecord.WithinInfo
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Thema()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Thema", Value = documentRecord.Thema()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Format()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Format", Value = documentRecord.Format()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Urheber()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Urheber", Value = documentRecord.Urheber()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Verleger()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Verleger", Value = documentRecord.Verleger()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.Abdeckung()))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Abdeckung", Value = documentRecord.Abdeckung()
                });
            }

            if (!string.IsNullOrEmpty(documentRecord?.PrimaryDataLink))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "Identifikation digitales Magazin", Value = documentRecord.PrimaryDataLink
                });
            }

            if (documentRecord?.CreationPeriod != null)
            {
                dokument.zusatzDaten.Add(
                    new ZusatzDatenMerkmal {
                    Name = "Entstehungszeitraum Anzeigetext", Value = documentRecord.CreationPeriod.Text
                });
            }

            var reihenfolge =
                metadataAccess.GetExtendedPropertyBagValue(extensions, "ARELDA:Dokument/Dokument/Zusatzdaten/Merkmal", "ReihenfolgeAnalogesDossier");

            if (!string.IsNullOrEmpty(reihenfolge))
            {
                dokument.zusatzDaten.Add(new ZusatzDatenMerkmal {
                    Name = "ReihenfolgeAnalogesDossier", Value = reihenfolge
                });
            }


            dossier.Dokument.Add(dokument);
            return(dokument);
        }