├── public ├── favicon.ico ├── robots.txt └── .htaccess ├── storage ├── temp │ └── .gitkeep ├── logs │ └── .gitignore ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── cache │ ├── data │ │ └── .gitignore │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── bootstrap └── cache │ └── .gitignore ├── database ├── .gitignore ├── settings │ ├── 2024_05_27_193133_create_forms_settings.php │ ├── 2022_10_18_123918_mailman_is_active.php │ ├── 2024_06_09_235516_add_clear_cache_url_setting.php │ ├── 2022_05_01_185012_create_nami_settings_group.php │ ├── 2023_05_01_185012_create_nami_search_setting.php │ ├── 2024_07_31_211952_create_invoice_remember_weeks_setting.php │ ├── 2022_11_05_213938_iban_settings.php │ ├── 2021_11_22_233113_create_allowed_nami_login_setting.php │ ├── 2022_02_19_230152_create_nami_settings.php │ ├── 2024_07_04_202013_create_prevention_settings.php │ ├── 202511-07_create_replyto_mail_settings.php │ ├── 2021_11_18_230152_create_general_settings.php │ ├── 2022_10_18_123917_mailman_settings.php │ ├── 2023_11_16_101137_create_module_settings.php │ ├── 2022_10_18_123919_mailman_lists.php │ ├── 2022_09_05_213938_bill_settings.php │ └── 2025_05_24_202013_create_prevention_yearly_mail_settings.php ├── seeders │ ├── DatabaseSeeder.php │ └── UserSeeder.php ├── migrations │ ├── 2024_12_15_155941_update_search_index.php │ ├── 2022_11_23_220958_drop_members_confirmed_at_column.php │ ├── 2023_02_05_233824_create_memberships_to_column.php │ ├── 2023_02_05_235353_edit_activities_nami_id_column.php │ ├── 2017_12_25_231219_create_ways_table.php │ ├── 2025_07_06_022536_create_forms_country_column.php │ ├── 2024_12_16_235710_update_form_searching_2.php │ ├── 2024_11_07_004559_add_members_keepdata_column.php │ ├── 2025_11_11_221048_create_participants_cancelled_at_column.php │ ├── 2017_04_12_010000_create_groups_table.php │ ├── 2022_10_05_171451_create_members_slug_column.php │ ├── 2023_05_16_113849_create_members_latlon_column.php │ ├── 2017_07_04_235624_create_countries_table.php │ ├── 2023_02_27_221231_create_members_comment_column.php │ ├── 2022_03_15_152907_create_members_efz_column.php │ ├── 2022_03_20_145006_create_activities_has_efz_column.php │ ├── 2023_02_27_213656_create_members_salutation_column.php │ ├── 2023_11_23_001310_create_invoice_data_column.php │ ├── 2024_06_26_224159_create_fileshares_table.php │ ├── 2023_03_02_220832_create_members_mitgliedsnr_column.php │ ├── 2024_06_29_141316_create_fileshare_column.php │ ├── 2017_07_05_000438_create_genders_table.php │ ├── 2022_12_11_192600_create_memberships_has_promise_column.php │ ├── 2023_11_24_131853_create_members_recertified_at_column.php │ ├── 2025_07_09_221048_create_forms_leader_conditions_column.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2023_03_05_230539_edit_members_birthday_column.php │ ├── 2021_11_18_215522_create_settings_table.php │ └── 2023_06_12_083133_create_maildispatchers_table.php └── factories │ ├── ConfessionFactory.php │ ├── CountryFactory.php │ ├── Payment │ └── SubscriptionChildFactory.php │ ├── UserFactory.php │ └── FeeFactory.php ├── resources ├── views │ ├── vendor │ │ └── mail │ │ │ ├── text │ │ │ ├── footer.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── table.blade.php │ │ │ ├── button.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ └── message.blade.php │ │ │ └── html │ │ │ ├── table.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── message.blade.php │ │ │ └── button.blade.php │ ├── tex │ │ └── templates │ │ │ ├── efz │ │ │ ├── bg-1.pdf │ │ │ ├── bg-2.pdf │ │ │ └── bg-3.pdf │ │ │ ├── invoice │ │ │ └── assets │ │ │ │ └── logo.png │ │ │ └── contribution │ │ │ ├── rdp-nrw.pdf │ │ │ ├── wuppertal.pdf │ │ │ ├── bdkj-hesse.pdf │ │ │ ├── city-frankfurt-main.pdf │ │ │ ├── city-remscheid-leader.pdf │ │ │ └── city-remscheid-children.pdf │ ├── mail │ │ ├── invoice │ │ │ ├── bill.blade.php │ │ │ └── remember.blade.php │ │ ├── prevention │ │ │ └── prevention-remember-participant.blade.php │ │ └── form │ │ │ └── confirm-registration.blade.php │ └── app.blade.php ├── css │ ├── layout.css │ ├── app.css │ ├── tooltip.css │ └── bool.css ├── img │ ├── dpsg.gif │ ├── logo.png │ └── svg │ │ ├── check.svg │ │ ├── filter.svg │ │ ├── menu.svg │ │ ├── search.svg │ │ ├── eye.svg │ │ ├── close.svg │ │ ├── copy.svg │ │ ├── envelope.svg │ │ ├── report.svg │ │ ├── warning.svg │ │ ├── pencil.svg │ │ ├── chevron.svg │ │ ├── undo.svg │ │ ├── danger.svg │ │ ├── info-button.svg │ │ ├── warning-triangle.svg │ │ ├── disabled.svg │ │ ├── open-folder.svg │ │ ├── plus.svg │ │ ├── save.svg │ │ ├── warning-triangle-light.svg │ │ ├── desktop.svg │ │ ├── course.svg │ │ ├── user.svg │ │ └── document.svg ├── js │ ├── components │ │ ├── form │ │ │ ├── CheckboxesLabel.vue │ │ │ ├── Hint.vue │ │ │ ├── SaveButton.vue │ │ │ └── Label.vue │ │ ├── page │ │ │ ├── Title.vue │ │ │ ├── FullHeading.vue │ │ │ ├── FullHeadingBanner.vue │ │ │ ├── FullLayout.vue │ │ │ └── Filter.vue │ │ └── ui │ │ │ ├── Sprite.vue │ │ │ ├── Loading.vue │ │ │ ├── Label.vue │ │ │ ├── ActionButton.vue │ │ │ ├── IconButton.vue │ │ │ ├── FilterSidebar.vue │ │ │ ├── Button.vue │ │ │ ├── AgeGroups.vue │ │ │ └── Menulist.vue │ ├── mixins │ │ ├── hasModule.js │ │ └── hasFlash.js │ ├── composables │ │ ├── useQueueEvents.js │ │ ├── useAgeColors.js │ │ └── useDownloads.ts │ ├── views │ │ ├── dashboard │ │ │ ├── VBlock.vue │ │ │ ├── MemberPayment.vue │ │ │ ├── EfzPending.vue │ │ │ ├── PsPending.vue │ │ │ └── AgeGroupCount.vue │ │ ├── formtemplate │ │ │ ├── useElements.js │ │ │ ├── TextField.vue │ │ │ ├── TextareaField.vue │ │ │ └── CheckboxField.vue │ │ ├── member │ │ │ └── Tags.vue │ │ └── form │ │ │ ├── Prevention.vue │ │ │ └── ConditionsForm.vue │ ├── lib │ │ ├── floatingVue.js │ │ └── toast.js │ └── layouts │ │ ├── FullLayout.vue │ │ └── _VLink.vue └── lang │ ├── de │ ├── pagination.php │ └── auth.php │ └── en │ ├── pagination.php │ ├── auth.php │ └── passwords.php ├── doc ├── .gitignore ├── page │ ├── assets │ │ └── img │ │ │ ├── member.jpg │ │ │ ├── init-confirm.jpg │ │ │ ├── init-login.jpg │ │ │ ├── init-members.jpg │ │ │ ├── nami-login-init.jpg │ │ │ └── init-default-groupid.jpg │ ├── firststeps │ │ └── index.md │ ├── _includes │ │ └── imgcap.html │ ├── kontakt.md │ └── index.md ├── build.sh └── 404.html ├── app ├── Lib │ ├── Events │ │ ├── JobFailed.php │ │ ├── JobFinished.php │ │ └── JobStarted.php │ ├── Editor │ │ ├── Editorable.php │ │ ├── ConditionMode.php │ │ ├── Comparator.php │ │ ├── Statement.php │ │ └── ConditionResolver.php │ ├── Data │ │ ├── RecordData.php │ │ └── DateData.php │ ├── Transformers │ │ └── DateTransformer.php │ ├── Normalizers │ │ └── DateNormalizer.php │ ├── Sorting.php │ └── HasDataMeta.php ├── Form │ ├── Matchers │ │ ├── BooleanMatcher.php │ │ ├── Matcher.php │ │ └── SingleValueMatcher.php │ ├── Contracts │ │ └── Filterable.php │ ├── Presenters │ │ ├── Presenter.php │ │ ├── BooleanPresenter.php │ │ ├── DefaultPresenter.php │ │ ├── DatePresenter.php │ │ ├── NamiPresenter.php │ │ ├── EnumPresenter.php │ │ └── GroupPresenter.php │ ├── Data │ │ ├── ColumnData.php │ │ └── SectionData.php │ ├── Actions │ │ ├── ClearFrontendCacheAction.php │ │ ├── FormDestroyAction.php │ │ ├── ParticipantFieldsAction.php │ │ ├── ParticipantAssignAction.php │ │ ├── FormtemplateDestroyAction.php │ │ └── IsDirtyAction.php │ ├── Fields │ │ └── EmailField.php │ ├── Enums │ │ └── SpecialType.php │ ├── Models │ │ └── Formtemplate.php │ ├── Casts │ │ └── FieldCollectionCast.php │ ├── Transformers │ │ ├── CollectionTransformer.php │ │ └── FieldCollectionTransformer.php │ └── Policies │ │ └── FormPolicy.php ├── Exceptions │ └── MemberNotInNamiException.php ├── Mailman │ ├── Exceptions │ │ └── MailmanServiceException.php │ └── Data │ │ └── Member.php ├── Contribution │ ├── Traits │ │ ├── HasPdfBackground.php │ │ └── FormatsDates.php │ ├── Requests │ │ └── GenerateApiRequest.php │ └── Contracts │ │ └── HasContributionData.php ├── Tex │ ├── TexCompiler.php │ └── TexServiceProvider.php ├── Invoice │ ├── MailRecipient.php │ ├── BillDocument.php │ ├── RememberDocument.php │ └── Actions │ │ ├── DisplayPdfAction.php │ │ ├── DisplayRememberpdfAction.php │ │ ├── InvoiceDestroyAction.php │ │ └── InvoiceStoreAction.php ├── Member │ ├── Actions │ │ ├── NamiDeleteMemberAction.php │ │ └── InsertFullMemberAction.php │ ├── BankAccount.php │ ├── Data │ │ └── MemberData.php │ └── Resources │ │ ├── RegionResource.php │ │ ├── NationalityResource.php │ │ └── BankAccountResource.php ├── Http │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── CheckForMaintenanceMode.php │ │ ├── TrimStrings.php │ │ ├── Authenticate.php │ │ ├── RedirectIfAuthenticated.php │ │ └── TrustProxies.php │ ├── Controllers │ │ └── Controller.php │ └── Resources │ │ └── UserResource.php ├── Nami │ └── Api │ │ ├── MemberAction.php │ │ ├── CoursesOfAction.php │ │ └── MembershipsOfAction.php ├── Maildispatcher │ ├── Models │ │ └── Localmaildispatcher.php │ ├── Data │ │ └── MailEntry.php │ └── Actions │ │ ├── CreateAction.php │ │ ├── DestroyAction.php │ │ ├── EditAction.php │ │ └── IndexAction.php ├── Confession.php ├── Nationality.php ├── Initialize │ ├── Actions │ │ └── InitializeFormAction.php │ ├── InitializeGenders.php │ ├── InitializeCountries.php │ ├── InitializeCourses.php │ ├── InitializeActivities.php │ ├── InitializeNationalities.php │ ├── InitializeRegions.php │ ├── InitializeConfessions.php │ └── InitializeFees.php ├── Prevention │ ├── Contracts │ │ └── Preventable.php │ └── Actions │ │ └── SettingApiAction.php ├── Providers │ ├── BroadcastServiceProvider.php │ └── PluginServiceProvider.php ├── Setting │ ├── LocalSettings.php │ ├── Contracts │ │ └── Storeable.php │ └── Actions │ │ └── ViewAction.php ├── Pdf │ └── Sender.php ├── Fileshare │ ├── Models │ │ └── Fileshare.php │ ├── Data │ │ └── ResourceData.php │ ├── Actions │ │ ├── FileshareApiIndexAction.php │ │ └── ListFilesAction.php │ └── FileshareSettings.php ├── Payment │ ├── SubscriptionChild.php │ └── SubscriptionChildResource.php ├── Mailgateway │ ├── Models │ │ └── Mailgateway.php │ ├── Actions │ │ ├── StoreAction.php │ │ └── UpdateAction.php │ └── MailgatewaySettings.php ├── Activity │ ├── Actions │ │ ├── EditAction.php │ │ └── CreateAction.php │ └── Api │ │ └── SubactivityShowAction.php ├── Country.php ├── Actions │ ├── PullMemberAction.php │ ├── DbMaintainAction.php │ ├── PullCoursesAction.php │ └── PullMembershipsAction.php ├── Efz │ └── ShowEfzDocumentAction.php ├── Membership │ └── Actions │ │ ├── ListForGroupAction.php │ │ └── MembershipIndexAction.php ├── Dashboard │ ├── Blocks │ │ └── Block.php │ ├── Actions │ │ └── IndexAction.php │ └── DashboardServiceProvider.php ├── View │ └── Mail │ │ └── Editor.php ├── Course │ └── Resources │ │ └── CourseResource.php ├── Group │ └── Enums │ │ └── Level.php ├── Region.php ├── Fee.php └── User.php ├── tests ├── Fileshare │ └── 08-skeleton.sh ├── Arch.php ├── stub │ └── phpstan │ │ ├── File.stub │ │ ├── Settings.stub │ │ ├── DataEloquentCast.stub │ │ └── TestResponse.stub ├── Lib │ ├── Queryable.php │ └── MergesAttributes.php ├── EndToEnd │ └── Form │ │ └── FormTestCase.php ├── RequestFactories │ ├── MemberUpdateRequestFactory.php │ ├── Child.php │ ├── MailmanTypeRequest.php │ ├── MemberStoreRequestFactory.php │ ├── InvoiceSettingsFake.php │ ├── ConditionRequestFactory.php │ └── ContributionMemberApiRequestFactory.php ├── Unit │ └── EditorDataTest.php └── Feature │ └── Invoice │ └── InvoiceDestroyActionTest.php ├── .gitattributes ├── .prettierrc ├── config └── init.php ├── .docker ├── bin │ └── build_base ├── nginx.Dockerfile └── php.Dockerfile ├── .styleci.yml ├── postcss.config.js ├── routes ├── remote.php ├── channels.php └── console.php ├── .editorconfig ├── Envoy.blade.php ├── .ackrc ├── .dockerignore ├── .bash_history ├── bin └── copydb ├── .app.env.example ├── server.php ├── .gitignore └── .gitmodules /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /storage/temp/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/footer.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/panel.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/table.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/button.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }}: {{ $url }} 2 | -------------------------------------------------------------------------------- /resources/css/layout.css: -------------------------------------------------------------------------------- 1 | .has-contents > div { 2 | display: contents; 3 | } 4 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/header.blade.php: -------------------------------------------------------------------------------- 1 | [{{ $slot }}]({{ $url }}) 2 | -------------------------------------------------------------------------------- /doc/.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | .jekyll-cache 4 | .jekyll-metadata 5 | vendor 6 | -------------------------------------------------------------------------------- /resources/img/dpsg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/img/dpsg.gif -------------------------------------------------------------------------------- /resources/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/img/logo.png -------------------------------------------------------------------------------- /doc/page/assets/img/member.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/doc/page/assets/img/member.jpg -------------------------------------------------------------------------------- /doc/page/assets/img/init-confirm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/doc/page/assets/img/init-confirm.jpg -------------------------------------------------------------------------------- /doc/page/assets/img/init-login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/doc/page/assets/img/init-login.jpg -------------------------------------------------------------------------------- /doc/page/assets/img/init-members.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/doc/page/assets/img/init-members.jpg -------------------------------------------------------------------------------- /app/Lib/Events/JobFailed.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/table.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ Illuminate\Mail\Markdown::parse($slot) }} 3 |
4 | -------------------------------------------------------------------------------- /resources/img/svg/filter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/tex/templates/efz/bg-1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/efz/bg-1.pdf -------------------------------------------------------------------------------- /resources/views/tex/templates/efz/bg-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/efz/bg-2.pdf -------------------------------------------------------------------------------- /resources/views/tex/templates/efz/bg-3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/efz/bg-3.pdf -------------------------------------------------------------------------------- /doc/page/assets/img/init-default-groupid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/doc/page/assets/img/init-default-groupid.jpg -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /resources/img/svg/menu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Form/Matchers/BooleanMatcher.php: -------------------------------------------------------------------------------- 1 | env('USER_EMAIL', 'admin@example.com'), 5 | 'password' => env('USER_PASSWORD', 'admin'), 6 | ]; 7 | -------------------------------------------------------------------------------- /resources/views/tex/templates/contribution/rdp-nrw.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/contribution/rdp-nrw.pdf -------------------------------------------------------------------------------- /resources/views/tex/templates/contribution/wuppertal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/contribution/wuppertal.pdf -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /tests/Arch.php: -------------------------------------------------------------------------------- 1 | expect('App') 5 | ->not->toUse(['die', 'dd', 'dump']) 6 | ->not->toHaveFileSystemPermissions('0777'); 7 | -------------------------------------------------------------------------------- /app/Lib/Editor/Editorable.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 | -------------------------------------------------------------------------------- /resources/views/tex/templates/contribution/city-frankfurt-main.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zoomyboy/adrema/HEAD/resources/views/tex/templates/contribution/city-frankfurt-main.pdf -------------------------------------------------------------------------------- /app/Lib/Editor/ConditionMode.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Exceptions/MemberNotInNamiException.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/js/components/page/Title.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /resources/js/components/ui/Sprite.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /doc/page/firststeps/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Erste Schritte 4 | has_children: true 5 | nav_order: 1 6 | --- 7 | 8 | # Erste Schritte 9 | 10 | Hier findest du Hinweise zur Grundeinrichtung von Adrema. 11 | 12 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/layout.blade.php: -------------------------------------------------------------------------------- 1 | {!! strip_tags($header) !!} 2 | 3 | {!! strip_tags($slot) !!} 4 | @isset($subcopy) 5 | 6 | {!! strip_tags($subcopy) !!} 7 | @endisset 8 | 9 | {!! strip_tags($footer) !!} 10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/js/components/page/FullHeading.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - unused_use 5 | finder: 6 | not-name: 7 | - index.php 8 | - server.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /resources/img/svg/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/Lib/Queryable.php: -------------------------------------------------------------------------------- 1 | create()))); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /resources/img/svg/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/Lib/Editor/Comparator.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | const tailwindcss = require('tailwindcss'); 2 | 3 | module.exports = { 4 | plugins: { 5 | 'postcss-import': {}, 6 | 'tailwindcss/nesting': {}, 7 | 'tailwindcss': {}, 8 | 'autoprefixer': {}, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss/base'; 2 | @import 'tailwindcss/components'; 3 | @import 'tailwindcss/utilities'; 4 | 5 | @import 'base.css'; 6 | @import 'layout'; 7 | @import 'buttons'; 8 | @import 'table'; 9 | @import 'bool'; 10 | @import 'editor'; 11 | -------------------------------------------------------------------------------- /tests/EndToEnd/Form/FormTestCase.php: -------------------------------------------------------------------------------- 1 | name('remote.nami.token'); 7 | Route::post('/nami/search', SearchAction::class)->name('remote.nami.search'); 8 | -------------------------------------------------------------------------------- /app/Contribution/Traits/HasPdfBackground.php: -------------------------------------------------------------------------------- 1 | >>']; 10 | 11 | protected $rawTags = ['<<>>']; 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /app/Form/Presenters/Presenter.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
Lade …
5 |
6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/RequestFactories/MemberUpdateRequestFactory.php: -------------------------------------------------------------------------------- 1 | state(['has_nami' => false]); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /database/settings/2024_05_27_193133_create_forms_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('form.registerUrl', ''); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /database/settings/2022_10_18_123918_mailman_is_active.php: -------------------------------------------------------------------------------- 1 | migrator->add('mailman.is_active', false); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/Lib/Editor/Statement.php: -------------------------------------------------------------------------------- 1 | migrator->add('form.clearCacheUrl', ''); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /Envoy.blade.php: -------------------------------------------------------------------------------- 1 | @servers(['docker' => ['stamm-silva@zoomyboy.de', 'stammgallier@stamm-gallier.de', 'dpsg-lennep@zoomyboy.de', 'dpsgbergischland@zoomyboy.de', 'dpsg-koeln@dpsg-koeln.de']]) 2 | 3 | @task('deploy', ['on' => 'docker']) 4 | cd $ADREMA_PATH 5 | docker compose down 6 | docker compose pull 7 | docker compose up -d 8 | @endtask 9 | -------------------------------------------------------------------------------- /app/Form/Data/ColumnData.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.ackrc: -------------------------------------------------------------------------------- 1 | --ignore-dir=vendor/composer 2 | --ignore-dir=public/js 3 | --ignore-dir=public/vendor 4 | --ignore-dir=vendor 5 | --ignore-dir=public/css 6 | --ignore-dir=storage/debugbar 7 | --type-set=tags:is:tags 8 | --type-set=log:ext:log 9 | --type-set=packagelock:is:package-lock.json 10 | --notags 11 | --nolog 12 | --nopackagelock 13 | -------------------------------------------------------------------------------- /app/Form/Presenters/DatePresenter.php: -------------------------------------------------------------------------------- 1 | format('d.m.Y') : ''; 13 | 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/Invoice/MailRecipient.php: -------------------------------------------------------------------------------- 1 | email = $email; 13 | $this->name = $name; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /database/settings/2022_05_01_185012_create_nami_settings_group.php: -------------------------------------------------------------------------------- 1 | migrator->add('nami.default_group_id', 0); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /database/settings/2023_05_01_185012_create_nami_search_setting.php: -------------------------------------------------------------------------------- 1 | migrator->add('nami.search_params', []); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /database/settings/2024_07_31_211952_create_invoice_remember_weeks_setting.php: -------------------------------------------------------------------------------- 1 | migrator->add('bill.rememberWeeks', 12); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /doc/page/_includes/imgcap.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
{{ include.caption }}
4 |
5 | -------------------------------------------------------------------------------- /tests/stub/phpstan/DataEloquentCast.stub: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class DataEloquentCast implements CastsAttributes 12 | { 13 | } 14 | -------------------------------------------------------------------------------- /resources/img/svg/report.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /database/settings/2022_11_05_213938_iban_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('bill.iban', ''); 10 | $this->migrator->add('bill.bic', ''); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/header.blade.php: -------------------------------------------------------------------------------- 1 | @props(['url']) 2 | 3 | 4 | 5 | @if (trim($slot) === 'Laravel') 6 | 7 | @else 8 | {{ $slot }} 9 | @endif 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /database/settings/2021_11_22_233113_create_allowed_nami_login_setting.php: -------------------------------------------------------------------------------- 1 | migrator->add('general.allowed_nami_accounts', []); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /resources/img/svg/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/Form/Presenters/NamiPresenter.php: -------------------------------------------------------------------------------- 1 | $value 10 | */ 11 | public function present($value): string 12 | { 13 | return collect(array_column($value, 'id'))->implode(', '); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /database/settings/2022_02_19_230152_create_nami_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('nami.mglnr', 0); 10 | $this->migrator->add('nami.password', ''); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /database/settings/2024_07_04_202013_create_prevention_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('prevention.formmail', ['time' => 1, 'blocks' => [], 'version' => '1.0']); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | data 3 | **/vendor 4 | public/build 5 | public/vendor 6 | bootstrap/cache/services.php 7 | bootstrap/cache/packages.php 8 | bootstrap/cache/routes.php 9 | packages/laravel-nami/.cookies 10 | storage/logs/** 11 | storage/temp/** 12 | storage/debugbar/** 13 | storage/app/tmp/** 14 | cookies 15 | storage/logs/laravel.log 16 | .git 17 | doc 18 | -------------------------------------------------------------------------------- /resources/img/svg/pencil.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /database/settings/202511-07_create_replyto_mail_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('form.replyToMail', ''); 10 | $this->migrator->add('prevention.replyToMail', ''); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /resources/js/components/page/FullHeadingBanner.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UserSeeder::class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/settings/2021_11_18_230152_create_general_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('general.modules', []); 10 | $this->migrator->add('general.single_view', false); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /doc/page/kontakt.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Kontakt 4 | nav_order: 5 5 | --- 6 | 7 | # Kontakt 8 | 9 | Wenn du Hilfe bei der Einrichtung brauchst, Rückfragen, Verbesserungsvorschläge oder etwas ähnliches hast, dann kontaktiere mich einfach. 10 | 11 | ## E-Mail 12 | 13 | [philipp@zoomyboy.de](mailto:philipp@zoomyboy.de) 14 | 15 | ## Matrix 16 | 17 | @philipp:zoomyboy.de 18 | -------------------------------------------------------------------------------- /resources/img/svg/chevron.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.bash_history: -------------------------------------------------------------------------------- 1 | php artisan migrate:fresh --seed 2 | exit 3 | php artisan migrate:fresh --seed 4 | php artisan migrate:fresh --database=mysqlrtest 5 | php artisan migrate:fresh --database=mysqltest 6 | exit 7 | php artisan migrate:fresh --seed 8 | exit 9 | exit 10 | php artisan migrate:fresh --seed 11 | exit 12 | exit 13 | php artisan tinker 14 | exit 15 | php artisan tinker 16 | v 17 | exit 18 | -------------------------------------------------------------------------------- /app/Form/Presenters/EnumPresenter.php: -------------------------------------------------------------------------------- 1 | $value 10 | */ 11 | public function present($value): string 12 | { 13 | return is_array($value) 14 | ? implode(', ', $value) 15 | : ''; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /resources/js/composables/useQueueEvents.js: -------------------------------------------------------------------------------- 1 | export default function (siteName, reloadCallback) { 2 | return { 3 | startListener: function () { 4 | window.Echo.channel(siteName).listen('\\App\\Lib\\Events\\ReloadTriggered', () => reloadCallback()); 5 | }, 6 | stopListener() { 7 | window.Echo.leave(siteName); 8 | }, 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /resources/views/mail/invoice/bill.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | # {{ $invoice->greeting }}, 3 | 4 | Im Anhang findet ihr die aktuelle Rechnung des Stammes Silva für das laufende Jahr. Bitte begleicht diese bis zum angegebenen Datum. 5 | 6 | @component('mail::subcopy') 7 | 8 | Herzliche Grüße und gut Pfad 9 | 10 | Der Stammesvorstand 11 | @endcomponent 12 | 13 | @endcomponent 14 | -------------------------------------------------------------------------------- /app/Member/Actions/NamiDeleteMemberAction.php: -------------------------------------------------------------------------------- 1 | login()->deleteMember($namiId); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | ]; 16 | } 17 | -------------------------------------------------------------------------------- /resources/js/views/dashboard/VBlock.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /resources/views/mail/prevention/prevention-remember-participant.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | # Hallo {{ $preventable->getMailRecipient()->name }}, 3 | 4 | 5 | 6 | @component('mail::subcopy') 7 | 8 | Herzliche Grüße und gut Pfad 9 | 10 | {{$settings->from_long}} 11 | @endcomponent 12 | 13 | @endcomponent 14 | -------------------------------------------------------------------------------- /resources/js/components/ui/Label.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | ]; 16 | } 17 | -------------------------------------------------------------------------------- /app/Form/Actions/ClearFrontendCacheAction.php: -------------------------------------------------------------------------------- 1 | clearCacheUrl); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Nami/Api/MemberAction.php: -------------------------------------------------------------------------------- 1 | member($groupId, $memberId); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Maildispatcher/Models/Localmaildispatcher.php: -------------------------------------------------------------------------------- 1 | greeting }}, 3 | 4 | Hiermit möchten wir euch an die noch ausstehenden Mitgliedsbeiträge des Stammes Silva für das laufende Jahr erinnern. Bitte begleicht diese bis zum angegebenen Datum. 5 | 6 | @component('mail::subcopy') 7 | 8 | Herzliche Grüße und gut Pfad 9 | 10 | Der Stammesvorstand 11 | @endcomponent 12 | 13 | @endcomponent 14 | -------------------------------------------------------------------------------- /app/Confession.php: -------------------------------------------------------------------------------- 1 | */ 12 | use HasFactory; 13 | 14 | public $fillable = ['name', 'nami_id', 'is_null']; 15 | public $timestamps = false; 16 | } 17 | -------------------------------------------------------------------------------- /app/Form/Matchers/Matcher.php: -------------------------------------------------------------------------------- 1 | value = $value; 15 | 16 | return $this; 17 | } 18 | 19 | abstract public function matches(Comparator $comparator, mixed $value): bool; 20 | } 21 | -------------------------------------------------------------------------------- /app/Invoice/BillDocument.php: -------------------------------------------------------------------------------- 1 | email = strtolower($email); 12 | } 13 | 14 | public function is(self $mailEntry): bool 15 | { 16 | return $this->email === $mailEntry->email; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/settings/2022_10_18_123917_mailman_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('mailman.base_url', null); 10 | $this->migrator->add('mailman.username', null); 11 | $this->migrator->add('mailman.password', null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /resources/js/composables/useAgeColors.js: -------------------------------------------------------------------------------- 1 | import {ref} from 'vue'; 2 | 3 | export default function useAgeColors() { 4 | const ageColors = ref({ 5 | biber: 'text-biber', 6 | woelfling: 'text-woelfling', 7 | jungpfadfinder: 'text-jungpfadfinder', 8 | pfadfinder: 'text-pfadfinder', 9 | rover: 'text-rover', 10 | leiter: 'text-leiter', 11 | }); 12 | 13 | return {ageColors}; 14 | } 15 | -------------------------------------------------------------------------------- /app/Member/BankAccount.php: -------------------------------------------------------------------------------- 1 | */ 12 | use HasFactory; 13 | 14 | public $guarded = []; 15 | 16 | public $primaryKey = 'member_id'; 17 | } 18 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/panel.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/Http/Middleware/CheckForMaintenanceMode.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | ]; 16 | } 17 | -------------------------------------------------------------------------------- /app/Nationality.php: -------------------------------------------------------------------------------- 1 | */ 13 | use HasFactory; 14 | use HasNamiField; 15 | 16 | public $fillable = ['name', 'nami_id']; 17 | } 18 | -------------------------------------------------------------------------------- /resources/js/components/ui/ActionButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /app/Invoice/RememberDocument.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'password', 16 | 'password_confirmation', 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /app/Initialize/Actions/InitializeFormAction.php: -------------------------------------------------------------------------------- 1 | put('title', 'Einrichtung'); 16 | 17 | return Inertia::render('Initialize/VIndex'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/js/components/form/Hint.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /resources/js/views/formtemplate/useElements.js: -------------------------------------------------------------------------------- 1 | export default function useElements() { 2 | function addOption(options) { 3 | return [...options, '']; 4 | } 5 | 6 | function setOption(options, index, $event) { 7 | return options.toSpliced(index, 1, $event); 8 | } 9 | 10 | function removeOption(options, index) { 11 | return options.toSpliced(index, 1); 12 | } 13 | 14 | return {addOption, setOption, removeOption}; 15 | } 16 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | $this->amount, 18 | 'name' => $this->name, 19 | ]; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/img/svg/undo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/js/components/form/SaveButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /resources/js/components/ui/IconButton.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /app/Prevention/Contracts/Preventable.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function preventions(): Collection; 18 | 19 | public function getMailRecipient(): ?stdClass; 20 | } 21 | -------------------------------------------------------------------------------- /app/Form/Actions/FormDestroyAction.php: -------------------------------------------------------------------------------- 1 | delete(); 16 | 17 | ClearFrontendCacheAction::run(); 18 | 19 | Succeeded::message('Veranstaltung gelöscht.')->dispatch(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | $this->group()]); 14 | } 15 | 16 | /** 17 | * @return array 18 | */ 19 | abstract public function viewData(): array; 20 | } 21 | -------------------------------------------------------------------------------- /resources/views/mail/form/confirm-registration.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Hallo {{$fullname}}, 4 | 5 | 6 | 7 | # Deine Daten 8 | 9 | @foreach($config->sections as $section) 10 | ## {{$section->name}} 11 | @foreach ($section->fields as $field) 12 | * {{$field->name}}: {{$field->presentRaw()}} 13 | @endforeach 14 | @endforeach 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/Nami/Api/CoursesOfAction.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function handle(Api $api, int $namiId): Collection 18 | { 19 | return $api->coursesOf($namiId); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/settings/2023_11_16_101137_create_module_settings.php: -------------------------------------------------------------------------------- 1 | migrator->delete('general.modules'); 11 | $this->migrator->delete('general.single_view'); 12 | $this->migrator->add('module.modules', collect(Module::cases())->map(fn ($module) => $module->value)); 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /resources/img/svg/danger.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/img/svg/info-button.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Member/Data/MemberData.php: -------------------------------------------------------------------------------- 1 | withoutMagicalCreation()->from([ 18 | 'fullname' => $member->fullname 19 | ]); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /database/settings/2022_10_18_123919_mailman_lists.php: -------------------------------------------------------------------------------- 1 | migrator->add('mailman.all_parents_list', null); 10 | $this->migrator->add('mailman.all_list', null); 11 | $this->migrator->add('mailman.active_leaders_list', null); 12 | $this->migrator->add('mailman.passive_leaders_list', null); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/Pdf/Sender.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function values(): array 18 | { 19 | return array_values($this->include('mglnr')->toArray()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Form/Fields/EmailField.php: -------------------------------------------------------------------------------- 1 | key => $this->required ? ['required', 'string', 'email'] : ['nullable', 'email', 'string']]; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /doc/404.html: -------------------------------------------------------------------------------- 1 | --- 2 | permalink: /404.html 3 | layout: default 4 | --- 5 | 6 | 19 | 20 |
21 |

404

22 | 23 |

Page not found :(

24 |

The requested page could not be found.

25 |
26 | -------------------------------------------------------------------------------- /app/Invoice/Actions/DisplayPdfAction.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function handle(Api $api, int $namiId): Collection 18 | { 19 | return $api->membershipsOf($namiId); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/js/composables/useDownloads.ts: -------------------------------------------------------------------------------- 1 | import { Axios } from 'axios'; 2 | import { inject } from 'vue'; 3 | 4 | export default function() { 5 | const axios = inject('axios'); 6 | 7 | async function download(url: string, payload: Record) { 8 | const payloadString = btoa(encodeURIComponent(JSON.stringify(payload))); 9 | await axios.get(`${url}?payload=${payloadString}&validate=1`); 10 | window.open(`${url}?payload=${payloadString}`); 11 | } 12 | 13 | return { download }; 14 | } 15 | -------------------------------------------------------------------------------- /resources/js/views/member/Tags.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /app/Lib/Transformers/DateTransformer.php: -------------------------------------------------------------------------------- 1 | format('Y-m-d'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/img/svg/warning-triangle.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/js/components/form/Label.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /tests/RequestFactories/MailmanTypeRequest.php: -------------------------------------------------------------------------------- 1 | 'https://'.$this->faker->domainName(), 13 | 'user' => $this->faker->firstName(), 14 | 'password' => $this->faker->password(), 15 | 'owner' => $this->faker->safeEmail(), 16 | ]; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/Unit/EditorDataTest.php: -------------------------------------------------------------------------------- 1 | paragraphs(['{search}'])->toData(); 14 | 15 | $data->replaceWithList('search', ['A', 'B']); 16 | 17 | $this->assertEquals('A', data_get($data->blocks, '0.data.items.0.content')); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Fileshare/Models/Fileshare.php: -------------------------------------------------------------------------------- 1 | */ 13 | use HasFactory; 14 | 15 | public $guarded = []; 16 | 17 | public $casts = [ 18 | 'type' => ConnectionType::class, 19 | ]; 20 | } 21 | -------------------------------------------------------------------------------- /bin/copydb: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "drop database adrema;" | sudo mysql 4 | echo "create database adrema;" | sudo mysql 5 | 6 | ssh -l stamm-silva zoomyboy.de "cd /usr/share/webapps/adrema_silva && docker compose exec db mysqldump -udb -p$SCOUTROBOT_DB_PASSWORD db" > db.tmp 7 | sudo mysql adrema < db.tmp 8 | rm db.tmp 9 | 10 | echo 'app(\App\Form\FormSettings::class)->fill(["registerUrl" => "http://stammsilva.test/anmeldung/{slug}/register", "clearCacheUrl" => "http://stammsilva.test/adrema/clear-cache"])->save();' | php artisan tinker 11 | 12 | exit 0 13 | -------------------------------------------------------------------------------- /resources/img/svg/disabled.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/js/layouts/FullLayout.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /app/Invoice/Actions/DisplayRememberpdfAction.php: -------------------------------------------------------------------------------- 1 | */ 13 | use HasFactory; 14 | use HasUuids; 15 | 16 | public $timestamps = false; 17 | 18 | public $fillable = ['name', 'amount', 'uuid', 'parent_id']; 19 | } 20 | -------------------------------------------------------------------------------- /tests/stub/phpstan/TestResponse.stub: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
7 |
8 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /.app.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME="Adrema" 2 | APP_ENV=production 3 | APP_KEY=YOUR_APP_KEY 4 | APP_DEBUG=false 5 | APP_URL=http://localhost:8000 6 | 7 | MAIL_MAILER=smtp 8 | MAIL_HOST=smtp.mailtrap.io 9 | MAIL_PORT=2525 10 | MAIL_USERNAME=null 11 | MAIL_PASSWORD=null 12 | MAIL_ENCRYPTION=null 13 | MAIL_FROM_ADDRESS=null 14 | MAIL_FROM_NAME=me 15 | 16 | DB_PASSWORD=secret_db_password 17 | MYSQL_PASSWORD=secret_db_password 18 | 19 | MEILI_MASTER_KEY=secret_meilisearch_password 20 | 21 | PUSHER_APP_HOST=socketi 22 | 23 | WORKERS=5 24 | 25 | USER_EMAIL=admin@example.com 26 | USER_PASSWORD=admin 27 | -------------------------------------------------------------------------------- /app/Lib/Normalizers/DateNormalizer.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | public function normalize(mixed $value): ?array 14 | { 15 | if (!$value instanceof Carbon) { 16 | return null; 17 | } 18 | 19 | return [ 20 | 'raw' => $value, 21 | 'human' => $value->format('d.m.Y'), 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Form/Actions/ParticipantFieldsAction.php: -------------------------------------------------------------------------------- 1 | json([ 16 | 'data' => [ 17 | 'id' => $participant->id, 18 | 'config' => $participant->getConfig(), 19 | ] 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/js/components/page/FullLayout.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /app/Contribution/Traits/FormatsDates.php: -------------------------------------------------------------------------------- 1 | dateFrom)->format('d.m.Y'); 13 | } 14 | 15 | public function niceDateUntil(): string 16 | { 17 | return Carbon::parse($this->dateUntil)->format('d.m.Y'); 18 | } 19 | 20 | public function dateRange(): string 21 | { 22 | return implode(' - ', [$this->niceDateFrom(), $this->niceDateUntil()]); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Mailgateway/Models/Mailgateway.php: -------------------------------------------------------------------------------- 1 | */ 14 | use HasFactory; 15 | use HasUuids; 16 | 17 | public $casts = ['type' => TypeCast::class]; 18 | public $guarded = []; 19 | } 20 | -------------------------------------------------------------------------------- /app/Invoice/Actions/InvoiceDestroyAction.php: -------------------------------------------------------------------------------- 1 | delete(); 18 | 19 | Succeeded::message('Rechnung gelöscht.')->dispatch(); 20 | 21 | return response()->json([]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/js/views/formtemplate/TextField.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /app/Activity/Actions/EditAction.php: -------------------------------------------------------------------------------- 1 | ActivityResource::meta(), 19 | 'data' => new ActivityResource($activity->load('subactivities')), 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Country.php: -------------------------------------------------------------------------------- 1 | */ 13 | use HasFactory; 14 | use HasNamiField; 15 | 16 | public $fillable = ['name', 'nami_id']; 17 | 18 | public static function default(): int 19 | { 20 | return self::whereName('Deutschland')->firstOrFail()->id; 21 | } 22 | 23 | public $timestamps = false; 24 | } 25 | -------------------------------------------------------------------------------- /app/Contribution/Requests/GenerateApiRequest.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | public function payload(): array 13 | { 14 | return $this->input(); 15 | } 16 | 17 | public function validateContribution(): void { 18 | } 19 | 20 | public function members(): Collection { 21 | return MemberData::fromApi($this->value('members')); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/Lib/Sorting.php: -------------------------------------------------------------------------------- 1 | withoutMagicalCreation()->from(['by' => $by]); 12 | } 13 | 14 | public function __construct(public string $by, public bool $direction = false) 15 | { 16 | } 17 | 18 | /** 19 | * @return array 20 | */ 21 | public function toMeilisearch(): array 22 | { 23 | return [$this->by . ':' . ($this->direction ? 'desc' : 'asc')]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Actions/PullMemberAction.php: -------------------------------------------------------------------------------- 1 | api(), $groupId, $memberId)); 18 | } 19 | 20 | private function api(): Api 21 | { 22 | return app(NamiSettings::class)->login(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Efz/ShowEfzDocumentAction.php: -------------------------------------------------------------------------------- 1 | handle($member); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 19 | return route('login'); 20 | } 21 | 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/js/views/form/Prevention.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /app/Lib/HasDataMeta.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public static function collectPages(mixed $items): array { 16 | $source = parent::collect($items, PaginatedDataCollection::class)->toArray(); 17 | return [ 18 | ...parent::collect($items, PaginatedDataCollection::class)->toArray(), 19 | 'meta' => [...$source['meta'], ...static::meta()] 20 | ]; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/lang/de/pagination.php: -------------------------------------------------------------------------------- 1 | '« Zurück', 16 | 'next' => 'Weiter »', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /tests/RequestFactories/MemberStoreRequestFactory.php: -------------------------------------------------------------------------------- 1 | inNami(89)->create(); 13 | $subactivity = Subactivity::factory()->inNami(90)->create(); 14 | 15 | return [ 16 | ...parent::definition(), 17 | 'first_activity_id' => $activity->id, 18 | 'first_subactivity_id' => $subactivity->id, 19 | ]; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Fileshare/Data/ResourceData.php: -------------------------------------------------------------------------------- 1 | $dir, 20 | 'name' => pathinfo($dir, PATHINFO_BASENAME), 21 | 'parent' => pathinfo($dir, PATHINFO_DIRNAME), 22 | ]); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Prevention/Actions/SettingApiAction.php: -------------------------------------------------------------------------------- 1 | json([ 17 | 'data' => app(PreventionSettings::class)->toFrontend(), 18 | 'meta' => [ 19 | 'preventAgainsts' => Prevention::values(), 20 | ] 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/img/svg/open-folder.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/Payment/SubscriptionChildResource.php: -------------------------------------------------------------------------------- 1 | $this->amount, 23 | 'name' => $this->name, 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Setting/Contracts/Storeable.php: -------------------------------------------------------------------------------- 1 | $input 18 | */ 19 | public function fill(array $input): Settings; 20 | 21 | /** 22 | * @return array 23 | */ 24 | public function rules(): array; 25 | 26 | public function beforeSave(ActionRequest $request): void; 27 | } 28 | -------------------------------------------------------------------------------- /resources/js/layouts/_VLink.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /app/Initialize/InitializeGenders.php: -------------------------------------------------------------------------------- 1 | api = $api; 15 | } 16 | 17 | public function handle(): void 18 | { 19 | $this->api->genders()->each(function ($gender) { 20 | \App\Gender::create(['nami_id' => $gender->id, 'name' => $gender->name]); 21 | }); 22 | } 23 | 24 | public function restore(): void 25 | { 26 | DB::table('genders')->delete(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {{ $subcopy }} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/Fileshare/Actions/FileshareApiIndexAction.php: -------------------------------------------------------------------------------- 1 | put('menu', 'setting'); 17 | session()->put('title', 'Datei-Verbindungen'); 18 | 19 | return FileshareResource::collection(Fileshare::paginate(15)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/img/svg/plus.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/js/views/dashboard/MemberPayment.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /tests/Lib/MergesAttributes.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | abstract public function defaults(): array; 11 | 12 | /** 13 | * @param array $overwrites 14 | * @return array 15 | */ 16 | public function attributes(?array $overwrites = []): array 17 | { 18 | $defaults = collect($this->defaults()); 19 | 20 | foreach ($overwrites as $key => $value) { 21 | $defaults->put($key, $value); 22 | } 23 | 24 | return $defaults->toArray(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Form/Data/SectionData.php: -------------------------------------------------------------------------------- 1 | api = $api; 15 | } 16 | 17 | public function handle(): void 18 | { 19 | $this->api->countries()->each(function ($country) { 20 | \App\Country::create(['nami_id' => $country->id, 'name' => $country->name]); 21 | }); 22 | } 23 | 24 | public function restore(): void 25 | { 26 | DB::table('countries')->delete(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/seeders/UserSeeder.php: -------------------------------------------------------------------------------- 1 | config('init.email'), 20 | 'email_verified_at' => now(), 21 | 'password' => Hash::make(config('init.password')), 22 | 'firstname' => 'Adrema', 23 | 'lastname' => 'Benutzer', 24 | ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/settings/2022_09_05_213938_bill_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('bill.from_long', ''); 10 | $this->migrator->add('bill.from', ''); 11 | $this->migrator->add('bill.mobile', ''); 12 | $this->migrator->add('bill.email', ''); 13 | $this->migrator->add('bill.website', ''); 14 | $this->migrator->add('bill.address', ''); 15 | $this->migrator->add('bill.place', ''); 16 | $this->migrator->add('bill.zip', ''); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/js/components/ui/Button.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /app/Maildispatcher/Actions/CreateAction.php: -------------------------------------------------------------------------------- 1 | put('menu', 'maildispatcher'); 17 | session()->put('title', 'Mail-Verteiler erstellen'); 18 | 19 | return Inertia::render('maildispatcher/MaildispatcherForm', [ 20 | 'meta' => MaildispatcherResource::meta(), 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.docker/nginx.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM composer:2.7.9 AS composer 2 | WORKDIR /app 3 | COPY . /app 4 | RUN composer install --ignore-platform-reqs --no-dev 5 | RUN php artisan telescope:publish 6 | RUN php artisan horizon:publish 7 | 8 | FROM node:20.15.0-slim AS node 9 | WORKDIR /app 10 | COPY . /app 11 | RUN npm install && npm run prod && npm run img && rm -R node_modules 12 | 13 | FROM nginx:1.21.6-alpine AS nginx 14 | WORKDIR /app 15 | COPY --from=node /app /app 16 | COPY --from=composer /app/public/vendor /app/public/vendor 17 | COPY ./.docker/nginx/nginx.conf /etc/nginx/nginx.conf 18 | EXPOSE 80 19 | 20 | VOLUME ["/app/public/storage"] 21 | 22 | CMD ["nginx", "-g", "daemon off;"] 23 | -------------------------------------------------------------------------------- /resources/css/bool.css: -------------------------------------------------------------------------------- 1 | .bool { 2 | @apply rounded-full w-5 h-5 text-xs flex items-center justify-center leading-none; 3 | &.bool-inline { 4 | @apply w-auto; 5 | } 6 | &.enabled { 7 | @apply bg-green-800 text-red-100; 8 | } 9 | &.disabled { 10 | @apply bg-red-800 text-green-100; 11 | } 12 | svg { 13 | @apply w-2 h-2; 14 | } 15 | } 16 | 17 | 18 | .bool-row { 19 | @apply flex; 20 | .bool { 21 | @apply rounded-none; 22 | &:last-child { 23 | @apply rounded-r-full; 24 | } 25 | &:first-child { 26 | @apply rounded-l-full; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/js/components/page/Filter.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /resources/js/lib/toast.js: -------------------------------------------------------------------------------- 1 | import Toast, {useToast} from 'vue-toastification'; 2 | const toast = useToast(); 3 | 4 | var interceptor = [ 5 | (config) => { 6 | return config; 7 | }, 8 | (err) => { 9 | if (err.response && err.response.status === 422) { 10 | var errors = err.response.data.errors; 11 | for (const error in errors) { 12 | errors[error].forEach((errorMessage) => toast.error(errorMessage)); 13 | } 14 | } 15 | return Promise.reject(err); 16 | }, 17 | ]; 18 | 19 | const options = { 20 | position: 'bottom-right', 21 | }; 22 | 23 | export {Toast, interceptor, options}; 24 | -------------------------------------------------------------------------------- /app/Activity/Api/SubactivityShowAction.php: -------------------------------------------------------------------------------- 1 | json([ 22 | 'data' => new SubactivityResource($subactivity), 23 | 'meta' => SubactivityResource::meta(), 24 | ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Initialize/InitializeCourses.php: -------------------------------------------------------------------------------- 1 | api = $api; 16 | } 17 | 18 | public function handle(): void 19 | { 20 | $this->api->courses()->each(function ($course) { 21 | Course::create(['nami_id' => $course->id, 'name' => $course->name]); 22 | }); 23 | } 24 | 25 | public function restore(): void 26 | { 27 | DB::table('courses')->delete(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Member/Resources/RegionResource.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | public function toArray($request) 21 | { 22 | return [ 23 | 'name' => $this->name, 24 | 'nami_id' => $this->nami_id, 25 | 'id' => $this->id, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->describe('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /database/migrations/2024_12_15_155941_update_search_index.php: -------------------------------------------------------------------------------- 1 | searchable(); 17 | } 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | // 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /app/Actions/DbMaintainAction.php: -------------------------------------------------------------------------------- 1 | 168]); // 168h = 7 Tage 20 | DB::select('optimize table telescope_entries'); 21 | Http::post('https://zoomyboy.de/maintain', ['url' => url()->current()]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Mailgateway/Actions/StoreAction.php: -------------------------------------------------------------------------------- 1 | $input 16 | */ 17 | public function handle(array $input): void 18 | { 19 | $this->checkIfWorks($input); 20 | Mailgateway::create($input); 21 | } 22 | 23 | public function asController(ActionRequest $request): void 24 | { 25 | $this->handle($request->validated()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Membership/Actions/ListForGroupAction.php: -------------------------------------------------------------------------------- 1 | json(Membership::active()->where([ 17 | 'group_id' => $request->group_id, 18 | 'activity_id' => $request->activity_id, 19 | 'subactivity_id' => $request->subactivity_id, 20 | ])->pluck('member_id')); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Member/Resources/NationalityResource.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | public function toArray($request) 21 | { 22 | return [ 23 | 'name' => $this->name, 24 | 'nami_id' => $this->nami_id, 25 | 'id' => $this->id, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /resources/img/svg/save.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | @if(auth()->id()) 9 | 10 | @endif 11 | @vite('resources/js/app.js') 12 | 13 | 14 | @inertia('app" class="bg-gray-900 font-sans flex flex-col grow"') 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/Actions/PullCoursesAction.php: -------------------------------------------------------------------------------- 1 | hasNami) { 18 | return; 19 | } 20 | 21 | InsertCoursesAction::run($member, CoursesOfAction::run($this->api(), $member->nami_id)); 22 | } 23 | 24 | private function api(): Api 25 | { 26 | return app(NamiSettings::class)->login(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Fileshare/Actions/ListFilesAction.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | public function handle(ActionRequest $request, Fileshare $fileshare): DataCollection 19 | { 20 | return ResourceData::collect($fileshare->type->getSubDirectories($request->input('parent')), DataCollection::class)->wrap('data'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/migrations/2022_11_23_220958_drop_members_confirmed_at_column.php: -------------------------------------------------------------------------------- 1 | dropColumn('confirmed_at'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2023_02_05_233824_create_memberships_to_column.php: -------------------------------------------------------------------------------- 1 | datetime('to')->nullable(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/img/svg/warning-triangle-light.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/Dashboard/Blocks/Block.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | abstract protected function data(): array; 11 | 12 | abstract protected function title(): string; 13 | 14 | abstract protected function component(): string; 15 | 16 | /** 17 | * @return array{data: array, title: string, component: string} 18 | */ 19 | public function render(): array 20 | { 21 | return [ 22 | 'data' => $this->data(), 23 | 'title' => $this->title(), 24 | 'component' => $this->component(), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Form/Actions/ParticipantAssignAction.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | public function rules(): array 17 | { 18 | return [ 19 | 'member_id' => 'required|exists:members,id', 20 | ]; 21 | } 22 | 23 | public function handle(Participant $participant, ActionRequest $request): void 24 | { 25 | $participant->update(['member_id' => $request->input('member_id')]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Membership/Actions/MembershipIndexAction.php: -------------------------------------------------------------------------------- 1 | MembershipData::collectPages(FilterScope::fromRequest($request->input('filter', ''))->getQuery()->paginate(20))] 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/View/Mail/Editor.php: -------------------------------------------------------------------------------- 1 | $content 14 | * @return void 15 | */ 16 | public function __construct(public array $content) 17 | { 18 | } 19 | 20 | /** 21 | * Get the view / contents that represent the component. 22 | * 23 | * @return \Illuminate\Contracts\View\View|\Closure|string 24 | */ 25 | public function render() 26 | { 27 | return view('components.mail.editor'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /app/Form/Actions/FormtemplateDestroyAction.php: -------------------------------------------------------------------------------- 1 | delete(); 17 | } 18 | 19 | public function asController(Formtemplate $formtemplate): JsonResponse 20 | { 21 | $this->handle($formtemplate); 22 | 23 | Succeeded::message('Vorlage gelöscht.')->dispatch(); 24 | 25 | return response()->json([]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Form/Enums/SpecialType.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public static function forSelect(): array 20 | { 21 | return collect(static::cases()) 22 | ->map(fn ($case) => ['id' => $case->value, 'name' => $case->value]) 23 | ->toArray(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Initialize/InitializeActivities.php: -------------------------------------------------------------------------------- 1 | api = $api; 15 | } 16 | 17 | public function handle(): void 18 | { 19 | app(ActivityCreator::class)->createFor($this->api, $this->api->groups()->first()); 20 | } 21 | 22 | public function restore(): void 23 | { 24 | DB::table('activity_subactivity')->delete(); 25 | DB::table('activities')->delete(); 26 | DB::table('subactivities')->delete(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Initialize/InitializeNationalities.php: -------------------------------------------------------------------------------- 1 | api = $api; 16 | } 17 | 18 | public function handle(Api $api): void 19 | { 20 | $this->api->nationalities()->each(function ($nationality) { 21 | Nationality::create(['nami_id' => $nationality->id, 'name' => $nationality->name]); 22 | }); 23 | } 24 | 25 | public function restore(): void 26 | { 27 | DB::table('nationalities')->delete(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/js/views/dashboard/EfzPending.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/button.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'url', 3 | 'color' => 'primary', 4 | 'align' => 'center', 5 | ]) 6 | 7 | 8 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /tests/Feature/Invoice/InvoiceDestroyActionTest.php: -------------------------------------------------------------------------------- 1 | login()->loginNami()->withoutExceptionHandling(); 13 | $invoice = Invoice::factory()->has(InvoicePosition::factory()->withMember(), 'positions')->create(); 14 | 15 | $this->delete(route('invoice.destroy', ['invoice' => $invoice]))->assertOk(); 16 | $this->assertDatabaseCount('invoices', 0); 17 | $this->assertDatabaseCount('invoice_positions', 0); 18 | }); 19 | -------------------------------------------------------------------------------- /app/Actions/PullMembershipsAction.php: -------------------------------------------------------------------------------- 1 | hasNami) { 18 | return; 19 | } 20 | 21 | InsertMembershipsAction::run($member, MembershipsOfAction::run($this->api(), $member->nami_id)); 22 | } 23 | 24 | private function api(): Api 25 | { 26 | return app(NamiSettings::class)->login(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Course/Resources/CourseResource.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public function toArray($request) 20 | { 21 | return [ 22 | 'name' => $this->name, 23 | 'nami_id' => $this->nami_id, 24 | 'id' => $this->id, 25 | 'short_name' => $this->short_name, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Fileshare/FileshareSettings.php: -------------------------------------------------------------------------------- 1 | FileshareResource::collection(Fileshare::paginate(15)) 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Form/Models/Formtemplate.php: -------------------------------------------------------------------------------- 1 | */ 17 | use HasFactory; 18 | 19 | public $guarded = []; 20 | 21 | public $casts = [ 22 | 'config' => FormConfigData::class, 23 | 'mail_top' => EditorData::class, 24 | 'mail_bottom' => EditorData::class, 25 | ]; 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 22 | return redirect(RouteServiceProvider::HOME); 23 | } 24 | 25 | return $next($request); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /resources/img/svg/desktop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/js/components/ui/AgeGroups.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /resources/js/views/dashboard/PsPending.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | -------------------------------------------------------------------------------- /app/Invoice/Actions/InvoiceStoreAction.php: -------------------------------------------------------------------------------- 1 | safe()->except('positions')); 18 | 19 | foreach ($request->validated('positions') as $position) { 20 | $invoice->positions()->create($position); 21 | } 22 | 23 | Succeeded::message('Rechnung erstellt.')->dispatch(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/migrations/2023_02_05_235353_edit_activities_nami_id_column.php: -------------------------------------------------------------------------------- 1 | unsignedInteger('nami_id')->nullable(true)->change(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /app/Initialize/InitializeRegions.php: -------------------------------------------------------------------------------- 1 | api = $api; 16 | } 17 | 18 | public function handle(): void 19 | { 20 | $this->api->regions()->each(function ($region) { 21 | \App\Region::create(['nami_id' => $region->id, 'name' => $region->name, 'is_null' => $region->name == $this->nullName]); 22 | }); 23 | } 24 | 25 | public function restore(): void 26 | { 27 | DB::table('regions')->delete(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Setting/Actions/ViewAction.php: -------------------------------------------------------------------------------- 1 | put('menu', 'setting'); 18 | session()->put('title', $settingGroup::title()); 19 | 20 | return Inertia::render('setting/' . ucfirst($settingGroup::group()), [ 21 | ...$settingGroup->viewData(), 22 | 'setting_menu' => app(SettingFactory::class)->getShare(), 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/RequestFactories/InvoiceSettingsFake.php: -------------------------------------------------------------------------------- 1 | 'langer Stammesname', 13 | 'from' => 'Stammeskurz', 14 | 'mobile' => '+49 176 55555', 15 | 'email' => 'max@muster.de', 16 | 'website' => 'https://example.com', 17 | 'address' => 'Musterstr 4', 18 | 'place' => 'Münster', 19 | 'zip' => '12345', 20 | 'iban' => 'DE444', 21 | 'bic' => 'SOLSSSSS', 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Mailgateway/MailgatewaySettings.php: -------------------------------------------------------------------------------- 1 | MailgatewayResource::collection(Mailgateway::paginate(10)), 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /resources/lang/de/auth.php: -------------------------------------------------------------------------------- 1 | 'Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.', 16 | 'throttle' => 'Zu viele Loginversuche. Versuchen Sie es bitte in :seconds Sekunden nochmal.', 17 | ]; 18 | -------------------------------------------------------------------------------- /app/Group/Enums/Level.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public static function values(): Collection 18 | { 19 | return collect(static::cases())->map(fn ($case) => $case->value); 20 | } 21 | 22 | /** 23 | * @return array 24 | */ 25 | public static function forSelect(): array 26 | { 27 | return array_map(fn ($case) => ['id' => $case->value, 'name' => $case->value], static::cases()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Maildispatcher/Actions/DestroyAction.php: -------------------------------------------------------------------------------- 1 | gateway->type->deleteList($maildispatcher->name, $maildispatcher->gateway->domain); 16 | $maildispatcher->delete(); 17 | } 18 | 19 | public function asController(Maildispatcher $maildispatcher): RedirectResponse 20 | { 21 | $this->handle($maildispatcher); 22 | 23 | return redirect()->back(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Member/Actions/InsertFullMemberAction.php: -------------------------------------------------------------------------------- 1 | member); 20 | InsertMembershipsAction::run($localMember, $member->memberships->toCollection()); 21 | InsertCoursesAction::run($localMember, $member->courses->toCollection()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Form/Casts/FieldCollectionCast.php: -------------------------------------------------------------------------------- 1 | > $value 15 | * @return FieldCollection 16 | */ 17 | public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): mixed 18 | { 19 | return new FieldCollection(collect($value)->map(fn ($value) => Field::classFromType($value['type'])::from($value))->all()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Region.php: -------------------------------------------------------------------------------- 1 | */ 13 | use HasFactory; 14 | public $timestamps = false; 15 | 16 | public $fillable = ['name', 'nami_id', 'is_null']; 17 | 18 | public $casts = [ 19 | 'is_null' => 'boolean', 20 | ]; 21 | 22 | /** 23 | * @return Collection 24 | */ 25 | public static function forSelect(): Collection 26 | { 27 | return static::select('id', 'name')->get(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Tex/TexServiceProvider.php: -------------------------------------------------------------------------------- 1 | addExtension('tex', 'tex', function () { 18 | $compiler = new TexCompiler(app('files'), config('view.compiled')); 19 | 20 | return new CompilerEngine($compiler, app('files')); 21 | }); 22 | } 23 | 24 | /** 25 | * Bootstrap services. 26 | * 27 | * @return void 28 | */ 29 | public function boot() 30 | { 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/factories/ConfessionFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class ConfessionFactory extends Factory 12 | { 13 | protected $model = Confession::class; 14 | 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | public function definition() 21 | { 22 | return [ 23 | 'name' => $this->faker->sentence(), 24 | 'is_null' => false, 25 | ]; 26 | } 27 | 28 | public function inNami(int $namiId): self 29 | { 30 | return $this->state(['nami_id' => $namiId]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2017_12_25_231219_create_ways_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('title'); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | Schema::dropIfExists('ways'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Form/Presenters/GroupPresenter.php: -------------------------------------------------------------------------------- 1 | field = $field; 16 | 17 | return $this; 18 | } 19 | 20 | /** 21 | * @param ?int $value 22 | */ 23 | public function present($value): string 24 | { 25 | if ($value === -1) { 26 | return $this->field->emptyOptionValue; 27 | } 28 | 29 | if (!$value) { 30 | return ''; 31 | } 32 | 33 | return Group::find($value)?->display() ?: ''; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Mailgateway/Actions/UpdateAction.php: -------------------------------------------------------------------------------- 1 | $input 16 | */ 17 | public function handle(Mailgateway $mailgateway, array $input): void 18 | { 19 | $this->checkIfWorks($input); 20 | 21 | $mailgateway->update($input); 22 | } 23 | 24 | public function asController(Mailgateway $mailgateway, ActionRequest $request): void 25 | { 26 | $this->handle($mailgateway, $request->validated()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/CountryFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class CountryFactory extends Factory 12 | { 13 | protected $model = Country::class; 14 | 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | public function definition() 21 | { 22 | return [ 23 | 'name' => $this->faker->country, 24 | 'nami_id' => $this->faker->randomNumber(), 25 | ]; 26 | } 27 | 28 | public function inNami(int $namiId): self 29 | { 30 | return $this->state(['nami_id' => $namiId]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/settings/2025_05_24_202013_create_prevention_yearly_mail_settings.php: -------------------------------------------------------------------------------- 1 | migrator->add('prevention.yearlymail', ['time' => 1, 'blocks' => [], 'version' => '1.0']); 11 | $this->migrator->add('prevention.weeks', 8); 12 | $this->migrator->add('prevention.freshRememberInterval', 12); 13 | $this->migrator->add('prevention.active', false); 14 | $this->migrator->add('prevention.yearlyMemberFilter', FilterScope::from([])->toArray()); 15 | $this->migrator->add('prevention.preventAgainst', []); 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /app/Dashboard/Actions/IndexAction.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function handle(): array 18 | { 19 | return [ 20 | 'blocks' => app(DashboardFactory::class)->render(), 21 | ]; 22 | } 23 | 24 | public function asController(): Response 25 | { 26 | session()->put('menu', 'dashboard'); 27 | session()->put('title', 'Dashboard'); 28 | 29 | return Inertia::render('dashboard/VIndex', $this->handle()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Fee.php: -------------------------------------------------------------------------------- 1 | */ 15 | use HasFactory; 16 | use HasNamiField; 17 | 18 | public $fillable = ['name', 'nami_id']; 19 | 20 | /** @var bool */ 21 | public $timestamps = false; 22 | 23 | /** 24 | * @return HasMany 25 | */ 26 | public function subscriptions(): HasMany 27 | { 28 | return $this->hasMany(Subscription::class); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/factories/Payment/SubscriptionChildFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class SubscriptionChildFactory extends Factory 12 | { 13 | protected $model = SubscriptionChild::class; 14 | 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | public function definition() 21 | { 22 | return [ 23 | 'amount' => $this->faker->numberBetween(10, 3000), 24 | 'name' => $this->faker->words(5, true), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Activity/Actions/CreateAction.php: -------------------------------------------------------------------------------- 1 | put('menu', 'activity'); 17 | session()->put('title', 'Tätigkeit erstellen'); 18 | 19 | return Inertia::render('activity/VForm', [ 20 | 'meta' => ActivityResource::meta(), 21 | 'data' => [ 22 | 'name' => '', 23 | 'is_filterable' => false, 24 | 'subactivities' => [], 25 | ], 26 | ]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Lib/Data/DateData.php: -------------------------------------------------------------------------------- 1 | > 22 | */ 23 | public static function normalizers(): array 24 | { 25 | return [ 26 | DateNormalizer::class, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /doc/page/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | nav_order: 0 4 | --- 5 | 6 | # Willkommen bei Adrema 7 | 8 | Adrema ist eine Applikation, die die Verwaltung von Mitgliedern in der DPSG vereinfachen soll. 9 | 10 | {% include imgcap.html img='member' caption="Mitglieder-Übersicht" %} 11 | 12 | Insbesondere soll dabei möglichst auf eine direkte Interaktion mit NaMi verzichtet werden. 13 | 14 | Sämtliche Änderungen die du in Adrema an deinen Mitgliedern vornimmst werden automatisch in NaMi übernommen und dort aktualisiert. 15 | 16 | Darüber hinaus findet täglich um 01:00 Uhr ein Abgleich mit NaMi statt. Dies sorgt dafür, dass Änderungen, die z.B. jemand anderes (beispilsweise eine übergeordnete Ebene wie ein Bezirk oder eine Diözese) ebenfalls bei dir in Adrema erscheinen. 17 | 18 | 19 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class UserFactory extends Factory 13 | { 14 | protected $model = User::class; 15 | 16 | /** 17 | * Define the model's default state. 18 | * 19 | * @return array 20 | */ 21 | public function definition() 22 | { 23 | return [ 24 | 'email' => $this->faker->safeEmail, 25 | 'password' => Hash::make('password'), 26 | 'firstname' => $this->faker->firstName, 27 | 'lastname' => $this->faker->lastName, 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Form/Transformers/CollectionTransformer.php: -------------------------------------------------------------------------------- 1 | $value 20 | * @return array 21 | */ 22 | public function transform(DataProperty $property, mixed $value, TransformationContext $context): mixed 23 | { 24 | return $value->toArray(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/img/svg/course.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | npm-debug.log 3 | yarn-error.log 4 | /bootstrap/compiled.php 5 | /app/storage/ 6 | /public/storage 7 | /public/hot 8 | /public/build 9 | /public/vendor 10 | storage/*.key 11 | /storage/media-library/* 12 | /vendor/ 13 | Homestead.yaml 14 | Homestead.json 15 | .vagrant/ 16 | .phpunit.result.cache 17 | /storage/temp/ 18 | /storage/debugbar/ 19 | /tests/Fileshare/oc_tmp/* 20 | 21 | # User data files 22 | /data/ 23 | /.app.env 24 | .config/psysh 25 | 26 | # Development files 27 | /docker-compose.yml 28 | /.env 29 | /.env.backup 30 | /.env.testing 31 | 32 | # Editor config files 33 | /.vscode/ 34 | 35 | # Temporary files 36 | *.swp 37 | *.swo 38 | *.swm 39 | /resources/img/sprite.svg 40 | /public/sprite.svg 41 | /.php-cs-fixer.cache 42 | /groups.sql 43 | /.phpunit.cache 44 | -------------------------------------------------------------------------------- /app/Form/Actions/IsDirtyAction.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function rules(): array 18 | { 19 | return [ 20 | 'config' => 'array|present', 21 | ]; 22 | } 23 | 24 | public function handle(Form $form, ActionRequest $request): JsonResponse 25 | { 26 | $form->config = $request->input('config'); 27 | 28 | return response()->json([ 29 | 'result' => $form->isDirty('config'), 30 | ]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/factories/FeeFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class FeeFactory extends Factory 12 | { 13 | protected $model = Fee::class; 14 | 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | public function definition() 21 | { 22 | return [ 23 | 'name' => $this->faker->randomElement(['Normaler Beitrag', 'Familienermäßigt']), 24 | 'nami_id' => $this->faker->randomNumber(), 25 | ]; 26 | } 27 | 28 | public function inNami(int $namiId): self 29 | { 30 | return $this->state(['nami_id' => $namiId]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2025_07_06_022536_create_forms_country_column.php: -------------------------------------------------------------------------------- 1 | string('country')->nullable()->after('location'); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('forms', function (Blueprint $table) { 25 | $table->dropColumn('country'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/js/mixins/hasFlash.js: -------------------------------------------------------------------------------- 1 | import { useToast } from 'vue-toastification' 2 | const toast = useToast() 3 | 4 | export default { 5 | methods: { 6 | ['$success'](message) { 7 | toast.success(message); 8 | }, 9 | ['$error'](message) { 10 | toast.error(message); 11 | }, 12 | errorsFromException(e) { 13 | if (e.response?.status !== 422 || !e.response?.data?.errors) { 14 | throw e; 15 | } 16 | 17 | var errors = e.response.data.errors; 18 | 19 | Object.keys(errors).forEach((field) => { 20 | errors[field].forEach((message) => { 21 | toast.error(message); 22 | }); 23 | }); 24 | }, 25 | }, 26 | }; 27 | -------------------------------------------------------------------------------- /resources/js/views/formtemplate/TextareaField.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies = '*'; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /app/Initialize/InitializeConfessions.php: -------------------------------------------------------------------------------- 1 | api = $api; 17 | } 18 | 19 | public function handle(): void 20 | { 21 | $this->api->confessions()->each(function ($confession) { 22 | Confession::create(['nami_id' => $confession->id, 'name' => $confession->name, 'is_null' => $this->nullName === $confession->name]); 23 | }); 24 | } 25 | 26 | public function restore(): void 27 | { 28 | DB::table('confessions')->delete(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2024_12_16_235710_update_form_searching_2.php: -------------------------------------------------------------------------------- 1 | participants as $participant) { 18 | $participant->searchable(); 19 | } 20 | } 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | // 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /resources/js/components/ui/Menulist.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {{ $subcopy }} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/js/views/dashboard/AgeGroupCount.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | -------------------------------------------------------------------------------- /database/migrations/2024_11_07_004559_add_members_keepdata_column.php: -------------------------------------------------------------------------------- 1 | boolean('keepdata')->after('email_parents')->default(false); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('members', function (Blueprint $table) { 25 | $table->dropColumn('keepdata'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2025_11_11_221048_create_participants_cancelled_at_column.php: -------------------------------------------------------------------------------- 1 | datetime('cancelled_at')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('participants', function (Blueprint $table) { 25 | $table->dropColumn('cancelled_at'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /tests/RequestFactories/ConditionRequestFactory.php: -------------------------------------------------------------------------------- 1 | 'all', 14 | 'ifs' => [], 15 | ]; 16 | } 17 | 18 | public function whenField(string $field, string $value): self { 19 | return $this->state([ 20 | 'ifs' => [ 21 | ['field' => $field, 'value' => $value, 'comparator' => 'isEqual'] 22 | ], 23 | ]); 24 | } 25 | 26 | public function toData(): Condition { 27 | return Condition::from($this->create()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Maildispatcher/Actions/EditAction.php: -------------------------------------------------------------------------------- 1 | put('menu', 'maildispatcher'); 18 | session()->put('title', 'Mail-Verteiler bearbeiten'); 19 | 20 | return Inertia::render('maildispatcher/MaildispatcherForm', [ 21 | 'data' => new MaildispatcherResource($maildispatcher), 22 | 'meta' => MaildispatcherResource::meta(), 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/RequestFactories/ContributionMemberApiRequestFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->firstName(), 13 | 'lastname' => $this->faker->lastName(), 14 | 'address' => $this->faker->streetAddress(), 15 | 'zip' => $this->faker->postcode, 16 | 'location' => $this->faker->city(), 17 | 'gender' => $this->faker->randomElement(['Männlich', 'Weiblich']), 18 | 'birthday' => $this->faker->date(), 19 | 'is_leader' => $this->faker->boolean(), 20 | ]; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Form/Policies/FormPolicy.php: -------------------------------------------------------------------------------- 1 | put('menu', 'maildispatcher'); 19 | session()->put('title', 'Mail-Verteiler'); 20 | 21 | return Inertia::render('maildispatcher/MaildispatcherIndex', [ 22 | 'data' => MaildispatcherResource::collection(Maildispatcher::with('gateway')->paginate(10)), 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/migrations/2017_04_12_010000_create_groups_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->unsignedInteger('nami_id'); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('groups'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2022_10_05_171451_create_members_slug_column.php: -------------------------------------------------------------------------------- 1 | string('slug', 100); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('members', function (Blueprint $table) { 28 | $table->dropColumn('slug'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "packages/laravel-nami"] 2 | path = packages/laravel-nami 3 | url = https://git.zoomyboy.de/silva/laravel-nami-api 4 | [submodule "packages/tex"] 5 | path = packages/tex 6 | url = https://git.zoomyboy.de/pille/tex 7 | [submodule "packages/adrema-form"] 8 | path = packages/adrema-form 9 | url = https://git.zoomyboy.de/silva/adrema-form.git 10 | [submodule "packages/medialibrary-helper"] 11 | path = packages/medialibrary-helper 12 | url = https://git.zoomyboy.de/zoomyboy/medialibrary-helper.git 13 | branch = version2 14 | [submodule "packages/flysystem-webdav"] 15 | path = packages/flysystem-webdav 16 | url = https://github.com/zoomyboy/flysystem-webdav.git 17 | [submodule "packages/table-document"] 18 | path = packages/table-document 19 | url = https://git.zoomyboy.de/zoomyboy/table-document.git 20 | -------------------------------------------------------------------------------- /app/Form/Transformers/FieldCollectionTransformer.php: -------------------------------------------------------------------------------- 1 | $value 16 | * @return array 17 | */ 18 | public function transform(DataProperty $property, mixed $value, TransformationContext $context): mixed 19 | { 20 | return $value->map(fn ($field) => [ 21 | ...$field->toArray(), 22 | 'type' => class_basename($field), 23 | ])->toArray(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/migrations/2023_05_16_113849_create_members_latlon_column.php: -------------------------------------------------------------------------------- 1 | double('lat')->nullable(); 17 | $table->double('lon')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('members', function (Blueprint $table) { 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /.docker/php.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM composer:2.7.9 AS composer 2 | WORKDIR /app 3 | COPY . /app 4 | RUN composer install --ignore-platform-reqs --no-dev 5 | 6 | FROM node:20.15.0-slim AS node 7 | WORKDIR /app 8 | COPY . /app 9 | RUN npm install && npm run prod && npm run img && rm -R node_modules 10 | 11 | FROM zoomyboy/adrema-base:latest AS php 12 | COPY --chown=www-data:www-data . /app 13 | COPY --chown=www-data:www-data --from=node /app/public /app/public 14 | COPY --chown=www-data:www-data --from=composer /app/vendor /app/vendor 15 | 16 | USER www-data 17 | RUN php artisan telescope:publish 18 | RUN php artisan horizon:publish 19 | 20 | USER root 21 | COPY ./.docker/php /bin 22 | 23 | VOLUME ["/app/packages/laravel-nami/.cookies", "/app/storage/app", "/app/resources/views/tex/invoice"] 24 | 25 | EXPOSE 9000 26 | 27 | CMD /bin/php-entrypoint 28 | -------------------------------------------------------------------------------- /database/migrations/2017_07_04_235624_create_countries_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->unsignedInteger('nami_id')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('countries'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2023_02_27_221231_create_members_comment_column.php: -------------------------------------------------------------------------------- 1 | text('comment')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('members', function (Blueprint $table) { 29 | $table->dropColumn('comment'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /app/Form/Matchers/SingleValueMatcher.php: -------------------------------------------------------------------------------- 1 | value) { 13 | return true; 14 | } 15 | 16 | if ($comparator === Comparator::NOTEQUAL && $value !== $this->value) { 17 | return true; 18 | } 19 | 20 | if ($comparator === Comparator::IN && in_array($this->value, $value)) { 21 | return true; 22 | } 23 | 24 | if ($comparator === Comparator::NOTIN && !in_array($this->value, $value)) { 25 | return true; 26 | } 27 | 28 | return false; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /resources/js/views/form/ConditionsForm.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 32 | -------------------------------------------------------------------------------- /app/Member/Resources/BankAccountResource.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | public function toArray($request) 21 | { 22 | return [ 23 | 'iban' => $this->iban, 24 | 'bic' => $this->bic, 25 | 'blz' => $this->blz, 26 | 'bank_name' => $this->bank_name, 27 | 'person' => $this->person, 28 | 'account_number' => $this->account_number, 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2022_03_15_152907_create_members_efz_column.php: -------------------------------------------------------------------------------- 1 | date('efz')->after('subscription_id')->nullable(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('members', function (Blueprint $table) { 28 | $table->dropColumn('efz'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2022_03_20_145006_create_activities_has_efz_column.php: -------------------------------------------------------------------------------- 1 | boolean('has_efz')->default(false); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('activities', function (Blueprint $table) { 28 | $table->dropColumn('has_efz'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2023_02_27_213656_create_members_salutation_column.php: -------------------------------------------------------------------------------- 1 | string('salutation')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('members', function (Blueprint $table) { 29 | $table->dropColumn('salutation'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2023_11_23_001310_create_invoice_data_column.php: -------------------------------------------------------------------------------- 1 | json('invoice_data')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('payments', function (Blueprint $table) { 29 | $table->dropColumn('invoice_data'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_06_26_224159_create_fileshares_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->json('type'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('fileshares'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | */ 14 | use HasFactory; 15 | use Notifiable; 16 | 17 | public $guarded = []; 18 | 19 | /** 20 | * @param string $token 21 | * @return void 22 | */ 23 | public function sendPasswordResetNotification($token) 24 | { 25 | $this->notify(new ResetPassword($token)); 26 | } 27 | 28 | public function getGravatarUrl(): string 29 | { 30 | return 'https://www.gravatar.com/avatar/' . hash('sha256', $this->email); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2023_03_02_220832_create_members_mitgliedsnr_column.php: -------------------------------------------------------------------------------- 1 | string('mitgliedsnr')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('members', function (Blueprint $table) { 29 | $table->dropColumn('mitgliedsnr'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_06_29_141316_create_fileshare_column.php: -------------------------------------------------------------------------------- 1 | json('fileshare')->after('inner_name')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('groups', function (Blueprint $table) { 29 | $table->dropColumn('fileshare'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have emailed your password reset link!', 18 | 'throttled' => 'Please wait before retrying.', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that email address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /app/Providers/PluginServiceProvider.php: -------------------------------------------------------------------------------- 1 | replace(base_path('plugins/'), '') 19 | ->replaceMatches('/\.php$/', '') 20 | ->replace('/', '\\'); 21 | $this->app->register('Plugins\\'.$cls); 22 | } 23 | } 24 | 25 | /** 26 | * Bootstrap services. 27 | * 28 | * @return void 29 | */ 30 | public function boot() 31 | { 32 | // 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2017_07_05_000438_create_genders_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->unsignedInteger('nami_id'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('genders'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2022_12_11_192600_create_memberships_has_promise_column.php: -------------------------------------------------------------------------------- 1 | date('promised_at')->nullable(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('memberships', function (Blueprint $table) { 28 | $table->dropColumn('promised_at'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2023_11_24_131853_create_members_recertified_at_column.php: -------------------------------------------------------------------------------- 1 | date('recertified_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('members', function (Blueprint $table) { 29 | $table->dropColumn('recertified_at'); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2025_07_09_221048_create_forms_leader_conditions_column.php: -------------------------------------------------------------------------------- 1 | json('leader_conditions')->after('name')->default(json_encode(['mode' => 'all', 'ifs' => []])); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('forms', function (Blueprint $table) { 25 | $table->dropColumn('leader_conditions'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /resources/img/svg/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/Lib/Editor/ConditionResolver.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | public function makeBlocks(EditorData $data): array 14 | { 15 | return array_filter($data->blocks, fn ($block) => $this->filterBlock($block)); 16 | } 17 | 18 | /** 19 | * @param array $block 20 | */ 21 | public function filterBlock(array $block): bool 22 | { 23 | return $this->filterCondition(Condition::factory()->withoutMagicalCreation()->from([ 24 | 'mode' => data_get($block, 'tunes.condition.mode', 'any'), 25 | 'ifs' => data_get($block, 'tunes.condition.ifs', []), 26 | ])); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Resources/UserResource.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | public function toArray($request): array 22 | { 23 | return [ 24 | 'firstname' => $this->firstname, 25 | 'lastname' => $this->lastname, 26 | 'avatar_url' => $this->getGravatarUrl(), 27 | 'email' => $this->email, 28 | 'avatar' => [ 29 | 'src' => Storage::url('avatar.png'), 30 | ], 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Initialize/InitializeFees.php: -------------------------------------------------------------------------------- 1 | api = $api; 16 | } 17 | 18 | public function handle(): void 19 | { 20 | $group = $this->api->groups()->first()->id; 21 | $this->api->feesOf($group)->each(function ($fee) { 22 | Fee::create(['nami_id' => $fee->id, 'name' => $fee->name]) 23 | ->subscriptions()->create([ 24 | 'name' => $fee->name, 25 | ]); 26 | }); 27 | } 28 | 29 | public function restore(): void 30 | { 31 | DB::table('subscriptions')->delete(); 32 | DB::table('fees')->delete(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2023_03_05_230539_edit_members_birthday_column.php: -------------------------------------------------------------------------------- 1 | date('birthday')->nullable(true)->change(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('members', function (Blueprint $table) { 28 | $table->date('birthday')->nullable(false)->change(); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /app/Contribution/Contracts/HasContributionData.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | public function type(): string; 21 | 22 | /** 23 | * @return Collection 24 | */ 25 | public function members(): Collection; 26 | 27 | public function country(): ?Country; 28 | 29 | public function validateContribution(): void; 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2021_11_18_215522_create_settings_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | 17 | $table->string('group')->index(); 18 | $table->string('name'); 19 | $table->boolean('locked'); 20 | $table->json('payload'); 21 | 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('settings'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2023_06_12_083133_create_maildispatchers_table.php: -------------------------------------------------------------------------------- 1 | uuid('id'); 17 | $table->string('name'); 18 | $table->uuid('gateway_id'); 19 | $table->json('filter'); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('maildispatchers'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /resources/img/svg/document.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /resources/js/views/formtemplate/CheckboxField.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 29 | -------------------------------------------------------------------------------- /app/Dashboard/DashboardServiceProvider.php: -------------------------------------------------------------------------------- 1 | singleton(DashboardFactory::class, fn () => new DashboardFactory()); 19 | } 20 | 21 | /** 22 | * Bootstrap services. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | app(Router::class)->middleware(['web', 'auth:web'])->group(function ($router) { 29 | $router->get('/', DashboardIndexAction::class)->name('home'); 30 | }); 31 | } 32 | } 33 | --------------------------------------------------------------------------------