diff --git a/app/Domains/Admin/Controllers/TenantPaymentMethodsGetController.php b/app/Domains/Admin/Controllers/TenantPaymentMethodsGetController.php index 824a7d4..59d1380 100644 --- a/app/Domains/Admin/Controllers/TenantPaymentMethodsGetController.php +++ b/app/Domains/Admin/Controllers/TenantPaymentMethodsGetController.php @@ -5,6 +5,7 @@ namespace App\Domains\Admin\Controllers; use App\Models\AvailablePaymentMethod; use App\Resources\AvailablePaymentMethodResource; use App\Scopes\CommonController; +use App\ValueObjects\BankStatementRuleset; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -16,6 +17,10 @@ class TenantPaymentMethodsGetController extends CommonController 'paymentMethods' => AvailablePaymentMethod::all() ->map(fn (AvailablePaymentMethod $method) => new AvailablePaymentMethodResource($method)->toArray($request)), 'saveEndpoint' => '/api/v1/admin/tenant/payment-methods', + // Der app-weite Standard für das Kontoauszug-Format. Das Formular zeigt ihn als + // Vorbelegung an, damit erkennbar ist, wovon ein Override abweicht. + 'statementRulesetDefault' => BankStatementRuleset::default()->toArray(), + 'statementRulesetCharsets' => BankStatementRuleset::CHARSETS, ]); } } diff --git a/app/Domains/Admin/Views/Partials/TenantPaymentMethods.vue b/app/Domains/Admin/Views/Partials/TenantPaymentMethods.vue index 1f60daa..a660416 100644 --- a/app/Domains/Admin/Views/Partials/TenantPaymentMethods.vue +++ b/app/Domains/Admin/Views/Partials/TenantPaymentMethods.vue @@ -1,5 +1,6 @@ + + + + diff --git a/app/Domains/Event/Views/Partials/Overview.vue b/app/Domains/Event/Views/Partials/Overview.vue index 870365f..2630d20 100644 --- a/app/Domains/Event/Views/Partials/Overview.vue +++ b/app/Domains/Event/Views/Partials/Overview.vue @@ -6,6 +6,7 @@ import EventAddons from "./EventAddons.vue"; import ParticipationSummary from "./ParticipationSummary.vue"; import CommonSettings from "./CommonSettings.vue"; import EventManagement from "./EventManagement.vue"; +import BankStatementImport from "./BankStatementImport.vue"; import Modal from "../../../../Views/Components/Modal.vue"; import MailCompose from "./MailCompose.vue"; import FullScreenModal from "../../../../Views/Components/FullScreenModal.vue"; @@ -21,6 +22,12 @@ const props = defineProps({ const displayData = ref('main'); const showEventData = ref(false); + const showBankStatement = ref(false); + + // Nach dem Buchen stimmen die Beitragsstände der Übersicht nicht mehr -- neu laden. + async function bankStatementBooked() { + await showMain(); + } async function showMain() { @@ -117,9 +124,18 @@ async function showEventAddons() {
+ +
+ + + @@ -158,6 +174,7 @@ async function showEventAddons() {
+



diff --git a/app/Domains/Event/Views/Partials/ParticipationFees.vue b/app/Domains/Event/Views/Partials/ParticipationFees.vue index 318e68a..0fe5fb6 100644 --- a/app/Domains/Event/Views/Partials/ParticipationFees.vue +++ b/app/Domains/Event/Views/Partials/ParticipationFees.vue @@ -26,6 +26,18 @@ const paymentMethodConfigurations = reactive({}) const showOptionsModal = ref(false) const optionsMethod = ref(null) +/** + * Die Optionen, die pro Aktion eingefroren werden. + * + * Optionen mit `scope: 'tenant'` bleiben draußen: Sie gelten für den ganzen Mandanten. Das + * Kontoauszug-Format etwa beschreibt die Bank, nicht die Zusage an die Teilnehmenden — hier + * eingefroren ließe sich nach einem Bankwechsel für laufende Aktionen nichts mehr importieren. + * Der Server hält sich beim Speichern an dieselbe Regel. + */ +function eventOptions(method) { + return (method?.optionsSchema ?? []).filter(option => option.scope !== 'tenant') +} + function openOptions(method) { optionsMethod.value = method showOptionsModal.value = true @@ -47,7 +59,7 @@ onMounted(async () => { for (const method of availablePaymentMethods.value) { const source = eventConfigBySlug[method.slug] ?? method.configuration ?? {} const config = {} - for (const option of method.optionsSchema ?? []) { + for (const option of eventOptions(method)) { config[option.name] = source[option.name] ?? '' } paymentMethodConfigurations[method.slug] = config @@ -358,7 +370,7 @@ onMounted(async () => { paymentMethod.name }}