50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Invoice\Queries;
 | 
						|
 | 
						|
use App\Invoice\Invoice;
 | 
						|
use App\Invoice\Page;
 | 
						|
use App\Member\Member;
 | 
						|
use Illuminate\Database\Eloquent\Builder;
 | 
						|
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
 | 
						|
abstract class InvoiceMemberQuery
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @return Builder<Member>
 | 
						|
     */
 | 
						|
    abstract protected function getQuery(): Builder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param class-string<Invoice> $type
 | 
						|
     *
 | 
						|
     * @return Collection<int, Page>
 | 
						|
     */
 | 
						|
    public function getPages(string $type): Collection
 | 
						|
    {
 | 
						|
        return $this->get($type)->groupBy(
 | 
						|
            fn ($member) => Str::slug(
 | 
						|
                "{$member->lastname}{$member->address}{$member->zip}{$member->location}",
 | 
						|
            ),
 | 
						|
        )->map(fn ($page) => new Page($page));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param class-string<Invoice> $type
 | 
						|
     *
 | 
						|
     * @return EloquentCollection<int, Member>
 | 
						|
     */
 | 
						|
    private function get(string $type): EloquentCollection
 | 
						|
    {
 | 
						|
        return $this->getQuery()
 | 
						|
            ->with([
 | 
						|
                'payments' => fn ($query) => $type::paymentsQuery($query)
 | 
						|
                    ->orderByRaw('nr, member_id'),
 | 
						|
            ])
 | 
						|
            ->get()
 | 
						|
            ->filter(fn (Member $member) => $member->payments->count() > 0);
 | 
						|
    }
 | 
						|
}
 |