Files
api/documentation/topics/generated/createStripePaymentIntent.topic
T
Jeppe BandJeppe Bundgaard 42ddce84bc Serialize VAT collection mutations with payment operations (#326)
## Summary

- Makes Stripe Terminal card payment intents always use 25% moms in the
API, independent of any client-supplied `tax_percentage`.
- Updates amount calculation, metadata persistence, stored-intent reuse
matching, the authoritative OpenAPI contracts, and operation-specific
Writerside outputs.
- Prevents double charging and false order closure across stale,
concurrently succeeded, partially recorded, or mismatched intents.
- Serializes payment create/capture/closure with order-item changes and
every order-to-invoice-collection reassignment through shared database
locks.
- Converts expected lock contention and reconciliation cases into
deliberate 409 responses.

## Exact-head evidence

Current head: `3a0f70d315a94d2efe586a2188d2c54f8ff11cd4`

- PHP syntax passed for all changed runtime files.
- Focused Orders suite: **42 tests / 293 assertions passed**.
- `git diff --check` passed.
- Fresh exact-head Tests and Qodana are running.
- Every Codex finding has a concrete reply; a fresh exact-head review is
requested below.

## Safety behavior

- Caller-controlled VAT is absent from request contracts; fixed 25% moms
is server-owned.
- A succeeded payment is preserved, requires the full expected
`amount_received`, and cannot close a changed/mismatched or
already-claimed collection.
- A compatible partially recorded Stripe closure is completed
idempotently; conflicting partial state fails closed for manual
reconciliation.
- Every cancellation/delete caller honors a concurrent-success result
and never falsely reports a completed payment as cleared.
- Price changes and invoice-collection reassignment share the payment
lock through validation, capture, post-capture reload, and closure.
- Reader changes are persisted only for reusable matching intents, so
stale intent cancellation targets the original terminal.
- Accepted legacy succeeded intents normalize stored tax to 25% before
response construction.

---------

Co-authored-by: Jeppe Bundgaard <jb@truckwash.dk>
2026-07-28 22:00:59 +02:00

56 lines
2.0 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
SYSTEM "https://resources.jetbrains.com/writerside/1.0/xhtml-entities.dtd">
<topic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://resources.jetbrains.com/writerside/1.0/topic.v2.xsd"
title="Create Stripe payment intent" id="createStripePaymentIntent">
<!-- AUTO-GENERATED, DO NOT EDIT -->
<p>This endpoint documentation is generated directly from <code>openapi.yaml</code>.</p>
<chapter title="Endpoint" id="endpoint">
<code-block lang="http">POST /orders/module/stripe/payment_intent</code-block>
</chapter>
<chapter title="Operation" id="operation">
<p>Operation ID: <code>createStripePaymentIntent</code></p>
<p>Creates a Stripe Terminal card payment intent with fixed 25% moms.</p>
</chapter>
<chapter title="Authentication" id="authentication">
<p>Security requirements:</p>
<table>
<tr><td>Scheme</td><td>Scopes</td></tr>
<tr><td>BearerAuth</td><td>-</td></tr>
</table>
</chapter>
<chapter title="Request Body" id="request-body">
<p>Required: yes.</p>
<p>Content type: <code>application/json</code></p>
<code-block lang="json">
{
&quot;properties&quot;: {
&quot;id&quot;: {
&quot;type&quot;: &quot;integer&quot;
},
&quot;reader&quot;: {
&quot;type&quot;: &quot;string&quot;
}
},
&quot;required&quot;: [
&quot;id&quot;,
&quot;reader&quot;
],
&quot;type&quot;: &quot;object&quot;
}
</code-block>
</chapter>
<chapter title="Responses" id="responses">
<table>
<tr><td>Status</td><td>Description</td><td>Content Types</td></tr>
<tr><td>200</td><td>Success</td><td>application/json</td></tr>
</table>
<p>Schema for response <code>200</code> (<code>application/json</code>):</p>
<code-block lang="json">
{}
</code-block>
</chapter>
</topic>