kessai now records the account a payment was taken against rather than the provider, so a site holding two contracts at one provider holds two accounts and the gateway plugin id names neither. The argument kept its name and position, so nothing fails to compile and the break is silent. See kessai issue 3621924.
What breaks
PaymentGatewayResolver validates a resolved id with the gateway plugin manager hasDefinition(). A real account fails that check, so the tenant override and the site default are both discarded and every booking falls through to the manual fallback: a payment that should have been taken by card is created against the offline gateway, nothing raises, and an operator is left expected to collect by hand.
The site-wide default select has the matching half of the problem. Built from the gateway plugin list, it offers ids kessai refuses, it cannot name any account whose machine name is not its plugin name, and its default value falls back to empty when the stored id is absent, so an account that is configured reads as None (manual).
The step override help text tells an operator to name a plugin id.
The change
The resolver asks kessai isGatewayAvailable(), which is the same question the creation door asks, so a check here and a refusal there cannot disagree. The default select lists getAvailableGateways(). Both live on PaymentClientInterface, which BookingPaymentHooks already held, so it drops the gateway plugin manager rather than swapping it. The help text names an account and links to the accounts list, and the resolver interface says account id rather than plugin id.
Tests
Two kernel tests pin the defect: an account named for itself resolves where it used to fall back to manual, and a retired account is skipped. The existing resolution chain test also needed the kessai and kessai_simulator config installed, because the accounts arrive with it.
Depends on
The kessai change above, which adds getAvailableGateways() and isGatewayAvailable(). Until it lands this cannot go green, because kessai 1.x has neither.
AI-Generated: Yes (Claude Code was used to help draft this issue summary and to write the code and tests on the merge request. I reviewed and ran the work myself before posting it.)
Issue fork yoyaku-3622781
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commented