feat(payments): Block Zahlungsvorgang im Bestell-Editor, Storno-Felder bei automatischem Storno

- Bestell-Editor rechts: Zahlungsvorgang (Status, Grund, Transaktions-ID,
  Referenz, Betraege, Zeiten, Verlauf aus PG payment_log), anbieterneutral
  ueber payment_transactions (Payments\Overview, Log::forOrder)
- markCancelled() fuellt Stornodatum, Stornostatus, Stornogrund und
  Storno-Nachricht der Bestellung (nur leere Felder)
- neuer Stornogrund 'Zahlung beim Anbieter nicht abgeschlossen' (install.sql)
- reconcile: 404-Grund lesbar mit Alter des Vorgangs
This commit is contained in:
Tom Bartelt
2026-09-22 09:30:52 +02:00
parent fe868641d2
commit 85bc1d8c9a
8 changed files with 240 additions and 4 deletions
@@ -483,6 +483,56 @@
<input style="width:300px;" type="text" readonly="readonly" value="{$order->paymorrow_response_result_code}" />
{/if}
</div>
{if $payment_tx}
{* 22.09.2026 -- Zahlungsvorgang aus core/payments (anbieterneutral: PayPal v2, spaeter Mollie) *}
<div class="info_block" id="payment_tx_block">
<div class="edit_title">Zahlungsvorgang {$payment_tx.provider_label|escape}</div>
<label>Status</label>
<input style="width:300px;{if $payment_tx.status == 'paid'}color:green;{elseif $payment_tx.status == 'mismatch'}color:red;font-weight:bold;{elseif $payment_tx.status == 'cancelled'}color:#990000;{/if}" type="text" readonly="readonly" value="{$payment_tx.status_label|escape}" />
{if $payment_tx.detail}
<label>Grund / Quelle</label>
<textarea style="width:300px;" rows="3" readonly="readonly">{$payment_tx.detail|escape}</textarea>
{/if}
<label>Transaktions-ID (Anbieter)</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.capture_id|escape}" onclick="this.select();" />
<label>Vorgangs-Referenz (Anbieter)</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.reference|escape}" onclick="this.select();" />
<label>Sollbetrag / gezahlt</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.expected_amount|escape}{if $payment_tx.paid_amount} / {$payment_tx.paid_amount|escape}{/if}" />
<label>Gestartet</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.created_at|escape}" />
{if $payment_tx.paid_at}
<label>Bezahlt am</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.paid_at|escape}" />
{else}
<label>Letzte &Auml;nderung</label>
<input style="width:300px;" type="text" readonly="readonly" value="{$payment_tx.updated_at|escape}" />
{/if}
{if $payment_tx.history}
<label>Verlauf</label>
<div style="width:300px;max-height:220px;overflow-y:auto;background:#fff;border:1px solid #ddd;font-size:11px;line-height:1.35;">
{foreach $payment_tx.history as $h}
<div style="margin:0;padding:3px 5px;border-bottom:1px solid #eee;">
<span style="color:#666;margin:0;">{$h.zeit|escape}</span><br />
<span style="margin:0;">{$h.aktion|escape}</span>
{if $h.status}<span style="color:#003580;margin:0;"> &middot; {$h.status|escape}</span>{/if}
{if $h.http}<span style="color:#999;margin:0;"> &middot; {$h.http|escape}</span>{/if}
{if $h.detail}<br /><span style="color:#990000;margin:0;">{$h.detail|escape}</span>{/if}
</div>
{/foreach}
</div>
{/if}
</div>
{/if}
<div class="info_block">
<div class="edit_title">Rechnung</div>