67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Invoice\Actions;
 | 
						|
 | 
						|
use App\Invoice\Events\InvoicesMassStored;
 | 
						|
use App\Invoice\Models\Invoice;
 | 
						|
use App\Lib\JobMiddleware\JobChannels;
 | 
						|
use App\Lib\JobMiddleware\WithJobState;
 | 
						|
use App\Lib\Queue\TracksJob;
 | 
						|
use App\Member\Member;
 | 
						|
use Illuminate\Http\JsonResponse;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
use Lorisleiva\Actions\ActionRequest;
 | 
						|
use Lorisleiva\Actions\Concerns\AsAction;
 | 
						|
 | 
						|
class MassStoreAction
 | 
						|
{
 | 
						|
    use AsAction;
 | 
						|
    use TracksJob;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<string, string>
 | 
						|
     */
 | 
						|
    public function rules(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'year' => 'required|numeric',
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    public function handle(int $year): void
 | 
						|
    {
 | 
						|
        /** @var Collection<int, Invoice> */
 | 
						|
        $invoices = collect([]);
 | 
						|
 | 
						|
        $memberGroup = Member::payable()->get()
 | 
						|
            ->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->save();
 | 
						|
            $invoice->positions()->createMany($invoice->positions);
 | 
						|
            $invoices->push($invoice->fresh('positions'));
 | 
						|
        }
 | 
						|
 | 
						|
        event(new InvoicesMassStored($year, $invoices));
 | 
						|
    }
 | 
						|
 | 
						|
    public function asController(ActionRequest $request): JsonResponse
 | 
						|
    {
 | 
						|
        $this->startJob($request->year);
 | 
						|
 | 
						|
        return response()->json([]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param mixed $parameters
 | 
						|
     */
 | 
						|
    public function jobState(WithJobState $jobState, ...$parameters): WithJobState
 | 
						|
    {
 | 
						|
        return $jobState
 | 
						|
            ->after('Zahlungen erstellt')
 | 
						|
            ->failed('Fehler beim Erstellen von Zahlungen')
 | 
						|
            ->shouldReload(JobChannels::make()->add('invoice'));
 | 
						|
    }
 | 
						|
}
 |