123 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
use App\Invoice\BillKind;
 | 
						|
use Illuminate\Database\Migrations\Migration;
 | 
						|
use Illuminate\Database\Schema\Blueprint;
 | 
						|
use Illuminate\Support\Facades\Schema;
 | 
						|
 | 
						|
return new class extends Migration
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Run the migrations.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function up()
 | 
						|
    {
 | 
						|
        Schema::create('invoices', function (Blueprint $table) {
 | 
						|
            $table->id();
 | 
						|
            $table->json('to');
 | 
						|
            $table->string('greeting');
 | 
						|
            $table->string('status');
 | 
						|
            $table->date('sent_at')->nullable();
 | 
						|
            $table->string('via');
 | 
						|
            $table->string('usage');
 | 
						|
            $table->string('mail_email')->nullable();
 | 
						|
            $table->datetime('last_remembered_at')->nullable();
 | 
						|
            $table->timestamps();
 | 
						|
        });
 | 
						|
 | 
						|
        Schema::create('invoice_positions', function (Blueprint $table) {
 | 
						|
            $table->id();
 | 
						|
            $table->foreignId('invoice_id');
 | 
						|
            $table->string('description');
 | 
						|
            $table->foreignId('member_id');
 | 
						|
            $table->unsignedBigInteger('price');
 | 
						|
            $table->timestamps();
 | 
						|
        });
 | 
						|
 | 
						|
        foreach (DB::table('subscriptions')->get() as $subscription) {
 | 
						|
            $children = DB::table('subscription_children')->where('parent_id', $subscription->id)->get();
 | 
						|
            if ($subscription->split === 1) {
 | 
						|
                foreach ($children as $child) {
 | 
						|
                    $newName = 'Beitrag {year} für {name} (' . $child->name . ')';
 | 
						|
                    DB::table('subscription_children')->where('id', $child->id)->update(['name' => $newName]);
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                DB::table('subscription_children')->where('parent_id', $subscription->id)->delete();
 | 
						|
                DB::table('subscription_children')->insert([
 | 
						|
                    'id' => Str::uuid()->toString(),
 | 
						|
                    'name' => 'Beitrag {year} für {name} (' . $subscription->name . ')',
 | 
						|
                    'amount' => $children->sum('amount'),
 | 
						|
                    'parent_id' => $subscription->id,
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $paymentGroups = DB::table('payments')->where('status_id', 2)->get()->groupBy(function ($payment) {
 | 
						|
            $member = DB::table('members')->where('id', $payment->member_id)->first();
 | 
						|
            return $member->lastname . $member->address . $member->location . $member->zip;
 | 
						|
        });
 | 
						|
 | 
						|
        foreach ($paymentGroups as $payments) {
 | 
						|
            $member = DB::table('members')->where('id', $payments->first()->member_id)->first();
 | 
						|
            $invoiceId = DB::table('invoices')->insertGetId([
 | 
						|
                'to' => json_encode([
 | 
						|
                    'name' => 'Familie ' . $member->lastname,
 | 
						|
                    'address' => $member->address,
 | 
						|
                    'zip' => $member->zip,
 | 
						|
                    'location' => $member->location,
 | 
						|
                ]),
 | 
						|
                'greeting' => 'Liebe Familie ' . $member->lastname,
 | 
						|
                'status' => 'Rechnung gestellt',
 | 
						|
                'via' => BillKind::fromValue($member->bill_kind)->value,
 | 
						|
                'usage' => 'Mitgliedsbeitrag für ' . $member->lastname,
 | 
						|
                'mail_email' => $member->email_parents ?: $member->email,
 | 
						|
                'last_remembered_at' => $payments->first()->last_remembered_at,
 | 
						|
                'sent_at' => $payments->first()->last_remembered_at,
 | 
						|
            ]);
 | 
						|
 | 
						|
            foreach ($payments as $payment) {
 | 
						|
                $subscription = DB::table('subscriptions')->where('id', $payment->subscription_id)->first();
 | 
						|
                $subscriptionChildren = DB::table('subscription_children')->where('parent_id', $subscription->id)->get();
 | 
						|
                $paymentMember = DB::table('members')->where('id', $payment->member_id)->first();
 | 
						|
                foreach ($subscriptionChildren as $child) {
 | 
						|
                    DB::table('invoice_positions')->insert([
 | 
						|
                        'invoice_id' => $invoiceId,
 | 
						|
                        'description' => str($child->name)->replace('{name}', $paymentMember->firstname . ' ' . $paymentMember->lastname)->replace('{year}', $payment->nr),
 | 
						|
                        'price' => $child->amount,
 | 
						|
                        'member_id' => $member->id,
 | 
						|
                    ]);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        Schema::dropIfExists('payments');
 | 
						|
 | 
						|
        Schema::table('subscriptions', function (Blueprint $table) {
 | 
						|
            $table->dropColumn('split');
 | 
						|
            $table->dropColumn('for_promise');
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Reverse the migrations.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function down()
 | 
						|
    {
 | 
						|
        Schema::table('subscriptions', function (Blueprint $table) {
 | 
						|
            $table->boolean('split')->default(false);
 | 
						|
            $table->boolean('for_promise')->default(false);
 | 
						|
        });
 | 
						|
        Schema::dropIfExists('invoice_positions');
 | 
						|
        Schema::dropIfExists('invoices');
 | 
						|
        Schema::create('payments', function ($table) {
 | 
						|
            $table->id();
 | 
						|
            $table->string('nr');
 | 
						|
            $table->integer('subscription_id');
 | 
						|
            $table->json('invoice_data');
 | 
						|
        });
 | 
						|
    }
 | 
						|
};
 |