diff --git a/app/Fee.php b/app/Fee.php index cb3843bf..4acd72ed 100644 --- a/app/Fee.php +++ b/app/Fee.php @@ -4,6 +4,8 @@ namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; +use App\Member\Member; +use App\Payment\Subscription; class Fee extends Model { @@ -11,4 +13,9 @@ class Fee extends Model public $fillable = ['name', 'nami_id']; public $timestamps = false; + + + public function subscriptions() { + return $this->hasMany(Subscription::class); + } } diff --git a/app/Initialize/InitializeFees.php b/app/Initialize/InitializeFees.php index b54d2629..dd598ca1 100644 --- a/app/Initialize/InitializeFees.php +++ b/app/Initialize/InitializeFees.php @@ -15,7 +15,11 @@ class InitializeFees { public function handle() { $this->bar->task('Synchronisiere Beiträge', function() { $this->api->group(auth()->user()->getNamiGroupId())->fees()->each(function($fee) { - \App\Fee::create(['nami_id' => $fee->id, 'name' => $fee->name]); + \App\Fee::create(['nami_id' => $fee->id, 'name' => $fee->name]) + ->subscriptions()->create([ + 'name' => $fee->name, + 'amount' => 1000, + ]); }); }); } diff --git a/app/Initialize/InitializeMembers.php b/app/Initialize/InitializeMembers.php index 4afd44d1..fc851144 100644 --- a/app/Initialize/InitializeMembers.php +++ b/app/Initialize/InitializeMembers.php @@ -22,6 +22,15 @@ class InitializeMembers { $this->api = $api; } + public function getSubscriptionId($member) { + $fee = Fee::firstWhere('nami_id', $member->fee_id ?: -1); + if (is_null($fee)) { + return null; + } + + return optional($fee->subscriptions()->first())->id; + } + public function handle() { $allMembers = collect([]); @@ -52,7 +61,7 @@ class InitializeMembers { 'confession_id' => optional(Confession::firstWhere('nami_id', $member->confession_id ?: -1))->id, 'region_id' => optional(Region::firstWhere('nami_id', $member->region_id ?: -1))->id, 'country_id' => Country::where('nami_id', $member->country_id)->firstOrFail()->id, - 'fee_id' => optional(Fee::firstWhere('nami_id', $member->fee_id ?: -1))->id, + 'subscription_id' => $this->getSubscriptionId($member), 'nationality_id' => Nationality::where('nami_id', $member->nationality_id)->firstOrFail()->id, 'version' => $member->version, ]); diff --git a/app/Member/CreateJob.php b/app/Member/CreateJob.php index 55f03dde..ffed4031 100644 --- a/app/Member/CreateJob.php +++ b/app/Member/CreateJob.php @@ -62,7 +62,7 @@ class CreateJob implements ShouldQueue 'confession_id' => $this->member->confession ? $this->member->confession->nami_id : Confession::firstWhere('is_null', true)->id, 'region_id' => optional($this->member->region)->nami_id, 'country_id' => $this->member->country->nami_id, - 'fee_id' => optional($this->member->fee)->nami_id, + 'fee_id' => $this->member->getNamiFeeId(), 'nationality_id' => $this->member->nationality->nami_id, 'group_id' => $this->member->group->nami_id, 'first_activity_id' => $this->member->firstActivity->nami_id, diff --git a/app/Member/Member.php b/app/Member/Member.php index 6de52a84..a4f5707b 100644 --- a/app/Member/Member.php +++ b/app/Member/Member.php @@ -8,18 +8,18 @@ use Illuminate\Notifications\Notifiable; use App\Bill\BillKind; use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Nationality; -use App\Fee; use App\Group; use App\Activity; use App\Subactivity; use Zoomyboy\LaravelNami\NamiUser; +use App\Payment\Subscription; class Member extends Model { use Notifiable; use HasFactory; - public $fillable = ['firstname', 'lastname', 'nickname', 'other_country', 'birthday', 'joined_at', 'send_newspaper', 'address', 'further_address', 'zip', 'location', 'main_phone', 'mobile_phone', 'work_phone', 'fax', 'email', 'email_parents', 'nami_id', 'group_id', 'letter_address', 'country_id', 'way_id', 'nationality_id', 'fee_id', 'region_id', 'gender_id', 'confession_id', 'letter_address', 'bill_kind_id', 'version', 'first_subactivity_id', 'first_activity_id', 'confirmed_at', 'children_phone']; + public $fillable = ['firstname', 'lastname', 'nickname', 'other_country', 'birthday', 'joined_at', 'send_newspaper', 'address', 'further_address', 'zip', 'location', 'main_phone', 'mobile_phone', 'work_phone', 'fax', 'email', 'email_parents', 'nami_id', 'group_id', 'letter_address', 'country_id', 'way_id', 'nationality_id', 'subscription_id', 'region_id', 'gender_id', 'confession_id', 'letter_address', 'bill_kind_id', 'version', 'first_subactivity_id', 'first_activity_id', 'confirmed_at', 'children_phone']; public $dates = ['joined_at', 'birthday']; @@ -56,6 +56,14 @@ class Member extends Model return $api->group($this->group->nami_id)->member($this->nami_id)->memberships()->toArray(); } + public function getNamiFeeId() { + if (!$this->subscription) { + return null; + } + + return $this->subscription->fee->nami_id; + } + //---------------------------------- Relations ---------------------------------- public function country() { @@ -97,9 +105,9 @@ class Member extends Model return $this->hasMany(Membership::class); } - public function fee() + public function subscription() { - return $this->belongsTo(Fee::class); + return $this->belongsTo(Subscription::class); } public function billKind() { diff --git a/app/Member/MemberController.php b/app/Member/MemberController.php index b57ea5dd..9f6a1e80 100644 --- a/app/Member/MemberController.php +++ b/app/Member/MemberController.php @@ -5,7 +5,6 @@ namespace App\Member; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Gender; -use App\Fee; use App\Region; use App\Country; use App\Nationality; @@ -13,6 +12,7 @@ use App\Confession; use App\Bill\BillKind; use App\Activity; use App\Group; +use App\Payment\Subscription; class MemberController extends Controller { @@ -44,7 +44,7 @@ class MemberController extends Controller 'regions' => Region::where('is_null', false)->get()->pluck('name', 'id'), 'nationalities' => Nationality::get()->pluck('name', 'id'), 'confessions' => Confession::where('is_null', false)->get()->pluck('name', 'id'), - 'fees' => Fee::get()->pluck('name', 'id'), + 'subscriptions' => Subscription::get()->pluck('name', 'id'), 'data' => [ 'country_id' => Country::default() ], @@ -69,7 +69,7 @@ class MemberController extends Controller 'regions' => Region::where('is_null', false)->get()->pluck('name', 'id'), 'nationalities' => Nationality::get()->pluck('name', 'id'), 'confessions' => Confession::where('is_null', false)->get()->pluck('name', 'id'), - 'fees' => Fee::get()->pluck('name', 'id'), + 'subscriptions' => Subscription::get()->pluck('name', 'id'), 'data' => new MemberResource($member), 'mode' => 'edit', ]); diff --git a/app/Member/MemberResource.php b/app/Member/MemberResource.php index 42863557..22598e03 100644 --- a/app/Member/MemberResource.php +++ b/app/Member/MemberResource.php @@ -26,7 +26,7 @@ class MemberResource extends JsonResource 'joined_at' => $this->joined_at->format('Y-m-d'), 'joined_at_human' => $this->joined_at->format('d.m.Y'), 'id' => $this->id, - 'fee_id' => $this->fee_id, + 'subscription_id' => $this->subscription_id, 'gender_id' => $this->gender_id, 'further_address' => $this->further_address, 'work_phone' => $this->work_phone, diff --git a/app/Member/UpdateJob.php b/app/Member/UpdateJob.php index 26b75ce8..5ccecb5e 100644 --- a/app/Member/UpdateJob.php +++ b/app/Member/UpdateJob.php @@ -60,7 +60,7 @@ class UpdateJob implements ShouldQueue 'confession_id' => $this->member->confession ? $this->member->confession->nami_id : Confession::firstWhere('is_null', true)->id, 'region_id' => optional($this->member->region)->nami_id, 'country_id' => $this->member->country->nami_id, - 'fee_id' => optional($this->member->fee)->nami_id, + 'fee_id' => $this->member->getNamiFeeId(), 'nationality_id' => $this->member->nationality->nami_id, 'id' => $this->member->nami_id, 'group_id' => $this->member->group->nami_id, diff --git a/database/migrations/2021_07_03_230731_create_subscriptions_relation_column.php b/database/migrations/2021_07_03_230731_create_subscriptions_relation_column.php index 5a3ee0d6..c3f1ba91 100644 --- a/database/migrations/2021_07_03_230731_create_subscriptions_relation_column.php +++ b/database/migrations/2021_07_03_230731_create_subscriptions_relation_column.php @@ -3,6 +3,9 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use App\Payment\Subscription; +use App\Fee; +use App\Member\Member; class CreateSubscriptionsRelationColumn extends Migration { @@ -18,6 +21,34 @@ class CreateSubscriptionsRelationColumn extends Migration $table->unsignedInteger('amount')->after('name'); $table->foreignId('fee_id')->after('name')->constrained(); }); + + foreach(Fee::get() as $fee) { + Subscription::create([ + 'amount' => 1000, + 'fee_id' => $fee->id, + 'name' => $fee->name, + ]); + } + + Schema::table('members', function (Blueprint $table) { + $table->foreignId('subscription_id')->after('version')->nullable()->default(1)->constrained(); + }); + + Member::withoutEvents(function() { + foreach (Member::get() as $member) { + if (is_null($member->fee_id)) { + $member->update(['subscription_id' => null]); + continue; + } + + $member->update(['subscription_id' => Subscription::firstWhere('fee_id', $member->fee_id)->id]); + } + }); + + Schema::table('members', function (Blueprint $table) { + $table->dropForeign(['fee_id']); + $table->dropColumn('fee_id'); + }); } /** diff --git a/resources/js/views/member/Form.vue b/resources/js/views/member/Form.vue index 8eaf9abc..038ceed6 100644 --- a/resources/js/views/member/Form.vue +++ b/resources/js/views/member/Form.vue @@ -50,7 +50,7 @@ <f-switch id="send_newspaper" v-model="inner.send_newspaper" label="Mittendrin"></f-switch> <f-text class="col-span-2" type="date" id="joined_at" v-model="inner.joined_at" label="Eintrittsdatum"></f-text> <f-select class="col-span-2" :options="confessions" id="confession_id" v-model="inner.confession_id" label="Konfession"></f-select> - <f-select class="col-span-2" :options="fees" id="fee_id" v-model="inner.fee_id" label="Beitrag"></f-select> + <f-select class="col-span-2" :options="subscriptions" id="subscription_id" v-model="inner.subscription_id" label="Beitrag"></f-select> <f-textarea class="col-span-2" rows="4" id="letter_address" v-model="inner.letter_address" label="Brief-Adresse"></f-textarea> </div> </div> @@ -77,7 +77,7 @@ export default { activities: {}, mode: {}, genders: {}, - fees: {}, + subscriptions: {}, data: {}, regions: {}, countries: {},