The booking workflow takes every held line off the clock, so that its own node timeouts govern the form and payment windows rather than racing yoyaku's hold cron. Nothing about that is visible: BookingWorkflowStarter does it in code, unconditionally, for any workflow that drives an order.
That imposes a policy no workflow asked for. A workflow that confirms immediately, one that only does back-office approval on a resource with no hold_ttl, or one that runs after placement has no use for it, and paying for it is not free: the site's per-resource basket expiry stops applying and the workflow becomes solely responsible for releasing the places. It is also invisible in the model, which is why it is easy to forget it happens at all.
The documentation already advertises the right design and it was never built. The Orchestra integration page lists a Suspend step beside Hold, Extend, Confirm and Release, described as handing the deadline to the workflow's own timers. There is no such plugin, and the starter is the shortcut that stands in for it.
Proposal: a SuspendHolds action, placed as the first node of the shipped booking workflow, doing explicitly what the starter does implicitly, and the starter stops doing it. A workflow that wants yoyaku's hold expiry to keep running simply omits the node.
A node runs once, and the basket stays editable while the workflow runs, so the step must also record that the workflow owns the hold clock: it sets a yoyaku_holds_suspended instance variable, and the subscriber that catches lines held later reads that instead of merely asking whether an instance is running. A ResumeHolds counterpart then becomes expressible, handing the clock back mid-run and clearing the variable, which today cannot be said at all.
Builds on #3614475: A declined payment throws the basket away, because unlocking resumes a hold the workflow, not the checkout, had taken off the clock, which established that a resumed hold gets back only the deadline the checkout itself took away, and which added the subscriber this would re-point.
Also fixes the documentation, which describes a Suspend task type that does not exist.
Issue fork yoyaku-3614495
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 #4
mably commentedComment #6
mably commented