Compare commits

..

76 Commits

Author SHA1 Message Date
philipp lang 1bb7d9000f Fix database migrations for mailgateways
continuous-integration/drone/push Build is failing Details
2024-12-23 03:07:05 +01:00
philipp lang 24ec0430c1 Exit successfully after running copydb 2024-12-23 03:04:59 +01:00
philipp lang 374d05a2ca Remove conditions from editor
continuous-integration/drone/push Build is failing Details
2024-12-22 19:26:59 +01:00
philipp lang 1d09afbeb3 Add prevention settings 2024-12-22 18:34:00 +01:00
philipp lang ca9bf70c9a Add fileshare settings 2024-12-22 18:32:41 +01:00
philipp lang 291e69e68c Add form settings 2024-12-20 00:15:15 +01:00
philipp lang db8d117dcf Lint 2024-12-19 23:34:17 +01:00
philipp lang bc21c86414 Add password reset confirm 2024-12-19 23:24:56 +01:00
philipp lang e4c08c3765 Cleanup 2024-12-19 23:24:56 +01:00
philipp lang 219c141359 Add Password Reset email page 2024-12-19 23:24:56 +01:00
philipp lang 6acab6888b Add Login module 2024-12-19 23:24:56 +01:00
philipp lang b594e92cda Move DPSG Icon 2024-12-19 23:24:56 +01:00
philipp lang 09acf0c98c Add title and menu to Page component 2024-12-19 23:24:56 +01:00
philipp lang 2012aa636f Add head component for html page head tag 2024-12-19 23:24:56 +01:00
philipp lang 62340871c6 Fix error handling for mailgateway forms 2024-12-19 23:24:56 +01:00
philipp lang e6412d9a89 Add error handling via tooltip 2024-12-19 23:24:56 +01:00
philipp lang c6c7bda0eb Fix: Add id to select field 2024-12-19 23:24:56 +01:00
philipp lang 28d7914802 Add Vite facade 2024-12-19 23:24:56 +01:00
philipp lang d9ce28d568 Add Danger theme for tippy 2024-12-19 23:24:56 +01:00
philipp lang b80d8e3f2c Add vite spritemap 2024-12-19 23:24:56 +01:00
philipp lang a21c4f608f Update sprite component 2024-12-19 23:24:56 +01:00
philipp lang 49be4f35e9 Add validation attributes to nami field 2024-12-19 23:24:56 +01:00
philipp lang 5212115ee8 Add SettingIntro component 2024-12-19 23:24:56 +01:00
philipp lang 7d3f52ec45 Add Nami Settings 2024-12-19 23:24:56 +01:00
philipp lang 072ab6abb8 Move test files 2024-12-19 23:24:56 +01:00
philipp lang 3ae0ef4bf5 Add page title 2024-12-19 23:24:56 +01:00
philipp lang 2ea8b8380c Add active menu entry for setting 2024-12-19 23:24:56 +01:00
philipp lang d24cef307a Set active title for setting 2024-12-19 23:24:55 +01:00
philipp lang b1e0bc00d6 Update arch tests 2024-12-19 23:24:55 +01:00
philipp lang 49e0fc4252 Lint 2024-12-19 23:24:55 +01:00
philipp lang c287d1183b Move types 2024-12-19 23:24:55 +01:00
philipp lang 2409443222 Move modules 2024-12-19 23:24:55 +01:00
philipp lang 2d646bb908 Add Badge component 2024-12-19 23:24:55 +01:00
philipp lang a25edc0b6a Add data type cast for Mailgateway 2024-12-19 23:24:55 +01:00
philipp lang 91a8e05c94 Allow MailmanTypeRequest to cast to data 2024-12-19 23:24:55 +01:00
philipp lang c2cd43380e Mod setArray macro for nested values 2024-12-19 23:24:55 +01:00
philipp lang 5f8f2fb996 Simplify form 2024-12-19 23:24:55 +01:00
philipp lang 9fa62d61c0 Update update hook 2024-12-19 23:24:55 +01:00
philipp lang c34418ee8a Add test for events 2024-12-19 23:24:55 +01:00
philipp lang 979e6faf7e Lint 2024-12-19 23:24:55 +01:00
philipp lang d9e8f38030 Update refresh page 2024-12-19 23:24:55 +01:00
philipp lang 600243bad1 Add mailgateway 2024-12-19 23:24:55 +01:00
philipp lang 595980cb1d Fix layout 2024-12-19 23:24:55 +01:00
philipp lang 592161603d Remove old MailgatewayRequestFactory 2024-12-19 23:24:55 +01:00
philipp lang c159d79487 Lint 2024-12-19 23:24:55 +01:00
philipp lang 29d068bcce Add HTTP Check to MailmanTypeRequest 2024-12-19 23:24:55 +01:00
philipp lang 94b809016a Delete old mailgateway tests 2024-12-19 23:24:55 +01:00
philipp lang 5838a20b27 Mark MailgatewayResource as deprecated 2024-12-19 23:24:55 +01:00
philipp lang 7d960f02c8 Mark old mailgateway settings as deprecated 2024-12-19 23:24:55 +01:00
philipp lang 11fca9d670 Add BooleanDisplay component 2024-12-19 23:24:55 +01:00
philipp lang cc440580e8 Make right slot optional in SettingLayout 2024-12-19 23:24:55 +01:00
philipp lang 6e72879874 fixup! Add modal component 2024-12-19 23:24:55 +01:00
philipp lang 9a33972ded Add testable macro for setArray 2024-12-19 23:24:55 +01:00
philipp lang f2b72b85cb Add modal component 2024-12-19 23:24:55 +01:00
philipp lang 918449be69 Throw exception when variant not found 2024-12-19 23:24:55 +01:00
philipp lang 77036ecbba Lint 2024-12-19 23:24:55 +01:00
philipp lang fce8019a73 Merge attributes for hint 2024-12-19 23:24:55 +01:00
philipp lang cf48c30432 Lint 2024-12-19 23:24:55 +01:00
philipp lang c8b994c5ac Fix Tooltip attribute of Table action 2024-12-19 23:24:55 +01:00
philipp lang 712d9f155a Register MailgatewayServiceProvider 2024-12-19 23:24:55 +01:00
philipp lang 9906f7ab8e Add select field 2024-12-19 23:24:55 +01:00
philipp lang b08df4d1df Disable autocomplete for password fields 2024-12-19 23:24:55 +01:00
philipp lang 7734d6ef82 Fix label required 2024-12-19 23:24:55 +01:00
philipp lang b3011a5322 Add Table action button 2024-12-19 23:24:55 +01:00
philipp lang dc7d0d1354 Add table component 2024-12-19 23:24:55 +01:00
philipp lang 42b628b165 Mod Component Test 2024-12-19 23:24:55 +01:00
philipp lang 8abeede8e6 Move Dashboard registrations 2024-12-19 23:24:55 +01:00
philipp lang 08729871c9 Add Settings for Bill 2024-12-19 23:24:51 +01:00
philipp lang f91c8ffa58 Add Toast and tooltip 2024-12-19 23:17:05 +01:00
philipp lang d81e65613c Remove Base tests from Composer 2024-12-19 23:17:05 +01:00
philipp lang 85800ae2b9 Add Component Resolver for Modules 2024-12-19 23:17:05 +01:00
philipp lang 5165ad932b Add Dashboard 2024-12-19 23:17:05 +01:00
philipp lang 30c9a4e573 Add Service Provider 2024-12-19 23:17:05 +01:00
philipp lang b5581a6142 Add livewire components 2024-12-19 23:17:02 +01:00
philipp lang b1e2e39fc3 Add config file 2024-12-19 23:15:14 +01:00
philipp lang 0d89768f4b Install Livewire Package 2024-12-19 23:15:14 +01:00
13 changed files with 8 additions and 127 deletions

View File

@ -1,21 +1,5 @@
# Letzte Änderungen
### 1.12.6
- Fix: Beiträge von Familienmitgliedern splitten
### 1.12.5
- Fix: Synchronisieren von bestehenden Beiträgen aus NaMi
### 1.12.4
- Filter Mitglieder nach Verhaltenskodex
### 1.12.3
- Volltextsuche für Rechnungen
### 1.12.2
- Zuschussliste Gallier

View File

@ -22,8 +22,7 @@ class InsertMemberAction
{
$region = Region::firstWhere('nami_id', $member->regionId ?: -1);
$payload = [
return Member::updateOrCreate(['nami_id' => $member->id], [
'firstname' => $member->firstname,
'lastname' => $member->lastname,
'joined_at' => $member->joinedAt,
@ -52,16 +51,7 @@ class InsertMemberAction
'mitgliedsnr' => $member->memberId,
'version' => $member->version,
'keepdata' => $member->keepdata,
];
// Dont update subscription if fee id of existing member's subscription is already the same
if ($existing = Member::nami($member->id)) {
if ($existing->subscription && $existing->subscription->fee->nami_id === $member->feeId) {
$payload['subscription_id'] = $existing->subscription->id;
}
}
return Member::updateOrCreate(['nami_id' => $member->id], $payload);
]);
}
public function getSubscription(NamiMember $member): ?Subscription

View File

@ -49,6 +49,7 @@ class Invoice extends Model
*/
public static function createForMember(Member $member, Collection $members, int $year, Subscription $subscription = null): self
{
$subscription = $subscription ?: $member->subscription;
$invoice = new self([
'to' => [
'name' => 'Familie ' . $member->lastname,
@ -65,8 +66,7 @@ class Invoice extends Model
$positions = collect([]);
foreach ($members as $member) {
$memberSubscription = $subscription ?: $member->subscription;
foreach ($memberSubscription->children as $child) {
foreach ($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

@ -46,8 +46,6 @@ class FilterScope extends ScoutFilter
public array $exclude = [],
public ?bool $hasFullAddress = null,
public ?bool $hasBirthday = null,
public ?bool $hasSvk = null,
public ?bool $hasVk = null,
) {
}
@ -87,12 +85,6 @@ class FilterScope extends ScoutFilter
if ($this->hasBirthday === true) {
$filter->push('birthday IS NOT NULL');
}
if ($this->hasSvk !== null) {
$filter->push('has_svk = ' . ($this->hasSvk ? 'true' : 'false'));
}
if ($this->hasVk !== null) {
$filter->push('has_vk = ' . ($this->hasVk ? 'true' : 'false'));
}
if ($this->ausstand === true) {
$filter->push('ausstand > 0');
}

View File

@ -544,8 +544,6 @@ class Member extends Model implements Geolocatable
'bill_kind' => $this->bill_kind?->value,
'group_id' => $this->group->id,
'group_name' => $this->group->inner_name ?: $this->group->name,
'has_vk' => $this->has_vk,
'has_svk' => $this->has_svk,
'links' => [
'show' => route('member.show', ['member' => $this], false),
'edit' => route('member.edit', ['member' => $this], false),

View File

@ -163,10 +163,6 @@ class MemberResource extends JsonResource
'activity_ids' => [],
'subactivity_ids' => []
],
'boolean_filter' => [
['id' => true, 'name' => 'Ja'],
['id' => false, 'name' => 'Nein'],
],
'default' => [
'gender_id' => null,
'salutation' => '',

View File

@ -138,7 +138,7 @@ return [
'key' => env('MEILI_MASTER_KEY', null),
'index-settings' => [
Member::class => [
'filterableAttributes' => ['address', 'birthday', 'ausstand', 'bill_kind', 'group_id', 'memberships', 'has_vk', 'has_svk', 'id'],
'filterableAttributes' => ['address', 'birthday', 'ausstand', 'bill_kind', 'group_id', 'memberships', 'id'],
'searchableAttributes' => ['fullname', 'address'],
'sortableAttributes' => ['lastname', 'firstname'],
'displayedAttributes' => ['age_group_icon', 'group_name', 'links', 'is_leader', 'lastname', 'firstname', 'fullname', 'address', 'ausstand', 'birthday', 'id', 'memberships', 'bill_kind', 'group_id'],

View File

@ -37,8 +37,6 @@ class MemberFactory extends Factory
'email' => $this->faker->safeEmail(),
'recertified_at' => null,
'keepdata' => false,
'has_svk' => $this->faker->boolean(),
'has_vk' => $this->faker->boolean(),
];
}

View File

@ -48,24 +48,6 @@
size="sm"
@update:model-value="setFilter('ausstand', $event)"
></f-switch>
<f-select
id="has_vk"
name="has_vk"
:model-value="getFilter('has_vk')"
label="Verhaltenskodex unterschrieben"
size="sm"
:options="meta.boolean_filter"
@update:model-value="setFilter('has_vk', $event)"
></f-select>
<f-select
id="has_svk"
name="has_svk"
:model-value="getFilter('has_svk')"
label="SVK unterschrieben"
size="sm"
:options="meta.boolean_filter"
@update:model-value="setFilter('has_svk', $event)"
></f-select>
<f-multipleselect
id="group_ids"
:options="meta.groups"

View File

@ -202,30 +202,6 @@ class MemberIndexTest extends EndToEndTestCase
]])->assertInertiaCount('data.data', 1);
}
public function testItFiltersForSvkPrevention(): void
{
Member::factory()->defaults()->create(['has_svk' => true]);
Member::factory()->defaults()->create(['has_svk' => false]);
Member::factory()->defaults()->create(['has_svk' => false]);
sleep(1);
$this->callFilter('member.index', ['has_svk' => true])->assertInertiaCount('data.data', 1);
$this->callFilter('member.index', ['has_svk' => false])->assertInertiaCount('data.data', 2);
$this->callFilter('member.index', ['has_svk' => null])->assertInertiaCount('data.data', 3);
}
public function testItFiltersForVkPrevention(): void
{
Member::factory()->defaults()->create(['has_vk' => true]);
Member::factory()->defaults()->create(['has_vk' => false]);
Member::factory()->defaults()->create(['has_vk' => false]);
sleep(1);
$this->callFilter('member.index', ['has_vk' => true])->assertInertiaCount('data.data', 1);
$this->callFilter('member.index', ['has_vk' => false])->assertInertiaCount('data.data', 2);
$this->callFilter('member.index', ['has_vk' => null])->assertInertiaCount('data.data', 3);
}
public function testGroupOfMembershipsFilterCanBeEmpty(): void
{
$mitglied = Activity::factory()->create();

View File

@ -90,8 +90,8 @@ class MassStoreActionTest extends TestCase
$this->assertDatabaseCount('invoices', 1);
$this->assertDatabaseCount('invoice_positions', 2);
$this->assertDatabaseHas('invoice_positions', ['description' => 'beitrag Max Muster', 'price' => 4466]);
$this->assertDatabaseHas('invoice_positions', ['description' => 'beitrag Jane Muster', 'price' => 4466]);
$this->assertDatabaseHas('invoice_positions', ['description' => 'beitrag Max Muster']);
$this->assertDatabaseHas('invoice_positions', ['description' => 'beitrag Jane Muster']);
}
public function testItSeparatesBillKinds(): void
@ -105,21 +105,4 @@ class MassStoreActionTest extends TestCase
$this->assertDatabaseCount('invoices', 2);
$this->assertDatabaseCount('invoice_positions', 2);
}
public function testItSeparatesSubscriptions(): void
{
$member1 = Member::factory()->defaults()->emailBillKind()
->for(Subscription::factory()->forFee()->children([new Child('beitrag1 {name}', 4466)]))
->create(['firstname' => 'Member1', 'lastname' => 'ln']);
$member2 = Member::factory()->defaults()->sameFamilyAs($member1)->emailBillKind()
->for(Subscription::factory()->forFee()->children([new Child('beitrag2 {name}', 4467)]))
->create(['firstname' => 'Member2']);
$this->postJson(route('invoice.mass-store'), ['year' => now()->addYear()->year])->assertOk();
$invoice = Invoice::first();
$this->assertDatabaseCount('invoice_positions', 2);
$this->assertDatabaseHas('invoice_positions', ['invoice_id' => $invoice->id, 'member_id' => $member1->id, 'description' => 'beitrag1 Member1 ln', 'price' => 4466]);
$this->assertDatabaseHas('invoice_positions', ['invoice_id' => $invoice->id, 'member_id' => $member2->id, 'description' => 'beitrag2 Member2 ln', 'price' => 4467]);
}
}

View File

@ -7,7 +7,6 @@ use App\Country;
use App\Fee;
use App\Gender;
use App\Group;
use App\Member\Member;
use App\Nationality;
use App\Payment\Subscription;
use App\Region;
@ -143,20 +142,3 @@ it('testItPullsMemberWithNoSubscription', function () {
'subscription_id' => null,
]);
});
it('doesnt set first subscription if fee matches', function () {
$this->loginNami();
Subscription::factory()->forFee(55)->create();
$otherSubscription = Subscription::factory()->forFee(55)->create();
$member = Member::factory()->defaults()->inNami(1001)->create(['subscription_id' => $otherSubscription->id]);
app(MemberFake::class)->shows(1000, 1001, [
'beitragsartId' => 55,
]);
app(PullMemberAction::class)->handle(1000, 1001);
$this->assertDatabaseHas('members', [
'subscription_id' => $otherSubscription->id,
'id' => $member->id,
]);
});

View File

@ -149,7 +149,7 @@ class ShowTest extends TestCase
->for(Group::factory())
->for(Nationality::factory()->name('deutsch'))
->for(Subscription::factory()->forFee())
->create(['firstname' => 'Max', 'lastname' => 'Muster', 'has_vk' => false, 'has_svk' => false]);
->create(['firstname' => 'Max', 'lastname' => 'Muster']);
$response = $this->get("/member/{$member->id}");