Compare commits

..

No commits in common. "b0e4017780678254f01917d12be413d40713fa19" and "b738dd819241779fd63f719e7af322ad2c0b8c26" have entirely different histories.

6 changed files with 2 additions and 111 deletions

View File

@ -1,46 +0,0 @@
<?php
namespace App\Invoice\Actions;
use App\Invoice\Models\Invoice;
use App\Member\Member;
use App\Payment\Subscription;
use Illuminate\Http\JsonResponse;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class MemberNewInvoiceAction
{
use AsAction;
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'year' => 'required|integer|gte:0',
'subscription_id' => 'required|exists:subscriptions,id',
];
}
/**
* @return array<string, mixed>
*/
public function handle(Member $member, Subscription $subscription, int $year): array
{
$invoice = Invoice::createForMember($member, Member::where('id', $member->id)->get(), $year, $subscription);
return [
...$invoice->getAttributes(),
'to' => $invoice->to,
'positions' => $invoice->getRelationValue('positions')->toArray(),
];
}
public function asController(ActionRequest $request, Member $member): JsonResponse
{
$payload = $this->handle($member, Subscription::find($request->input('subscription_id')), $request->input('year'));
return response()->json($payload);
}
}

View File

@ -8,7 +8,6 @@ use App\Invoice\Enums\InvoiceStatus;
use App\Invoice\InvoiceDocument;
use App\Invoice\RememberDocument;
use App\Member\Member;
use App\Payment\Subscription;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@ -45,9 +44,8 @@ class Invoice extends Model
/**
* @param Collection<int, Member> $members
*/
public static function createForMember(Member $member, Collection $members, int $year, Subscription $subscription = null): self
public static function createForMember(Member $member, Collection $members, int $year): self
{
$subscription = $subscription ?: $member->subscription;
$invoice = new self([
'to' => [
'name' => 'Familie ' . $member->lastname,
@ -64,7 +62,7 @@ class Invoice extends Model
$positions = collect([]);
foreach ($members as $member) {
foreach ($subscription->children as $child) {
foreach ($member->subscription->children as $child) {
$positions->push([
'description' => str($child->name)->replace('{name}', $member->firstname . ' ' . $member->lastname)->replace('{year}', (string) $year),
'price' => $child->amount,

View File

@ -7,7 +7,6 @@ use App\Invoice\Enums\InvoiceStatus;
use App\Invoice\Models\Invoice;
use App\Lib\HasMeta;
use App\Member\Member;
use App\Payment\Subscription;
use Illuminate\Http\Resources\Json\JsonResource;
/**
@ -60,7 +59,6 @@ class InvoiceResource extends JsonResource
'vias' => BillKind::forSelect(),
'statuses' => InvoiceStatus::forSelect(),
'members' => Member::forSelect(),
'subscriptions' => Subscription::forSelect(),
'default' => [
'to' => [
'name' => '',

View File

@ -34,7 +34,6 @@ use App\Invoice\Actions\InvoiceIndexAction;
use App\Invoice\Actions\InvoiceUpdateAction;
use App\Invoice\Actions\MassPostPdfAction;
use App\Invoice\Actions\MassStoreAction as InvoiceMassStoreAction;
use App\Invoice\Actions\MemberNewInvoiceAction;
use App\Invoice\Actions\PaymentPositionIndexAction;
use App\Maildispatcher\Actions\CreateAction;
use App\Maildispatcher\Actions\DestroyAction;
@ -115,7 +114,6 @@ Route::group(['middleware' => 'auth:web'], function (): void {
Route::get('/invoice/{invoice}/pdf', DisplayPdfAction::class)->name('invoice.pdf');
Route::get('/invoice/{invoice}/rememberpdf', DisplayRememberpdfAction::class)->name('invoice.rememberpdf');
Route::get('/invoice/masspdf', MassPostPdfAction::class)->name('invoice.masspdf');
Route::post('/member/{member}/new-invoice', MemberNewInvoiceAction::class)->name('member.new-invoice');
// ----------------------------- invoice-position ------------------------------

View File

@ -7,7 +7,6 @@ use App\Invoice\Enums\InvoiceStatus;
use App\Invoice\Models\Invoice;
use App\Invoice\Models\InvoicePosition;
use App\Member\Member;
use App\Payment\Subscription;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
@ -19,7 +18,6 @@ class InvoiceIndexActionTest extends TestCase
public function testItDisplaysInvoices(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$subscription = Subscription::factory()->name('Beitrag')->create();
$member = Member::factory()->defaults()->create(['firstname' => 'Aaaa', 'lastname' => 'Aaab']);
$invoice = Invoice::factory()
->has(InvoicePosition::factory()->price(1100)->for($member)->state(['description' => 'lala']), 'positions')
@ -54,7 +52,6 @@ class InvoiceIndexActionTest extends TestCase
->assertInertiaPath('data.meta.vias.0', ['id' => 'E-Mail', 'name' => 'E-Mail'])
->assertInertiaPath('data.meta.statuses.0', ['id' => 'Neu', 'name' => 'Neu'])
->assertInertiaPath('data.meta.members.0', ['id' => $member->id, 'name' => 'Aaaa Aaab'])
->assertInertiaPath('data.meta.subscriptions.0', ['name' => 'Beitrag', 'id' => $subscription->id])
->assertInertiaPath('data.meta.default', [
'to' => [
'name' => '',

View File

@ -1,54 +0,0 @@
<?php
namespace Tests\Feature\Invoice;
use App\Member\Member;
use App\Payment\Subscription;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\RequestFactories\Child;
use Tests\TestCase;
class MemberNewInvoiceActionTest extends TestCase
{
use DatabaseTransactions;
public function setUp(): void
{
parent::setUp();
$this->login()->loginNami()->withoutExceptionHandling();
}
public function testItReturnsNewInvoiceOfMember(): void
{
$subscription = Subscription::factory()->children([
new Child('beitrag {name}', 4466),
new Child('beitrag2 für {name} für {year}', 2290),
])->create();
$member = Member::factory()
->defaults()
->emailBillKind()
->create(['firstname' => 'Max', 'lastname' => 'Muster', 'address' => 'Maxstr 4', 'zip' => '33445', 'location' => 'Solingen', 'email' => 'lala@b.de']);
$this->post(route('member.new-invoice', ['member' => $member]), ['year' => 2019, 'subscription_id' => $subscription->id])
->assertOk()
->assertJsonPath('greeting', 'Liebe Familie Muster')
->assertJsonPath('to.address', 'Maxstr 4')
->assertJsonPath('to.location', 'Solingen')
->assertJsonPath('to.zip', '33445')
->assertJsonPath('to.name', 'Familie Muster')
->assertJsonPath('usage', 'Mitgliedsbeitrag für Muster')
->assertJsonPath('via', 'E-Mail')
->assertJsonPath('mail_email', 'lala@b.de')
->assertJsonPath('status', 'Neu')
->assertJsonPath('positions.0.description', 'beitrag Max Muster')
->assertJsonPath('positions.0.member_id', $member->id)
->assertJsonPath('positions.0.price', 4466)
->assertJsonPath('positions.1.description', 'beitrag2 für Max Muster für 2019')
->assertJsonPath('positions.1.member_id', $member->id)
->assertJsonPath('positions.1.price', 2290);
$this->assertDatabaseCount('invoices', 0);
$this->assertDatabaseCount('invoice_positions', 0);
}
}