Abo: Extern erledigt zaehlt als ausgefuehrte Abo-Lieferung

getCountPaidOrders() zaehlt jetzt bezahlte ODER extern erledigte (Status 8)
Bestellungen als ausgefuehrte Lieferung. "Extern erledigt" = Lieferung
ausgefuehrt und Punkte vergeben, daher muss der Lieferungs-Zaehler hochgehen
(Anzeige "Abo-Lieferungen X / Mindestlaufzeit" sowie canCancelAbo), obwohl
paid=false bleibt (Inkasso laeuft ausserhalb des Systems).

Der Incentive-Zaehler (qualified_abos via IncentiveTracker::trackAboActivated)
lief bereits korrekt; Test ergaenzt diese Absicherung explizit.

Tests: getCountPaidOrders 0 -> 1 nach Erledigen, Incentive qualified_abos = 1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-06-17 11:57:29 +00:00
parent 321e7959da
commit 0d4c0b640c
2 changed files with 20 additions and 2 deletions

View file

@ -220,8 +220,14 @@ class UserAbo extends Model
public function getCountPaidOrders() public function getCountPaidOrders()
{ {
// sind bezahlte Bestellungen // Ausgefuehrte Abo-Lieferungen: bezahlte sowie extern erledigte (Status 8,
return $this->user_abo_orders->where('status', '>=', 2)->where('paid', true)->count(); // abo_extern_done) Bestellungen. Extern erledigt = Lieferung ausgefuehrt und
// Punkte vergeben, daher zaehlt sie wie eine bezahlte Lieferung (z. B. fuer die
// Mindestlaufzeit), obwohl paid=false bleibt (Inkasso laeuft ausserhalb).
return $this->user_abo_orders
->where('status', '>=', 2)
->filter(fn (UserAboOrder $order) => $order->paid || (int) $order->status === 8)
->count();
} }
public function setStartDateAttribute($value) public function setStartDateAttribute($value)

View file

@ -111,6 +111,9 @@ function heldAboSeed(): array
it('markiert eine angehaltene Abo-Bestellung als extern erledigt, schreibt Punkte gut und hebt die Blockade auf', function () { it('markiert eine angehaltene Abo-Bestellung als extern erledigt, schreibt Punkte gut und hebt die Blockade auf', function () {
[$userAbo, $order, $aboOrder, $user] = heldAboSeed(); [$userAbo, $order, $aboOrder, $user] = heldAboSeed();
// Vorher zaehlt die angehaltene Lieferung nicht als ausgefuehrte Lieferung.
expect(UserAbo::find($userAbo->id)->getCountPaidOrders())->toBe(0);
$result = app(AboExternalCompletionService::class)->complete($order); $result = app(AboExternalCompletionService::class)->complete($order);
expect($result['success'])->toBeTrue(); expect($result['success'])->toBeTrue();
@ -133,6 +136,11 @@ it('markiert eine angehaltene Abo-Bestellung als extern erledigt, schreibt Punkt
->and($userAbo->active)->toBeTrue(); ->and($userAbo->active)->toBeTrue();
expect(\Carbon\Carbon::parse($userAbo->getRawOriginal('next_date'))->isFuture())->toBeTrue(); expect(\Carbon\Carbon::parse($userAbo->getRawOriginal('next_date'))->isFuture())->toBeTrue();
// Abo-Lieferungs-Zaehler beruecksichtigt die extern erledigte Ausfuehrung.
$fresh = UserAbo::find($userAbo->id);
expect($fresh->getCountPaidOrders())->toBe(1)
->and($fresh->getCountOrders())->toBe(1);
// Punkte gutgeschrieben - mit heutigem Datum (Markierungsdatum), nicht dem // Punkte gutgeschrieben - mit heutigem Datum (Markierungsdatum), nicht dem
// vergangenen Bestelldatum, damit sie in der laufenden Monatsauswertung landen. // vergangenen Bestelldatum, damit sie in der laufenden Monatsauswertung landen.
$volume = UserSalesVolume::where('shopping_order_id', $order->id)->first(); $volume = UserSalesVolume::where('shopping_order_id', $order->id)->first();
@ -168,6 +176,10 @@ it('trackt Incentive-Punkte mit dem Bestelldatum (Ausfuehrungsmonat), nicht mit
expect($newAbo)->not->toBeNull() expect($newAbo)->not->toBeNull()
->and($newAbo->activated_at->toDateString())->toBe('2026-04-10'); ->and($newAbo->activated_at->toDateString())->toBe('2026-04-10');
// Incentive-Zaehler (qualified_abos) des Teilnehmers wurde erhoeht.
$participant = \App\Models\IncentiveParticipant::find($newAbo->participant_id);
expect((int) $participant->qualified_abos)->toBe(1);
// Reguläre Provisionspunkte hingegen mit heutigem Datum (Juni). // Reguläre Provisionspunkte hingegen mit heutigem Datum (Juni).
$volume = UserSalesVolume::where('shopping_order_id', $order->id)->first(); $volume = UserSalesVolume::where('shopping_order_id', $order->id)->first();
expect((int) $volume->month)->toBe(6) expect((int) $volume->month)->toBe(6)