diff --git a/.circleci/config.yml b/.circleci/config.yml index 0ec26c112..14982aee7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 executors: docker_cypress: docker: - - image: cypress/base:14.17.0 + - image: cypress/base:14.18.1 jobs: # Circle's "Auto-cancel redundant builds" feature doesn't work on the default branch. When merging PRs on data, this @@ -22,8 +22,8 @@ jobs: executor: docker_cypress resource_class: large environment: - HUGO_VERSION: '0.139.0' - HUGO_BINARY: hugo_extended_0.139.0_linux-amd64 + HUGO_VERSION: '0.140.0' + HUGO_BINARY: hugo_extended_0.140.0_linux-amd64 steps: - run: command: | @@ -51,8 +51,8 @@ jobs: executor: docker_cypress resource_class: large environment: - HUGO_VERSION: '0.139.0' - HUGO_BINARY: hugo_extended_0.139.0_linux-amd64 + HUGO_VERSION: '0.140.0' + HUGO_BINARY: hugo_extended_0.140.0_linux-amd64 steps: - run: command: | @@ -72,7 +72,7 @@ jobs: yarn cypress verify hugo server --baseURL "http://localhost" --disableFastRender --minify & # Wait for server to deploy before continuing (with 1 minute timeout) - yarn wait-on tcp:1314 -t 120000 + yarn wait-on "http://localhost:1314/generator/" -t 240000 # Only record the Cypress tests if the Cypress env var is set, see: # https://stackoverflow.com/a/13864829 if [ -z ${CYPRESS_RECORD_KEY+x} ]; then yarn cypress run; else yarn cypress run --record; fi diff --git a/.eslintrc.js b/.eslintrc.js index f3e9c7d77..b34894abf 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,3 @@ -const path = require('path'); - module.exports = { parser: '@typescript-eslint/parser', env: { @@ -90,18 +88,21 @@ module.exports = { globals: { Atomics: 'readonly', SharedArrayBuffer: 'readonly', - BASE_URL: 'readonly', - LOCALE: 'readonly', - SUPPORTED_LANGUAGES: 'readonly', - SUPPORTED_COUNTRIES: 'readonly', - // defined in `src/general.js` + // defined by included scripts (`translations-.gen.js` and `translations-requests.gen.js`) I18N_DEFINITION: 'readonly', I18N_DEFINITION_REQUESTS: 'readonly', + + // defined in `src/general.js` PARAMETERS: 'readonly', - // defined in `webpack.common.js` - CODE_VERSION: 'readonly', + // defined in `scripts.html` + SUPPORTED_COUNTRIES: 'readonly', + LOCALE: 'readonly', + SUPPORTED_LANGUAGES: 'readonly', + BASE_URL: 'readonly', + hugoDevMode: 'readonly', + PDF_WORKER_URL: 'readonly', }, settings: { react: { @@ -146,6 +147,5 @@ module.exports = { }, // The Preact config includes Jest rules but we don't have Jest installed. This stops them from complaining. jest: { version: 'n/a' }, - 'import/resolver': { webpack: { config: path.resolve(__dirname, 'webpack.common.js') } }, }, }; diff --git a/.nvmrc b/.nvmrc index 62df50f1e..31102b28d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.17.0 +14.18.1 diff --git a/ATTRIBUTION b/ATTRIBUTION index 0e01c8a17..00713000f 100644 --- a/ATTRIBUTION +++ b/ATTRIBUTION @@ -1,6 +1,8 @@ # This file contains a list of libraries and other external contributions used in this repository (that end up in the release build in some way or another). When including new dependencies, be sure to include them here. Please try to stick to the format used by the other entries. The list is sorted alphabetically by the name of the dependency. # The direct contributors to this repository are listed in the AUTHORS file. +AJV TODO + Autocomplete.js by Algolia, Inc. ([MIT License](https://github.com/algolia/autocomplete.js/blob/master/LICENSE)) https://github.com/algolia/autocomplete.js @@ -73,6 +75,9 @@ https://github.com/google/roboto Spartan MB by Matt Bailey ([OFL 1.1](https://github.com/MattBaileyDesign/Spartan-MB/blob/V-1.006/OFL.txt)) https://github.com/MattBaileyDesign/Spartan-MB +slugify by Sindre Sorhus ([MIT License](https://github.com/sindresorhus/slugify/blob/main/license)) +https://github.com/sindresorhus/slugify + SpinKit by Tobias Ahlin ([MIT License](https://github.com/tobiasahlin/SpinKit/blob/master/LICENSE)) https://github.com/tobiasahlin/SpinKit diff --git a/README.md b/README.md index e405743fa..f362e4e2a 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,10 @@ Datenanfragen.de is designed as a static website, running on [Hugo](https://gohu To build the project locally for development, follow these steps: -1. Install [Yarn 1](https://classic.yarnpkg.com/en/docs/install) (Classic) and the extended(!) version of [Hugo](https://gohugo.io/getting-started/quick-start/) (v0.88.1). +1. Install [Yarn 1](https://classic.yarnpkg.com/en/docs/install) (Classic) and the extended(!) version of [Hugo](https://gohugo.io/getting-started/quick-start/) (v0.140.0). 2. Clone the repo and run `yarn` in the root directory of the repo to fetch all required dependencies. 3. Run the deploy script (`./deploy.sh`) to fetch and prepare the required resources from our [data](https://github.com/datenanfragen/data) repository. -4. Open two terminal windows. In the first, run `yarn dev` to start the Webpack file watcher, which will automatically build the JS files. In the second one, run `hugo server` to have Hugo continuously build the actual website and the SCSS. +4. Open two terminal windows. In the first, run `yarn dev` to start the translations file watcher, which will automatically build the translations files. In the second one, run `hugo server` to have Hugo continuously build the actual website and the SCSS. 5. Now the website should be served by Hugo on multiple ports, starting from `1313`, for the different language versions. We recommend building and developing on Linux or macOS. If you are on Windows, use WSL. diff --git a/_headers b/_headers index 5e15d8b67..d49f23027 100644 --- a/_headers +++ b/_headers @@ -1,6 +1,5 @@ /* X-Frame-Options: DENY - X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=63072000; includeSubDomains; preload Referrer-Policy: no-referrer diff --git a/assets/styles/elements.scss b/assets/styles/elements.scss index c0a17e9c8..6b3ea4cb3 100644 --- a/assets/styles/elements.scss +++ b/assets/styles/elements.scss @@ -1351,6 +1351,10 @@ details.footnote { background-color: color('red', 300); color: color('red', 900); } +.badge-gray { + background-color: color('gray', 300); + color: color('gray', 900); +} /* ReinderWidget */ diff --git a/assets/styles/framework.scss b/assets/styles/framework.scss index a44843073..a98beef5c 100644 --- a/assets/styles/framework.scss +++ b/assets/styles/framework.scss @@ -216,6 +216,23 @@ a:focus { color: color('teal', 800); } +a.primary-link { + /* stylelint-disable scss/at-extend-no-missing-placeholder */ + @extend .no-link-decoration; + /* stylelint-enable scss/at-extend-no-missing-placeholder */ + + &, + &:visited { + color: $primary-color; + } + + &:active, + &:focus, + &:hover { + color: color('blue', 900); + } +} + main a { overflow-wrap: anywhere; diff --git a/components-package/src/index.ts b/components-package/src/index.ts index 5608d70e7..677657be6 100644 --- a/components-package/src/index.ts +++ b/components-package/src/index.ts @@ -4,7 +4,6 @@ import type { I18nLanguage } from '../../src/types/globals'; import { supported_countries } from './generated/globals.json'; -import { version } from '../package.json'; import i18n_definition_de from '../../src/i18n/de.json'; import i18n_definition_en from '../../src/i18n/en.json'; import i18n_definition_fr from '../../src/i18n/fr.json'; @@ -51,9 +50,6 @@ export const setupWindow = ({ // @ts-ignore window.BASE_URL = languages[locale].base_url; - // @ts-ignore - window.CODE_VERSION = version; - // @ts-ignore window.SUPPORTED_COUNTRIES = supported_countries || []; diff --git a/config/_default/config.toml b/config/_default/config.toml index 54c084177..a78ad5bb0 100644 --- a/config/_default/config.toml +++ b/config/_default/config.toml @@ -19,3 +19,16 @@ hint = "picture" [params] mainSections = ['blog'] + +# Mount the `src` dir to `assets/js` so that Hugo Pipes can find it. To do so, we need to recreate the default `assets` +# mount, which would otherwise be lost. +[mounts] + [[module.mounts]] + source = 'assets' + target = 'assets' + [[module.mounts]] + source = 'src' + target = 'assets/js' + +[build] + noJSConfigInAssets = true diff --git a/content/cs/suggest.md b/content/cs/suggest.md index 341e3b5f4..e5f35f543 100644 --- a/content/cs/suggest.md +++ b/content/cs/suggest.md @@ -15,7 +15,16 @@ If you have any suggestions that cannot be handled through this form or that you {{< loadingIndicator >}}
-
+
+ +
+ +Do you have any further comments or notes that we should take into account when reviewing your suggestion? If so, you can share them with us here. + + + + +
By submitting this form, you agree for your contributions to be published in our company database and license them under a [CC0 license](https://creativecommons.org/publicdomain/zero/1.0), which allows anyone to use them without restrictions. diff --git a/content/de/act/ada-health/index.md b/content/de/act/ada-health/index.md index 58edd2c86..d750128c4 100644 --- a/content/de/act/ada-health/index.md +++ b/content/de/act/ada-health/index.md @@ -5,7 +5,8 @@ "tags": [ "ada health", "gesundheitsdaten", "app", "datenlöschung", "vergessenwerden" ], "featured_image": "ada-health", "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[assorted-color syringes on clear glass rack](https://unsplash.com/photos/zsKFQs2kDpM)“ von [Ibrahim Boran](https://unsplash.com/@ibrahimboran) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[assorted-color syringes on clear glass rack](https://unsplash.com/photos/zsKFQs2kDpM)“ von [Ibrahim Boran](https://unsplash.com/@ibrahimboran) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "ada-health" ] } Die App *Ada Health* stellt sich auf ihrer [Webseite](https://ada.com/de/) als „Deine Gesundheitshelferin” vor. Per interaktivem Chat können Nutzer_innen der App die Symptome ihrer Krankheiten mitteilen, welche diese dann verwendet um mögliche Ursachen zu vermuten und Ratschläge für die nächsten Schritte zu geben. Die Diagnose kann sogar direkt an die eigene Ärzt_in weitergeleitet werden. diff --git a/content/de/act/boniversum-uebernahme-infoscore/index.md b/content/de/act/boniversum-uebernahme-infoscore/index.md new file mode 100644 index 000000000..bf29d5400 --- /dev/null +++ b/content/de/act/boniversum-uebernahme-infoscore/index.md @@ -0,0 +1,47 @@ +{ + "title": "Übernahme durch Experian: Creditreform Boniversum GmbH mit infoscore Consumer Data GmbH verschmolzen", + "type": "act", + "date": "2025-11-17T16:28:00+02:00", + "tags": [ "creditreform boniversum", "infoscore consumer data", "experian", "auskunftei", "auskunftsanfrage" ], + "featured_image": "uebernahme-von-boniversum-durch-infoscore-experian", + "authors": [ "baltpeter" ], + "notices": "Titelfoto angepasst nach: „[Datacenter, Bigdata, Computer science image](https://pixabay.com/photos/datacenter-bigdata-computer-science-2803200/)“ von [foudefoot60](https://pixabay.com/users/foudefoot60-6589702/) ([Pixabay-Lizenz](https://pixabay.com/service/license-summary/))", + "discussedCompanies": [ "infoscore" ] +} + +Die Creditreform Boniversum GmbH (zuletzt Boniversum GmbH) wurde von Experian, einer weltweit tätigen Dienstleisterin für Risiko-, Fraud- und Identitäts-Management mit Hauptsitz in Irland, übernommen. Creditreform ist ein Wirtschaftsinformations- und Inkassounternehmen, das mit Boniversum eine der größten Wirtschaftsauskunfteien für Privatpersonen in Deutschland betrieben hat. Nachdem Experian und Creditreform bereits seit mehreren Jahren [zusammenarbeiteten](https://www.handelsblatt.com/finanzen/banken-versicherungen/wirtschaftsauskunftei-datendienst-experian-uebernimmt-schufa-konkurrenten-boniversum/100109825.html), wurde im Rahmen einer im März 2025 angekündigten Partnerschaft nun eine nicht näher spezifizierte „[Technologie- und Datenallianz](https://www.experian.de/events-and-insights/2025/03/04/experian-beginnt-strategische-partnerschaft/)“ zwischen beiden Unternehmen eingegangen, die „eine in ihrer Qualität einzigartige Datenbasis für die Identitätsprüfung und Risikobewertung schaffen“ soll. + +{{< featuredImg alt="Stylisiertes blautöniges Foto von Computern in einem Datenzentrum, darüber der Text: „Übernahme von Boniversum durch infoscore/Experian“" >}} + +Teil dieser Partnerschaft ist auch die [Übernahme von Boniversum durch Experian](https://www.lto.de/recht/kanzleien-unternehmen/k/experian-creditreform-strategische-partnerschaft-uebernahme-boniversum). Die Verschmelzung der Boniversum GmbH mit der infoscore Consumer Data GmbH, einer weiteren Auskunftei und Teil der Experian-Gruppe, wurde im September 2025 im [Handelsregister](https://www.northdata.de/?id=4761284597514240) [eingetragen](https://www.northdata.de/?id=4887812606001152). Anfragen zu den gespeicherten Daten solltest Du also ab sofort an die infoscore Consumer Data GmbH [richten](https://www.creditreform.de/solingen/aktuelles-wissen/pressemeldungen-fachbeitraege/news-details/show/wichtig-fuer-alle-boniversum-kunden-anpassung-in-ihren-agb-noetig). + +## Um welche Daten geht es? + +Auskunfteien wie Boniversum, infoscore und die Schufa sammeln sog. Bonitätsdaten über Verbraucher_innen, die Auskunft über ihre Zahlungsfähigkeit geben sollen und zur Identitätsprüfung genutzt werden. Solche Daten haben direkte Auswirkungen auf Deinen Alltag: Auf ihrer Basis entscheiden Unternehmen wie Banken und Online-Shops etwa, ob Du einen Kredit bekommst, einen Mobilfunkvertrag abschließen kannst oder auf Rechnung bestellen darfst. + +Laut einer Antwort auf eine Auskunftsanfrage aus dem Jahr 2023 hat die Creditreform Boniversum GmbH unter anderem folgende Datenkategorien gesammelt: + +* Bekannte Adresse(n) +* Öffentliche Negativmerkmale (z. B. Insolvenzverfahren oder Nichtabgabe der Vermögensauskunft) +* Mahn- und Inkassoverfahren +* Positive und negative Zahlungsinformationen (z. B. Zahlungsrückstände) + +Zudem berechnete Boniversum Bonitätsscores, welche Aussagen darüber treffen sollen, wie wahrscheinlich es ist, dass eine Person ihren Zahlungsverpflichtungen nachkommt. + +Ziel von Auskunfteien ist es, für ihre Unternehmenskundinnen Profile zu möglichst vielen Menschen bereitzuhalten. Daher ist es gut möglich, dass Bonitätsdaten zu Dir bei Boniversum vorhanden waren und nun in Systemen von Experian bzw. der infoscore Consumer Data GmbH weiterverarbeitet werden. Ob dem so ist, welche Daten konkret gespeichert sind und welche Scores für Dich berechnet werden, kannst Du mit einer {{< link slug="your-gdpr-rights" text="Auskunftsanfrage" >}} bei infoscore herausfinden. Das Unternehmen ist verpflichtet, Deine Anfrage kostenlos zu beantworten. + +Wir möchten Dich dabei unterstützen, dieses Recht wahrzunehmen. Wir sind ein gemeinnütziger Verein, der sich {{< link slug="verein/mission-statement" text="für Dein Recht auf Datenschutz einsetzt" >}}. Wir haben eine Auskunftsanfrage vorbereitet, die Du an die infoscore Consumer Data GmbH schicken kannst. Dafür musst Du nur Deinen Namen, Dein Geburtsdatum, Deine Adresse und ggf. Voranschriften der letzten Jahre eintragen. + +
+{{< noScript "noscript-actwidget" >}} + + +Die Anfrage verschickst Du dann als E‑Mail selbst mit Deinem E‑Mail‑Programm. So stellen wir sicher, dass wir Deine eingegebenen Daten gar nicht erst zu sehen bekommen: Alles, was Du hier auf der Seite einträgst, wird nur lokal auf Deinem Rechner verarbeitet und nicht an uns übertragen. + +Nach Eingang Deiner Anfrage hat das Unternehmen grundsätzlich einen Monat Zeit, Dir zu antworten. diff --git a/content/de/act/boniversum-uebernahme-infoscore/uebernahme-von-boniversum-durch-infoscore-experian.jpg b/content/de/act/boniversum-uebernahme-infoscore/uebernahme-von-boniversum-durch-infoscore-experian.jpg new file mode 100644 index 000000000..f9cf0f026 Binary files /dev/null and b/content/de/act/boniversum-uebernahme-infoscore/uebernahme-von-boniversum-durch-infoscore-experian.jpg differ diff --git a/content/de/act/deliveroo.md b/content/de/act/deliveroo.md index 36e712677..c620279ff 100644 --- a/content/de/act/deliveroo.md +++ b/content/de/act/deliveroo.md @@ -3,7 +3,8 @@ "type": "act", "date": "2019-09-15T12:31:47+02:00", "tags": [ "deliveroo", "deutschland", "schließung", "datenlöschung", "vergessenwerden" ], - "authors": [ "baltpeter" ] + "authors": [ "baltpeter" ], + "discussedCompanies": [ "deliveroo" ] } Der Essenslieferant *Deliveroo* hat sich [im August 2019 aus dem deutschen Markt zurückgezogen](https://www.tagesschau.de/wirtschaft/deliveroo-abschied-deutschland-101.html). Was übrig bleibt, sind die Kundenkonten und die damit verbundenen Daten. @@ -24,7 +25,7 @@ Dabei können wir Dir helfen. Wir sind ein gemeinnütziger Verein, der sich {{< window.addEventListener('load', function() { window.renderActWidget({ requestTypes: ['erasure'], transportMedium: 'email', - company: 'deliveroo-de' + company: 'deliveroo' }); }); diff --git a/content/de/act/deutsche-wohnen/index.md b/content/de/act/deutsche-wohnen/index.md index e14225eff..f11aace26 100644 --- a/content/de/act/deutsche-wohnen/index.md +++ b/content/de/act/deutsche-wohnen/index.md @@ -5,7 +5,8 @@ "tags": [ "deutsche wohnen", "bußgeld", "datenschutzverstoß", "auskunftsanfrage", "selbstauskunft" ], "featured_image": "deutsche-wohnen", "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[top-view photography of houses](https://unsplash.com/photos/7lvzopTxjOU)“ von [Tom Rumble](https://unsplash.com/@tomrumble) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[top-view photography of houses](https://unsplash.com/photos/7lvzopTxjOU)“ von [Tom Rumble](https://unsplash.com/@tomrumble) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "deutsche-wohnen" ] } Die Deutsche Wohnen SE ist eines der größten Immobilienunternehmen in Deutschland. [Nach eigenen Angaben](https://www.deutsche-wohnen.com/ueber-uns/unternehmen/unternehmensprofil/) verwaltet sie mehr als 150.000 Immobilien in Deutschland. Dementsprechend kommt das Unternehmen aus Berlin in Kontakt mit den Daten zahlreicher Mieter_innen. diff --git a/content/de/act/drk-brandenburg-datenleck/index.md b/content/de/act/drk-brandenburg-datenleck/index.md index 2c97f372b..1fe196e9f 100644 --- a/content/de/act/drk-brandenburg-datenleck/index.md +++ b/content/de/act/drk-brandenburg-datenleck/index.md @@ -5,7 +5,8 @@ "tags": [ "deutsches rotes kreuz", "drk", "gesundheitsdaten", "sensible daten", "datenleck" ], "featured_image": "drk-brandenburg-datenleck", "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[red vehicle in timelapse](https://unsplash.com/photos/vGu08RYjO-s)“ von [camilo jimenez](https://unsplash.com/@coolmilo) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[red vehicle in timelapse](https://unsplash.com/photos/vGu08RYjO-s)“ von [camilo jimenez](https://unsplash.com/@coolmilo) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "drk-brandenburg" ] } Das Deutsche Rote Kreuz (DRK) Brandenburg hat über mehrere Jahre sensible Gesundheitsdaten von Patient_innen kaum geschützt auf einem Server abgelegt. Hacker hätten einfach auf diese sensiblen Daten zugreifen und sie sogar manipulieren können. Betroffen sind Daten zu mehr als 111.000 Einsatzfahrten des DRK für über 30.000 Patient_innen aus den letzten 12 Jahren. diff --git a/content/de/act/honey/index.md b/content/de/act/honey/index.md index 6180b8772..ac1f2ec6d 100644 --- a/content/de/act/honey/index.md +++ b/content/de/act/honey/index.md @@ -7,7 +7,8 @@ "featured_image": "honey.jpg", "authors": [ "malte", "baltpeter" ], "notices": "Titelfoto angepasst nach: „[Busy bees](https://unsplash.com/photos/StEaRc1xQV4)“ von [Boba Jaglicic](https://unsplash.com/@bobajaglicic) ([Unsplash-Lizenz](https://unsplash.com/license))", - "has_sva_finder": true + "has_sva_finder": true, + "discussedCompanies": [ "joinhoney" ] } In unserer {{< link slug="blog/honey-data-collection" text="Recherche zu Honey" >}} haben wir aufgedeckt, dass die Browser-Erweiterung reichlich Daten zu Ihren Nutzer_innen sammelt. Unabhängig davon, ob ein Account angelegt wurde oder nicht, protokolliert das Add-on fleißig alle Aufrufe zahlreicher Webseiten und sendet sie an den Betreiber, die {{< link slug="company/joinhoney" text="Honey Science LLC" >}}, ein US-Unternehmen, das vom Bezahlanbieter [PayPal gekauft wurde](https://help.joinhoney.com/article/302-what-does-honey-joining-paypal-mean-for-members). diff --git a/content/de/act/lieferando/index.md b/content/de/act/lieferando/index.md index 59b256c76..49d157150 100644 --- a/content/de/act/lieferando/index.md +++ b/content/de/act/lieferando/index.md @@ -5,10 +5,11 @@ "tags": [ "lieferando", "deutschland", "fahrer", "auskunft", "lieferdienst", "arbeitnehmerrechte" ], "featured_image": "lieferando-ueberwachung.jpg", "authors": [ "malte", "zner0l" ], - "notices": "Titelfoto angepasst nach: „[man riding motorcycle on road during daytime](https://unsplash.com/photos/clYlmCaQbzY)“ von [Rowan Freeman](https://unsplash.com/@rowanfreeman) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[man riding motorcycle on road during daytime](https://unsplash.com/photos/clYlmCaQbzY)“ von [Rowan Freeman](https://unsplash.com/@rowanfreeman) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "takeaway-com" ] } -Laut Recherchen des [BRs](https://www.tagesschau.de/investigativ/br-recherche/ueberwachung-lieferando-101.html) überwacht Lieferando seine Fahrer_innen sehr genau: +Laut Recherchen des [BRs](https://web.archive.org/web/20210521122206/https://www.tagesschau.de/investigativ/br-recherche/ueberwachung-lieferando-101.html) überwacht Lieferando seine Fahrer_innen sehr genau: > Aus den Unterlagen geht hervor, dass die App pro Lieferung 39 Datenpunkte erhebt: Sekundengenau ist nachvollziehbar, wann ein Fahrer eine Bestellung zugeteilt bekommt, diese abholt und ausliefert. Zusätzlich wird hinterlegt, ob der Rider einzelne Zeitvorgaben einhält oder nicht. Kommt ein Fahrer zu spät bei einem Restaurant oder Kunden an, wird das vermerkt. Die Daten sind personalisiert, können also einzelnen Arbeitnehmerinnen oder Arbeitnehmern zugeordnet werden. diff --git a/content/de/act/miles-sensoren-ueberwachung/index.md b/content/de/act/miles-sensoren-ueberwachung/index.md index aebe5336e..ffa6cb3c9 100644 --- a/content/de/act/miles-sensoren-ueberwachung/index.md +++ b/content/de/act/miles-sensoren-ueberwachung/index.md @@ -5,7 +5,8 @@ "tags": [ "miles", "carsharing", "telematik", "fahrverhalten", "überwachung", "auskunftsanfrage" ], "featured_image": "miles-ueberwacht-fahrer-innen-jetzt-daten-anfragen", "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[Traffic Transport Jam](https://pixabay.com/photos/traffic-transport-traffic-jam-2251530/)“ von [garten-gg](https://pixabay.com/users/garten-gg-201217/) ([Pixabay-Lizenz](https://pixabay.com/service/license-summary/))" + "notices": "Titelfoto angepasst nach: „[Traffic Transport Jam](https://pixabay.com/photos/traffic-transport-traffic-jam-2251530/)“ von [garten-gg](https://pixabay.com/users/garten-gg-201217/) ([Pixabay-Lizenz](https://pixabay.com/service/license-summary/))", + "discussedCompanies": [ "miles-mobility" ] } Miles ist mit 21.000 Fahrzeugen der größte Carsharing-Dienst in Deutschland – in Berlin und Hamburg wird er von mehr als einem Viertel der Menschen mit Führerschein [genutzt](https://vision-mobility.de/news/miles-waechst-weiter-und-sieht-erste-entlastungseffekte-durch-sharing-310005.html). Der Spiegel [berichtet](https://www.spiegel.de/auto/carsharing-frust-miles-und-co-ueberwachen-fahrer-immer-genauer-a-c449a4aa-e518-4986-a80f-a781109cd6fb) nun, dass Miles Mieter_innen seiner Autos über eingebaute Sensoren immer genauer überwache und Strafen etwa für angebliches Fehlverhalten verhänge. diff --git a/content/de/blog/abis-unterschrift-dsgvo-anfragen/index.md b/content/de/blog/abis-unterschrift-dsgvo-anfragen/index.md index f7f38bc0d..d3e29c0fb 100644 --- a/content/de/blog/abis-unterschrift-dsgvo-anfragen/index.md +++ b/content/de/blog/abis-unterschrift-dsgvo-anfragen/index.md @@ -7,7 +7,8 @@ "tags": [ "abis gmbh", "dsgvo beschwerde", "selbstauskunft unterschrift", "formerfordernisse" ], "featured_image": "abis-beschwerde-unterschrift.jpg", "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[person writing on white paper](https://unsplash.com/photos/GJao3ZTX9gU)“ von [Cytonn Photography](https://unsplash.com/@cytonn_photography) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[person writing on white paper](https://unsplash.com/photos/GJao3ZTX9gU)“ von [Cytonn Photography](https://unsplash.com/@cytonn_photography) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "abis" ] } **Beschweren lohnt sich: Die ABIS GmbH, ein Adressmanagement-Tochterunternehmen der Deutschen Post und Bertelsmann, hatte bisher für Selbstauskünfte nach der DSGVO eine unterschriebene Anfrage verlangt und die Antworten nur per Post verschickt. Nach einer erfolgreichen Beschwerde bei den Datenschutz-Aufsichtsbehörden wurde dieses rechtswidrige Verhalten nun eingestellt.** diff --git a/content/de/blog/angefragt-paydirekt-giropay/index.md b/content/de/blog/angefragt-paydirekt-giropay/index.md new file mode 100644 index 000000000..b121836c6 --- /dev/null +++ b/content/de/blog/angefragt-paydirekt-giropay/index.md @@ -0,0 +1,39 @@ +{ + "title": "Angefragt: Was ist nach dem Ende von paydirekt/giropay mit den Daten passiert?", + "type": "blog", + "date": "2025-12-10T13:27:04+02:00", + "description": "Der Bezahldienst paydirekt/giropay wurde zum Ende des Jahres 2024 eingestellt. Wir wollten wissen, was seitdem mit den gespeicherten Daten passiert ist, und haben eine Auskunftsanfrage gestellt.", + "featured_image": "was-ist-mit-den-daten-von-paydirekt-und-giropay-passiert", + "tags": [ "paydirekt", "giropay", "bezahldienst", "auskunftsanfrage", "dsgvo" ], + "authors": [ "baltpeter" ], + "notices": "Titelfoto angepasst nach: „[Mobile shredder (1).jpg](https://commons.wikimedia.org/wiki/File:Mobile_shredder_(1).jpg)“ von Андрей Москаленко ([CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.en))", + "discussedCompanies": [ "paydirekt" ] +} + +**Der Zahlungsdienst paydirekt/giropay ist seit fast einem Jahr Geschichte. Nachdem er in der Vergangenheit immer wieder in der Kritik stand, zu viele Daten zu sammeln, wollte ich wissen, was nach der Einstellung mit den gespeicherten Daten passiert ist, und habe eine Auskunftsanfrage gestellt. Das Ergebnis ist erfreulich: Alle paydirekt- und giropay-Daten wurden im April 2025 vollständig gelöscht.** + +{{< featuredImg alt="Stylisiertes blautöniges Foto von Papierschnipseln, die aus einem LKW herausfallen, darüber der Text: „Was ist mit den Daten von paydirekt und giropay passiert?“" >}} + +Bei paydirekt handelte es sich um einen Online-Bezahldienst, der von deutschen Banken und Sparkassen betrieben wurde und insbesondere als [Konkurrenz zu PayPal](https://www.tagesschau.de/wirtschaft/ende-paydirekt-100.html) gedacht war. Ende 2020 [übernahm paydirekt auch den Bezahldienst giropay](https://t3n.de/news/paydirekt-schluckt-giropay-1318389/) und trat ab 2021 dann als gemeinsamer Dienst unter diesem Namen auf. + +Ich hatte paydirekt und später giropay etwa genutzt, um Einkäufe bei einigen Online-Shops zu bezahlen und Bahntickets zu kaufen, aber auch, um die Gebühr für meinen Bibliotheksausweis zu begleichen. Im September 2024 kam dann die [E-Mail](https://www.hna.de/verbraucher/ende-fuer-deutschen-zahlungsanbieter-kuendigungs-mail-an-millionen-von-kunden-zr-93364011.html), die mir mitteilte, dass das Zahlverfahren zum 31. Dezember 2024 [eingestellt](https://www.t-online.de/finanzen/aktuelles/id_100426502/sparkasse-giropay-paydirekt-ab-2025-eingestellt.html) wird. [Nachfolger soll der europäische Bezahldienst Wero](https://www.golem.de/news/paypal-konkurrenz-abschied-von-giropay-alias-paydirekt-hoffen-auf-wero-2412-192019.html) werden. + +Mittlerweile ist fast ein Jahr seit der Einstellung des Dienstes vergangen und die paydirekt GmbH befindet sich seit Juni 2025 [in Liquidation](https://www.northdata.de/paydirekt%20GmbH,%20Frankfurt%20a%C2%B7%20Main/Amtsgericht%20Frankfurt%20am%20Main%20HRB%2099538). Ich wollte wissen, was mit den Daten passiert ist, die im Rahmen meiner Nutzung angefallen sind, und habe daher eine {{< link text="Auskunftsanfrage nach der DSGVO" slug="sample-letter-gdpr-access-request" >}} gestellt. + +Die Antwort kam ein paar Wochen später per Post. Sie wiegt stolze 362 g und wirkt auf den ersten Blick mehr wie ein Buch als ein Brief. Schlummern die paydirekt-Daten also noch auf irgendeinem Server im Büro der Liquidatorin? Ganz im Gegenteil! Die Antwort ist eindeutig: + +> Gerne bestätigen wir Ihnen, dass die paydirekt GmbH keinerlei personenbezogene Daten von Ihnen […] verarbeitet. Sämtliche gespeicherten Transaktions- und Kundendaten wurden im Rahmen der Liquidation der paydirekt GmbH mit der Unterstützung der Senacor Technologies AG (durch deren Dienstleister noris network GmbH) vollständig und datenschutzkonform gelöscht (einschließlich Sicherungskopien und Backups). […] +> +> Dies gilt gleichermaßen für den Bezahldienst *Giropay (ehem.)*. Auch insofern wurden die Sie betreffenden personenbezogenen Daten vollständig und datenschutzkonform gelöscht. + +Warum also der dicke Brief, wenn gar keine Daten mehr vorhanden sind? Damit ich ihnen das glaube, wurden direkt noch zwei Löschprotokolle und -zertifikate angehängt. In diesen bestätigt die noris network AG die Löschung von insgesamt 72 SSDs am 28. April 2025 mit dreifachem Überschreiben. + +## Wie sah es früher aus? + +Dass nun tatsächlich alle Daten nachweislich gelöscht wurden, ist erfreulich. Denn aus Datenschutzperspektive standen paydirekt und giropay in der Kritik. Wurden beim „alten“ giropay zunächst nur [minimale für die Zahlung nötige Daten](https://www.kuketz-blog.de/giropay-entfernung-aus-der-empfehlungsecke/) (IBAN, BIC, Kontoinhaber_in und Transaktionsnummer) verarbeitet, sammelten paydirekt (und auch das „neue“ giropay) deutlich mehr Daten, darunter auch Transaktionsdaten inklusive Informationen über die konkret gekauften Artikel und die Lieferadresse. Die Datenschutzorganisation noyb sah hierin einen Verstoß gegen die DSGVO und legte 2022 [Beschwerde ein](https://noyb.eu/de/giropay-weiss-was-du-letzten-sommer-gekauft-hast). + +Als ich 2021 schon einmal eine Auskunftsanfrage an paydirekt stellte, konnte ich die kritisierte Datenmenge auch bei mir feststellen. Neben Stammdaten (Name, Geburtsdatum, E-Mail, Telefonnummer, Bankdaten) und Accountaktivitäten enthielt die Antwort auch eine Übersicht über alle „E-Commerce-Vorgänge“, die ich seit meiner Registrierung 2019 bei paydirekt getätigt hatte. + +{{< img name="paydirekt-antwort-2021" alt="Auszug aus der Antwort von paydirekt auf die Auskunftsanfrage aus 2021, welche die Daten zu einer Bestellung zeigt. Zu sehen sind u.a. Datum und Uhrzeit, Shop und Händlerin, Bestell-, Vorgangs-, Kunden- und Rechnungsnummer, Lieferadresse, bestellte Artikel und Preise sowie Bankdaten." >}} + +Hier fanden sich tatsächlich umfassende Informationen zu den Bestellungen, die ich getätigt habe. So wurde immer die Lieferadresse und teils auch eine Aufschlüsselung über die Warenkorbartikel sowie deren Preise gespeichert. diff --git a/content/de/blog/angefragt-paydirekt-giropay/paydirekt-antwort-2021.png b/content/de/blog/angefragt-paydirekt-giropay/paydirekt-antwort-2021.png new file mode 100644 index 000000000..120cb1a9d Binary files /dev/null and b/content/de/blog/angefragt-paydirekt-giropay/paydirekt-antwort-2021.png differ diff --git a/content/de/blog/angefragt-paydirekt-giropay/was-ist-mit-den-daten-von-paydirekt-und-giropay-passiert.jpg b/content/de/blog/angefragt-paydirekt-giropay/was-ist-mit-den-daten-von-paydirekt-und-giropay-passiert.jpg new file mode 100644 index 000000000..3e8b4b435 Binary files /dev/null and b/content/de/blog/angefragt-paydirekt-giropay/was-ist-mit-den-daten-von-paydirekt-und-giropay-passiert.jpg differ diff --git a/content/de/blog/datensparsamkeit-ist-verboten.md b/content/de/blog/datensparsamkeit-ist-verboten.md index 1f9d698e4..589440c66 100644 --- a/content/de/blog/datensparsamkeit-ist-verboten.md +++ b/content/de/blog/datensparsamkeit-ist-verboten.md @@ -6,7 +6,8 @@ "tags": [ "BVerfG", "TKÜV", "Posteo", "Telekommunikationsüberwachung", "Datensparsamkeit" ], "featured_image_url": "https://static.dacdn.de/blog/posteo.jpg", "license": "cc-by-nd-40", - "authors": [ "zner0l" ] + "authors": [ "zner0l" ], + "discussedCompanies": [ "posteo" ] } Mit dem [seit kürzlich öffentlichen Beschluss](https://www.bundesverfassungsgericht.de/SharedDocs/Entscheidungen/DE/2018/12/rk20181220_2bvr237716.html) weist das Bundesverfassungsgericht eine Klage des E-Mail-Anbieters Posteo zurück, der sich gegen die Verpflichtung wehrte, IP-Adressen an die Strafverfolgungsbehörden weiterzugeben, weil er diese nicht protokolliere. Posteo ist von dieser Entscheidung [„sehr überrascht“](https://posteo.de/blog/erster-kommentar-zur-entscheidung-des-bundesverfassungsgerichts), so wie auch wir die Entscheidung mit einigem Erschrecken aufgenommen haben. diff --git a/content/de/blog/gdpr-cheat-sheet.md b/content/de/blog/gdpr-cheat-sheet.md index 867b34b41..b7f3d0cb1 100644 --- a/content/de/blog/gdpr-cheat-sheet.md +++ b/content/de/blog/gdpr-cheat-sheet.md @@ -88,7 +88,7 @@ Die Information, dass die IP-Adresse 31.41.59.26 am 25. Mai 2018 unseren {{< lin ### Profiling -Profiling ist eine Form der automatisierten Entscheidungsfindung, bei der der [Verantwortliche](#verantwortlicher) Deine [personenbezogenen Daten](#personenbezogene-daten) nutzt, um automatisch ohne Eingriff eines Menschen bestimmte persönliche Aspekte von Dir zu bewerten. Häufig geht es darum, Aspekte wie die folgenden über Dich zu analyisieren und vorherzusagen: +Profiling ist eine Form der automatisierten Entscheidungsfindung, bei der der [Verantwortliche](#verantwortlicher) Deine [personenbezogenen Daten](#personenbezogene-daten) nutzt, um automatisch ohne Eingriff eines Menschen bestimmte persönliche Aspekte von Dir zu bewerten. Häufig geht es darum, Aspekte wie die folgenden über Dich zu analysieren und vorherzusagen: * Arbeitsleistung * wirtschaftliche Lage @@ -99,7 +99,7 @@ Profiling ist eine Form der automatisierten Entscheidungsfindung, bei der der [V * Verhalten * Aufenthaltsort oder Ortswechsel -Ein klassisches Beispiel ist das Abschließen von Kredit- oder Mobilfunkverträgen. Viele Unternehmen werden vor dem Vertragsschluss Deine Daten an eine Auskunftei wie die {{< link slug="schufa" text="Schufa" >}}, {{< link slug="creditreform-boniversum" text="Creditreform Boniversum" >}} oder {{< link slug="infoscore" text="infoscore" >}} weiterleiten, die dann anhand bestimmter Aspekte (wie Deinem bisherigen Zahlungsverhalten oder der Anzahl Deiner Bankkonten) Aussagen dazu trifft, wie wahrscheinlich Du Deine Vertragspflichten erfüllen würdest. +Ein klassisches Beispiel ist das Abschließen von Kredit- oder Mobilfunkverträgen. Viele Unternehmen werden vor dem Vertragsschluss Deine Daten an eine Auskunftei wie die {{< link slug="company/schufa" text="Schufa" >}}, {{< link slug="company/crifbuergel" text="CRIF" >}} oder {{< link slug="company/infoscore" text="infoscore" >}} weiterleiten, die dann anhand bestimmter Aspekte (wie Deinem bisherigen Zahlungsverhalten oder der Anzahl Deiner Bankkonten) Aussagen dazu trifft, wie wahrscheinlich Du Deine Vertragspflichten erfüllen würdest. ### Rechte diff --git a/content/de/blog/honey-data-collection/index.md b/content/de/blog/honey-data-collection/index.md index fe5df2492..d7192558f 100644 --- a/content/de/blog/honey-data-collection/index.md +++ b/content/de/blog/honey-data-collection/index.md @@ -8,7 +8,8 @@ "featured_image": "honey-beobachtet-dich-beim-surfen", "tags": [ "addon", "coupon-codes", "datensammlung", "browser-verlauf", "auskunftsrecht" ], "authors": [ "baltpeter" ], - "notices": "Titelfoto angepasst nach: „[Alien Invasion](https://unsplash.com/photos/QMFZhJCufKw)“ von [Henry Mwenge](https://unsplash.com/@ayende_the_walkingman) ([Unsplash-Lizenz](https://unsplash.com/license))" + "notices": "Titelfoto angepasst nach: „[Alien Invasion](https://unsplash.com/photos/QMFZhJCufKw)“ von [Henry Mwenge](https://unsplash.com/@ayende_the_walkingman) ([Unsplash-Lizenz](https://unsplash.com/license))", + "discussedCompanies": [ "joinhoney" ] } **Die kostenlose Browser-Erweiterung „Honey“ möchte ihren Nutzer_innen durch das automatische Suchen von Gutschein-Codes Geld sparen. Honey beschreibt sich selbst als datenschutzfreundlich und sammelt angeblich nur Daten zum Surfverhalten auf Online-Shopping-Webseiten. Zwei unserer Mitglieder, die Honey genutzt hatten, haben mithilfe der DSGVO Auskunft über die Daten angefragt, die zu ihnen gesammelt wurden. Unsere Auswertung der Antworten zeigt, dass Honey entgegen der eigenen Angaben in großem Stil Browser-Verlaufsdaten sammelt. Deshalb haben wir Beschwerde bei den Datenschutzaufsichtsbehörden eingelegt.** diff --git a/content/de/suggest.md b/content/de/suggest.md index af328054a..f890d7607 100644 --- a/content/de/suggest.md +++ b/content/de/suggest.md @@ -32,7 +32,16 @@ Falls Du irgendeinen Vorschlag haben solltest, der sich nicht über dieses Formu {{< loadingIndicator >}}
-
+
+ +
+ +Hast Du weitere Anmerkungen oder Hinweise, die wir bei der Überprüfung Deines Vorschlags beachten sollten? Dann kannst Du sie uns hier mitteilen. + + + + +
diff --git a/content/de/verein/compensated-lectures.md b/content/de/verein/compensated-lectures.md index e77e3ab2b..e3034403c 100644 --- a/content/de/verein/compensated-lectures.md +++ b/content/de/verein/compensated-lectures.md @@ -6,7 +6,7 @@ } Zweck dieser Vortragsordnung ist die Regelung von vergüteten Vorträgen zu den Verein betreffenden Themen durch Vereinsmitglieder und Angestellte. -Diese Vortragsordnung wurde in der ordentlichen Mitgliederversammlung vom 16. Juni 2020 beschlossen und zuletzt in der ordentlichen Mitgliederversammlung vom 14. Dezember 2023 geändert. +Diese Vortragsordnung wurde in der ordentlichen Mitgliederversammlung vom 16. Juni 2020 beschlossen und zuletzt in der ordentlichen Mitgliederversammlung vom 18. Dezember 2024 geändert. ## 1. Feststellungen @@ -18,19 +18,19 @@ Für durch den Verein organisierte Vorträge und Vorträge, an denen sich der Ve ## 1a. Ausnahmen -Angestellte des Vereins dürfen für Vorträge, die den Verein betreffen, keine Bezahlung annehmen, die über die reine Übernahme der entstandenen Reise- und/oder Übernachtungskosten hinausgeht. Die Bezeichnung der Bezahlung ist dabei irrelevant. Einer Annahme einer höheren Bezahlung steht ausnahmsweise nichts entgegen, wenn die Differenz an den Verein gespendet wird. +Angestellte des Vereins dürfen für Vorträge, die im Namen des Vereins, keine externe Bezahlung annehmen, die über die reine Übernahme der entstandenen Reise-, Veranstaltungs- und Übernachtungskosten hinausgeht. Gleiches gilt für Vorträge, die den Verein betreffen, soweit nichts anderes vereinbart ist. Die Bezeichnung der Bezahlung ist dabei irrelevant. Einer Annahme einer höheren Bezahlung steht ausnahmsweise nichts entgegen, wenn die Differenz an den Verein gespendet wird. Erhält eine Person eine Vergütung für einen Vortrag zu Themen, die den Verein betreffen, ist die Übernahme oder Erstattung der Reisekosten durch den Verein ausgeschlossen. ## 2. Nutzung von Vereinsmitteln -Erhält ein_e Vortragende_r von einer externen Organisation eine Vergütung für einen Vortrag, welche über die reine Erstattung der entstandenen Reise- und/oder Übernachtungskosten hinausgeht, übernimmt sie_er **privat** die Verantwortung für diesen Vortrag. Der Verein kann dennoch als Mitorganisator oder Beteiligter auftreten. Für die Organisation und Durchführung solcher Vorträge werden allerdings keine Vereinsmittel aufgewendet. +Erhält ein_e Vortragende_r von einer externen Organisation eine Vergütung für einen Vortrag, welche über die reine Erstattung der entstandenen Reise-, Veranstaltungs- und Übernachtungskosten hinausgeht, übernimmt sie_er **privat** die Verantwortung für diesen Vortrag. Der Verein kann dennoch als Mitorganisator oder Beteiligter auftreten. Für die Organisation und Durchführung solcher Vorträge werden allerdings keine Vereinsmittel aufgewendet. Diese Regelung gilt nicht für die Bereitstellung von Informationsmaterialien, die der Verein ohnehin vorhält. Die Verbreitung dieser Materialien stellt eine unmittelbare Umsetzung der Satzungszwecke dar und ist insofern zu unterstützen. ## 3. Transparenzverpflichtung für Vorstandsmitglieder -Die Mitglieder des Vorstandes werden verpflichtet, Informationen zu Vorträgen zu Themen, die den Verein betreffen, und für welche sie eine externe Bezahlung erhalten haben, auf der Transparenzseite des Vereins zu veröffentlichen. Diese Informationen müssen mindestens die folgenden Angaben enthalten: den Monat und das Jahr des Vortrages; die Namen der Vorstandsmitglieder, die für den Vortrag eine Bezahlung erhalten haben; die_der Auftraggeber_in; die Höhe des Honorars. +Die Vorsitzenden werden verpflichtet, Informationen zu Vorträgen zu Themen, die den Verein betreffen, und für welche sie eine externe Bezahlung erhalten haben, auf der Transparenzseite des Vereins zu veröffentlichen. Gleiches gilt für Besitzende, hier allerdings nur für Vorträge im Namen des Vereins. Diese Informationen müssen mindestens die folgenden Angaben enthalten: den Monat und das Jahr des Vortrages; die Namen der Vorstandsmitglieder, die für den Vortrag eine Bezahlung erhalten haben; die_der Auftraggeber_in; die Höhe des Honorars. Als Bezahlung im Sinne dieser Regelung gilt auch die reine Übernahme von Reise- und/oder Übernachtungskosten. diff --git a/content/de/verein/event/fnf-at-39c3-workshop/index.md b/content/de/verein/event/fnf-at-39c3-workshop/index.md new file mode 100644 index 000000000..de9adfb27 --- /dev/null +++ b/content/de/verein/event/fnf-at-39c3-workshop/index.md @@ -0,0 +1,21 @@ +{ + "title": "Datenschutzrechte zum Mitmachen – DSGVO-Anfragen stellen mit Datenanfragen.de", + "type": "event", + "event_date": "2025-12-28T14:00:00+02:00", + "duration": "60m", + "place": { + "name": "39c3, Freedom-not-Fear-Assembly" + }, + "license": "cc-by-40", + "description": "Die DSGVO ist in aller Munde, aber was bedeutet sie eigentlich für Dich? Wir wollen uns die Rechte, die Dir durch die DSGVO zugesichert werden, einmal genauer anschauen und – vor allem — ausprobieren. In unserem Workshop lernst Du, mit Datenanfragen.de Anfragen zu stellen, um an Deine Daten zu kommen, sie löschen zu lassen, zu berichtigen oder Widerspruch gegen Direktwerbung einzulegen." +} + +Online-Shops, Streamingdienste, Banken, Handy-Apps, öffentliche Stellen, Versicherungen, soziale Netzwerke … Die Liste an Organisationen, die Deine Daten haben wollen, ist sehr lang. Wahrscheinlich gibt es sogar etliche Unternehmen wie Adresshändler und Auskunfteien, die zwar Deine Daten haben, von denen Du aber noch nie etwas gehört hast. + +Zum Glück musst Du Dich nicht damit abfinden, „dass das halt so ist“. Denn Du hast ein Recht auf Datenschutz! Wenn Unternehmen, Behörden und andere Organisationen Deine personenbezogenen Daten nutzen wollen, müssen sie sich dabei an die Datenschutz-Grundverordnung (DSGVO) halten. Damit Du die Kontrolle über Deine Daten behalten kannst, gewährt Dir die DSGVO eine Reihe von Rechten, die Du den Organisationen gegenüber kostenlos geltendmachen darfst: Das Recht auf Auskunft darüber, welche Daten zu Dir verarbeitet werden, einschließlich einer Kopie dieser Daten, das Recht auf Berichtigung falscher Daten zu Dir, das Recht auf Löschung Deiner Daten unter bestimmten Umständen, und das Recht auf Werbewiderspruch. + +Wir sind ein gemeinnütziger Verein, der daran arbeitet, diese Rechte allen Menschen zugänglich zu machen. Dafür betreiben wir vor allem die Webseite Datenanfragen.de, die Dich durch den gesamten Anfragenprozess leitet und am Ende den Anfragentext generiert, den Du nur noch an die entsprechenden Organisationen abschicken musst. + +In diesem Workshop wollen wir Dich einladen, von Deinen Rechten Gebrauch zu machen und mehr darüber zu erfahren, wer welche Daten zu Dir hat. Dazu erklären wir Dir näher, was es mit Deinen Datenschutzrechten und unseren Werkzeugen auf sich hat und stellen dann gemeinsam Anfragen. Keine Sorge: Du brauchst dafür keine technischen oder rechtlichen Vorkenntnisse. Der Workshop richtet sich vor allem an Menschen, die bisher keine oder wenig Erfahrung mit DSGVO-Anfragen haben. Alle anderen sind aber natürlich auch willkommen. + +**Material**: [Vortragsfolien](https://static.dacdn.de/talks/slides/2025-12-28-fnf-at-39c3-workshop.pdf) diff --git a/content/en/act/honey/index.md b/content/en/act/honey/index.md index a98f86390..84682f779 100644 --- a/content/en/act/honey/index.md +++ b/content/en/act/honey/index.md @@ -7,7 +7,8 @@ "featured_image": "honey.jpg", "authors": [ "malte", "baltpeter" ], "notices": "Photo adapted after: \"[Busy bees](https://unsplash.com/photos/StEaRc1xQV4)\" by [Boba Jaglicic](https://unsplash.com/@bobajaglicic) ([Unsplash license](https://unsplash.com/license))", - "has_sva_finder": true + "has_sva_finder": true, + "discussedCompanies": [ "joinhoney" ] } In our {{< link slug="blog/honey-data-collection" text="investigation on Honey" >}}, we have shown that the browser extension collects their users’ data on a large scale. Regardless of whether an account has been registered or not, the add-on diligently logs page views on plenty of websites and sends them to the company behind the extension, {{< link slug="company/joinhoney" text="Honey Science LLC" >}}, a US-based company that was [bought by PayPal](https://help.joinhoney.com/article/302-what-does-honey-joining-paypal-mean-for-members). diff --git a/content/en/blog/honey-data-collection/index.md b/content/en/blog/honey-data-collection/index.md index 4a29a0cda..ebc43f7e4 100644 --- a/content/en/blog/honey-data-collection/index.md +++ b/content/en/blog/honey-data-collection/index.md @@ -6,7 +6,8 @@ "featured_image": "honey-watches-you-while-browsing", "tags": [ "addon", "coupon codes", "data collection", "history data", "right to data access" ], "authors": [ "baltpeter" ], - "notices": "Photo adapted after: \"[Alien Invasion](https://unsplash.com/photos/QMFZhJCufKw)\" by [Henry Mwenge](https://unsplash.com/@ayende_the_walkingman) ([Unsplash license](https://unsplash.com/license))" + "notices": "Photo adapted after: \"[Alien Invasion](https://unsplash.com/photos/QMFZhJCufKw)\" by [Henry Mwenge](https://unsplash.com/@ayende_the_walkingman) ([Unsplash license](https://unsplash.com/license))", + "discussedCompanies": [ "joinhoney" ] } **The free browser extension "Honey" wants to save their users money by automatically finding and applying coupon codes. They describe themselves as advocates for data protection and allegedly only collect history data on online shopping websites. Two of our members who have used Honey in the past, have asked for access to the data saved on them using the GDPR. Our analysis of the responses shows that Honey collects history data on a large scale, contrary to what their own privacy policy says. Thus, we have submitted complaints with the data protection authorities.** diff --git a/content/en/suggest.md b/content/en/suggest.md index 129f84796..b40e069c6 100644 --- a/content/en/suggest.md +++ b/content/en/suggest.md @@ -31,7 +31,16 @@ If you have any suggestions that cannot be handled through this form or that you {{< loadingIndicator >}}
-
+
+ +
+ +Do you have any further comments or notes that we should take into account when reviewing your suggestion? If so, you can share them with us here. + + + + +
By submitting this form, you agree for your contributions to be published in our company database and license them under a [CC0 license](https://creativecommons.org/publicdomain/zero/1.0), which allows anyone to use them without restrictions. diff --git a/content/en/verein/event/fnf-at-39c3-office-hours-2025/index.md b/content/en/verein/event/fnf-at-39c3-office-hours-2025/index.md new file mode 100644 index 000000000..26b8b23e5 --- /dev/null +++ b/content/en/verein/event/fnf-at-39c3-office-hours-2025/index.md @@ -0,0 +1,14 @@ +{ + "title": "datarequests.org office hours: We answer your GDPR request questions", + "type": "event", + "event_date": "2025-12-27T14:00:00+02:00", + "duration": "60m", + "place": { + "name": "39c3, Freedom not Fear assembly" + }, + "description": "Have you encountered problems with a data subject request? You think think someone is processing your data illegally and you want help filing a report? Or you want to volunteer with datarequests.org and want some help getting started? Meet up with us to talk data protection and how to make use of the GDPR." +} + +Have you encountered problems with a data subject request? You think think someone is processing your data illegally and you want help filing a report? Or you want to volunteer with datarequests.org and want some help getting started? Meet up with us to talk data protection and how to make use of the GDPR. + +Note: Due to German law, when it comes to specific advice, we need to refer you to a lawyer. But we can give you general advice and exchange experiences. diff --git a/content/es/suggest.md b/content/es/suggest.md index 530b0adc1..0de6d5ff5 100644 --- a/content/es/suggest.md +++ b/content/es/suggest.md @@ -32,7 +32,16 @@ Si tienes alguna sugerencia que no se puede manejar a través de este formulario {{< loadingIndicator >}}
-
+
+ +
+ +¿Tienes algún otro comentario o nota que debamos tener en cuenta al revisar tu sugerencia? Si es así, puedes compartirlos con nosotros aquí. + + + + +
Al enviar este formulario, aceptas que tus contribuciones se publiquen en nuestra base de datos de empresas y bajo una [licencia CC0](https://creativecommons.org/publicdomain/zero/1.0), lo que permite que cualquiera pueda usarlos sin restricciones. diff --git a/content/fr/suggest.md b/content/fr/suggest.md index f720766bb..79209b7d7 100644 --- a/content/fr/suggest.md +++ b/content/fr/suggest.md @@ -14,7 +14,16 @@ Si tu as des suggestions qui ne peuvent pas être traitées par ce formulaire ou {{< loadingIndicator >}}
-
+
+ +
+ +As-tu d'autres commentaires ou remarques à nous faire parvenir concernant l'examen de ta proposition ? Tu peux nous les communiquer ici. + + + + +
En soumettant ce formulaire, tu acceptes que tes contributions soient publiées dans notre base de données d'entreprises et que tu les concèdes sous [licence CC0](https://creativecommons.org/publicdomain/zero/1.0), qui permet à quiconque de les utiliser sans restriction. diff --git a/content/hr/suggest.md b/content/hr/suggest.md index b06851b2e..ebf888196 100644 --- a/content/hr/suggest.md +++ b/content/hr/suggest.md @@ -31,7 +31,16 @@ Nakon slanja obrasca, upisani podaci bit će javno vidljivi u našem -
+
+ +
+ +Do you have any further comments or notes that we should take into account when reviewing your suggestion? If so, you can share them with us here. + + + + +
Slanjem ovog obrasca pristaješ, da se tvoji prilozi objavljuju u našoj bazi podataka te da se podaci licenciraju pod [CC0 licencom](https://creativecommons.org/publicdomain/zero/1.0), čime se svima omogućuje neograničeno korištenje podataka. diff --git a/content/nl/suggest.md b/content/nl/suggest.md index 805f2c98c..dd34c20e9 100644 --- a/content/nl/suggest.md +++ b/content/nl/suggest.md @@ -13,7 +13,16 @@ If you have any suggestions that cannot be handled through this form or that you {{< loadingIndicator >}}
-
+
+ +
+ +Do you have any further comments or notes that we should take into account when reviewing your suggestion? If so, you can share them with us here. + + + + +
By submitting this form, you agree for your contributions to be published in our company database and license them under a [CC0 license](https://creativecommons.org/publicdomain/zero/1.0), which allows anyone to use them without restrictions. diff --git a/content/pt/suggest.md b/content/pt/suggest.md index 45e12eea8..00a0ed3ce 100644 --- a/content/pt/suggest.md +++ b/content/pt/suggest.md @@ -13,7 +13,16 @@ If you have any suggestions that cannot be handled through this form or that you {{< loadingIndicator >}}
-
+
+ +
+ +Do you have any further comments or notes that we should take into account when reviewing your suggestion? If so, you can share them with us here. + + + + +
By submitting this form, you agree for your contributions to be published in our company database and license them under a [CC0 license](https://creativecommons.org/publicdomain/zero/1.0), which allows anyone to use them without restrictions. diff --git a/cypress.config.ts b/cypress.config.ts index fefbaf578..eded6804f 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ experimentalRunAllSpecs: true, experimentalStudio: true, testIsolation: true, - retries: 3, + retries: process.env.CYPRESS_RETRIES ? +process.env.CYPRESS_RETRIES : 3, }, }); diff --git a/cypress/README.md b/cypress/README.md index 6d75b60a2..67098abb3 100644 --- a/cypress/README.md +++ b/cypress/README.md @@ -15,6 +15,12 @@ If you want to, you can override the launch URLs: export CYPRESS_baseUrl='http://localhost:1314' ``` +To avoid flaky tests in CI, we allow up to three retries. However, this can be annoying when working on the tests, so you can disable this if you want: + +```sh +export CYPRESS_RETRIES=0 +``` + Then, open the test runner: ```sh yarn cypress open --e2e --browser electron diff --git a/cypress/e2e/components/proceedings.spec.js b/cypress/e2e/components/proceedings.spec.js index dc8a64bbc..533a09d8f 100644 --- a/cypress/e2e/components/proceedings.spec.js +++ b/cypress/e2e/components/proceedings.spec.js @@ -1,8 +1,8 @@ import { isOn, skipOn } from '@cypress/skip-test'; -const message_template = { - reference: '2022-KKD2YF1', - date: new Date(), +const messageTemplate = (reference, date = undefined) => ({ + reference, + date: date || new Date(), type: 'access', slug: 'datenanfragen', correspondent_address: 'Datenanfragen.de e. V.\nSchreinerweg 6\n38126 Braunschweig\nDeutschland', @@ -12,7 +12,18 @@ const message_template = { content: undefined, sentByMe: true, extra: undefined, -}; +}); + +const makeProceeding = (reference) => ({ + reference, + status: 'waitingForResponse', + messages: { + [`${reference}-00`]: { + id: `${reference}-00`, + ...messageTemplate(reference), + }, + }, +}); describe('Proceedings page', () => { beforeEach(() => { @@ -30,18 +41,7 @@ describe('Proceedings page', () => { }); it('shows regular proceeding', () => { - cy.proceedingsStore().then((store) => - store.addProceeding({ - reference: '2022-KKD2YF1', - status: 'done', - messages: { - '2022-KKD2YF1-00': { - id: '2022-KKD2YF1-00', - ...message_template, - }, - }, - }) - ); + cy.proceedingsStore().then((store) => store.addProceeding(makeProceeding('2022-KKD2YF1'))); cy.get('.proceeding-rows') .should('contain.text', '2022-KKD2YF1') .should('contain.text', 'Datenanfragen.de e. V.'); @@ -54,7 +54,7 @@ describe('Proceedings page', () => { messages: {}, }); store.addMessage({ - ...message_template, + ...messageTemplate('2022-KKD2YF1'), date: new Date('2022-01-14T00:00:00.000Z'), }); }); @@ -62,7 +62,7 @@ describe('Proceedings page', () => { cy.proceedingsStore().then((store) => { store.addMessage({ - ...message_template, + ...messageTemplate('2022-KKD2YF1'), type: 'response', sentByMe: false, }); @@ -72,7 +72,7 @@ describe('Proceedings page', () => { cy.proceedingsStore().then((store) => { store.addMessage({ - ...message_template, + ...messageTemplate('2022-KKD2YF1'), type: 'admonition', sentByMe: true, }); @@ -80,4 +80,112 @@ describe('Proceedings page', () => { cy.get('.proceeding-rows').should('contain.text', 'Response pending'); }); + + it('can delete selected proceedings', () => { + const references = ['2022-KKD2YF1', '2025-1ISPYF6I', '2025-1INGZ5L6', '2025-P1TJ3BC']; + cy.proceedingsStore().then((store) => + Promise.all(references.map((ref) => store.addProceeding(makeProceeding(ref)))) + ); + const assertAllProceedingsExist = () => { + for (const ref of references) cy.get('.proceeding-rows').should('contain.text', ref); + }; + assertAllProceedingsExist(); + + const selectProceedings = () => { + cy.contains('Select').click(); + cy.get('.proceeding-row-list-item input[type="checkbox"][data-reference="2022-KKD2YF1"]').check(); + cy.get('.proceeding-row-list-item input[type="checkbox"][data-reference="2025-P1TJ3BC"]').check(); + }; + + let step = 0; + cy.on('window:confirm', (text) => { + // This is ugly but how you're supposed to do it + // (https://docs.cypress.io/api/cypress-api/catalog-of-events#Window-Confirm). I haven't found a way to + // remove the event handler. And due to Cypress' weird pseudo-promises, we can't reassign the variable + // outside of it either. + step++; + expect(text).to.contains('This will delete the selected proceedings'); + return step === 2; + }); + + // Initially, we'll cancel deletion. + selectProceedings(); + cy.get('button.icon-ellipsis').click(); + cy.contains('Delete selected proceedings').click(); + + cy.reload(); + assertAllProceedingsExist(); + + // This time, we'll go through with it. + selectProceedings(); + cy.get('button.icon-ellipsis').click(); + cy.contains('Delete selected proceedings').click(); + + const assertDeletionWorked = () => { + cy.get('.proceeding-rows').should('contain.text', '2025-1ISPYF6I'); + cy.get('.proceeding-rows').should('contain.text', '2025-1INGZ5L6'); + cy.get('.proceeding-rows').should('not.contain.text', '2022-KKD2YF1'); + cy.get('.proceeding-rows').should('not.contain.text', '2025-P1TJ3BC'); + }; + + cy.contains('Delete selected proceedings').should('not.exist'); + assertDeletionWorked(); + + cy.reload(); + assertDeletionWorked(); + }); + + for (const state of ['done', 'abandoned']) { + const stateLabel = state === 'done' ? 'Done' : 'Abandoned'; + + it(`can mark selected proceedings as ${state} and reactivate them`, () => { + cy.proceedingsStore().then((store) => { + store.addProceeding({ + reference: '2022-KKD2YF1', + messages: {}, + }); + store.addMessage({ + ...messageTemplate('2022-KKD2YF1'), + date: new Date('2022-01-14T00:00:00.000Z'), + }); + }); + const references = ['2025-1ISPYF6I', '2025-1INGZ5L6']; + cy.proceedingsStore().then((store) => + Promise.all(references.map((ref) => store.addProceeding(makeProceeding(ref)))) + ); + + const selectProceedings = () => { + cy.contains('Select').click(); + cy.get('.proceeding-row-list-item input[type="checkbox"][data-reference="2022-KKD2YF1"]').check(); + cy.get('.proceeding-row-list-item input[type="checkbox"][data-reference="2025-1INGZ5L6"]').check(); + }; + + selectProceedings(); + cy.get('button.icon-ellipsis').click(); + cy.contains(`Mark selected proceedings as ${state}`).click(); + + const assertState = (state) => { + cy.get('#proceeding-row-heading-2022-KKD2YF1') + .parent() + .should('contain.text', state === 'Response pending' ? 'Overdue' : state); + cy.get('#proceeding-row-heading-2025-1INGZ5L6').parent().should('contain.text', state); + cy.get('#proceeding-row-heading-2025-1ISPYF6I') + .parent() + .should(state === stateLabel ? 'not.contain.text' : 'contain.text', state); + + if (state === stateLabel) cy.get('#main-nav .badge-error').should('not.exist'); + else cy.get('#main-nav .badge-error').should('contain.text', '1'); + }; + + assertState(stateLabel); + cy.reload(); + assertState(stateLabel); + + selectProceedings(); + cy.get('button.icon-ellipsis').click(); + cy.contains('Reactivate selected proceedings').click(); + + assertState('Response pending'); + }); + } }); diff --git a/cypress/e2e/components/svafinder.spec.js b/cypress/e2e/components/svafinder.spec.js index 157115ad3..c43a73b04 100644 --- a/cypress/e2e/components/svafinder.spec.js +++ b/cypress/e2e/components/svafinder.spec.js @@ -23,12 +23,12 @@ describe('SvaFinder component', () => { const paths = [ { path: ['Federal authority'], - result_name: 'Der Bundesbeauftragte für den Datenschutz und die Informationsfreiheit', + result_name: 'Die Bundesbeauftragte für den Datenschutz und die Informationsfreiheit', result_url_regex: /supervisory-authority\/debfdi/, }, { path: ['Statutory health insurance'], - result_name: 'Der Bundesbeauftragte für den Datenschutz und die Informationsfreiheit', + result_name: 'Die Bundesbeauftragte für den Datenschutz und die Informationsfreiheit', result_url_regex: /supervisory-authority\/debfdi/, }, { @@ -68,14 +68,18 @@ describe('SvaFinder component', () => { }, { path: ['Public service broadcaster', 'Deutschlandradio'], - result_name: - 'Der Rundfunkdatenschutzbeauftragte beim BR, HR, MDR, rbb, SR, SWR, WDR, Deutschlandradio und ZDF', + result_name: 'Der Rundfunkdatenschutzbeauftragte', result_url_regex: /supervisory-authority\/derf/, }, { - path: ['Public service broadcaster', 'Beitragsservice', 'Lower Saxony'], - result_name: 'Rundfunkdatenschutzbeauftragter Norddeutscher Rundfunk', - result_url_regex: /supervisory-authority\/derfndr/, + path: ['Public service broadcaster', 'Beitragsservice'], + result_name: 'Der Rundfunkdatenschutzbeauftragte', + result_url_regex: /supervisory-authority\/derf/, + }, + { + path: ['Public service broadcaster', 'Deutsche Welle'], + result_name: 'Rundfunkdatenschutzbeauftragter Deutsche Welle', + result_url_regex: /supervisory-authority\/derfdw/, }, ]; diff --git a/cypress/e2e/old-bugs/no-fail-on-invalid-date-in-importmessagemodal.spec.js b/cypress/e2e/old-bugs/no-fail-on-invalid-date-in-importmessagemodal.spec.js index a47d32eae..405cfaad1 100644 --- a/cypress/e2e/old-bugs/no-fail-on-invalid-date-in-importmessagemodal.spec.js +++ b/cypress/e2e/old-bugs/no-fail-on-invalid-date-in-importmessagemodal.spec.js @@ -8,6 +8,7 @@ describe('ImportMessageModal', () => { beforeEach(() => { skipOn(isOn('production')); + cy.clearIndexedDb('Datenanfragen.de'); cy.visit('/my-requests'); // TODO: Can this be more elegant? // eslint-disable-next-line cypress/no-unnecessary-waiting @@ -43,7 +44,7 @@ describe('ImportMessageModal', () => { }) ); - cy.contains('Datenanfragen.de').click(); + cy.contains('Datenanfragen.de').parent().click(); cy.contains('Add message').click(); cy.get('.modal'); diff --git a/cypress/e2e/old-bugs/reference-in-sendrequestbutton-modal-subject.spec.js b/cypress/e2e/old-bugs/reference-in-sendrequestbutton-modal-subject.spec.js new file mode 100644 index 000000000..f81ff0d4b --- /dev/null +++ b/cypress/e2e/old-bugs/reference-in-sendrequestbutton-modal-subject.spec.js @@ -0,0 +1,22 @@ +/* + * In #1095, we noticed that in the new generator, the reference was only included in the `MailtoDropdown`'s subject + * line but not in the subject input shown in the `SendRequestButton` modal. + */ + +describe('Reference in generated subject', () => { + it('Reference is in included in subject input for generated request', () => { + cy.visit('/generator/#!companies=datenanfragen&request_type=access'); + cy.contains('Datenanfragen.de'); + + cy.contains('Send request').click(); + + cy.get('#send-request-modal-subject').should('contain.value', '(My reference:'); + + cy.get('#send-request-modal-body') + .invoke('val') + .then((body) => { + const reference = body.match(/My reference: ([\dA-Z-]+)/)[1]; + cy.get('#send-request-modal-subject').should('contain.value', reference); + }); + }); +}); diff --git a/cypress/e2e/use-cases/generator.spec.js b/cypress/e2e/use-cases/generator.spec.js index 0f1b70a3e..29cb99a09 100644 --- a/cypress/e2e/use-cases/generator.spec.js +++ b/cypress/e2e/use-cases/generator.spec.js @@ -1,3 +1,5 @@ +import { isOn, skipOn } from '@cypress/skip-test'; + describe('Using the generator', () => { beforeEach(() => { cy.visit('/generator', { @@ -8,6 +10,9 @@ describe('Using the generator', () => { }); it('Simple access requests to companies in "add-all" company pack', () => { + // This causes errors in production, see: https://github.com/datenanfragen/website/issues/1232 + skipOn(isOn('production')); + cy.contains('Get access'); cy.get('.request-type-help-button').first().click(); cy.contains('Through an access request, you can find out'); @@ -48,8 +53,8 @@ describe('Using the generator', () => { .should( 'satisfy', (subject) => - subject === 'Request to access to personal data according to Art. 15 GDPR' || - subject === 'Anfrage bzgl. Auskunft gemäß Art. 15 DSGVO' + subject.startsWith('Request to access to personal data according to Art. 15 GDPR') || + subject.startsWith('Anfrage bzgl. Auskunft gemäß Art. 15 DSGVO') ); cy.get('#send-request-modal-recipient').invoke('val').should('not.be.empty'); @@ -73,6 +78,9 @@ describe('Using the generator', () => { }); it('Two erasure requests with various features, followed by an access request', () => { + // This causes errors in production, see: https://github.com/datenanfragen/website/issues/1232 + skipOn(isOn('production')); + cy.contains('Delete (parts of)').click(); cy.get('.ais-SearchBox-input').type('{selectall}soundcloud'); @@ -98,7 +106,7 @@ describe('Using the generator', () => { cy.get('.modal').contains('Here’s your generated request.'); cy.get('#send-request-modal-subject').should( - 'have.value', + 'contain.value', 'Request for erasure of personal data according to Art. 17 GDPR' ); cy.get('#send-request-modal-recipient').invoke('val').should('not.be.empty'); @@ -142,13 +150,16 @@ describe('Using the generator', () => { cy.contains('Send request').click(); cy.get('#send-request-modal-subject').should( - 'have.value', + 'contain.value', 'Request to access to personal data according to Art. 15 GDPR' ); cy.get('#send-request-modal-body').should('contain.value', 'I am hereby requesting access'); }); it('Rectification request to custom company, appears in “My requests”', () => { + // This causes errors in production, see: https://github.com/datenanfragen/website/issues/1232 + skipOn(isOn('production')); + cy.contains('Correct data').click(); cy.contains('Add a custom company').click(); @@ -204,7 +215,7 @@ describe('Using the generator', () => { cy.contains('Send request').click(); cy.get('.modal').contains('Here’s your generated request.'); cy.get('#send-request-modal-subject').should( - 'have.value', + 'contain.value', 'Request for rectification of personal data according to Art. 16 GDPR' ); cy.get('#send-request-modal-recipient').should('have.value', 'privacy@darkenanfragen.tld'); @@ -234,7 +245,7 @@ describe('Using the generator', () => { cy.get('.ais-SearchBox-input').type('{selectall}a1 austria'); cy.contains('A1 Telekom Austria').click(); cy.get('.ais-SearchBox-input').type('{selectall}joyn'); - cy.contains('Joyn GmbH').click(); + cy.contains('Joyn').click(); cy.contains('Request 2 companies').click(); cy.contains('Companies you selected'); @@ -247,7 +258,7 @@ describe('Using the generator', () => { cy.contains('Request 2 companies').click(); cy.contains('A1 Telekom Austria'); - cy.contains('Joyn GmbH'); + cy.contains('Joyn'); cy.contains('Continue with these companies').click(); @@ -258,7 +269,7 @@ describe('Using the generator', () => { cy.contains('Send request').click(); cy.get('.modal').contains('Here’s your generated request. Download the PDF'); - cy.get('#send-request-modal-subject').should('have.value', 'Werbewiderspruch gemäß Art. 21 Abs. 2 DSGVO'); + cy.get('#send-request-modal-subject').should('contain.value', 'Werbewiderspruch gemäß Art. 21 Abs. 2 DSGVO'); cy.get('#send-request-modal-recipient').should('contain.value', 'Österreich'); cy.get('#send-request-modal-body') .should('contain.value', 'ich lege hiermit Widerspruch') diff --git a/deploy.sh b/deploy.sh index 22665cd3c..64ee20a8b 100755 --- a/deploy.sh +++ b/deploy.sh @@ -70,7 +70,7 @@ cd .. || exit yarn licenses generate-disclaimer --ignore-optional --ignore-platform > static/NOTICES.txt -echo "Running Webpack and Hugo…" +echo "Running Hugo and translations build…" yarn run build if [ "$CONTEXT" = "production" ] diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index df91840c0..137cad95f 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -31,12 +31,8 @@ {{ if eq .Type "generator" -}} {{- end }} - {{ $style := resources.Get "styles/index.scss" | toCSS (dict "enableSourceMap" .Site.Params.devMode) | postCSS (dict "config" "postcss.config.js" "noMap" true) | minify | fingerprint }} - {{ $style_link := $style.RelPermalink | absURL }} - {{ if (or (eq hugo.Environment "production") (eq hugo.Environment "staging")) }} - {{ $style_link = $style_link | replaceRE "\\.[^\\.]*(\\.[^\\.]*)$" "$1" }} - {{ end }} - + {{ $style := resources.Get "styles/index.scss" | toCSS (dict "enableSourceMap" .Site.Params.devMode) | postCSS (dict "config" "postcss.config.js" "noMap" true) | minify }} + {{ partial "head/meta.html" . }} {{ partial "head/favicons.html" . }} diff --git a/layouts/company/single.html b/layouts/company/single.html index e9cedad2c..d65ee07a2 100644 --- a/layouts/company/single.html +++ b/layouts/company/single.html @@ -177,6 +177,16 @@

{{ T "cdb-related-companies" }}

{{ end }} + {{ $postsPerCompany := partialCached "functions/posts-per-company.html" . }} + {{ $companyPosts := index $postsPerCompany .Params.slug }} + {{ if $companyPosts }} +

{{ T "cdb-related-posts" }}

+ + {{ range $companyPosts }} + {{ partial "summary-minimal.html" . }} + {{ end }} + {{ end }} +
{{ end }} diff --git a/layouts/partials/functions/posts-per-company.html b/layouts/partials/functions/posts-per-company.html new file mode 100644 index 000000000..dab092f6b --- /dev/null +++ b/layouts/partials/functions/posts-per-company.html @@ -0,0 +1,25 @@ + + +{{ $companyPosts := dict }} + +{{ range $page := .Site.RegularPages }} + {{ if or (eq $page.Type "blog") (eq $page.Type "act") }} + {{ if $page.Params.discussedCompanies }} + {{ $pageCompanies := $page.Params.discussedCompanies }} + + {{ range $companySlug := $pageCompanies }} + {{ if not (index $companyPosts $companySlug) }} + {{ $companyPosts = merge $companyPosts (dict $companySlug (slice $page)) }} + {{ else }} + {{ $existingPosts := index $companyPosts $companySlug }} + {{ $companyPosts = merge $companyPosts (dict $companySlug (append $page $existingPosts)) }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} +{{ end }} + +{{ return $companyPosts }} diff --git a/layouts/partials/functions/supported-countries.html b/layouts/partials/functions/supported-countries.html new file mode 100644 index 000000000..c535410cc --- /dev/null +++ b/layouts/partials/functions/supported-countries.html @@ -0,0 +1,18 @@ +{{ $countryCounts := dict }} + +{{ range where $.Site.Pages "Type" "company" }} + {{ range .Param "relevant-countries" }} + {{ $currentCount := index $countryCounts . | default 0 }} + {{ $countryCounts = merge $countryCounts (dict . (add $currentCount 1)) }} + {{ end }} +{{ end }} + +{{ $supportedCountries := slice }} + +{{ range $country, $count := $countryCounts }} + {{ if ge $count 10 }} + {{ $supportedCountries = $supportedCountries | append $country }} + {{ end }} +{{ end }} + +{{ return $supportedCountries }} diff --git a/layouts/partials/loading-indicator.html b/layouts/partials/loading-indicator.html index e47faf103..5945280cd 100644 --- a/layouts/partials/loading-indicator.html +++ b/layouts/partials/loading-indicator.html @@ -1,9 +1,5 @@ -{{ $loader := resources.Get "styles/loader.scss" | toCSS (dict "enableSourceMap" .Site.Params.devMode) | postCSS (dict "config" "postcss.config.js" "noMap" true) | minify | fingerprint }} -{{ $link := $loader.RelPermalink | absURL }} -{{ if (or (eq hugo.Environment "production") (eq hugo.Environment "staging")) }} - {{ $link = $link | replaceRE "\\.[^\\.]*(\\.[^\\.]*)$" "$1" }} -{{ end }} - +{{ $loader := resources.Get "styles/loader.scss" | toCSS (dict "enableSourceMap" .Site.Params.devMode) | postCSS (dict "config" "postcss.config.js" "noMap" true) | minify }} + `; +#bank-transfer-qrcode-section { display: none; }`; if (!print_window || !content) return; - print_window.document.write(style + content.innerHTML); + const style_tag = print_window.document.createElement('style'); + style_tag.textContent = style; + print_window.document.head.appendChild(style_tag); + print_window.document.body.appendChild(content.cloneNode(true)); print_window.document.close(); print_window.focus(); print_window.print(); diff --git a/src/Components/Generator/DynamicInput.tsx b/src/Components/Generator/DynamicInput.tsx index ef0713c75..d8c2b31f6 100644 --- a/src/Components/Generator/DynamicInput.tsx +++ b/src/Components/Generator/DynamicInput.tsx @@ -59,8 +59,8 @@ export const DynamicInput = (props: DynamicInputProps) => { data-dynamic-input-id={props.id} className="dynamic-input-delete button button-secondary button-small icon-trash" onClick={props.onRemove} - title={t('delete-field', 'generator', { - field_name: props.value.desc || t('unnamed-field', 'generator'), + title={t(props.value.desc ? 'delete-field' : 'delete-unnamed-field', 'generator', { + field_name: props.value.desc, })} /> )} @@ -82,7 +82,11 @@ export const DynamicInput = (props: DynamicInputProps) => { descInput.current?.select(); }} aria-live="polite"> - {props.value.desc} + {props.value.desc || ( + + + + )}
{props.label ? props.label : }
- {(props.media || TRANSPORT_MEDIA.filter((m) => m !== 'webform')).map((transportMedium) => ( + {(props.media || TRANSPORT_MEDIA).map((transportMedium) => ( { + const ref = useRef(null); + + useEffect(() => { + if (ref.current) { + if (ref.current.setHTML) { + ref.current.setHTML(props.html); + } else { + // support uncool browsers + // remove this when setHTML hits the baseline + ref.current.innerHTML = props.html; + } + } + }, [props.html]); + + return
; +}; diff --git a/src/Components/Reactor/templates.ts b/src/Components/Reactor/templates.ts index 455abc8ff..a1569060e 100644 --- a/src/Components/Reactor/templates.ts +++ b/src/Components/Reactor/templates.ts @@ -56,48 +56,48 @@ Ich bin der Meinung, dass die Daten, die ich in meinem Antrag bereits angegeben Ich bin der Ansicht, dass die Daten, die ich bereits in meiner Anfrage angegeben habe, ausreichen, um mich zu identifizieren und die Verantwortliche daher keine zusätzlichen Informationen verlangen kann.[has:reasoning> {reasoning}][concerns_online_account> Meine Anfrage bezieht sich auf einen Online-Account. Erwägungsgrund 64 DSGVO stellt klar, dass Online-Kennungen zur Identifizierung genutzt werden sollen.]`, 'additional-id::complaint::resolved': `Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, solange ich keine zusätzlichen Identifizierungsdaten zur Verfügung stelle und damit gegen Art. 12 Abs. 6 DSGVO verstoßen. Diese Angelegenheit wurde inzwischen geklärt.`, - 'id-copy::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten, bis ich eine Ausweiskopie vorlege. Bitte beachten Sie, dass die Bereitstellung einer Ausweiskopie einen erheblichen Eingriff in die Sicherheit meiner personenbezogenen Daten darstellt und daher nur dann angemessen ist, wenn sie unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 73).[user_objects> Ich glaube nicht, dass dies bei meiner Anfrage der Fall ist.] + 'id-copy::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten, bis ich eine Ausweiskopie vorlege. Bitte beachten Sie, dass die Bereitstellung einer Ausweiskopie einen erheblichen Eingriff in die Sicherheit meiner personenbezogenen Daten darstellt und daher nur dann angemessen ist, wenn sie unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 74).[user_objects> Ich glaube nicht, dass dies bei meiner Anfrage der Fall ist.] -[not_linked_to_real_life_identity>Meine Anfrage betrifft Daten, die nicht in Bezug zu meiner realen Identität stehen. Es ist daher nicht ersichtlich, wie die Übermittlung einer Ausweiskopie Ihnen bei der Authentifizierung meiner Anfrage helfen würde.][concerns_online_account>Meine Anfrage betrifft einen Online-Account. Damit gibt es bereits ein besseres und weniger invasives Authentifizierungsverfahren (vgl. Erwägungsgrund 64 GDPR). Folglich ist es unverhältnismäßig, eine Ausweiskopie zu verlangen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 72).][has:reasoning> -{reasoning}][ask_about_redactions>Ich bin bereit, eine geschwärzte Ausweiskopie für diese Anfrage zur Verfügung zu stellen, aber leider haben Sie mir nicht mitgeteilt, welche Informationen zur Bestätigung meiner Identität erforderlich sind. Nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 75). Bitte teilen Sie mir mit, welche Informationen Sie für notwendig erachten, damit ich den Rest schwärzen kann. +[not_linked_to_real_life_identity>Meine Anfrage betrifft Daten, die nicht in Bezug zu meiner realen Identität stehen. Es ist daher nicht ersichtlich, wie die Übermittlung einer Ausweiskopie Ihnen bei der Authentifizierung meiner Anfrage helfen würde.][concerns_online_account>Meine Anfrage betrifft einen Online-Account. Damit gibt es bereits ein besseres und weniger invasives Authentifizierungsverfahren (vgl. Erwägungsgrund 64 GDPR). Folglich ist es unverhältnismäßig, eine Ausweiskopie zu verlangen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 73).][has:reasoning> +{reasoning}][ask_about_redactions>Ich bin bereit, eine geschwärzte Ausweiskopie für diese Anfrage zur Verfügung zu stellen, aber leider haben Sie mir nicht mitgeteilt, welche Informationen zur Bestätigung meiner Identität erforderlich sind. Nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 76). Bitte teilen Sie mir mit, welche Informationen Sie für notwendig erachten, damit ich den Rest schwärzen kann. -Ich möchte Sie außerdem bereits im Voraus darauf hinweisen, dass eine längere Aufbewahrung der Ausweiskopie, als für die Überprüfung meiner Identität für diese Anfrage erforderlich ist, angesichts der Grundsätze der Zweckbindung und Speicherbegrenzung (Art. 5 Abs. 1 lit. b und e DSGVO) einen Verstoß gegen die DSGVO darstellt. Der Europäische Datenschutzausschuss empfiehlt, einen Vermerk zu machen, dass Sie mein Ausweisdokument überprüft haben, und die Kopie dann sofort zu löschen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 78).][controller_requires_unredacted>Ich bin bereit, eine Ausweiskopie mit den zu meiner Identifizierung für diese Anfrage notwendigen Informationen zur Verfügung zu stellen, aber leider haben Sie mir mitgeteilt, dass Sie nur ungeschwärzte Kopien akzeptieren. Die Forderung nach einer ungeschwärzten Ausweiskopie ist nur unter sehr engen Voraussetzungen rechtmäßig, die meiner Meinung nach in diesem Fall nicht gegeben sind. Nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 75). Bitte teilen Sie mir mit, welche Informationen Sie für notwendig erachten, damit ich den Rest schwärzen kann. +Ich möchte Sie außerdem bereits im Voraus darauf hinweisen, dass eine längere Aufbewahrung der Ausweiskopie, als für die Überprüfung meiner Identität für diese Anfrage erforderlich ist, angesichts der Grundsätze der Zweckbindung und Speicherbegrenzung (Art. 5 Abs. 1 lit. b und e DSGVO) einen Verstoß gegen die DSGVO darstellt. Der Europäische Datenschutzausschuss empfiehlt, einen Vermerk zu machen, dass Sie mein Ausweisdokument überprüft haben, und die Kopie dann sofort zu löschen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 79).][controller_requires_unredacted>Ich bin bereit, eine Ausweiskopie mit den zu meiner Identifizierung für diese Anfrage notwendigen Informationen zur Verfügung zu stellen, aber leider haben Sie mir mitgeteilt, dass Sie nur ungeschwärzte Kopien akzeptieren. Die Forderung nach einer ungeschwärzten Ausweiskopie ist nur unter sehr engen Voraussetzungen rechtmäßig, die meiner Meinung nach in diesem Fall nicht gegeben sind. Nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 76). Bitte teilen Sie mir mit, welche Informationen Sie für notwendig erachten, damit ich den Rest schwärzen kann. -Ich möchte Sie außerdem bereits im Voraus darauf hinweisen, dass eine längere Aufbewahrung der Ausweiskopie, als für die Überprüfung meiner Identität für diese Anfrage erforderlich ist, angesichts der Grundsätze der Zweckbindung und Speicherbegrenzung (Art. 5 Abs. 1 lit. b und e DSGVO) einen Verstoß gegen die DSGVO darstellt. Der Europäische Datenschutzausschuss empfiehlt, einen Vermerk zu machen, dass Sie mein Ausweisdokument überprüft haben, und die Kopie dann sofort zu löschen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 78).]`, +Ich möchte Sie außerdem bereits im Voraus darauf hinweisen, dass eine längere Aufbewahrung der Ausweiskopie, als für die Überprüfung meiner Identität für diese Anfrage erforderlich ist, angesichts der Grundsätze der Zweckbindung und Speicherbegrenzung (Art. 5 Abs. 1 lit. b und e DSGVO) einen Verstoß gegen die DSGVO darstellt. Der Europäische Datenschutzausschuss empfiehlt, einen Vermerk zu machen, dass Sie mein Ausweisdokument überprüft haben, und die Kopie dann sofort zu löschen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 79).]`, 'id-copy::you-said-that::issue': `das Unternehmen sich geweigert hat, Deine Anfrage zu beantworten, bis Du eine[controller_requires_unredacted> ungeschwärzte] Ausweiskopie vorlegst.`, 'id-copy::you-said-that::meta': `[user_objects>Du hast gesagt, dass die Anforderung einer Ausweiskopie meiner Meinung nach aus den folgenden Gründen nicht angemessen ist: ][not_linked_to_real_life_identity>Deine Anfrage betrifft Daten, die nicht in Bezug zu meiner realen Identität stehen.][concerns_online_account>Deine Anfrage bezieht sich auf einen Online-Account.][has:reasoning>„{reasoning}”][controller_requires_unredacted>Du hast gesagt, dass das Unternehmen eine ungeschwärzte Ausweiskopie verlangt hat.]`, - 'id-copy::complaint::persists': `Das Unternehmen hat sich geweigert, meine Anfrage zu beantworten, bis ich eine Ausweiskopie vorlege. Laut dem Europäischen Datenschutzausschuss ist das nur dann angemessen, wenn es unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 73).[user_objects> Ich glaube nicht, dass dies bei meiner Anfrage der Fall ist.] -[not_linked_to_real_life_identity>Meine Anfrage betrifft Daten, die nicht in Bezug zu meiner realen Identität stehen. Es ist daher nicht ersichtlich, wie die Übermittlung einer Ausweiskopie der Verantwortlichen bei der Authentifizierung meiner Anfrage helfen würde.][concerns_online_account>Meine Anfrage betrifft einen Online-Account. Damit gibt es bereits ein besseres und weniger invasives Authentifizierungsverfahren (vgl. Erwägungsgrund 64 GDPR). Folglich ist es unverhältnismäßig, eine Ausweiskopie zu verlangen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 72).][has:reasoning> -{reasoning}][controller_requires_unredacted>Ich bin bereit, eine Ausweiskopie mit den zu meiner Identifizierung für diese Anfrage notwendigen Informationen zur Verfügung zu stellen, aber leider hat die Verantwortliche mir mitgeteilt, dass sie nur ungeschwärzte Kopien akzeptiert. Aber nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 75).]`, - 'id-copy::complaint::resolved': `[user_objects>Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, sofern ich keine Ausweiskopie vorlege, was laut dem Europäischen Datenschutzausschuss nur dann angemessen ist, wenn es unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 73).][controller_requires_unredacted>Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, sofern ich keine ungeschwärzte Ausweiskopie vorlege. Aber nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 75).] Diese Angelegenheit wurde inzwischen geklärt.`, + 'id-copy::complaint::persists': `Das Unternehmen hat sich geweigert, meine Anfrage zu beantworten, bis ich eine Ausweiskopie vorlege. Laut dem Europäischen Datenschutzausschuss ist das nur dann angemessen, wenn es unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 74).[user_objects> Ich glaube nicht, dass dies bei meiner Anfrage der Fall ist.] +[not_linked_to_real_life_identity>Meine Anfrage betrifft Daten, die nicht in Bezug zu meiner realen Identität stehen. Es ist daher nicht ersichtlich, wie die Übermittlung einer Ausweiskopie der Verantwortlichen bei der Authentifizierung meiner Anfrage helfen würde.][concerns_online_account>Meine Anfrage betrifft einen Online-Account. Damit gibt es bereits ein besseres und weniger invasives Authentifizierungsverfahren (vgl. Erwägungsgrund 64 GDPR). Folglich ist es unverhältnismäßig, eine Ausweiskopie zu verlangen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 73).][has:reasoning> +{reasoning}][controller_requires_unredacted>Ich bin bereit, eine Ausweiskopie mit den zu meiner Identifizierung für diese Anfrage notwendigen Informationen zur Verfügung zu stellen, aber leider hat die Verantwortliche mir mitgeteilt, dass sie nur ungeschwärzte Kopien akzeptiert. Aber nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 76).]`, + 'id-copy::complaint::resolved': `[user_objects>Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, sofern ich keine Ausweiskopie vorlege, was laut dem Europäischen Datenschutzausschuss nur dann angemessen ist, wenn es unbedingt erforderlich und geeignet ist und im Einklang mit dem nationalen Recht steht (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 74).][controller_requires_unredacted>Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, sofern ich keine ungeschwärzte Ausweiskopie vorlege. Aber nach Ansicht des Europäischen Datenschutzausschusses reichen in der Regel das Ausstellungs- oder Ablaufdatum, die ausstellende Behörde und der vollständige Name aus, und alle anderen Informationen sollten geschwärzt werden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 76).] Diese Angelegenheit wurde inzwischen geklärt.`, - 'wrong-medium::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über Ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Bitte beachten Sie, dass die DSGVO Ihnen nicht erlaubt, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50). [wrong_transport_medium>Dazu gehört auch die Anforderung, Anfragen auf einem bestimmten Weg zu senden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 52).][not_form>Das bedeutet, dass Sie zwar ein solches Webformular für Anfragen anbieten können, aber dennoch auch Anfragen, die auf anderem Wege übermittelt werden, nachkommen müssen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 53, 136).][wrong_contact>Sie sind zwar nicht verpflichtet, Anfragen zu beantworten, die an willkürliche, nicht mit der Angelegenheit befasste Personen gerichtet sind, aber Sie können auch nicht nur Anfragen beantworten, die an eine bestimmte Anlaufstelle gerichtet sind (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 55 ff.)][wrong_contact_customer_service> Ich habe meine Anfrage an Ihren regulären Kund_innenservice/Support gerichtet. Es ist angemessen, von Ihnen zu erwarten, dass Sie meine Anfrage intern korrekt weiterleiten.][wrong_contact_privacy> Ich habe meine Anfrage an die Datenschutz-Anlaufstelle geschickt, die Sie in Ihrer Datenschutzerklärung angegeben haben. Dies ist offensichtlich eine angemessene Kontaktstelle für solche Anfragen. Falls erforderlich, sollten Sie sie intern an die richtige Person oder Abteilung weiterleiten.][wrong_contact_dpo> Ich habe meine Anfrage an Ihre_n Datenschutzbeauftragte_n geschickt, wie in Ihrer Datenschutzerklärung angegeben. Unabhängig davon, ob Ihr_ Datenschutzbeauftragte_r mit der Beantwortung von Anfragen betroffener Personen betraut ist, ist dies eine angemessene Anlaufstelle für solche Anfragen. Falls erforderlich, sollten Sie sie intern an die richtige Person oder Abteilung weiterleiten.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, + 'wrong-medium::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über Ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Bitte beachten Sie, dass die DSGVO Ihnen nicht erlaubt, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50). [wrong_transport_medium>Dazu gehört auch die Anforderung, Anfragen auf einem bestimmten Weg zu senden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 52).][not_form>Das bedeutet, dass Sie zwar ein solches Webformular für Anfragen anbieten können, aber dennoch auch Anfragen, die auf anderem Wege übermittelt werden, nachkommen müssen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 53, 138).][wrong_contact>Sie sind zwar nicht verpflichtet, Anfragen zu beantworten, die an willkürliche, nicht mit der Angelegenheit befasste Personen gerichtet sind, aber Sie können auch nicht nur Anfragen beantworten, die an eine bestimmte Anlaufstelle gerichtet sind (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 55 ff.)][wrong_contact_customer_service> Ich habe meine Anfrage an Ihren regulären Kund_innenservice/Support gerichtet. Es ist angemessen, von Ihnen zu erwarten, dass Sie meine Anfrage intern korrekt weiterleiten.][wrong_contact_privacy> Ich habe meine Anfrage an die Datenschutz-Anlaufstelle geschickt, die Sie in Ihrer Datenschutzerklärung angegeben haben. Dies ist offensichtlich eine angemessene Kontaktstelle für solche Anfragen. Falls erforderlich, sollten Sie sie intern an die richtige Person oder Abteilung weiterleiten.][wrong_contact_dpo> Ich habe meine Anfrage an Ihre_n Datenschutzbeauftragte_n geschickt, wie in Ihrer Datenschutzerklärung angegeben. Unabhängig davon, ob Ihr_ Datenschutzbeauftragte_r mit der Beantwortung von Anfragen betroffener Personen betraut ist, ist dies eine angemessene Anlaufstelle für solche Anfragen. Falls erforderlich, sollten Sie sie intern an die richtige Person oder Abteilung weiterleiten.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, 'wrong-medium::you-said-that::issue': `das Unternehmen sich geweigert hat, Deine Anfrage zu beantworten, weil Du sie an die falsche Anlaufstelle oder auf dem falschen Weg gesendet hast.`, 'wrong-medium::you-said-that::meta': `Du hast gesagt, dass das Unternehmen sich geweigert hat, Deine Anfrage zu beantworten, weil [wrong_transport_medium>Du sie nicht per {medium} geschickt hast.][not_form>Du sie nicht über sein Webformular versendet hast.][wrong_contact>sie an die falsche Anlaufstelle geschickt hast.] [wrong_contact_customer_service> Du hast gesagt, dass Du Deine Anfrage an den regulären Kund_innenservice/Support geschickt hast.][wrong_contact_privacy> Du hast gesagt, dass Du Deine Anfrage an die Datenschutz-Anlaufstelle geschickt hast.][wrong_contact_dpo> Du hast gesagt, dass Du Deine Anfrage an die_den Datenschutzbeauftragte_n geschickt hast.][has:wrong_contact_reasoning> Du hast gesagt, dass die Anlaufstelle, an die Du Deine Anfrage geschickt hast, aus folgenden Gründen angemessen ist: „{wrong_contact_reasoning}“]`, - 'wrong-medium::complaint::persists': `Die Verantwortliche hat sich geweigert, meine Anfrage zu beantworten, [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50). [wrong_transport_medium>Dazu gehört auch die Anforderung, Anfragen auf einem bestimmten Weg zu senden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 52).][not_form>Dazu gehört auch die Anforderung, dass Anfragen über ein Webformular gesendet werden (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 53, 136).][wrong_contact>Während ich anerkenne, dass die Verantwortliche nicht verpflichtet ist, Anfragen zu beantworten, die an willkürliche, nicht mit der Angelegenheit befasste Personen gerichtet sind, kann sie auch nicht nur Anfragen beantworten, die an eine bestimmte Anlaufstelle gerichtet sind (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 55 ff.)][wrong_contact_customer_service> Ich habe meine Anfrage an deb regulären Kund_innenservice/Support der Verantwortlichen gerichtet. Es ist angemessen, von zu erwarten, dass sie meine Anfrage intern korrekt weiterleitet.][wrong_contact_privacy> Ich habe meine Anfrage an die Datenschutz-Anlaufstelle geschickt, welche die Verantwortliche in ihrer Datenschutzerklärung angegeben hat. Dies ist offensichtlich eine angemessene Kontaktstelle für solche Anfragen. Falls erforderlich, sollten die Verantwortliche sie intern an die richtige Person oder Abteilung weiterleiten.][wrong_contact_dpo> Ich habe meine Anfrage an die_den Datenschutzbeauftragte_n der Verantwortlichen geschickt, wie in der Datenschutzerklärung angegeben. Unabhängig davon, ob die_der Datenschutzbeauftragte_r mit der Beantwortung von Anfragen betroffener Personen betraut ist, ist dies eine angemessene Anlaufstelle für solche Anfragen. Falls erforderlich, sollten die Verantwortliche sie intern an die richtige Person oder Abteilung weiterleiten.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, - 'wrong-medium::complaint::resolved': `Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50). Diese Angelegenheit wurde inzwischen geklärt.`, + 'wrong-medium::complaint::persists': `Die Verantwortliche hat sich geweigert, meine Anfrage zu beantworten, [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50). [wrong_transport_medium>Dazu gehört auch die Anforderung, Anfragen auf einem bestimmten Weg zu senden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 52).][not_form>Dazu gehört auch die Anforderung, dass Anfragen über ein Webformular gesendet werden (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 53, 138).][wrong_contact>Während ich anerkenne, dass die Verantwortliche nicht verpflichtet ist, Anfragen zu beantworten, die an willkürliche, nicht mit der Angelegenheit befasste Personen gerichtet sind, kann sie auch nicht nur Anfragen beantworten, die an eine bestimmte Anlaufstelle gerichtet sind (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 55 ff.)][wrong_contact_customer_service> Ich habe meine Anfrage an deb regulären Kund_innenservice/Support der Verantwortlichen gerichtet. Es ist angemessen, von zu erwarten, dass sie meine Anfrage intern korrekt weiterleitet.][wrong_contact_privacy> Ich habe meine Anfrage an die Datenschutz-Anlaufstelle geschickt, welche die Verantwortliche in ihrer Datenschutzerklärung angegeben hat. Dies ist offensichtlich eine angemessene Kontaktstelle für solche Anfragen. Falls erforderlich, sollten die Verantwortliche sie intern an die richtige Person oder Abteilung weiterleiten.][wrong_contact_dpo> Ich habe meine Anfrage an die_den Datenschutzbeauftragte_n der Verantwortlichen geschickt, wie in der Datenschutzerklärung angegeben. Unabhängig davon, ob die_der Datenschutzbeauftragte_r mit der Beantwortung von Anfragen betroffener Personen betraut ist, ist dies eine angemessene Anlaufstelle für solche Anfragen. Falls erforderlich, sollten die Verantwortliche sie intern an die richtige Person oder Abteilung weiterleiten.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, + 'wrong-medium::complaint::resolved': `Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, [wrong_transport_medium>weil sie nicht per {medium} gesendet wurde.][not_form>solange ich sie nicht über ihr Webformular sende.][wrong_contact>mit der Begründung, dass sie an die falsche Kontaktperson gesendet wurde.] Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50). Diese Angelegenheit wurde inzwischen geklärt.`, - 'signature::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Bitte beachten Sie, dass die DSGVO Ihnen nicht erlaubt, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50). Eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil Sie nicht einmal eine Unterschriftenprobe von mir haben, mit der Sie meine Unterschrift vergleichen könnten].`, + 'signature::admonition': `Sie haben sich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Bitte beachten Sie, dass die DSGVO Ihnen nicht erlaubt, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50). Eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil Sie nicht einmal eine Unterschriftenprobe von mir haben, mit der Sie meine Unterschrift vergleichen könnten].`, 'signature::you-said-that::issue': `das Unternehmen sich geweigert hat, Deine Anfrage zu beantworten, solange Du sie nicht unterschreibst.`, 'signature::you-said-that::meta': `[not:signature_on_file>Du hast gesagt, dass das Unternehmen keine Unterschriftenprobe von Dir vorliegen hat.][signature_on_file>Du hast gesagt, dass Du Unternehmen eventuell eine Unterschriftenprobe von Dir vorliegen hat.]`, - 'signature::complaint::persists': `Die Verantwortliche hat sich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50). Eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil die Verantwortliche nicht einmal eine Unterschriftenprobe von mir hat, mit der sie meine Unterschrift vergleichen könnte].`, - 'signature::complaint::resolved': `Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Aber die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 50) und eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil die Verantwortliche nicht einmal eine Unterschriftenprobe von mir hat, mit der sie meine Unterschrift vergleichen könnte]. Diese Angelegenheit wurde inzwischen geklärt.`, + 'signature::complaint::persists': `Die Verantwortliche hat sich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50). Eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil die Verantwortliche nicht einmal eine Unterschriftenprobe von mir hat, mit der sie meine Unterschrift vergleichen könnte].`, + 'signature::complaint::resolved': `Die Verantwortliche hatte sich ursprünglich geweigert, meine Anfrage zu beantworten, solange ich sie nicht unterschreibe. Aber die DSGVO erlaubt Verantwortlichen nicht, zusätzliche Formerfordernisse für Anfragen festzusetzen (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 50) und eine Unterschrift kann auch nicht zur Authentifizierung oder Identifizierung genutzt werden[not:signature_on_file>, insbesondere, weil die Verantwortliche nicht einmal eine Unterschriftenprobe von mir hat, mit der sie meine Unterschrift vergleichen könnte]. Diese Angelegenheit wurde inzwischen geklärt.`, - 'other-language::admonition': `Sie haben meine Anfrage auf {response_language} beantwortet, obwohl ich meine Anfrage auf {request_language} geschrieben habe.[user_does_not_understand_response_language> Ich verstehe Ihre Antwort auf {response_language} nicht.] Nach Art. 12 Abs. 1 DSGVO müssen Sie Mitteilungen „in präziser, transparenter, verständlicher und leicht zugänglicher Form in einer klaren und einfachen Sprache” übermitteln. Nach dem Europäischen Datenschutzausschuss bedeutet das, dass Sie Anfragen in einer Sprache beantworten müssen, die von betroffenen Personen in den entsprechenden Ländern, in denen sie Ihre Dienste anbieten, verstanden wird. (Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 140) + 'other-language::admonition': `Sie haben meine Anfrage auf {response_language} beantwortet, obwohl ich meine Anfrage auf {request_language} geschrieben habe.[user_does_not_understand_response_language> Ich verstehe Ihre Antwort auf {response_language} nicht.] Nach Art. 12 Abs. 1 DSGVO müssen Sie Mitteilungen „in präziser, transparenter, verständlicher und leicht zugänglicher Form in einer klaren und einfachen Sprache” übermitteln. Nach dem Europäischen Datenschutzausschuss bedeutet das, dass Sie Anfragen in einer Sprache beantworten müssen, die von betroffenen Personen in den entsprechenden Ländern, in denen sie Ihre Dienste anbieten, verstanden wird. (Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 142) Bitte beantworten Sie meine Anfrage dementsprechend auf {request_language}.`, 'other-language::you-said-that::issue': `das Unternehmen auf Deine Anfrage in einer anderen Sprache geantwortet hat.`, 'other-language::you-said-that::meta': `Du hast gesagt, dass das Unternehmen Deine Anfrage, welche Du auf {request_language} gestellt hast, auf {response_language} beantwortet hat. Du hast gesagt, dass Du die Antwort des Unternehmens auf {response_language}[user_does_not_understand_response_language> nicht] verstehst.`, - 'other-language::complaint::persists': `Die Verantwortliche hat meine Anfrage auf {response_language} beantwortet, obwohl ich meine Anfrage auf {request_language} geschrieben habe.[user_does_not_understand_response_language> Ich verstehe die Antwort auf {response_language} nicht.] Nach Art. 12 Abs. 1 DSGVO muss die Verantwortliche Mitteilungen „in präziser, transparenter, verständlicher und leicht zugänglicher Form in einer klaren und einfachen Sprache” übermitteln. Nach dem Europäischen Datenschutzausschuss bedeutet das, dass sie Anfragen in einer Sprache beantworten muss, die von betroffenen Personen in den entsprechenden Ländern, in denen sie Ihre Dienste anbieten, verstanden wird. (Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 140)`, + 'other-language::complaint::persists': `Die Verantwortliche hat meine Anfrage auf {response_language} beantwortet, obwohl ich meine Anfrage auf {request_language} geschrieben habe.[user_does_not_understand_response_language> Ich verstehe die Antwort auf {response_language} nicht.] Nach Art. 12 Abs. 1 DSGVO muss die Verantwortliche Mitteilungen „in präziser, transparenter, verständlicher und leicht zugänglicher Form in einer klaren und einfachen Sprache” übermitteln. Nach dem Europäischen Datenschutzausschuss bedeutet das, dass sie Anfragen in einer Sprache beantworten muss, die von betroffenen Personen in den entsprechenden Ländern, in denen sie Ihre Dienste anbieten, verstanden wird. (Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 142)`, 'other-language::complaint::resolved': `Die Verantwortliche hatte meine Anfrage ursprünglich auf {response_language} beantwortet, obwohl ich meine Anfrage auf {request_language} geschrieben habe[user_does_not_understand_response_language> und ich habe die Antwort auf {response_language} der Verantwortlichen nicht verstanden]. Diese Angelegenheit wurde inzwischen geklärt.`, 'excessive::admonition': `[controller_refuses>Sie haben sich geweigert, aufgrund meiner Anfrage tätig zu werden.][controller_wants_to_charge>Sie wollen eine Gebühr für meine Anfrage erheben.] Nach Art. 12 Abs. 5 DSGVO durfen Sie das nur im Falle offenkundig unbegründeter oder exzessiver Anfragen[controller_gave_no_reasoning> und Sie haben den Nachweis für den offenkundig unbegründeten oder exzessiven Charakter der Anfrage zu erbringen. Das haben Sie nicht getan].[controller_wants_to_charge> Alternativ könnten Sie nach Art. 15 Abs. 3 DSGVO eine Gebühr für weitere Kopien meiner Daten, die ich beantragt habe, erheben.] -Ich glaube nicht, dass Sie [controller_refuses>sich weigern können, aufgrund meiner Anfrage tätig zu werden][controller_wants_to_charge>eine Gebühr für meine Anfrage erheben können][controller_gave_no_reasoning> und Sie haben auch keine Gegenargumente vorgebracht]. [first_request>Dies ist die erste Anfrage, die ich jemals an Sie gerichtet habe. Daher ist für mich nicht ersichtlich, inwiefern sie als unbegründet oder exzessiv angesehen werden könnte. Sie können auch niemals eine Gebühr für die erste Kopie erheben, unabhängig davon, ob Sie deren Anfertigung für zu teuer halten (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 22).][additional_copy_no_prior_request>Ich habe Ihnen noch nie eine Anfrage geschickt. Es ist daher nicht ersichtlich, wie ich eine zusätzliche Kopie meiner Daten beantragen könnte. Sie können für die erste Kopie niemals eine Gebühr erheben, unabhängig davon, ob Sie die Kosten für die Erstellung der Kopie für zu hoch halten (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 22).][concerns_different_data>Sie behaupten, ich würde eine zusätzliche Kopie meiner Daten beantragen. Dies würde jedoch nur dann zutreffen, wenn sich diese Anfrage auf dieselben Daten bezöge wie meine vorherige Anfrage. Betrifft die Anfrage stattdessen andere Daten (z. B. andere Datentypen oder einen anderen Zeitraum), müssen Sie sie als neue Anfrage betrachten, und das Recht auf eine kostenlose Kopie gilt erneut (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 28). Ich glaube, dass dies hier der Fall ist.][has:reasoning>{reasoning}]`, +Ich glaube nicht, dass Sie [controller_refuses>sich weigern können, aufgrund meiner Anfrage tätig zu werden][controller_wants_to_charge>eine Gebühr für meine Anfrage erheben können][controller_gave_no_reasoning> und Sie haben auch keine Gegenargumente vorgebracht]. [first_request>Dies ist die erste Anfrage, die ich jemals an Sie gerichtet habe. Daher ist für mich nicht ersichtlich, inwiefern sie als unbegründet oder exzessiv angesehen werden könnte. Sie können auch niemals eine Gebühr für die erste Kopie erheben, unabhängig davon, ob Sie deren Anfertigung für zu teuer halten (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 22).][additional_copy_no_prior_request>Ich habe Ihnen noch nie eine Anfrage geschickt. Es ist daher nicht ersichtlich, wie ich eine zusätzliche Kopie meiner Daten beantragen könnte. Sie können für die erste Kopie niemals eine Gebühr erheben, unabhängig davon, ob Sie die Kosten für die Erstellung der Kopie für zu hoch halten (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 22).][concerns_different_data>Sie behaupten, ich würde eine zusätzliche Kopie meiner Daten beantragen. Dies würde jedoch nur dann zutreffen, wenn sich diese Anfrage auf dieselben Daten bezöge wie meine vorherige Anfrage. Betrifft die Anfrage stattdessen andere Daten (z. B. andere Datentypen oder einen anderen Zeitraum), müssen Sie sie als neue Anfrage betrachten, und das Recht auf eine kostenlose Kopie gilt erneut (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 28). Ich glaube, dass dies hier der Fall ist.][has:reasoning>{reasoning}]`, 'excessive::you-said-that::issue': `das Unternehmen [controller_refuses>sich geweigert hat, aufgrund meiner Anfrage tätig zu werden][controller_wants_to_charge>eine Gebühr für Deine Anfrage erheben will].`, 'excessive::you-said-that::meta': `[controller_gave_no_reasoning>Du hast gesagt, dass das Unternehmen keinen Grund angegeben hat.][first_request>Du hast gesagt, dass dies Deine erste Anfrage an das Unternehmen war.][additional_copy_no_prior_request>Du hast gesagt, dass das Unternehmen behauptet, Du würdest eine weitere Kopie Deiner Daten beantragen, obwohl dies in Wirklichkeit Deine erste Anfrage an das Unternehmen ist.][concerns_different_data>Du hast gesagt, dass das Unternehmen behauptet, Du würdest eine weitere Kopie Deiner Daten beantragen, obwohl Du der Meinung bist, dass sich Deine Anfrage auf andere Daten bezieht.][has:reasoning>Du hast Deine eigene Begründung angegeben: „{reasoning}“]`, 'excessive::complaint::persists': `[controller_refuses>Die Verantwortliche hat sich geweigert, aufgrund meiner Anfrage tätig zu werden.][controller_wants_to_charge>Die Verantwortliche will eine Gebühr für meine Anfrage erheben.] Nach Art. 12 Abs. 5 DSGVO darf sie das nur im Falle offenkundig unbegründeter oder exzessiver Anfragen[controller_gave_no_reasoning> und sie hat den Nachweis für den offenkundig unbegründeten oder exzessiven Charakter der Anfrage zu erbringen. Das hat sie nicht getan].[controller_wants_to_charge> Alternativ könnte sie nach Art. 15 Abs. 3 DSGVO eine Gebühr für weitere Kopien meiner Daten, die ich beantragt habe, erheben.] -Ich glaube nicht, dass die Verantwortliche [controller_refuses>sich weigern kann, aufgrund meiner Anfrage tätig zu werden][controller_wants_to_charge>eine Gebühr für meine Anfrage erheben kann][controller_gave_no_reasoning> und sie hat auch keine Gegenargumente vorgebracht]. [first_request>Dies ist die erste Anfrage, die ich jemals an die Verantwortliche gerichtet habe. Daher ist für mich nicht ersichtlich, inwiefern sie als unbegründet oder exzessiv angesehen werden könnte. Die Verantwortliche kann auch niemals eine Gebühr für die erste Kopie erheben, unabhängig davon, ob sie deren Anfertigung für zu teuer hält (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 22).][additional_copy_no_prior_request>Ich habe der Verantwortlichen noch nie eine Anfrage geschickt. Es ist daher nicht ersichtlich, wie ich eine zusätzliche Kopie meiner Daten beantragen könnte. Sie kann für die erste Kopie niemals eine Gebühr erheben, unabhängig davon, ob sie die Kosten für die Erstellung der Kopie für zu hoch hält (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 22).][concerns_different_data>Die Verantwortliche behauptet, ich würde eine zusätzliche Kopie meiner Daten beantragen. Dies würde jedoch nur dann zutreffen, wenn sich diese Anfrage auf dieselben Daten bezöge wie meine vorherige Anfrage. Betrifft die Anfrage stattdessen andere Daten (z. B. andere Datentypen oder einen anderen Zeitraum), muss die Verantwortliche sie als neue Anfrage betrachten, und das Recht auf eine kostenlose Kopie gilt erneut (vgl. Europäischer Datenschutzausschuss, „Guidelines 01/2022 on data subject rights - Right of access“, Version 1.0, Rn. 28). Ich glaube, dass dies hier der Fall ist.][has:reasoning>{reasoning}]`, +Ich glaube nicht, dass die Verantwortliche [controller_refuses>sich weigern kann, aufgrund meiner Anfrage tätig zu werden][controller_wants_to_charge>eine Gebühr für meine Anfrage erheben kann][controller_gave_no_reasoning> und sie hat auch keine Gegenargumente vorgebracht]. [first_request>Dies ist die erste Anfrage, die ich jemals an die Verantwortliche gerichtet habe. Daher ist für mich nicht ersichtlich, inwiefern sie als unbegründet oder exzessiv angesehen werden könnte. Die Verantwortliche kann auch niemals eine Gebühr für die erste Kopie erheben, unabhängig davon, ob sie deren Anfertigung für zu teuer hält (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 22).][additional_copy_no_prior_request>Ich habe der Verantwortlichen noch nie eine Anfrage geschickt. Es ist daher nicht ersichtlich, wie ich eine zusätzliche Kopie meiner Daten beantragen könnte. Sie kann für die erste Kopie niemals eine Gebühr erheben, unabhängig davon, ob sie die Kosten für die Erstellung der Kopie für zu hoch hält (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 22).][concerns_different_data>Die Verantwortliche behauptet, ich würde eine zusätzliche Kopie meiner Daten beantragen. Dies würde jedoch nur dann zutreffen, wenn sich diese Anfrage auf dieselben Daten bezöge wie meine vorherige Anfrage. Betrifft die Anfrage stattdessen andere Daten (z. B. andere Datentypen oder einen anderen Zeitraum), muss die Verantwortliche sie als neue Anfrage betrachten, und das Recht auf eine kostenlose Kopie gilt erneut (vgl. Europäischer Datenschutzausschuss, „Leitlinien 01/2022 zu den Rechten der betroffenen Person – Auskunftsrecht“, Version 2.0, Rn. 28). Ich glaube, dass dies hier der Fall ist.][has:reasoning>{reasoning}]`, 'excessive::complaint::resolved': `[controller_refuses>Die Verantwortliche hatte sich ursprünglich geweigert, aufgrund meiner Anfrage tätig zu werden.][controller_wants_to_charge>Die Verantwortliche wollte ursprünglich eine Gebühr für meine Anfrage erheben.] Nach Art. 12 Abs. 5 DSGVO darf sie das nur im Falle offenkundig unbegründeter oder exzessiver Anfragen. [controller_wants_to_charge> Alternativ könnte sie nach Art. 15 Abs. 3 DSGVO eine Gebühr für weitere Kopien meiner Daten, die ich beantragt habe, erheben.] Dies war hier nicht der Fall. Diese Angelegenheit wurde inzwischen geklärt.`, 'overdue::admonition': `Sie haben meine Anfrage noch nicht beantwortet. Nach Art. 12 Abs. 3 DSGVO haben Sie einen Monat nach Eingang meiner Anfrage Zeit, um diese zu beantworten. Ich habe meine Anfrage am {request_date} abgeschickt, was bedeutet, dass Sie diese Frist überschritten haben. Nach Art. 12 Abs. 3 DSGVO kann die Frist nur dann um weitere zwei Monate verlängert werden, wenn dies erforderlich ist und Sie mich über die Fristverlängerung und deren Gründe informieren. [no_information_about_extension>Das haben Sie nicht getan.][has:reasoning>Der Grund, den Sie für die Verlängerung angegeben haben, ist meiner Meinung nach nicht akzeptabel: {reasoning}][more_than_three_months> @@ -163,47 +163,47 @@ I am of the opinion that the data I have already provided in my request is suffi I am of the opinion that the data I have already provided in my request is sufficient to identify me and that the controller can thus not require me to provide any additional data.[has:reasoning> {reasoning}][concerns_online_account> My request concerns an online account. Recital 64 GDPR explains that online identifiers should be used for identification.]`, 'additional-id::complaint::resolved': `The controller had initially refused to answer my request unless I provide additional identification data, violating Art. 12(6) GDPR. This issue has since been resolved.`, - 'id-copy::admonition': `You have refused to answer my request until I provide a copy of an identity document. Please note that providing a copy of an identity document is an invasive measure that creates a risk for the security of my personal data, and is as such only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 73).[user_objects> I do not believe that this is the case for my request.] -[not_linked_to_real_life_identity>My request concerns data that is not linked to my real-life identity. As such, it is not apparent how providing a copy of an identity document would help you in authenticating my request.][concerns_online_account>My request concerns an online account, which means that a better and less intrusive authentication procedure already exists (cf. Recital 64 GDPR). Consequently, it is disproportionate to require a copy of an identity document (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 72).][has:reasoning> -{reasoning}][ask_about_redactions>I am willing to provide a redacted copy of an identity document for this request but unfortunately you have not told me which information is necessary for confirming my identity. According to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 75). Please tell me which information you deem necessary so I can redact the rest. + 'id-copy::admonition': `You have refused to answer my request until I provide a copy of an identity document. Please note that providing a copy of an identity document is an invasive measure that creates a risk for the security of my personal data, and is as such only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 74).[user_objects> I do not believe that this is the case for my request.] +[not_linked_to_real_life_identity>My request concerns data that is not linked to my real-life identity. As such, it is not apparent how providing a copy of an identity document would help you in authenticating my request.][concerns_online_account>My request concerns an online account, which means that a better and less intrusive authentication procedure already exists (cf. Recital 64 GDPR). Consequently, it is disproportionate to require a copy of an identity document (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 73).][has:reasoning> +{reasoning}][ask_about_redactions>I am willing to provide a redacted copy of an identity document for this request but unfortunately you have not told me which information is necessary for confirming my identity. According to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 76). Please tell me which information you deem necessary so I can redact the rest. -I also want to point out in advance that storing the copy of my identity document longer than is necessary for verifying my identity for this request is an infringement of the GDPR considering the principles of storage and purpose limitation (Art. 5(1)(b) and (e) GDPR). The European Data Protection Board recommends making a note that you have verified my identity document and then immediately deleting the copy (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 78).][controller_requires_unredacted>I am willing to provide a copy of an identity document with the necessary information to identify me for this request but unfortunately you have told me that you only accept unredacted copies. Requiring an unredacted copy on an identify document is only legal in very narrow circumstances which I don’t think are met in this case. According to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 75). Please tell me which information you deem necessary so I can redact the rest. +I also want to point out in advance that storing the copy of my identity document longer than is necessary for verifying my identity for this request is an infringement of the GDPR considering the principles of storage and purpose limitation (Art. 5(1)(b) and (e) GDPR). The European Data Protection Board recommends making a note that you have verified my identity document and then immediately deleting the copy (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 79).][controller_requires_unredacted>I am willing to provide a copy of an identity document with the necessary information to identify me for this request but unfortunately you have told me that you only accept unredacted copies. Requiring an unredacted copy on an identify document is only legal in very narrow circumstances which I don’t think are met in this case. According to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 76). Please tell me which information you deem necessary so I can redact the rest. -As a precaution, I also want to already point out that storing the copy of my identity document longer than is necessary for verifying my identity for this request is an infringement of the GDPR considering the principles of storage and purpose limitation (Art. 5(1)(b) and (e) GDPR). The European Data Protection Board recommends making a note that you have verified my identity document and then immediately deleting the copy (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 78).]`, +As a precaution, I also want to already point out that storing the copy of my identity document longer than is necessary for verifying my identity for this request is an infringement of the GDPR considering the principles of storage and purpose limitation (Art. 5(1)(b) and (e) GDPR). The European Data Protection Board recommends making a note that you have verified my identity document and then immediately deleting the copy (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 79).]`, 'id-copy::you-said-that::issue': `the company refused to answer your request until you provide a[controller_requires_unredacted>n unredacted] copy of an identity document.`, 'id-copy::you-said-that::meta': `[user_objects>You said you don’t believe that asking for an ID copy was appropriate for this request for the following reason: ][not_linked_to_real_life_identity>Your request concerns data that is not linked to your real-life identity.][concerns_online_account>Your request concerns an online account.][has:reasoning>“{reasoning}”][controller_requires_unredacted>You said that the company required you to submit an unredated ID copy for the request.]`, - 'id-copy::complaint::persists': `The controller has refused to answer my request unless I provide a copy of an identity document. According to the European Data Protection Board, this is only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 73).[user_objects> I do not believe that this is the case for my request.] -[not_linked_to_real_life_identity>My request concerns data that is not linked to my real-life identity. As such, it is not apparent how providing a copy of an identity document would help the controller in authenticating my request.][concerns_online_account>My request concerns an online account, which means that a better and less intrusive authentication procedure already exists (cf. Recital 64 GDPR). Consequently, it is disproportionate to require a copy of an identity document (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 72).][has:reasoning> -{reasoning}][controller_requires_unredacted>I am willing to provide a copy of an identity document with the necessary information to identify me for this request but unfortunately the controller has told me that they only accept unredacted copies. But according to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 75).]`, - 'id-copy::complaint::resolved': `[user_objects>The controller had initially refused to answer my request unless I provide a copy of an identity document, which, according to the European Data Protection Board, is only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 73).][controller_requires_unredacted>The controller had initially refused to answer my request unless I provide an unredacted copy of an identity document, but according to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 75).] This issue has since been resolved.`, + 'id-copy::complaint::persists': `The controller has refused to answer my request unless I provide a copy of an identity document. According to the European Data Protection Board, this is only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 74).[user_objects> I do not believe that this is the case for my request.] +[not_linked_to_real_life_identity>My request concerns data that is not linked to my real-life identity. As such, it is not apparent how providing a copy of an identity document would help the controller in authenticating my request.][concerns_online_account>My request concerns an online account, which means that a better and less intrusive authentication procedure already exists (cf. Recital 64 GDPR). Consequently, it is disproportionate to require a copy of an identity document (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 73).][has:reasoning> +{reasoning}][controller_requires_unredacted>I am willing to provide a copy of an identity document with the necessary information to identify me for this request but unfortunately the controller has told me that they only accept unredacted copies. But according to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 76).]`, + 'id-copy::complaint::resolved': `[user_objects>The controller had initially refused to answer my request unless I provide a copy of an identity document, which, according to the European Data Protection Board, is only appropriate if strictly necessary, suitable, and in line with national law (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 74).][controller_requires_unredacted>The controller had initially refused to answer my request unless I provide an unredacted copy of an identity document, but according to the European Data Protection Board, generally, the date of issue or expiry date, the issuing authority and the full name are sufficient, and all other information should be redacted (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 76).] This issue has since been resolved.`, - 'wrong-medium::admonition': `You have refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through your web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] Please be aware that the GDPR doesn’t allow you to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50). [wrong_transport_medium>This includes requiring requests to be sent via a particular transport medium (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 52).][not_form>This means that while you can offer such a self-service tool or web form for requests, you still have to comply with requests sent via other means (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, paras. 53, 136).][wrong_contact>While you are indeed not required to answer requests sent to random contacts not involved in the matter, you cannot only answer requests sent to a particular point of contact, either (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, paras. 55 et seq.).][wrong_contact_customer_service> I sent my request to your regular customer service/support contact. It is reasonable to expect you to correctly forward my request internally.][wrong_contact_privacy> I sent my request to the privacy contact you specified in your privacy policy. This is obviously a reasonable point of contact for such requests. If necessary, you should forward them to the correct person or department internally.][wrong_contact_dpo> I sent my request to your data protection officer, as specified in your privacy policy. Regardless of whether your data protection officer is tasked with responding to data subject requests, this is a reasonable point of contact for such requests. If necessary, you should forward them to the correct person or department internally.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, + 'wrong-medium::admonition': `You have refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through your web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] Please be aware that the GDPR doesn’t allow you to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50). [wrong_transport_medium>This includes requiring requests to be sent via a particular transport medium (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 52).][not_form>This means that while you can offer such a self-service tool or web form for requests, you still have to comply with requests sent via other means (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, paras. 53, 138).][wrong_contact>While you are indeed not required to answer requests sent to random contacts not involved in the matter, you cannot only answer requests sent to a particular point of contact, either (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, paras. 55 et seq.).][wrong_contact_customer_service> I sent my request to your regular customer service/support contact. It is reasonable to expect you to correctly forward my request internally.][wrong_contact_privacy> I sent my request to the privacy contact you specified in your privacy policy. This is obviously a reasonable point of contact for such requests. If necessary, you should forward them to the correct person or department internally.][wrong_contact_dpo> I sent my request to your data protection officer, as specified in your privacy policy. Regardless of whether your data protection officer is tasked with responding to data subject requests, this is a reasonable point of contact for such requests. If necessary, you should forward them to the correct person or department internally.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, 'wrong-medium::you-said-that::issue': `the company refused to answer your request because you sent it to the wrong contact or via the wrong medium.`, 'wrong-medium::you-said-that::meta': `You said that the company refused to answer your request because [wrong_transport_medium>it was not sent via {medium}.][not_form>you didn’t send it through their web form/self-service tool.][wrong_contact>it was sent to the wrong contact.] [wrong_contact_customer_service> You said that you sent your request to their regular customer service/support contact.][wrong_contact_privacy> You said that you sent your request to the privacy contact.][wrong_contact_dpo> You said that you sent your request to the data protection officer.][has:wrong_contact_reasoning> You said that the point of contact you sent your request to was reasonable for the following reason: “{wrong_contact_reasoning}”]`, - 'wrong-medium::complaint::persists': `The controller has refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through their web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] The GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50). [wrong_transport_medium>This includes requiring requests to be sent via a particular transport medium (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 52).][not_form>This includes requiring requests to be sent through a particular web form/self-service tool (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, paras. 53, 136).][wrong_contact>While I acknowledge that controllers are not required to answer requests sent to random contacts not involved in the matter, they cannot only answer requests sent to a particular point of contact, either (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, paras. 55 et seq.).][wrong_contact_customer_service> I sent my request to the controller’s regular customer service/support contact. It is reasonable to expect them to correctly forward my request internally.][wrong_contact_privacy> I sent my request to the privacy contact specified in the controller’s privacy policy. This is obviously a reasonable point of contact for such requests. If necessary, they should forward them to the correct person or department internally.][wrong_contact_dpo> I sent my request to the controller’s data protection officer, as specified in their privacy policy. Regardless of whether their data protection officer is tasked with responding to data subject requests, this is a reasonable point of contact for such requests. If necessary, they should forward them to the correct person or department internally.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, - 'wrong-medium::complaint::resolved': `The controller had initially refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through their web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] But the GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50). This issue has since been resolved.`, + 'wrong-medium::complaint::persists': `The controller has refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through their web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] The GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50). [wrong_transport_medium>This includes requiring requests to be sent via a particular transport medium (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 52).][not_form>This includes requiring requests to be sent through a particular web form/self-service tool (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, paras. 53, 138).][wrong_contact>While I acknowledge that controllers are not required to answer requests sent to random contacts not involved in the matter, they cannot only answer requests sent to a particular point of contact, either (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, paras. 55 et seq.).][wrong_contact_customer_service> I sent my request to the controller’s regular customer service/support contact. It is reasonable to expect them to correctly forward my request internally.][wrong_contact_privacy> I sent my request to the privacy contact specified in the controller’s privacy policy. This is obviously a reasonable point of contact for such requests. If necessary, they should forward them to the correct person or department internally.][wrong_contact_dpo> I sent my request to the controller’s data protection officer, as specified in their privacy policy. Regardless of whether their data protection officer is tasked with responding to data subject requests, this is a reasonable point of contact for such requests. If necessary, they should forward them to the correct person or department internally.][has:wrong_contact_reasoning> {wrong_contact_reasoning}]`, + 'wrong-medium::complaint::resolved': `The controller had initially refused to answer my request [wrong_transport_medium>because it was not sent via {medium}.][not_form>unless I send it through their web form/self-service tool.][wrong_contact>claiming that it was sent to the wrong contact.] But the GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50). This issue has since been resolved.`, - 'signature::admonition': `You have refused to answer my request unless I sign it. Please be aware that the GDPR doesn’t allow you to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50). A signature can also not be used for authentication or identification.[not:signature_on_file> This is especially true since I have never provided you with my signature in the first place, so you have nothing you could even compare my signature against.]`, + 'signature::admonition': `You have refused to answer my request unless I sign it. Please be aware that the GDPR doesn’t allow you to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50). A signature can also not be used for authentication or identification.[not:signature_on_file> This is especially true since I have never provided you with my signature in the first place, so you have nothing you could even compare my signature against.]`, 'signature::you-said-that::issue': `the company refused to answer your request unless you sign it.`, 'signature::you-said-that::meta': `[not:signature_on_file>You said that the company doesn’t have your signature on file.][signature_on_file>You said that the company may have your signature on file.]`, - 'signature::complaint::persists': `The controller has refused to answer my request unless I sign it. The GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50). A signature can also not be used for authentication or identification.[not:signature_on_file> This is especially true since I have never provided them with my signature in the first place, so they have nothing they could even compare my signature against.]`, - 'signature::complaint::resolved': `The controller had initially refused to answer my request unless I sign it. But the GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 50), and a signature can also not be used for authentication or identification[not:signature_on_file>, especially since I have never even provided the controller with a signature that they could compare against]. This issue has since been resolved.`, + 'signature::complaint::persists': `The controller has refused to answer my request unless I sign it. The GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50). A signature can also not be used for authentication or identification.[not:signature_on_file> This is especially true since I have never provided them with my signature in the first place, so they have nothing they could even compare my signature against.]`, + 'signature::complaint::resolved': `The controller had initially refused to answer my request unless I sign it. But the GDPR doesn’t allow controllers to impose any additional formal requirements on requests (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 50), and a signature can also not be used for authentication or identification[not:signature_on_file>, especially since I have never even provided the controller with a signature that they could compare against]. This issue has since been resolved.`, - 'other-language::admonition': `You have answered my request in {response_language}, even though my request was in {request_language}.[user_does_not_understand_response_language> I cannot understand your response in {response_language}.] According to Art. 12(1) GDPR, you have to provide communication related to requests in “easily accessible form, using clear and plain language”. According to the European Data Protection Board: “A controller that offers a service in a country should also offer answers in the language that is understood by the data subjects in that country.” (European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 140) + 'other-language::admonition': `You have answered my request in {response_language}, even though my request was in {request_language}.[user_does_not_understand_response_language> I cannot understand your response in {response_language}.] According to Art. 12(1) GDPR, you have to provide communication related to requests in “easily accessible form, using clear and plain language”. According to the European Data Protection Board: “A controller that offers a service in a country should also offer answers in the language that is understood by the data subjects in that country.” (European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 142) Please respond to my request in {request_language} instead.`, 'other-language::you-said-that::issue': `the company responded to your request in a different language.`, 'other-language::you-said-that::meta': `You said that the company responded in {response_language} to your request in {request_language}. You said that you[user_does_not_understand_response_language> don’t] understand the company’s response in {response_language}.`, - 'other-language::complaint::persists': `The controller has answered my request in {response_language}, even though my request was in {request_language}.[user_does_not_understand_response_language> I cannot understand the controller’s response in {response_language}.] According to Art. 12(1) GDPR, they have to provide communication related to requests in “easily accessible form, using clear and plain language”. According to the European Data Protection Board: “A controller that offers a service in a country should also offer answers in the language that is understood by the data subjects in that country.” (European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 140)`, + 'other-language::complaint::persists': `The controller has answered my request in {response_language}, even though my request was in {request_language}.[user_does_not_understand_response_language> I cannot understand the controller’s response in {response_language}.] According to Art. 12(1) GDPR, they have to provide communication related to requests in “easily accessible form, using clear and plain language”. According to the European Data Protection Board: “A controller that offers a service in a country should also offer answers in the language that is understood by the data subjects in that country.” (European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 142)`, 'other-language::complaint::resolved': `The controller had initially answered my request in {response_language}, even though my request was in {request_language}[user_does_not_understand_response_language> and I couldn’t understand the controller’s response in {response_language}]. This issue has since been resolved.`, 'excessive::admonition': `[controller_refuses>You have refused to act on my request.][controller_wants_to_charge>You want to charge a fee for my request.] According to Art. 12(5) GDPR, you can only do that for manifestly unfounded or excessive requests[controller_gave_no_reasoning> and you bear the burden of demonstrating the manifestly unfounded or excessive character of my request. You have not done that].[controller_wants_to_charge> Alternatively, you could charge a fee based on Art. 15(3) GDPR for further copies that I have requested.] -I don’t believe that you can [controller_refuses>refuse to act on my request][controller_wants_to_charge>charge me for my request] in this case[controller_gave_no_reasoning> and you have not argued to the contrary]. [first_request>This is the first request I have ever sent to you. As such, it is not apparent to me how it could possibly be considered unfounded or excessive. You can also never charge a fee for the first copy, regardless of whether you consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 22).][additional_copy_no_prior_request>I have never sent you a request before. As such, it is not apparent how I could be asking for an additional copy of my data. You can never charge a fee for the first copy, regardless of whether you consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 22).][concerns_different_data>You claim that I am asking for an additional copy of my data. However, this would only apply if this request concerned the same data as my previous request. If the request instead concerns different data (e.g. different data types or a different timeframe), you have to consider it a new request and the right to a free copy applies again (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 28). I believe that to be the case here.][has:reasoning>{reasoning}]`, +I don’t believe that you can [controller_refuses>refuse to act on my request][controller_wants_to_charge>charge me for my request] in this case[controller_gave_no_reasoning> and you have not argued to the contrary]. [first_request>This is the first request I have ever sent to you. As such, it is not apparent to me how it could possibly be considered unfounded or excessive. You can also never charge a fee for the first copy, regardless of whether you consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 22).][additional_copy_no_prior_request>I have never sent you a request before. As such, it is not apparent how I could be asking for an additional copy of my data. You can never charge a fee for the first copy, regardless of whether you consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 22).][concerns_different_data>You claim that I am asking for an additional copy of my data. However, this would only apply if this request concerned the same data as my previous request. If the request instead concerns different data (e.g. different data types or a different timeframe), you have to consider it a new request and the right to a free copy applies again (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 28). I believe that to be the case here.][has:reasoning>{reasoning}]`, 'excessive::you-said-that::issue': `the company [controller_refuses>refused to act on your request][controller_wants_to_charge>wants to charge a fee for your request].`, 'excessive::you-said-that::meta': `[controller_gave_no_reasoning>You said that the company didn’t give a reason.][first_request>You said that this was your first request to the company.][additional_copy_no_prior_request>You said that the company claimed you were asking for an additional copy of your data, but this was in fact your first request to them.][concerns_different_data>You said that the company claimed you were asking for an additional copy of your data, but you believe you were asking for different data.][has:reasoning>You gave your own reasoning: “{reasoning}”]`, 'excessive::complaint::persists': `[controller_refuses>The controller refused to act on my request.][controller_wants_to_charge>The controller wants to charge a fee for my request.] According to Art. 12(5) GDPR, they can only do that for manifestly unfounded or excessive requests[controller_gave_no_reasoning> and they bear the burden of demonstrating the manifestly unfounded or excessive character of my request. They have not done that].[controller_wants_to_charge> Alternatively, they could charge a fee based on Art. 15(3) GDPR for further copies that I have requested.] -I don’t believe that they can [controller_refuses>refuse to act on my request][controller_wants_to_charge>charge me for my request] in this case[controller_gave_no_reasoning> and they have not argued to the contrary]. [first_request>This is the first request I have ever sent to the controller. As such, it is not apparent to me how it could possibly be considered unfounded or excessive. The controller can also never charge a fee for the first copy, regardless of whether they consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 22).][additional_copy_no_prior_request>I have never sent a request to the controller before. As such, it is not apparent how I could be asking for an additional copy of my data. The controller can never charge a fee for the first copy, regardless of whether they consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 22).][concerns_different_data>The controller claims that I am asking for an additional copy of my data. However, this would only apply if this request concerned the same data as my previous request. If the request instead concerns different data (e.g. different data types or a different timeframe), you have to consider it a new request and the right to a free copy applies again (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 1.0, para. 28). I believe that to be the case here.][has:reasoning>{reasoning}]`, +I don’t believe that they can [controller_refuses>refuse to act on my request][controller_wants_to_charge>charge me for my request] in this case[controller_gave_no_reasoning> and they have not argued to the contrary]. [first_request>This is the first request I have ever sent to the controller. As such, it is not apparent to me how it could possibly be considered unfounded or excessive. The controller can also never charge a fee for the first copy, regardless of whether they consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 22).][additional_copy_no_prior_request>I have never sent a request to the controller before. As such, it is not apparent how I could be asking for an additional copy of my data. The controller can never charge a fee for the first copy, regardless of whether they consider the cost of producing it to be too high (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 22).][concerns_different_data>The controller claims that I am asking for an additional copy of my data. However, this would only apply if this request concerned the same data as my previous request. If the request instead concerns different data (e.g. different data types or a different timeframe), you have to consider it a new request and the right to a free copy applies again (cf. European Data Protection Board, “Guidelines 01/2022 on data subject rights - Right of access”, Version 2.1, para. 28). I believe that to be the case here.][has:reasoning>{reasoning}]`, 'excessive::complaint::resolved': `[controller_refuses>The controller had initially refused to act on my request.][controller_wants_to_charge>The controller had initially wanted to charge a fee for my request.] According to Art. 12(5) GDPR, they can only do that for manifestly unfounded or excessive requests.[controller_wants_to_charge> Alternatively, they could charge a fee based on Art. 15(3) GDPR for further copies that I have requested.] This was not the case here. This issue has since been resolved.`, 'overdue::admonition': `You have not answered my request yet. According to Art. 12(3) GDPR, you have one month from the receipt of my request to answer it. I sent my request on {request_date}, which means that you have exceeded that period. According to Art. 12(3) GDPR, the period can be extended for an additional two months only if necessary and if you inform me of the extension and its reason. [no_information_about_extension>You have not done that.][has:reasoning>The reason you gave for the extension is not acceptable in my opinion: {reasoning}][more_than_three_months> diff --git a/src/Components/RequestList.tsx b/src/Components/RequestList.tsx index b7b1f2ab2..4df6bfc68 100644 --- a/src/Components/RequestList.tsx +++ b/src/Components/RequestList.tsx @@ -4,7 +4,7 @@ import { useAppStore } from '../store/app'; import { FeatureDisabledWidget } from './FeatureDisabledWidget'; import t from '../Utility/i18n'; import { Privacy, PRIVACY_ACTIONS } from '../Utility/Privacy'; -import { iconClassForTransportMedium, icsFromProceedings } from '../Utility/requests'; +import { iconClassForTransportMedium, icsFromProceedings, isCompletedProceedingStatus } from '../Utility/requests'; import { compareMessage, getGeneratedMessage, @@ -12,7 +12,7 @@ import { getNewestMessage, useProceedingsStore, } from '../store/proceedings'; -import type { Proceeding, Message } from '../types/proceedings'; +import type { Proceeding, Message, ProceedingStatus } from '../types/proceedings'; import type { RequestType } from '../types/request.d'; import { useModal } from './Modal'; import { MessageMetadataInput } from './MessageMetadataInput'; @@ -27,15 +27,22 @@ type RequestListProps = { getBlobFromStorage?: (blobId: string) => Promise; /** Function to execute when the 'React' button is clicked. */ onReact?: (reference: string) => void; + /** The order in which to show the requests (default: `new-to-old`). */ + sortOrder?: 'new-to-old' | 'old-to-new'; }; export const RequestList = (props: RequestListProps) => { const proceedings = useProceedingsStore((state) => state.proceedings); const clearProceedings = useProceedingsStore((state) => state.clearProceedings); + const removeProceeding = useProceedingsStore((state) => state.removeProceeding); + const [setProceedingStatus, reactivateProceeding] = useProceedingsStore((state) => [ + state.setProceedingStatus, + state.reactivateProceeding, + ]); const [selectedRequestIds, setSelectedRequestIds] = useState([]); const [selectionMode, setSelectionMode] = useState(false); - const sortedRequestIds = useMemo( + const sortedRequestIdsOldToNew = useMemo( () => Object.keys(proceedings).sort((a, b) => { const req_a = Object.values(proceedings[a].messages)[0]; @@ -45,11 +52,12 @@ export const RequestList = (props: RequestListProps) => { }), [proceedings] ); + const sortedRequestIdsNewToOld = useMemo(() => [...sortedRequestIdsOldToNew].reverse(), [sortedRequestIdsOldToNew]); const buildCsv = useCallback(() => { const csv = 'date;slug;recipient;email;reference;type;via\r\n' + - sortedRequestIds + sortedRequestIdsOldToNew .filter((id) => selectedRequestIds.includes(id)) .map((id) => Object.values(proceedings[id].messages).reduce( @@ -71,17 +79,34 @@ export const RequestList = (props: RequestListProps) => { .join(''); return new Blob([csv], { type: 'text/csv;charset=utf-8' }); - }, [proceedings, selectedRequestIds, sortedRequestIds]); + }, [proceedings, selectedRequestIds, sortedRequestIdsOldToNew]); const buildIcs = useCallback( () => icsFromProceedings( - sortedRequestIds.reduce( + sortedRequestIdsOldToNew.reduce( (acc, id) => (selectedRequestIds.includes(id) ? [...acc, proceedings[id]] : acc), [] ) ), - [proceedings, selectedRequestIds, sortedRequestIds] + [proceedings, selectedRequestIds, sortedRequestIdsOldToNew] + ); + + const deleteSelected = useCallback(() => { + for (const reference of selectedRequestIds) removeProceeding(reference); + + setSelectedRequestIds([]); + setSelectionMode(false); + }, [selectedRequestIds, removeProceeding]); + + const changeSelectedStatus = useCallback( + (status: ProceedingStatus | 'reactivate') => { + for (const reference of selectedRequestIds) { + if (status === 'reactivate') reactivateProceeding(reference); + else setProceedingStatus(reference, status); + } + }, + [selectedRequestIds, setProceedingStatus, reactivateProceeding] ); if (!Privacy.isAllowed(PRIVACY_ACTIONS.SAVE_MY_REQUESTS)) { @@ -147,15 +172,17 @@ export const RequestList = (props: RequestListProps) => { onClick={() => { setSelectionMode(true); setSelectedRequestIds( - selectedRequestIds.length === sortedRequestIds.length + selectedRequestIds.length === sortedRequestIdsOldToNew.length ? [] - : sortedRequestIds + : sortedRequestIdsOldToNew ); }} title={t('more-options', 'my-requests')}> @@ -177,6 +204,37 @@ export const RequestList = (props: RequestListProps) => { style="margin-right: 10px;"> + + + + )}
@@ -184,31 +242,33 @@ export const RequestList = (props: RequestListProps) => { )}
)} @@ -297,6 +357,13 @@ export const ProceedingRow = (props: ProceedingRowProps) => { const locale_country = country.toUpperCase(); const date_locale = locale_country === 'ALL' ? savedLocale : `${savedLocale}-${locale_country}`; + const companyName = getNameFromMesssage( + original_request, + + + + ); + return ( <> @@ -310,11 +377,12 @@ export const ProceedingRow = (props: ProceedingRowProps) => { style="float: right;" /> )} - {getNameFromMesssage( - original_request, - - - + {original_request?.slug ? ( + + {companyName} + + ) : ( + companyName )}
{index === Object.keys(props.proceeding.messages).length - 1 && ( <> - {props.proceeding.status !== 'done' && ( + {!isCompletedProceedingStatus(props.proceeding.status) ? ( { }}> - )} - {props.proceeding.status === 'done' && ( + ) : (