statementRuleset([]); $this->assertSame(';', $ruleset->delimiter); $this->assertSame('', $ruleset->enclosure); $this->assertSame('Windows-1252', $ruleset->charset); $this->assertSame('Buchungstag', $ruleset->column('payment_date')); $this->assertSame([], $ruleset->missingRequiredColumns()); } /** * Der Override gilt ganz oder gar nicht: Wer die Spalten seiner Bank einträgt, bekommt nicht * daneben noch die Spaltennamen der GLS untergeschoben und sucht den Fehler an der falschen Stelle. */ public function test_a_tenant_override_replaces_the_column_mapping_entirely(): void { $ruleset = new AccountTransferPaymentModule()->statementRuleset([ AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => [ 'delimiter' => ',', 'enclosure' => '"', 'columns' => [ 'payment_date' => 'Datum', 'purpose' => 'Zweck', 'amount' => 'Summe', ], ], ]); $this->assertSame(',', $ruleset->delimiter); $this->assertSame('"', $ruleset->enclosure); $this->assertSame('Datum', $ruleset->column('payment_date')); // Nicht aus dem App-Standard ergänzt: $this->assertNull($ruleset->column('payer_iban')); } /** Das Frontend schickt das Ruleset als JSON-String durch das generische Options-Formular. */ public function test_accepts_the_override_as_json_string(): void { $ruleset = new AccountTransferPaymentModule()->statementRuleset([ AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => json_encode([ 'delimiter' => "\t", 'columns' => ['payment_date' => 'Datum', 'purpose' => 'Zweck', 'amount' => 'Summe'], ]), ]); $this->assertSame("\t", $ruleset->delimiter); $this->assertSame('Datum', $ruleset->column('payment_date')); } public function test_reports_a_missing_required_column(): void { $ruleset = BankStatementRuleset::fromConfiguration([ 'columns' => ['payment_date' => 'Datum', 'purpose' => 'Zweck'], ]); $this->assertSame(['amount'], $ruleset->missingRequiredColumns()); } /** * Das Kontoauszug-Format beschreibt die Bank, nicht die Zusage an die Teilnehmenden. Im * Event-Snapshot eingefroren ließe sich nach einem Bankwechsel für laufende Aktionen nichts mehr * importieren -- IBAN und Kontoinhaber frieren dagegen weiterhin pro Aktion ein. */ public function test_the_ruleset_is_stripped_from_the_event_snapshot(): void { $configuration = [ 'account_owner' => 'Kasse', 'iban' => 'DE02120300000000202051', AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => ['delimiter' => ','], ]; $snapshot = PaymentMethod::stripTenantScopedOptions( PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, $configuration, ); $this->assertArrayNotHasKey(AccountTransferPaymentModule::OPTION_STATEMENT_RULESET, $snapshot); $this->assertSame('Kasse', $snapshot['account_owner']); $this->assertSame('DE02120300000000202051', $snapshot['iban']); } public function test_the_ruleset_option_is_the_only_tenant_scoped_one(): void { $this->assertSame( [AccountTransferPaymentModule::OPTION_STATEMENT_RULESET], new AccountTransferPaymentModule()->tenantScopedOptionKeys(), ); } }