diff --git a/app/Invoice/Actions/MassStoreAction.php b/app/Invoice/Actions/MassStoreAction.php index 3b7f57a8..2ada5f09 100644 --- a/app/Invoice/Actions/MassStoreAction.php +++ b/app/Invoice/Actions/MassStoreAction.php @@ -34,10 +34,13 @@ class MassStoreAction $invoices = collect([]); $memberGroup = Member::payable()->get() - ->groupBy(fn ($member) => "{$member->bill_kind->value}{$member->lastname}{$member->address}{$member->zip}{$member->location}"); + ->groupBy(fn($member) => "{$member->bill_kind->value}{$member->lastname}{$member->address}{$member->zip}{$member->location}"); foreach ($memberGroup as $members) { - $invoice = Invoice::createForMember($members->first(), $members, $year); + $invoice = $members->first()->getInvoiceFactory() + ->withFamilyMembers($members) + ->year($year) + ->getInvoice(); $invoice->save(); $invoice->positions()->createMany($invoice->positions->toArray()); $invoices->push($invoice->fresh('positions')); diff --git a/app/Invoice/Actions/MemberNewInvoiceAction.php b/app/Invoice/Actions/MemberNewInvoiceAction.php index cc42ddb1..e13bb733 100644 --- a/app/Invoice/Actions/MemberNewInvoiceAction.php +++ b/app/Invoice/Actions/MemberNewInvoiceAction.php @@ -30,7 +30,11 @@ class MemberNewInvoiceAction */ public function handle(Member $member, Subscription $subscription, int $year): array { - $invoice = Invoice::createForMember($member, collect([$member]), $year, $subscription); + $invoice = $member->first()->getInvoiceFactory() + ->forSingleMember() + ->year($year) + ->withSubscription($subscription) + ->getInvoice(); return [ ...$invoice->getAttributes(), diff --git a/app/Invoice/Models/Invoice.php b/app/Invoice/Models/Invoice.php index 009d58db..ccb99af4 100644 --- a/app/Invoice/Models/Invoice.php +++ b/app/Invoice/Models/Invoice.php @@ -9,14 +9,11 @@ use App\Invoice\Enums\InvoiceStatus; use App\Invoice\InvoiceDocument; use App\Invoice\InvoiceSettings; use App\Invoice\RememberDocument; -use App\Member\Member; -use App\Payment\Subscription; use Database\Factories\Invoice\Models\InvoiceFactory; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Support\Collection; use Laravel\Scout\Searchable; class Invoice extends Model @@ -43,42 +40,6 @@ class Invoice extends Model return $this->hasMany(InvoicePosition::class); } - /** - * @param Collection $members - */ - public static function createForMember(Member $member, Collection $members, int $year, ?Subscription $subscription = null): self - { - $invoice = new self([ - 'to' => [ - 'name' => 'Familie ' . $member->lastname, - 'address' => $member->address, - 'zip' => $member->zip, - 'location' => $member->location, - 'greeting' => 'Liebe Familie ' . $member->lastname, - 'email' => $member->email_parents ?: $member->email, - ], - 'status' => InvoiceStatus::NEW, - 'via' => $member->bill_kind, - 'usage' => 'Mitgliedsbeitrag für ' . $member->lastname, - ]); - - $positions = collect([]); - foreach ($members as $member) { - $memberSubscription = $subscription ?: $member->subscription; - foreach ($memberSubscription->children as $child) { - $positions->push([ - 'description' => str($child->name)->replace('{name}', $member->firstname . ' ' . $member->lastname)->replace('{year}', (string) $year), - 'price' => $child->amount, - 'member_id' => $member->id, - 'id' => null, - ]); - } - } - $invoice->setRelation('positions', $positions); - - return $invoice; - } - public static function booted(): void { static::deleting(function ($model) { diff --git a/app/Member/Factories/MemberInvoiceFactory.php b/app/Member/Factories/MemberInvoiceFactory.php new file mode 100644 index 00000000..f57524fd --- /dev/null +++ b/app/Member/Factories/MemberInvoiceFactory.php @@ -0,0 +1,86 @@ + */ + private Collection $positions; + + private int $year; + + private ?Subscription $subscription = null; + + public function __construct(private Member $member) {} + + /** + * @param Collection $members + */ + public function withFamilyMembers(Collection $members): self + { + $this->positions = $members; + + return $this; + } + + public function forSingleMember(): self + { + $this->positions = collect([$this->member]); + + return $this; + } + + public function year(int $year): self + { + $this->year = $year; + + return $this; + } + + public function withSubscription(Subscription $subscription): self + { + $this->subscription = $subscription; + + return $this; + } + + public function getInvoice(): Invoice + { + $invoice = new Invoice([ + 'to' => [ + 'name' => 'Familie ' . $this->member->lastname, + 'address' => $this->member->address, + 'zip' => $this->member->zip, + 'location' => $this->member->location, + 'greeting' => 'Liebe Familie ' . $this->member->lastname, + 'email' => $this->member->email_parents ?: $this->member->email, + ], + 'status' => InvoiceStatus::NEW, + 'via' => $this->member->bill_kind, + 'usage' => 'Mitgliedsbeitrag für ' . $this->member->lastname, + ]); + + $positions = collect([]); + foreach ($this->positions as $member) { + $memberSubscription = $this->subscription ?: $member->subscription; + foreach ($memberSubscription->children as $child) { + $positions->push([ + 'description' => str($child->name)->replace('{name}', $member->firstname . ' ' . $member->lastname)->replace('{year}', (string) $this->year), + 'price' => $child->amount, + 'member_id' => $member->id, + 'id' => null, + ]); + } + } + $invoice->setRelation('positions', $positions); + + return $invoice; + } +} diff --git a/app/Member/Member.php b/app/Member/Member.php index 67973eac..fecb2383 100644 --- a/app/Member/Member.php +++ b/app/Member/Member.php @@ -9,6 +9,7 @@ use App\Gender; use App\Group; use App\Invoice\BillKind; use App\Invoice\Models\InvoicePosition; +use App\Member\Factories\MemberInvoiceFactory; use App\Nami\HasNamiField; use App\Nationality; use App\Payment\Subscription; @@ -385,6 +386,10 @@ class Member extends Model implements Geolocatable, Preventable return $query->where('bill_kind', '!=', null)->where('subscription_id', '!=', null); } + public function getInvoiceFactory(): MemberInvoiceFactory { + return new MemberInvoiceFactory($this); + } + /** * @inheritdoc */