diff --git a/app/Invoice/Actions/MassStoreAction.php b/app/Invoice/Actions/MassStoreAction.php index 2ada5f09..d11b8ea4 100644 --- a/app/Invoice/Actions/MassStoreAction.php +++ b/app/Invoice/Actions/MassStoreAction.php @@ -37,10 +37,11 @@ class MassStoreAction ->groupBy(fn($member) => "{$member->bill_kind->value}{$member->lastname}{$member->address}{$member->zip}{$member->location}"); foreach ($memberGroup as $members) { - $invoice = $members->first()->getInvoiceFactory() + $factory = $members->first()->getInvoiceFactory() ->withFamilyMembers($members) - ->year($year) - ->getInvoice(); + ->year($year); + + $invoice = Invoice::createFromFactory($factory); $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 e13bb733..5017a68e 100644 --- a/app/Invoice/Actions/MemberNewInvoiceAction.php +++ b/app/Invoice/Actions/MemberNewInvoiceAction.php @@ -30,11 +30,12 @@ class MemberNewInvoiceAction */ public function handle(Member $member, Subscription $subscription, int $year): array { - $invoice = $member->first()->getInvoiceFactory() + $factory = $member->first()->getInvoiceFactory() ->forSingleMember() ->year($year) - ->withSubscription($subscription) - ->getInvoice(); + ->withSubscription($subscription); + + $invoice = Invoice::createFromFactory($factory); return [ ...$invoice->getAttributes(), diff --git a/app/Invoice/Data/PositionData.php b/app/Invoice/Data/PositionData.php new file mode 100644 index 00000000..6a026601 --- /dev/null +++ b/app/Invoice/Data/PositionData.php @@ -0,0 +1,14 @@ +hasMany(InvoicePosition::class); } + /** + * @param Collection $members + */ + public static function createFromFactory(MemberInvoiceFactory $factory): self + { + $invoice = new self([ + 'to' => $factory->getReceiver(), + 'status' => InvoiceStatus::NEW, + 'via' => $factory->getVia(), + 'usage' => $factory->getUsage(), + ]); + + $invoice->setRelation('positions', $factory->getPositions()->toArray()); + + 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 index f57524fd..6c773866 100644 --- a/app/Member/Factories/MemberInvoiceFactory.php +++ b/app/Member/Factories/MemberInvoiceFactory.php @@ -2,8 +2,9 @@ namespace App\Member\Factories; -use App\Invoice\Enums\InvoiceStatus; -use App\Invoice\Models\Invoice; +use App\Invoice\BillKind; +use App\Invoice\Data\PositionData; +use App\Invoice\Data\ReceiverData; use App\Member\Member; use App\Payment\Subscription; use Illuminate\Support\Collection; @@ -51,36 +52,41 @@ class MemberInvoiceFactory 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, + public function getReceiver(): ReceiverData { + return ReceiverData::from([ + '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, ]); + } + public function getVia(): BillKind { + return $this->member->bill_kind; + } + + public function getUsage(): string { + return 'Mitgliedsbeitrag für ' . $this->member->lastname; + } + + /** @return Collection */ + public function getPositions() { + /** @var Collection */ $positions = collect([]); foreach ($this->positions as $member) { $memberSubscription = $this->subscription ?: $member->subscription; foreach ($memberSubscription->children as $child) { - $positions->push([ + $positions->push(PositionData::from([ '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; + return $positions; } }