├── 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 |
2 |
3 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/resources/js/components/ui/Sprite.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 | |
4 | {{ Illuminate\Mail\Markdown::parse($slot) }}
5 | |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/resources/js/components/page/FullHeading.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
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 |
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 |
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 |
2 |
3 |
4 |

5 |
6 |
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 |
2 |
6 |
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 |
2 |
6 |
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 |
4 |
5 |
6 | |
7 | {{ Illuminate\Mail\Markdown::parse($slot) }}
8 | |
9 |
10 |
11 | |
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 |
2 |
3 |
4 |
5 |
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 |
2 |
7 |
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 |
2 |
5 |
6 |
7 |
16 |
--------------------------------------------------------------------------------
/resources/js/components/ui/IconButton.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
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 |
2 |
3 | N
4 | M
5 |
6 |
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 |
2 |
3 | {{ value }}
4 | *
5 |
6 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
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 |
2 |
8 |
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 |
2 |
11 |
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 |
2 |
5 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
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 |
2 |
8 |
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 |
2 |
8 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Filtern
9 |
10 |
11 |
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 |
2 |
11 |
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 |
9 |
10 |
11 | |
12 |
19 | |
20 |
21 |
22 | |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
22 |
--------------------------------------------------------------------------------
/resources/js/views/dashboard/PsPending.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
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 |
2 |
3 |
12 |
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 |
2 |
9 |
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 |
2 |
9 |
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 |
2 |
3 |
4 | Speichern
5 |
6 |
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 |
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 |
9 |
--------------------------------------------------------------------------------
/resources/js/views/formtemplate/CheckboxField.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
18 |
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 |
--------------------------------------------------------------------------------