Verbessere Mitgliederfilter und Zahlungszuordnung
This commit is contained in:
+94
-12
@@ -21,6 +21,59 @@ if ($hasAccess && isset($_SESSION['flash_paypal'])) {
|
||||
unset($_SESSION['flash_paypal']);
|
||||
}
|
||||
|
||||
$suchbegriff = trim((string)($_SERVER['REQUEST_METHOD'] === 'POST' ? ($_POST['return_q'] ?? '') : ($_GET['q'] ?? '')));
|
||||
$returnQuery = $suchbegriff !== '' ? '?q=' . urlencode($suchbegriff) : '';
|
||||
|
||||
function paypal_select_options(array $members, array $suggestions = [], int $selectedId = 0): string
|
||||
{
|
||||
$suggestedIds = [];
|
||||
foreach ($suggestions as $suggestion) {
|
||||
$suggestedIds[(int)$suggestion['participant_id']] = true;
|
||||
}
|
||||
|
||||
$html = '<option value="">- Mitglied wählen -</option>';
|
||||
if ($suggestions !== []) {
|
||||
$html .= '<optgroup label="Vorschläge">';
|
||||
foreach ($suggestions as $suggestion) {
|
||||
$id = (int)$suggestion['participant_id'];
|
||||
$html .= '<option value="' . $id . '"' . ($selectedId === $id ? ' selected' : '') . '>'
|
||||
. saas_html((string)$suggestion['display_name'])
|
||||
. '</option>';
|
||||
}
|
||||
$html .= '</optgroup>';
|
||||
}
|
||||
|
||||
$html .= '<optgroup label="Alle aktiven Mitglieder">';
|
||||
foreach ($members as $member) {
|
||||
$id = (int)$member['participant_id'];
|
||||
if (isset($suggestedIds[$id])) {
|
||||
continue;
|
||||
}
|
||||
$html .= '<option value="' . $id . '"' . ($selectedId === $id ? ' selected' : '') . '>'
|
||||
. saas_html((string)$member['display_name'])
|
||||
. '</option>';
|
||||
}
|
||||
$html .= '</optgroup>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
function paypal_payment_matches_query(array $payment, string $query): bool
|
||||
{
|
||||
$query = imports_normalize_match_text($query);
|
||||
if ($query === '') {
|
||||
return true;
|
||||
}
|
||||
|
||||
$text = imports_normalize_match_text(
|
||||
(string)$payment['payer_name'] . ' '
|
||||
. (string)($payment['note'] ?? '') . ' '
|
||||
. (string)($payment['transaction_code'] ?? '')
|
||||
);
|
||||
|
||||
return str_contains($text, $query);
|
||||
}
|
||||
|
||||
if ($hasAccess && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$aktion = (string)($_POST['aktion'] ?? '');
|
||||
$paymentId = (int)($_POST['payment_id'] ?? 0);
|
||||
@@ -45,7 +98,7 @@ if ($hasAccess && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
// Post-Redirect-Get gegen Doppelbuchung per Refresh.
|
||||
$_SESSION['flash_paypal'] = $flash;
|
||||
header('Location: paypal-zuordnung.php');
|
||||
header('Location: paypal-zuordnung.php' . $returnQuery);
|
||||
exit;
|
||||
}
|
||||
|
||||
@@ -58,6 +111,7 @@ if ($hasAccess) {
|
||||
$offene = paypal_fetch_unmatched($pdo, $tenantId);
|
||||
$mitglieder = ledger_fetch_participant_summaries($pdo, $tenantId, ['active_only' => true]);
|
||||
}
|
||||
$offeneGefiltert = array_values(array_filter($offene, static fn(array $payment): bool => paypal_payment_matches_query($payment, $suchbegriff)));
|
||||
|
||||
include "header.php";
|
||||
include "headerline.php";
|
||||
@@ -88,27 +142,53 @@ include "nav.php";
|
||||
<?php endif; ?>
|
||||
|
||||
<h3>Offene Zahlungen (<?php echo count($offene); ?>)</h3>
|
||||
<form method="get" action="paypal-zuordnung.php" class="admin-filter-bar">
|
||||
<label for="paypal-q">Suche</label>
|
||||
<input type="search" name="q" id="paypal-q" value="<?php echo saas_html($suchbegriff); ?>" placeholder="Zahler, Mitteilung oder Transaktion">
|
||||
<button type="submit">Filtern</button>
|
||||
<a class="button alt" href="paypal-zuordnung.php">Zurücksetzen</a>
|
||||
</form>
|
||||
<?php if ($offene === []): ?>
|
||||
<p>Keine offenen Zahlungen. Alles automatisch zugeordnet. 🎉</p>
|
||||
<p>Keine offenen Zahlungen. Alles automatisch zugeordnet.</p>
|
||||
<?php elseif ($offeneGefiltert === []): ?>
|
||||
<p>Keine offenen Zahlungen für diesen Filter gefunden.</p>
|
||||
<?php else: ?>
|
||||
<table>
|
||||
<tr><th>Eingang</th><th>Zahler (PayPal)</th><th>Mitteilung</th><th>Betrag</th><th>Zuordnen</th><th></th></tr>
|
||||
<?php foreach ($offene as $z): ?>
|
||||
<p><?php echo count($offeneGefiltert); ?> von <?php echo count($offene); ?> offenen Zahlungen angezeigt.</p>
|
||||
<div class="table-wrapper">
|
||||
<table class="admin-table">
|
||||
<tr><th>Eingang</th><th>Zahlung</th><th>Betrag</th><th>Vorschläge</th><th>Zuordnen</th><th></th></tr>
|
||||
<?php foreach ($offeneGefiltert as $z): ?>
|
||||
<?php
|
||||
$suggestions = imports_suggest_participants($pdo, $tenantId, (string)$z['payer_name'], (string)($z['note'] ?? ''), 4);
|
||||
$selectedId = count($suggestions) === 1 ? (int)$suggestions[0]['participant_id'] : 0;
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo saas_html((string)($z['paid_at'] ?? $z['created_at'])); ?></td>
|
||||
<td><?php echo saas_html($z['payer_name']); ?></td>
|
||||
<td><?php echo saas_html((string)($z['note'] ?? '')); ?></td>
|
||||
<td>
|
||||
<strong><?php echo saas_html($z['payer_name']); ?></strong>
|
||||
<?php if (($z['note'] ?? '') !== null && trim((string)$z['note']) !== ''): ?>
|
||||
<br><small><?php echo saas_html((string)$z['note']); ?></small>
|
||||
<?php endif; ?>
|
||||
<br><small>Transaktion: <?php echo saas_html((string)$z['transaction_code']); ?></small>
|
||||
</td>
|
||||
<td><?php echo saas_html(saas_format_money_cents((int)$z['net_cents'])); ?> €</td>
|
||||
<td>
|
||||
<form method="post" action="paypal-zuordnung.php" style="display:flex;gap:0.5em;align-items:center;margin:0">
|
||||
<?php if ($suggestions === []): ?>
|
||||
<span class="status-badge muted">Kein Vorschlag</span>
|
||||
<?php else: ?>
|
||||
<?php foreach ($suggestions as $suggestion): ?>
|
||||
<span class="status-badge info"><?php echo saas_html((string)$suggestion['display_name']); ?></span>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<form method="post" action="paypal-zuordnung.php" class="inline-admin-form">
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<input type="hidden" name="aktion" value="zuordnen">
|
||||
<input type="hidden" name="payment_id" value="<?php echo (int)$z['id']; ?>">
|
||||
<input type="hidden" name="return_q" value="<?php echo saas_html($suchbegriff); ?>">
|
||||
<select name="participant_id" required>
|
||||
<option value="">– Mitglied wählen –</option>
|
||||
<?php foreach ($mitglieder as $m): ?>
|
||||
<option value="<?php echo (int)$m['participant_id']; ?>"><?php echo saas_html($m['display_name']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
<?php echo paypal_select_options($mitglieder, $suggestions, $selectedId); ?>
|
||||
</select>
|
||||
<button type="submit">Buchen</button>
|
||||
</form>
|
||||
@@ -118,12 +198,14 @@ include "nav.php";
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<input type="hidden" name="aktion" value="ignorieren">
|
||||
<input type="hidden" name="payment_id" value="<?php echo (int)$z['id']; ?>">
|
||||
<input type="hidden" name="return_q" value="<?php echo saas_html($suchbegriff); ?>">
|
||||
<button type="submit" class="alt">Ignorieren</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
Reference in New Issue
Block a user