mivita/tests/Feature/RepairAboOrderUserAssignmentTest.php
Kevin 9b7665c59a Abo-Wartungs-Commands & Ausfuehrungs-Reminder aktivieren
Neue Artisan-Commands CreateAboReplacementOrder (Ersatzbestellung fuer ein
Abo anlegen) und RepairAboOrderUserAssignment (fehlerhafte User-Zuordnung
von Abo-Bestellungen korrigieren), jeweils mit Feature-Tests.
Ausserdem den abo:send-execution-reminder-Schedule (06:00) aktiviert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 13:37:39 +00:00

179 lines
5.6 KiB
PHP

<?php
use App\Models\Country;
use App\Models\ShoppingOrder;
use App\Models\ShoppingUser;
use App\Models\UserAbo;
use App\Models\UserAboOrder;
use App\Models\UserAccount;
use App\Models\UserSalesVolume;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Artisan;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
function repairAboOrderUserAssignmentMakeUser(string $email, array $accountData): User
{
$country = Country::firstOrFail();
$account = UserAccount::create(array_merge([
'salutation' => 'mr',
'first_name' => 'Vorname',
'last_name' => 'Nachname',
'address' => 'Alte Strasse 1',
'zipcode' => '10000',
'city' => 'Berlin',
'country_id' => $country->id,
'same_as_billing' => true,
], $accountData));
return User::forceCreate([
'account_id' => $account->id,
'email' => $email,
'password' => bcrypt('secret'),
'lang' => 'de',
]);
}
function repairAboOrderUserAssignmentSeed(): array
{
makeShopEnv();
$oldUser = repairAboOrderUserAssignmentMakeUser('old@example.com', [
'first_name' => 'Alter',
'last_name' => 'User',
'address' => 'Falsche Strasse 1',
'zipcode' => '11111',
'city' => 'Altstadt',
]);
$targetUser = repairAboOrderUserAssignmentMakeUser('target@example.com', [
'first_name' => 'Richtiger',
'last_name' => 'User',
'address' => 'Richtige Strasse 455',
'zipcode' => '45500',
'city' => 'Zielstadt',
]);
$wrongShoppingUser = ShoppingUser::create([
'auth_user_id' => $oldUser->id,
'billing_firstname' => 'Alter',
'billing_lastname' => 'User',
'billing_address' => 'Falsche Strasse 1',
'billing_zipcode' => '11111',
'billing_city' => 'Altstadt',
'billing_country_id' => Country::firstOrFail()->id,
'billing_email' => $oldUser->email,
'same_as_billing' => true,
'shipping_country_id' => Country::firstOrFail()->id,
'is_for' => 'me',
'is_from' => 'user_order',
'mode' => 'live',
]);
$userAbo = UserAbo::create([
'user_id' => $oldUser->id,
'shopping_user_id' => $wrongShoppingUser->id,
'is_for' => 'me',
'email' => $oldUser->email,
'payone_userid' => 900100,
'clearingtype' => 'cc',
'active' => true,
'status' => 2,
'abo_interval' => 5,
'next_date' => now()->addDays(3),
]);
$order = ShoppingOrder::create([
'shopping_user_id' => $wrongShoppingUser->id,
'auth_user_id' => $oldUser->id,
'country_id' => 1,
'language' => 'de',
'user_shop_id' => 1,
'payment_for' => 3,
'total' => 100,
'subtotal' => 90,
'shipping' => 10,
'shipping_net' => 8.4,
'subtotal_ws' => 98.4,
'tax' => 11.6,
'total_shipping' => 100,
'points' => 10,
'is_abo' => true,
'abo_interval' => 5,
'paid' => true,
'txaction' => 'paid',
'mode' => 'live',
]);
UserAboOrder::create([
'user_abo_id' => $userAbo->id,
'shopping_order_id' => $order->id,
'status' => 2,
'paid' => true,
]);
UserSalesVolume::create([
'user_id' => $oldUser->id,
'shopping_order_id' => $order->id,
'month' => now()->month,
'year' => now()->year,
'date' => now(),
'points' => 10,
'total_net' => 90,
'status_points' => 1,
'status' => 1,
]);
return [$oldUser, $targetUser, $userAbo, $order, $wrongShoppingUser];
}
it('zeigt die betroffene Abo-Bestellung im Trockenlauf ohne Aenderung', function () {
[$oldUser, $targetUser, $userAbo, $order, $wrongShoppingUser] = repairAboOrderUserAssignmentSeed();
$exit = Artisan::call('abo:repair-order-user', [
'--abo' => (string) $userAbo->id,
'--user' => (string) $targetUser->id,
'--order' => (string) $order->id,
'--old-user' => (string) $oldUser->id,
'--no-documents' => true,
]);
expect($exit)->toBe(0);
expect($order->fresh()->auth_user_id)->toBe($oldUser->id);
expect($order->fresh()->shopping_user_id)->toBe($wrongShoppingUser->id);
});
it('korrigiert die letzte Abo-Bestellung auf den Ziel-User', function () {
[$oldUser, $targetUser, $userAbo, $order, $wrongShoppingUser] = repairAboOrderUserAssignmentSeed();
$exit = Artisan::call('abo:repair-order-user', [
'--fix' => true,
'--force' => true,
'--abo' => (string) $userAbo->id,
'--user' => (string) $targetUser->id,
'--order' => (string) $order->id,
'--old-user' => (string) $oldUser->id,
'--no-documents' => true,
]);
expect($exit)->toBe(0);
$order->refresh();
$userAbo->refresh();
expect($userAbo->user_id)->toBe($targetUser->id)
->and($userAbo->email)->toBe($targetUser->email)
->and($order->auth_user_id)->toBe($targetUser->id)
->and($order->shopping_user_id)->not->toBe($wrongShoppingUser->id)
->and(UserSalesVolume::where('shopping_order_id', $order->id)->first()->user_id)->toBe($targetUser->id);
$newShoppingUser = $order->shopping_user;
expect($newShoppingUser->auth_user_id)->toBe($targetUser->id)
->and($newShoppingUser->billing_firstname)->toBe('Richtiger')
->and($newShoppingUser->billing_lastname)->toBe('User')
->and($newShoppingUser->billing_address)->toBe('Richtige Strasse 455')
->and($newShoppingUser->billing_email)->toBe($targetUser->email);
});