create(); LegacyImportMap::query()->create([ 'legacy_portal' => 'presseecho', 'legacy_table' => 'sf_guard_user', 'legacy_id' => 501, 'target_table' => 'users', 'target_id' => $user->id, 'imported_at' => now(), ]); insertLegacyInvoice([ 'id' => 1001, 'user_id' => 501, 'user_payment_id' => 901, 'billing_address_id' => 701, 'number' => 'PE-1001', 'status' => 'paid', 'amount' => 119.00, 'invoice_date' => '2024-01-10', 'due_date' => '2024-01-24', 'payment_method' => 'SPK_Berlin', 'pay_date' => '2024-01-12', ]); $this->artisan('legacy:archive-invoices', [ '--portal' => 'presseecho', '--no-report' => true, ]) ->assertSuccessful() ->expectsOutputToContain('[presseecho] Quelle: 1 | ohne User-Mapping: 0 | PDF-Payload: 1'); $invoice = LegacyInvoice::query()->where('legacy_id', 1001)->firstOrFail(); expect($invoice->user_id)->toBe($user->id) ->and($invoice->status)->toBe('paid') ->and($invoice->amount_cents)->toBe(11900) ->and(data_get($invoice->raw_snapshot, 'number'))->toBe('PE-1001') ->and(data_get($invoice->pdf_payload, 'billing_address.name'))->toBe('Muster GmbH') ->and(data_get($invoice->pdf_payload, 'user_payment.status'))->toBe('finished') ->and(data_get($invoice->pdf_payload, 'payment_option_translation.name'))->toBe('Legacy Pressepaket'); }); test('legacy invoice archive keeps unmapped invoices and reports them', function () { /** @var TestCase $this */ configureLegacyInvoiceConnection(); insertLegacyInvoice([ 'id' => 1002, 'user_id' => 999, 'user_payment_id' => 901, 'billing_address_id' => 701, 'number' => 'PE-1002', 'status' => 'open', 'amount' => 49.00, 'invoice_date' => '2024-02-10', 'due_date' => '2024-02-24', 'payment_method' => 'Invoice', 'pay_date' => '0000-00-00', ]); $this->artisan('legacy:archive-invoices', [ '--portal' => 'presseecho', '--no-report' => true, ]) ->assertSuccessful() ->expectsOutputToContain('[presseecho] Quelle: 1 | ohne User-Mapping: 1 | PDF-Payload: 1'); $invoice = LegacyInvoice::query()->where('legacy_id', 1002)->firstOrFail(); expect($invoice->user_id)->toBeNull() ->and($invoice->legacy_user_id)->toBe(999) ->and($invoice->status)->toBe('open') ->and($invoice->paid_at)->toBeNull(); }); function configureLegacyInvoiceConnection(): void { Config::set('database.connections.mysql_presseecho', [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', 'foreign_key_constraints' => false, ]); DB::purge('mysql_presseecho'); Schema::connection('mysql_presseecho')->create('invoice', function (Blueprint $table): void { $table->integer('id')->primary(); $table->integer('user_id'); $table->integer('user_payment_id'); $table->integer('billing_address_id'); $table->string('number'); $table->string('status'); $table->integer('reminder_count')->nullable(); $table->date('next_reminder_date')->nullable(); $table->decimal('amount', 10, 2); $table->boolean('is_netto')->default(false); $table->boolean('is_media')->default(true); $table->date('invoice_date'); $table->date('due_date'); $table->date('service_period_begin_date')->nullable(); $table->date('service_period_end_date')->nullable(); $table->string('payment_method')->nullable(); $table->date('pay_date')->nullable(); $table->dateTime('created_at'); $table->dateTime('updated_at'); }); Schema::connection('mysql_presseecho')->create('invoice_billing_address', function (Blueprint $table): void { $table->integer('id')->primary(); $table->integer('salutation_id')->nullable(); $table->string('title')->nullable(); $table->string('name'); $table->text('address')->nullable(); $table->string('address1')->nullable(); $table->string('address2')->nullable(); $table->string('postal_code')->nullable(); $table->string('city')->nullable(); $table->integer('country_id')->nullable(); $table->string('country_name')->nullable(); $table->dateTime('created_at'); $table->dateTime('updated_at'); }); Schema::connection('mysql_presseecho')->create('user_payment', function (Blueprint $table): void { $table->integer('id')->primary(); $table->integer('user_payment_option_id'); $table->decimal('amount', 10, 2); $table->string('status'); $table->dateTime('created_at'); $table->dateTime('updated_at'); }); Schema::connection('mysql_presseecho')->create('user_payment_option', function (Blueprint $table): void { $table->integer('id')->primary(); $table->integer('user_id'); $table->integer('payment_option_id'); $table->integer('coupon_id')->nullable(); $table->string('status'); $table->date('valid_until_date')->nullable(); $table->date('next_due_date')->nullable(); $table->dateTime('created_at'); $table->dateTime('updated_at'); }); Schema::connection('mysql_presseecho')->create('payment_option', function (Blueprint $table): void { $table->integer('id')->primary(); $table->string('article_number'); $table->string('type'); $table->decimal('price', 10, 2); $table->boolean('is_hidden')->default(false); $table->string('event_name_prefix')->nullable(); $table->boolean('activate_on_first_payment')->default(false); }); Schema::connection('mysql_presseecho')->create('payment_option_translation', function (Blueprint $table): void { $table->integer('id'); $table->string('name'); $table->text('description')->nullable(); $table->string('lang', 5); }); DB::connection('mysql_presseecho')->table('invoice_billing_address')->insert([ 'id' => 701, 'salutation_id' => 1, 'title' => null, 'name' => 'Muster GmbH', 'address' => 'Musterstrasse 1', 'address1' => null, 'address2' => null, 'postal_code' => '10115', 'city' => 'Berlin', 'country_id' => 177, 'country_name' => 'Deutschland', 'created_at' => '2024-01-01 00:00:00', 'updated_at' => '2024-01-01 00:00:00', ]); DB::connection('mysql_presseecho')->table('user_payment')->insert([ 'id' => 901, 'user_payment_option_id' => 801, 'amount' => 119.00, 'status' => 'finished', 'created_at' => '2024-01-01 00:00:00', 'updated_at' => '2024-01-01 00:00:00', ]); DB::connection('mysql_presseecho')->table('user_payment_option')->insert([ 'id' => 801, 'user_id' => 501, 'payment_option_id' => 601, 'coupon_id' => null, 'status' => 'finished', 'valid_until_date' => '2024-12-31', 'next_due_date' => null, 'created_at' => '2024-01-01 00:00:00', 'updated_at' => '2024-01-01 00:00:00', ]); DB::connection('mysql_presseecho')->table('payment_option')->insert([ 'id' => 601, 'article_number' => 'PK-LEGACY', 'type' => 'recurring', 'price' => 119.00, 'is_hidden' => false, 'event_name_prefix' => 'paymentoption.legacy', 'activate_on_first_payment' => true, ]); DB::connection('mysql_presseecho')->table('payment_option_translation')->insert([ 'id' => 601, 'name' => 'Legacy Pressepaket', 'description' => null, 'lang' => 'de', ]); } /** * @param array $overrides */ function insertLegacyInvoice(array $overrides): void { DB::connection('mysql_presseecho')->table('invoice')->insert(array_merge([ 'reminder_count' => null, 'next_reminder_date' => null, 'is_netto' => false, 'is_media' => true, 'service_period_begin_date' => '2024-01-01', 'service_period_end_date' => '2024-12-31', 'created_at' => '2024-01-01 00:00:00', 'updated_at' => '2024-01-01 00:00:00', ], $overrides)); }