<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>8</buildNumber><marked><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><branch><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><branch><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><branch><SHA1>b1a7c4026f44521453558a428303a0537697beda</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'><environment><GIT_SHA>b1a7c40</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/8-b1a7c40</RELEASE_DIR><RELEASE_ID>8-b1a7c40</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/8/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/8/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/8/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Checkout</restartableStage><restartableStage>Guard: main only</restartableStage><restartableStage>Ship source to target</restartableStage><restartableStage>Build, health-check and swap</restartableStage><restartableStage>Smoke test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#8 b1a7c40</displayName><duration>26057</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #8 b1a7c40</fullDisplayName><id>8</id><keepLog>false</keepLog><number>8</number><queueId>5457</queueId><result>SUCCESS</result><timestamp>1785232726165</timestamp><url>https://jenkins.younex.de/job/blut24-landing/8/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.env.example</affectedPath><affectedPath>app/components/RegistrationForm.vue</affectedPath><affectedPath>nuxt.config.ts</affectedPath><commitId>b1a7c4026f44521453558a428303a0537697beda</commitId><timestamp>1785232713000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>registration: the FORM also has to know about the test domains

A whitelisted address was still rejected with "Die Domain gehört nicht zu …".
The server accepted it — I had only ever tested the server with curl, which
bypasses the form entirely. The browser does its own domain check for instant
feedback and knew nothing about REGISTRATION_TEST_DOMAINS, so it blocked the
submit before the request was ever sent. Verified the wrong layer, missed the bug.

The list is now mirrored into runtimeConfig.public and consulted by both the
submit guard and the blur handler. Publishing it is acceptable: it is a temporary
operator feature (empty in real production) and a bypassed registration still has
to confirm a mail delivered to that domain, so knowing the name grants nothing.

The blur notice does NOT claim the domain "matches the Standort" — that would be
untrue. It says it is a test domain and that the registration is flagged for
manual approval.

Note the two-name trap, documented in .env.example: REGISTRATION_TEST_DOMAINS is
read server-side, NUXT_PUBLIC_REGISTRATION_TEST_DOMAINS by the browser. Set both
or the form and the server disagree — which is exactly this bug.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 11:58:33 +0200</date><id>b1a7c4026f44521453558a428303a0537697beda</id><msg>registration: the FORM also has to know about the test domains</msg><path><editType>edit</editType><file>app/components/RegistrationForm.vue</file></path><path><editType>edit</editType><file>nuxt.config.ts</file></path><path><editType>edit</editType><file>.env.example</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit><inProgress>false</inProgress><nextBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>9</buildNumber><marked><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><branch><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><branch><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><branch><SHA1>f182d455db3a8ce7361ae7d2e691c06efffe267b</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#9 f182d45</displayName><duration>26078</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #9 f182d45</fullDisplayName><id>9</id><keepLog>false</keepLog><number>9</number><queueId>5459</queueId><result>SUCCESS</result><timestamp>1785232906182</timestamp><url>https://jenkins.younex.de/job/blut24-landing/9/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/mail.ts</affectedPath><affectedPath>server/api/registration/submit.post.ts</affectedPath><affectedPath>app/components/RegistrationForm.vue</affectedPath><affectedPath>server/utils/registrationValidation.ts</affectedPath><commitId>f182d455db3a8ce7361ae7d2e691c06efffe267b</commitId><timestamp>1785232895000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>registration: switching type must not carry the other branch's data

Reported from real use: pick a clinic, switch to "Kurierdienst", register — and
the confirmation mail arrived as "Medizinischer Kurierdienst / Einrichtung:
Facharztklinik Hamburg / Anschrift: Martinistraße 78". There was no watcher on
form.type at all, so stoid/orgName/street/plz/city kept the clinic's values and
the courier branch submits those fields verbatim. Switching type now clears the
clinic selection, the address fields and the related errors.

Couriers may register with any address, freemail included — they are not tied to
a clinic domain and every courier registration is reviewed manually anyway. The
block stays for clinics, where the domain is what proves the registrant belongs
to the Standort they picked. Enforced on the server too, not just in the form.

The confirmation mail is now written per type: a courier is not a clinic, so it
gets its own description (orders on the phone, confirm pickup/delivery in the
app, free, manual review) and the detail row reads "Unternehmen" rather than
"Einrichtung". Both the HTML and the plain-text alternative.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 12:01:35 +0200</date><id>f182d455db3a8ce7361ae7d2e691c06efffe267b</id><msg>registration: switching type must not carry the other branch's data</msg><path><editType>edit</editType><file>server/api/registration/submit.post.ts</file></path><path><editType>edit</editType><file>server/utils/mail.ts</file></path><path><editType>edit</editType><file>app/components/RegistrationForm.vue</file></path><path><editType>edit</editType><file>server/utils/registrationValidation.ts</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>10</number><url>https://jenkins.younex.de/job/blut24-landing/10/</url></nextBuild><previousBuild><number>8</number><url>https://jenkins.younex.de/job/blut24-landing/8/</url></previousBuild></nextBuild><previousBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>7</buildNumber><marked><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#7 4476c9c</displayName><duration>26829</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #7 4476c9c</fullDisplayName><id>7</id><keepLog>false</keepLog><number>7</number><queueId>5453</queueId><result>SUCCESS</result><timestamp>1785228855796</timestamp><url>https://jenkins.younex.de/job/blut24-landing/7/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/SectionCourier.vue</affectedPath><affectedPath>app/components/SectionHowItWorks.vue</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>app/components/SiteFooter.vue</affectedPath><affectedPath>app/components/SectionRegistration.vue</affectedPath><affectedPath>app/components/SectionProof.vue</affectedPath><commitId>4476c9c4298767c7d1e75e392fda5233727c5d91</commitId><timestamp>1785228842000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>landing: copy pass — courier value proposition, step 4, spacing, footer

- Step 4 now says what actually happens: if the other clinic is on Blut24 too,
  order, delivery note and unit data stay inside the system with nothing retyped
  or faxed; DGTI-Lieferschein, PDF and e-mail remain available for houses that
  are not yet connected, rather than being the default path.
- Courier section rewritten around the app: orders arrive on the phone, pickup
  and delivery are confirmed there, and participation is free so a courier can
  win additional runs without buying software. Kept strictly to goods transport
  wording - no patient-transport terms.
- "dauerhaft kostenlos" -&gt; "für Kliniken kostenlos" everywhere.
- Tightened the gap between the header and the hero headline on both breakpoints.
- Dropped the Bundes-Klinik-Atlas source line from the footer.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 10:54:02 +0200</date><id>4476c9c4298767c7d1e75e392fda5233727c5d91</id><msg>landing: copy pass — courier value proposition, step 4, spacing, footer</msg><path><editType>edit</editType><file>app/components/SectionHowItWorks.vue</file></path><path><editType>edit</editType><file>app/components/SectionProof.vue</file></path><path><editType>edit</editType><file>app/components/SectionRegistration.vue</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/components/SectionCourier.vue</file></path><path><editType>edit</editType><file>app/components/SiteFooter.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>8</number><url>https://jenkins.younex.de/job/blut24-landing/8/</url></nextBuild><previousBuild><number>6</number><url>https://jenkins.younex.de/job/blut24-landing/6/</url></previousBuild></previousBuild></workflowRun>