<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>14</buildNumber><marked><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</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>49c9f2a</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/14-49c9f2a</RELEASE_DIR><RELEASE_ID>14-49c9f2a</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/14/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/14/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/14/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>#14 49c9f2a</displayName><duration>27282</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #14 49c9f2a</fullDisplayName><id>14</id><keepLog>false</keepLog><number>14</number><queueId>5471</queueId><result>SUCCESS</result><timestamp>1785247787466</timestamp><url>https://jenkins.younex.de/job/blut24-landing/14/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.env.example</affectedPath><affectedPath>server/utils/mail.ts</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>server/api/registration/submit.post.ts</affectedPath><affectedPath>server/api/registration/confirm.post.ts</affectedPath><affectedPath>app/components/SectionRegistration.vue</affectedPath><affectedPath>README.md</affectedPath><affectedPath>app/locales/en.ts</affectedPath><affectedPath>server/utils/registrationTypes.ts</affectedPath><affectedPath>app/locales/de.ts</affectedPath><affectedPath>scripts/test-registration.mjs</affectedPath><affectedPath>server/utils/registrationValidation.ts</affectedPath><affectedPath>app/composables/useRegistrationDialog.ts</affectedPath><affectedPath>server/utils/registrationDb.ts</affectedPath><affectedPath>server/utils/erpOnboarding.ts</affectedPath><affectedPath>app/components/RegistrationForm.vue</affectedPath><affectedPath>server/utils/i18n.ts</affectedPath><commitId>49c9f2a18725f35f7caed718f3cd9669ca7b5048</commitId><timestamp>1785247772000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Fixes
</comment><date>2026-07-28 16:09:32 +0200</date><id>49c9f2a18725f35f7caed718f3cd9669ca7b5048</id><msg>Fixes</msg><path><editType>edit</editType><file>server/api/registration/confirm.post.ts</file></path><path><editType>edit</editType><file>server/utils/erpOnboarding.ts</file></path><path><editType>edit</editType><file>app/components/RegistrationForm.vue</file></path><path><editType>edit</editType><file>app/locales/de.ts</file></path><path><editType>edit</editType><file>.env.example</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>README.md</file></path><path><editType>add</editType><file>server/utils/registrationTypes.ts</file></path><path><editType>edit</editType><file>server/utils/registrationDb.ts</file></path><path><editType>edit</editType><file>scripts/test-registration.mjs</file></path><path><editType>edit</editType><file>server/api/registration/submit.post.ts</file></path><path><editType>edit</editType><file>app/composables/useRegistrationDialog.ts</file></path><path><editType>edit</editType><file>app/locales/en.ts</file></path><path><editType>edit</editType><file>server/utils/i18n.ts</file></path><path><editType>edit</editType><file>server/utils/registrationValidation.ts</file></path><path><editType>edit</editType><file>server/utils/mail.ts</file></path><path><editType>edit</editType><file>app/components/SectionRegistration.vue</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>15</buildNumber><marked><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</SHA1><branch><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</SHA1><branch><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</SHA1><branch><SHA1>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</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>#15 49f3d63</displayName><duration>30604</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #15 49f3d63</fullDisplayName><id>15</id><keepLog>false</keepLog><number>15</number><queueId>5476</queueId><result>SUCCESS</result><timestamp>1785257388243</timestamp><url>https://jenkins.younex.de/job/blut24-landing/15/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/locales/de.ts</affectedPath><affectedPath>scripts/test-registration.mjs</affectedPath><affectedPath>server/api/registration/confirm.post.ts</affectedPath><affectedPath>server/utils/i18n.ts</affectedPath><affectedPath>app/locales/en.ts</affectedPath><affectedPath>README.md</affectedPath><commitId>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</commitId><timestamp>1785257378000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>registration: keep the manual-review promise — gate ERP onboarding on needs_manual_approval

HANDOFF §4 (ERP repo, reference/blut24/HANDOFF.md). needs_manual_approval gated
nothing: couriers and no-domain clinics — exactly the registrations nothing
could verify — were auto-onboarded into iDempiere with live credentials mailed,
while form, confirmation mail and welcome mail promised a manual review.
confirm.post.ts now skips onboarding for them and records erp_status
'manual-approval'; the operator provisions them by hand. Verified and test
registrations stay fully automatic.

Copy made truthful: the test-domain notice no longer claims "marked for manual
approval" (test domains auto-activate; they are marked internally as test
registrations), and the manual-review texts are courier-neutral instead of
explaining a clinic-only domain lookup.

alreadyConfirmed now returns credentialsSent, read from the stored ERP payload
(setErpResult persists it).

README: the ERP auth section described a Bearer scheme the code never uses —
the token travels as the logship_it cookie, and the ERP's send-credentials
route is now gated on exact equality with the instance's IDEMPIERETOKEN, so
ERP_SERVICE_TOKEN must be exactly that value.

test-registration.mjs: courier confirm asserts needsManualApproval,
credentialsSent=false and erp_status 'manual-approval' (83/83 green).

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 18:49:38 +0200</date><id>49f3d63e2f1169fda0b321572605cb5f9b6fcd5e</id><msg>registration: keep the manual-review promise — gate ERP onboarding on needs_manual_approval</msg><path><editType>edit</editType><file>scripts/test-registration.mjs</file></path><path><editType>edit</editType><file>app/locales/en.ts</file></path><path><editType>edit</editType><file>README.md</file></path><path><editType>edit</editType><file>app/locales/de.ts</file></path><path><editType>edit</editType><file>server/api/registration/confirm.post.ts</file></path><path><editType>edit</editType><file>server/utils/i18n.ts</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><previousBuild><number>14</number><url>https://jenkins.younex.de/job/blut24-landing/14/</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>13</buildNumber><marked><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</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>#13 595e2c4</displayName><duration>26227</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #13 595e2c4</fullDisplayName><id>13</id><keepLog>false</keepLog><number>13</number><queueId>5469</queueId><result>SUCCESS</result><timestamp>1785239626779</timestamp><url>https://jenkins.younex.de/job/blut24-landing/13/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/LangFlag.vue</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>app/locales/de.ts</affectedPath><affectedPath>app/components/RegistrationDialog.vue</affectedPath><affectedPath>app/components/SiteHeader.vue</affectedPath><affectedPath>app/locales/en.ts</affectedPath><commitId>595e2c473bdb201384ea147d00098a5c8786b811</commitId><timestamp>1785239613000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Language switch becomes a borderless flag menu; free-of-charge block moves into the dialog

The switch showed both languages permanently inside a bordered group, spending
header width and visual weight on a control almost nobody touches. It is now a
borderless trigger carrying only the CURRENT language — flag, code and a caret —
that opens a small menu with the alternatives and a tick against the active one.
Chrome appears only on hover, focus or open.

Still two real buttons, so the site-wide focus ring and keyboard operation are
unchanged; aria-haspopup/aria-expanded describe the menu and each entry carries
aria-current. The menu closes on outside click, on Escape and after choosing, and
both listeners are attached only while it is open and removed on unmount.

Flags moved into their own LangFlag component: the Union Jack needs a clipPath and
the glyph now renders up to three times on one page, so a shared literal id would
have made every instance clip against the first one's rect. Drawn as SVG rather
than flag emoji, which do not render as flags on Windows at all.

The free-of-charge block moves out of the hero and into the foot of the
registration dialog, after the form — the cost question is what someone asks once
they have seen how much they are being asked for. Its copy moved from hero.* to
dialog.* to match. The dialog's header subtitle said the same thing directly under
a heading that already reads "Kostenlos … registrieren", so it is dropped rather
than repeated twice in one panel.

Hero grid switched from items-center to items-start, so the "Blutkonserven-Plattform"
eyebrow and the top edge of the stock-matrix card now share a top line.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 13:53:33 +0200</date><id>595e2c473bdb201384ea147d00098a5c8786b811</id><msg>Language switch becomes a borderless flag menu; free-of-charge block moves into the dialog</msg><path><editType>add</editType><file>app/components/LangFlag.vue</file></path><path><editType>edit</editType><file>app/locales/de.ts</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/locales/en.ts</file></path><path><editType>edit</editType><file>app/components/RegistrationDialog.vue</file></path><path><editType>edit</editType><file>app/components/SiteHeader.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>14</number><url>https://jenkins.younex.de/job/blut24-landing/14/</url></nextBuild><previousBuild><number>12</number><url>https://jenkins.younex.de/job/blut24-landing/12/</url></previousBuild></previousBuild></workflowRun>