Compare commits

...

1165 Commits

Author SHA1 Message Date
philipp lang a456cc1889 Fix: Sort participants by created_at
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-12-16 14:18:02 +01:00
philipp lang 784b49c3dd Add invoice full text search
continuous-integration/drone/push Build is failing Details
2024-12-15 16:05:38 +01:00
philipp lang c3a0381a0a Fix invoice settings when fields are empty
continuous-integration/drone/push Build is passing Details
2024-12-15 12:06:44 +01:00
philipp lang 101ac7402a Add Phpunit to gitignore
continuous-integration/drone/push Build is passing Details
2024-12-15 11:56:13 +01:00
philipp lang 2c38488962 Remove cross
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-12-13 19:13:30 +01:00
philipp lang 8a26276e28 Rename document
continuous-integration/drone/push Build is passing Details
2024-12-13 19:03:40 +01:00
philipp lang 4651a4cb96 Lint
continuous-integration/drone/push Build is passing Details
2024-12-13 14:37:13 +01:00
philipp lang 688e10e230 Lint
continuous-integration/drone/push Build is failing Details
2024-12-13 11:56:02 +01:00
philipp lang 267da38c6b Lint
continuous-integration/drone/push Build is passing Details
2024-12-13 02:46:44 +01:00
philipp lang 499c61afff Lint 2024-12-13 02:44:08 +01:00
philipp lang 02531938b3 Lint 2024-12-13 02:42:08 +01:00
philipp lang 1c53e81f1a Lint 2024-12-13 02:40:33 +01:00
philipp lang 98712093b2 Lint 2024-12-13 02:36:17 +01:00
philipp lang a32ef33113 Move engine 2024-12-13 02:33:12 +01:00
philipp lang 088ea4f0a2 Lint 2024-12-13 02:28:41 +01:00
philipp lang 4ac89da124 Lint 2024-12-13 02:16:09 +01:00
philipp lang 286ceea0d4 Lint 2024-12-13 01:59:24 +01:00
philipp lang 52ac5937a4 Add validation 2024-12-13 01:59:09 +01:00
philipp lang 4690e86bbf Add gallier document 2024-12-13 01:54:02 +01:00
philipp lang 1a4a7c3652 Add base gallier document 2024-12-13 00:58:44 +01:00
philipp lang b05c5025c0 Add button to mark invoice as paid
continuous-integration/drone/push Build is passing Details
2024-12-12 21:26:51 +01:00
philipp lang acf7b94094 Update CHANGELOG
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is passing Details
2024-12-12 16:37:20 +01:00
philipp lang 57b1efb065 Add registration_from and registration_until to frontend api
continuous-integration/drone/push Build is passing Details
2024-12-12 15:42:35 +01:00
philipp lang 3e563f8390 Add registration_from and registration_to fields 2024-12-12 15:21:03 +01:00
philipp lang 0a5590d533 Remove CreatesApplication Trait 2024-12-12 13:56:13 +01:00
philipp lang 10deaf15a1 Update form edit view 2024-12-12 13:45:42 +01:00
philipp lang ae447a7a60 Add fileshare and web setting on bin/run 2024-12-12 13:45:26 +01:00
philipp lang baea21807a Update CHANGELOG
continuous-integration/drone/push Build is passing Details
2024-12-12 13:21:05 +01:00
philipp lang 58426c5537 Fix tests
continuous-integration/drone/push Build was killed Details
2024-12-12 12:18:49 +01:00
philipp lang 84cd13c085 Fix migration
continuous-integration/drone/push Build is failing Details
2024-12-12 03:12:26 +01:00
philipp lang b8d2b37057 Add sorting frontend for participants list
continuous-integration/drone/push Build is failing Details
2024-12-12 03:07:10 +01:00
philipp lang 44eb3719b9 Update tests
continuous-integration/drone/push Build is passing Details
2024-12-12 02:35:27 +01:00
philipp lang c65a208e34 Add frontend for sorting
continuous-integration/drone/push Build was killed Details
2024-12-12 02:33:10 +01:00
philipp lang 95a8d4d689 Fix page navigation 2024-12-12 02:27:58 +01:00
philipp lang e1e8669beb Fix tests
continuous-integration/drone/push Build is failing Details
2024-12-12 01:32:01 +01:00
philipp lang a3ecfa756d Add sorting to participant list
continuous-integration/drone/push Build was killed Details
2024-12-12 01:26:22 +01:00
philipp lang 70e085a49e Fix: Dont update form when not using meilisearch
continuous-integration/drone/push Build is failing Details
2024-12-12 00:50:05 +01:00
philipp lang 1178b011e0 Lint
continuous-integration/drone/push Build was killed Details
2024-12-12 00:36:56 +01:00
philipp lang 6a91e857d2 Add filtering for participant index
continuous-integration/drone/push Build was killed Details
2024-12-12 00:30:59 +01:00
philipp lang 82baf67a73 Lint 2024-12-11 22:37:49 +01:00
philipp lang 36466420f6 Lint 2024-12-11 22:36:25 +01:00
philipp lang 54c37fccd1 Add searchable participants via full text 2024-12-11 22:32:23 +01:00
philipp lang d03f036a2b Move ParticipantIndexActionTest to EndToEnd 2024-12-10 01:28:35 +01:00
philipp lang 75d11f9860 Update formsettings when copying db 2024-12-10 00:58:05 +01:00
philipp lang da4d553ea6 Update CHANGELOG
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-12-09 14:08:52 +01:00
philipp lang 5bad88c5f4 Add config for job batching
continuous-integration/drone/push Build is passing Details
2024-12-09 14:08:02 +01:00
philipp lang 75dc0d9769 Update CHANGELOG
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-11-20 11:11:26 +01:00
philipp lang 9fc8548504 Fix: Dont remember past events
continuous-integration/drone/push Build is passing Details
2024-11-20 11:10:24 +01:00
philipp lang c990ce3171 Fix Color of lilie svg
continuous-integration/drone/push Build is failing Details
2024-11-18 23:06:36 +01:00
philipp lang e7f63d19e5 Add imagick extension
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-11-13 19:44:40 +01:00
philipp lang f549b31862 Update medialibrary-helper
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-11-13 14:36:29 +01:00
philipp lang 1f4efb22d3 Install imagemagick 2024-11-13 14:35:54 +01:00
philipp lang 3e725d9842 Install imagick extension 2024-11-13 13:14:45 +01:00
philipp lang 16d3bc51a3 Fix php version of deploy
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-11-12 01:20:41 +01:00
philipp lang 0467f24ff6 Update composer in nginx.Dockerfile
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-11-12 00:39:40 +01:00
philipp lang ed1a8f30bc Update composer version in Dockerfile
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-11-11 23:43:17 +01:00
philipp lang e5066af192 Add instruction for building adrema-base image 2024-11-11 23:36:09 +01:00
philipp lang 31afa2e418 Add Changelog 2024-11-11 23:35:55 +01:00
philipp lang a897690e7a Add keepdata to member form
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-11-07 01:29:26 +01:00
philipp lang 24ed5d4ab9 Lint 2024-11-07 00:38:28 +01:00
philipp lang e807aff3e6 Remove default arch tests
continuous-integration/drone/push Build is passing Details
2024-10-28 23:54:21 +01:00
philipp lang 096224fe98 Lint
continuous-integration/drone/push Build is passing Details
2024-09-23 02:01:35 +02:00
philipp lang 646ce647da Move Dashboard Route to DashboardServiceProvider 2024-09-23 01:53:46 +02:00
philipp lang f858716e57 Add Arch tests
continuous-integration/drone/push Build is passing Details
2024-09-22 22:58:31 +02:00
philipp lang 1521aba1f8 Fix drone
continuous-integration/drone/push Build is passing Details
2024-09-22 19:39:36 +02:00
philipp lang 664b88564d Fix phpstan
continuous-integration/drone/push Build is failing Details
2024-09-22 18:25:42 +02:00
philipp lang d30a2336cf Fix tests
continuous-integration/drone/push Build is failing Details
2024-09-22 17:32:29 +02:00
philipp lang a5f1c90003 Fix tests
continuous-integration/drone/push Build is failing Details
2024-09-22 12:28:10 +02:00
philipp lang c3908b714b Update laravel-nami
continuous-integration/drone/push Build is failing Details
2024-09-22 03:02:15 +02:00
philipp lang 2f1e02151f Fix tests 2024-09-22 03:02:10 +02:00
philipp lang eaf014b7c7 Touch env file while testing with drone
continuous-integration/drone/push Build is failing Details
2024-09-22 02:30:25 +02:00
philipp lang 94d34d1afa Add Pail 2024-09-22 02:15:59 +02:00
philipp lang 9b700be889 Update laravel-nami
continuous-integration/drone/push Build was killed Details
2024-09-22 02:13:12 +02:00
philipp lang e1ec6ad9df update composer in drone
continuous-integration/drone/push Build is failing Details
2024-09-22 02:03:58 +02:00
philipp lang aaa236fcd5 Fix tests
continuous-integration/drone/push Build is failing Details
2024-09-22 01:41:56 +02:00
philipp lang 4d74e53fc2 Update Activity UpdateTest 2024-09-22 00:06:03 +02:00
philipp lang b8d389bdb9 Lint Activity EditTest 2024-09-21 23:43:51 +02:00
philipp lang 3a4c99f154 Add Laravel 11 support
continuous-integration/drone/push Build was killed Details
2024-09-21 22:46:38 +02:00
philipp lang fca7fc463e Update php to 8.3
continuous-integration/drone/push Build is passing Details
2024-09-21 21:55:16 +02:00
philipp lang 767df11e4f Fix tests
continuous-integration/drone/push Build is passing Details
2024-09-21 18:56:53 +02:00
philipp lang 295d85f4f8 Add Pestphp
continuous-integration/drone/push Build is failing Details
2024-09-21 18:29:47 +02:00
philipp lang 42ccd32740 Fix tests
continuous-integration/drone/push Build is failing Details
2024-09-21 17:46:07 +02:00
philipp lang bbcf2fd768 Update to laravel 10
continuous-integration/drone/push Build is failing Details
2024-09-21 17:42:11 +02:00
philipp lang b335c20777 Update CHANGELOG
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-09-12 11:17:45 +02:00
philipp lang c63c8316b5 Update adrema-form
continuous-integration/drone/push Build is passing Details
2024-09-12 11:15:58 +02:00
philipp lang 2e6c27b8f1 Update CHANGELOG
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build is passing Details
2024-08-30 22:38:04 +02:00
philipp lang 1cf8d34b78 Fix tests
continuous-integration/drone/push Build is passing Details
2024-08-30 22:04:14 +02:00
philipp lang e3b52bf901 Fixed tests
continuous-integration/drone/push Build is failing Details
2024-08-30 21:06:16 +02:00
philipp lang 76e7b06630 Fix tests
continuous-integration/drone/push Build is failing Details
2024-08-30 20:06:10 +02:00
philipp lang 21def11ae9 Fixed: Dont display efz and ps for inactive memberships
continuous-integration/drone/push Build is failing Details
2024-08-30 19:04:18 +02:00
philipp lang 565b1ffbce Lint
continuous-integration/drone/push Build is failing Details
2024-08-28 21:02:53 +02:00
philipp lang ef70203c8a Remove Member toolbar button
continuous-integration/drone/push Build is failing Details
2024-08-28 16:30:26 +02:00
philipp lang b3a29c706c Lint 2024-08-28 13:32:52 +02:00
philipp lang 298140e387 Set default member model as meta 2024-08-28 13:26:30 +02:00
philipp lang 151477dbdd Lint 2024-08-27 23:21:10 +02:00
philipp lang a01e8adf8a Add backdrop 2024-08-27 18:19:52 +02:00
philipp lang 547c9edfd5 Update CHANGELOG
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-08-25 14:11:18 +02:00
philipp lang 6e09e2ec0d Fix: Show all groups in conditions 2024-08-25 14:10:22 +02:00
philipp lang 9d37ebefc5 Update CHANGELOG
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is passing Details
2024-08-25 10:39:45 +02:00
philipp lang 11b1e6a198 Lint migrations
continuous-integration/drone/push Build is passing Details
2024-08-23 22:25:25 +02:00
philipp lang 5008244de2 Add conditions for group fields
continuous-integration/drone/push Build is failing Details
2024-08-23 17:57:20 +02:00
philipp lang 8b3b3de9a8 Fix: update single name in migrations
continuous-integration/drone/push Build is failing Details
2024-08-02 12:05:21 +02:00
philipp lang d9adb526ce Remove Setting store actions
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-08-01 16:26:38 +02:00
philipp lang daf6e87814 Remove Middleware 2024-08-01 16:26:38 +02:00
philipp lang 2056e1ad6b Fixed tests 2024-08-01 16:26:38 +02:00
philipp lang a4eba23bff Remove viewable interface 2024-08-01 16:26:38 +02:00
philipp lang ad8cd58b4f Add SettingView action 2024-08-01 16:26:38 +02:00
philipp lang 3a4908f505 Move Indexable to Viewable 2024-08-01 16:26:38 +02:00
philipp lang 291eec3849 Update CHANGELOG
continuous-integration/drone/push Build is passing Details
2024-08-01 12:15:28 +02:00
philipp lang 0e0f23c17e Fix user principal
continuous-integration/drone/push Build is passing Details
2024-08-01 12:13:33 +02:00
philipp lang 6d204b948e Add avatar image
continuous-integration/drone/push Build is failing Details
2024-07-31 22:41:02 +02:00
philipp lang 977e427abb Lint 2024-07-31 22:30:13 +02:00
philipp lang 46e070a029 Lint 2024-07-31 22:25:54 +02:00
philipp lang 84e05fbc52 Update changelog 2024-07-31 21:39:14 +02:00
philipp lang 343b0d418d Add RememberWeeks setting for remembering invoices
continuous-integration/drone/push Build is passing Details
2024-07-31 21:37:18 +02:00
philipp lang fe258198f4 Add daily invoice sending 2024-07-31 21:19:02 +02:00
philipp lang 8317fdca90 Update changelog
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-07-30 23:12:12 +02:00
philipp lang 32ec479975 Display for_members field when nami field is set
continuous-integration/drone/push Build is passing Details
2024-07-30 23:10:24 +02:00
philipp lang ac45e0c8fa Fix tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-07-25 12:53:40 +02:00
philipp lang 6f1ab73bae Update changelog 2024-07-25 11:14:43 +02:00
philipp lang c95658ae65 Fix prevention moreps
continuous-integration/drone/push Build is failing Details
2024-07-25 11:13:40 +02:00
philipp lang d64ea85be6 Update Changelog
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-07-25 09:41:02 +02:00
philipp lang 22157b5d50 Add prevention items frontend
continuous-integration/drone/push Build is passing Details
2024-07-25 00:17:31 +02:00
philipp lang 107b616bc1 Update base 2024-07-24 22:26:52 +02:00
philipp lang d7cc80afe9 Lint
continuous-integration/drone/push Build is passing Details
2024-07-24 22:26:38 +02:00
philipp lang db6248999a Update CHANGELOG
continuous-integration/drone/push Build is failing Details
2024-07-24 16:13:36 +02:00
philipp lang 9c568176ce Fixed: Display all forms on index page
continuous-integration/drone/push Build is failing Details
2024-07-24 16:11:29 +02:00
philipp lang d56cb253a9 Add Excel export for participants
continuous-integration/drone/push Build is failing Details
2024-07-23 22:59:23 +02:00
philipp lang 5fcee5f284 Move Creation of excel document to own action 2024-07-23 22:59:23 +02:00
philipp lang b01ff9a677 Add prevention items 2024-07-23 22:59:23 +02:00
philipp lang 0d76b3cc5f Revert "Install adrema-form dependencies in docker"
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
This reverts commit eee0c64106.
2024-07-21 16:09:41 +02:00
philipp lang 0972ad65a7 Update changelog
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-07-18 16:03:10 +02:00
philipp lang 259465189f Update changelog
continuous-integration/drone/push Build is passing Details
2024-07-18 16:02:49 +02:00
philipp lang 306fef3e07 Add Verhaltenskodex prevention
continuous-integration/drone/push Build is passing Details
2024-07-18 13:58:21 +02:00
philipp lang ca0dd11336 Check for APP_KEY in every PHP Container
continuous-integration/drone/push Build is passing Details
2024-07-18 01:41:35 +02:00
philipp lang 89a8feb278 Clear node_modules in drone 2024-07-18 01:41:12 +02:00
philipp lang 8f7edadb99 Remove invoice volume 2024-07-18 01:40:55 +02:00
philipp lang eee0c64106 Install adrema-form dependencies in docker 2024-07-18 01:40:37 +02:00
philipp lang e50269d031 Move tex templates to invoice folder 2024-07-18 01:38:41 +02:00
philipp lang dc40728fca Mod helps
continuous-integration/drone/push Build is failing Details
2024-07-18 01:16:02 +02:00
philipp lang dfa17ed3db Update node version
continuous-integration/drone/push Build is failing Details
2024-07-18 00:59:15 +02:00
philipp lang 77c57794e1 Remove silvaletter dir
continuous-integration/drone/push Build is failing Details
2024-07-17 23:49:03 +02:00
philipp lang 1347347324 Add compose invoice dir
continuous-integration/drone/push Build is failing Details
2024-07-17 23:29:00 +02:00
philipp lang cd9cc607f4 Add silvaletter template
continuous-integration/drone/push Build is failing Details
2024-07-17 23:18:25 +02:00
philipp lang 6f1efb7470 Update silvaletter package 2024-07-17 22:54:50 +02:00
philipp lang 5fd050e116 Move template dir from default to invoice 2024-07-17 22:51:53 +02:00
philipp lang 3a53777dbd Update README 2024-07-17 22:45:16 +02:00
philipp lang 1ad2e6a978 Fix typo 2024-07-17 22:38:16 +02:00
philipp lang ac76d23941 Move template files of bill and remember invoice 2024-07-17 22:35:06 +02:00
philipp lang b67fa85539 Update Changelog
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-07-15 17:56:53 +02:00
philipp lang 5641006e2b Add mail data from template to form
continuous-integration/drone/push Build was killed Details
2024-07-15 17:13:23 +02:00
philipp lang 607038af6b Lint 2024-07-15 17:05:21 +02:00
philipp lang 189b83f2a5 Update migrations 2024-07-15 17:05:02 +02:00
philipp lang 3f4c655e5e Disable is_dirty when link not found 2024-07-15 17:00:42 +02:00
philipp lang 158cd2d352 Lint 2024-07-15 16:59:29 +02:00
philipp lang bf1388dbd9 Lint
continuous-integration/drone/push Build is passing Details
2024-07-14 22:16:34 +02:00
philipp lang aa20329a62 Lint
continuous-integration/drone/push Build is failing Details
2024-07-14 21:44:33 +02:00
philipp lang 09de9a5510 Add frontnd for formtemplate mails
continuous-integration/drone/push Build is failing Details
2024-07-14 20:53:26 +02:00
philipp lang 2982ae035f Lint 2024-07-14 20:53:15 +02:00
philipp lang 46740b14a2 Add mail_top and mail_bottom for formtemplates
continuous-integration/drone/push Build is failing Details
2024-07-14 20:20:56 +02:00
philipp lang 885eaa5df5 Fix migrations
continuous-integration/drone/push Build is failing Details
2024-07-14 20:19:17 +02:00
philipp lang 757042bdd2 Fix migrations
continuous-integration/drone/push Build is failing Details
2024-07-14 19:57:37 +02:00
philipp lang c3f6d3827b Add EditorData for forms texts
continuous-integration/drone/push Build is failing Details
2024-07-14 19:29:42 +02:00
philipp lang 1ef7995ec2 Update Changelog
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-07-14 12:13:59 +02:00
philipp lang c8676aef6d Fix tests
continuous-integration/drone/push Build is passing Details
2024-07-14 00:37:38 +02:00
philipp lang cf93b8eff0 Lint
continuous-integration/drone/push Build is failing Details
2024-07-14 00:11:18 +02:00
philipp lang e2a2d746a3 Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-14 00:05:53 +02:00
philipp lang aabba32f89 Fix drone
continuous-integration/drone/push Build was killed Details
2024-07-13 23:31:17 +02:00
philipp lang 11b97a634b Fix drone
continuous-integration/drone/push Build was killed Details
2024-07-13 22:50:17 +02:00
philipp lang 26cb7fd9f1 Add drone nextcloud service
continuous-integration/drone/push Build is failing Details
2024-07-13 22:36:08 +02:00
philipp lang 2b48f42734 Add nextcloud connections
continuous-integration/drone/push Build was killed Details
2024-07-13 22:30:34 +02:00
philipp lang 74867cb09f Add file conversion to jpeg
continuous-integration/drone/push Build is failing Details
2024-07-13 19:49:50 +02:00
philipp lang d4057ff08f Add filter for participants
continuous-integration/drone/push Build is failing Details
2024-07-13 18:48:11 +02:00
philipp lang 657a648f46 Add: Store participant 2024-07-13 18:24:43 +02:00
philipp lang d9c45f5236 Fix participant update 2024-07-13 17:54:23 +02:00
philipp lang 5d48521875 Fix fileshare skeleton 2024-07-13 17:44:03 +02:00
philipp lang 98976700a9 Mod db maintain
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-07-13 14:08:42 +02:00
philipp lang 790332b25c Lint
continuous-integration/drone/push Build is passing Details
2024-07-12 20:42:30 +02:00
philipp lang 56c28ae00e Add form to edit
continuous-integration/drone/push Build is failing Details
2024-07-12 20:18:41 +02:00
philipp lang a603aca80c Add backend for update 2024-07-12 20:15:24 +02:00
philipp lang c05434a7fb Add participant fields link 2024-07-12 19:49:47 +02:00
philipp lang 248499dc60 Fixed condition default
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is passing Details
2024-07-12 19:18:35 +02:00
philipp lang ad7fe80236 Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-12 18:27:18 +02:00
philipp lang dbde189575 Fix prevention for leaders
continuous-integration/drone/push Build is failing Details
2024-07-12 18:07:33 +02:00
philipp lang 146cbb0bef Add prevention conditions 2024-07-12 18:07:33 +02:00
philipp lang e6477fff2b Add conditions form 2024-07-12 18:07:33 +02:00
philipp lang 3c725c0efc Lint 2024-07-12 18:07:33 +02:00
philipp lang f632a8bb8f Lint 2024-07-12 18:07:33 +02:00
philipp lang 2f03dccebb Add data for conditions 2024-07-12 18:07:33 +02:00
philipp lang 235f439d51 Update adrema-form
continuous-integration/drone/push Build is passing Details
2024-07-11 15:15:50 +02:00
philipp lang cf77797512 Fix PreventionRememberAction
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-07-10 00:52:05 +02:00
philipp lang d44ad4bc53 Fix migration
continuous-integration/drone/tag Build is passing Details
2024-07-10 00:19:29 +02:00
philipp lang 94597e57c1 Fix migration
continuous-integration/drone/tag Build was killed Details
2024-07-10 00:18:18 +02:00
philipp lang a9ecdfe4bb Lint
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-07-08 23:17:14 +02:00
philipp lang 10a966c6ad Lint 2024-07-08 23:06:45 +02:00
philipp lang 3b63a73161 Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-08 22:39:11 +02:00
philipp lang 4e453a73a6 Fix tests 2024-07-08 21:42:31 +02:00
philipp lang 96cf0b7dd5 Fix EditorData cache
continuous-integration/drone/push Build is failing Details
2024-07-08 20:48:08 +02:00
philipp lang b2e85211a7 Add prevention_text field
continuous-integration/drone/push Build is failing Details
2024-07-06 15:14:53 +02:00
philipp lang 3dacfb3e54 Add prevention_text to form 2024-07-06 15:08:13 +02:00
philipp lang c9ccebc8f3 Lint
continuous-integration/drone/push Build is failing Details
2024-07-04 23:58:46 +02:00
philipp lang b6aaf6b2e1 Add todos
continuous-integration/drone/push Build is failing Details
2024-07-04 23:56:47 +02:00
philipp lang 793e4bacbd Add mail view 2024-07-04 23:54:37 +02:00
philipp lang 6c44a25638 Composer update
continuous-integration/drone/push Build is failing Details
2024-07-04 23:38:38 +02:00
philipp lang 8609f1e9c6 Fix: Cast Data object from Settings 2024-07-04 22:29:29 +02:00
philipp lang 0d07975e53 Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-04 22:12:45 +02:00
philipp lang f7d9328447 Fix: Dont Send mail to participants without mail 2024-07-04 22:09:24 +02:00
philipp lang d26bdd72fb Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-04 21:42:19 +02:00
philipp lang ff40b9e805 Add prevention settings
continuous-integration/drone/push Build is failing Details
2024-07-04 21:01:14 +02:00
philipp lang 92997aa78f Lint 2024-07-04 20:04:51 +02:00
philipp lang ee02b8df3a Add prevention 2024-07-04 20:04:49 +02:00
philipp lang 8ec4e4eb59 Fix db maintain
continuous-integration/drone/push Build is passing Details
2024-07-04 01:40:43 +02:00
philipp lang fc70107aa3 Optimize telescope table when pruning
continuous-integration/drone/push Build is failing Details
2024-07-04 00:56:20 +02:00
philipp lang 5661d66770 Add search result component
continuous-integration/drone/push Build is passing Details
2024-07-03 17:43:49 +02:00
philipp lang 0a8ecedb0f Update search 2024-07-03 17:31:06 +02:00
philipp lang fd9aff25fe Add hits to searchModal 2024-07-03 17:20:47 +02:00
philipp lang c65a25ed2a Fix: Switch input should not be invisible 2024-07-03 17:17:44 +02:00
philipp lang ced2d577c0 Lint 2024-07-03 17:12:57 +02:00
philipp lang aafef695aa Lint 2024-07-03 17:12:32 +02:00
philipp lang 44a39fc5a8 Lint 2024-07-03 17:10:04 +02:00
philipp lang 46a353d674 Fix event name im contribution 2024-07-03 17:09:34 +02:00
philipp lang fed0e95f14 Fix switch with array 2024-07-03 17:07:14 +02:00
philipp lang d1dfcb3a04 Add dev url for search 2024-07-03 17:03:53 +02:00
philipp lang 7f9be4262c Lint 2024-07-03 16:37:58 +02:00
philipp lang 99a28f44dd Dont match Email Nami Field
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-07-03 11:01:16 +02:00
philipp lang 9c93b13032 Fix: Dont reset page when assigning members
continuous-integration/drone/push Build is passing Details
2024-07-02 21:42:38 +02:00
philipp lang 231ed3b4ad Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-07-02 18:44:42 +02:00
philipp lang ccfeb85e4b Fix tests
continuous-integration/drone/push Build is failing Details
2024-07-02 18:19:40 +02:00
philipp lang 445a8ae962 Add assign for participant
continuous-integration/drone/push Build is failing Details
2024-07-02 18:04:55 +02:00
philipp lang 0741984858 Lint 2024-07-02 17:44:28 +02:00
philipp lang 69a3ed2a60 Add member_id for participants 2024-07-02 16:04:07 +02:00
philipp lang bbdc9e9dfb Fix tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-07-01 12:08:59 +02:00
philipp lang 7e39a4da84 Fix tests
continuous-integration/drone/push Build is failing Details
2024-06-30 23:50:01 +02:00
philipp lang ae450ef9ae Add table export
continuous-integration/drone/push Build is failing Details
2024-06-30 23:36:44 +02:00
philipp lang 2425ff6638 Add adapter test 2024-06-30 21:04:54 +02:00
philipp lang 2586669c96 Delete skeleton dir when container starts 2024-06-30 21:04:20 +02:00
philipp lang af124f897b Fix Form export
continuous-integration/drone/push Build is passing Details
2024-06-30 18:51:14 +02:00
philipp lang c78c1cfee7 Make Export not nullable
continuous-integration/drone/push Build is failing Details
2024-06-30 18:10:53 +02:00
philipp lang bbd3237330 Add fields for form export
continuous-integration/drone/push Build is passing Details
2024-06-29 19:09:00 +02:00
philipp lang fcc01d26ac Lint
continuous-integration/drone/push Build is passing Details
2024-06-29 18:54:56 +02:00
philipp lang 93d30d10eb Add export to form
continuous-integration/drone/push Build is failing Details
2024-06-29 18:02:23 +02:00
philipp lang c7fc76466e Add fileshare to groups
continuous-integration/drone/push Build is passing Details
2024-06-29 14:36:35 +02:00
philipp lang 6aaeb75b2a Add remote selector
continuous-integration/drone/push Build is passing Details
2024-06-29 13:13:11 +02:00
philipp lang 8c3dc2211b Add loading component 2024-06-29 11:27:08 +02:00
philipp lang d06ae7acb5 Lint
continuous-integration/drone/push Build is passing Details
2024-06-29 11:23:33 +02:00
philipp lang 63c62dc958 Fix: Return Basename instead of Filename 2024-06-29 10:34:40 +02:00
philipp lang 71903936a3 Add api for listing subdirectories
continuous-integration/drone/push Build is failing Details
2024-06-28 23:56:34 +02:00
philipp lang 0ad6b40393 Add tests 2024-06-28 22:26:38 +02:00
philipp lang f04cf7a1b2 Install webdav filesystem 2024-06-28 22:26:09 +02:00
philipp lang 94cc0147bc Add fileshare api 2024-06-28 15:51:40 +02:00
philipp lang 73633d7628 Move component assertion 2024-06-28 15:51:40 +02:00
philipp lang 5482d47f0c Rename fileshare 2024-06-28 15:51:40 +02:00
philipp lang e1c3240290 Add update for fileshares 2024-06-28 15:51:40 +02:00
philipp lang e9e0be83cc Add: Store connection frontend 2024-06-28 15:51:40 +02:00
philipp lang 32e7f8c41d Rename test files 2024-06-28 15:51:40 +02:00
philipp lang 4cfa70e534 Lint 2024-06-28 15:51:40 +02:00
philipp lang 45597558e3 Add owncloud domain to drone 2024-06-28 15:51:40 +02:00
philipp lang c99a5a0369 Add owncloud application to drone 2024-06-28 15:51:40 +02:00
philipp lang 258093f2c4 Add fileshare storage 2024-06-28 15:51:40 +02:00
philipp lang f16b58dbc6 Add type information to index 2024-06-28 15:51:40 +02:00
philipp lang 8609a648fd Add fileshare index 2024-06-28 15:51:40 +02:00
philipp lang b15b806948 Remove switch and form css
continuous-integration/drone/push Build is passing Details
2024-06-28 15:50:40 +02:00
philipp lang 19b13133a6 Mod fields
continuous-integration/drone/push Build is passing Details
2024-06-28 14:26:12 +02:00
philipp lang d22e4b597f Add field appearance 2024-06-28 14:04:20 +02:00
philipp lang f100135f33 move classes 2024-06-28 13:43:38 +02:00
philipp lang efc9a397f3 Fix default for subscription 2024-06-28 12:47:41 +02:00
philipp lang ab06c7de5d Add validator for text modelValue 2024-06-28 12:45:43 +02:00
philipp lang a9dea10a17 Add recertified to member default 2024-06-28 12:45:23 +02:00
philipp lang dd4468808b Remove name prop from f-text component 2024-06-28 12:43:05 +02:00
philipp lang 1ef8cfdec8 Mod text component
continuous-integration/drone/push Build is passing Details
2024-06-28 12:13:08 +02:00
philipp lang b6c9eea8ea Cleanup 2024-06-28 12:13:08 +02:00
philipp lang 12eb5016c8 remove console log
continuous-integration/drone/push Build is passing Details
2024-06-28 12:12:02 +02:00
philipp lang 75d9301033 Add echo port via mode
continuous-integration/drone/push Build is passing Details
2024-06-28 12:10:18 +02:00
philipp lang 8c820ab24d Add cy data to invoice edit button
continuous-integration/drone/push Build is failing Details
2024-06-28 08:40:58 +02:00
philipp lang d26463d43c Add run script 2024-06-28 08:38:05 +02:00
philipp lang 4fda17d2c6 make siteName optional in api index 2024-06-28 08:36:57 +02:00
philipp lang 094a84c745 Lint text component 2024-06-28 08:30:35 +02:00
philipp lang 1630bce795 Add table toggle for participant index
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-21 00:25:14 +02:00
philipp lang cce9d4fa3e Add id to participant index 2024-06-21 00:24:27 +02:00
philipp lang 323f136e40 Add useTableToggle composable for group index 2024-06-21 00:23:31 +02:00
philipp lang 820b317b57 Add has_nami_field to participant component 2024-06-20 23:31:09 +02:00
philipp lang 43c528fc46 Add has_nami and two participant urls to form 2024-06-20 23:29:23 +02:00
philipp lang e9e8b193f4 Add pagination for participant api index parent 2024-06-20 23:25:47 +02:00
philipp lang 646b292249 Add has_nami to participant api index 2024-06-20 23:25:14 +02:00
philipp lang 0526b52b6b Lint 2024-06-20 00:12:15 +02:00
philipp lang 1a5675634f Add children filter to participant index
continuous-integration/drone/push Build is passing Details
2024-06-19 23:51:20 +02:00
philipp lang 73089ae654 Add TableToggleButton for group index
continuous-integration/drone/push Build is passing Details
2024-06-19 22:36:24 +02:00
philipp lang e4f195ee3e Add TableToggleButton component 2024-06-19 22:00:18 +02:00
philipp lang 87377dab06 Add toggle 2024-06-19 21:33:59 +02:00
philipp lang 668cf9d292 Fixed: Dont sync member when member is manual
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-19 13:05:45 +02:00
philipp lang 03c19aa5fb Validate fields for manual member
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-19 10:30:07 +02:00
philipp lang 40407214e3 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-19 00:04:28 +02:00
philipp lang 49afcafbb2 Update adrema-form
continuous-integration/drone/push Build is failing Details
2024-06-18 23:55:30 +02:00
philipp lang 8f6b8e466a Fix: allow parent group field to have empty value 2024-06-18 23:54:55 +02:00
philipp lang af6dd35a5b Update adrema-form
continuous-integration/drone/push Build is passing Details
2024-06-18 21:50:08 +02:00
philipp lang 402e0fe5ee Update adrema-form 2024-06-18 21:36:06 +02:00
philipp lang 9252686e78 Fixed: Fill fields of manual member if nami type
continuous-integration/drone/push Build is passing Details
2024-06-18 21:21:02 +02:00
philipp lang c9885a8c9c Add intro field for existing sections
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-18 15:12:40 +02:00
philipp lang a71af994bb Fix tests
continuous-integration/drone/push Build is passing Details
2024-06-18 15:07:10 +02:00
philipp lang f03459de58 Fix: Update section intro
continuous-integration/drone/push Build is failing Details
2024-06-18 14:54:44 +02:00
philipp lang 3f3ecf0071 Add non nami members
continuous-integration/drone/push Build is passing Details
2024-06-18 02:00:36 +02:00
philipp lang fa2d93174a Add mobile phone nami type
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-12 00:47:25 +02:00
philipp lang cb3cc087d6 Add age nami field 2024-06-12 00:41:49 +02:00
philipp lang 86aaf55d21 Add gender as a nami field 2024-06-12 00:14:25 +02:00
philipp lang 700d69d1a2 Add male and female for member factory
continuous-integration/drone/push Build is passing Details
2024-06-12 00:04:13 +02:00
philipp lang 452505632e Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-10 18:51:06 +02:00
philipp lang 6ae61655de Add minmax for checkboxes
continuous-integration/drone/push Build is failing Details
2024-06-10 17:46:41 +02:00
philipp lang df202d9a9a Update adrema-form
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-10 16:52:28 +02:00
philipp lang da02a76e21 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-10 11:16:28 +02:00
philipp lang edfd5dcbe7 Add: clear form frontend cache when form updated
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-06-10 00:17:14 +02:00
philipp lang ccea9ab094 Update adrema-form
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-06-07 01:03:42 +02:00
philipp lang 348fca4dd0 Fixed tests
continuous-integration/drone/push Build is passing Details
2024-06-07 01:02:07 +02:00
philipp lang 1ee2e72347 Add default value for intro
continuous-integration/drone/push Build is failing Details
2024-06-07 00:55:34 +02:00
philipp lang 393d1f391c Add nickname to nami fields
continuous-integration/drone/push Build is failing Details
2024-06-07 00:52:09 +02:00
philipp lang 7e152c017a Add intro to fields
continuous-integration/drone/push Build is failing Details
2024-06-07 00:48:54 +02:00
philipp lang 2b976ac03e Mod tab name in Form 2024-06-07 00:20:15 +02:00
philipp lang 68a47e3fb9 Fixed: Filter members for different memberships
continuous-integration/drone/push Build is passing Details
2024-05-28 00:17:18 +02:00
philipp lang 917a3932e1 Add export for forms
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-27 21:08:09 +02:00
philipp lang 5bd52e7b51 Add unique fields for mmebership filters
continuous-integration/drone/push Build is passing Details
2024-05-27 20:39:06 +02:00
philipp lang db640c8185 Add register url
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-27 19:47:28 +02:00
philipp lang 0fb259a373 Return active and private from forms api
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-27 19:14:55 +02:00
philipp lang e299e8b159 Lint 2024-05-27 19:14:42 +02:00
philipp lang 35a8c59055 Add private columns
continuous-integration/drone/push Build is failing Details
2024-05-27 18:53:44 +02:00
philipp lang 0c49166392 Add private state for forms 2024-05-27 18:49:11 +02:00
philipp lang c4aa9b1051 Add inactive forms 2024-05-27 18:30:05 +02:00
philipp lang e5008d127d Ignore _url when searching for members
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-26 01:17:05 +02:00
philipp lang a9eafb44be Ignore media-library storage
continuous-integration/drone/push Build is passing Details
2024-05-23 23:54:12 +02:00
philipp lang e10742d298 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-14 09:38:18 +02:00
philipp lang c0daff972b Add filter for invoices
continuous-integration/drone/push Build is failing Details
2024-05-14 01:29:39 +02:00
philipp lang 30d670a575 Grab page limit from scout config
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-05-09 02:23:55 +02:00
philipp lang b1581bf9c8 Fix: Export all pages when exporting a csv
continuous-integration/drone/push Build is passing Details
2024-05-09 02:07:31 +02:00
philipp lang b3354e1474 Mod deletion of members when initializing
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-05-02 21:08:48 +02:00
philipp lang ce6cc215bd Update adrema-form
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is failing Details
2024-04-27 00:00:23 +02:00
philipp lang c4cec65249 Fix assert
continuous-integration/drone/push Build is passing Details
2024-04-26 23:46:23 +02:00
philipp lang 36a9b21028 Lint
continuous-integration/drone/push Build is failing Details
2024-04-26 23:33:34 +02:00
philipp lang 1c4b0b5e46 Mod Size of participants filters
continuous-integration/drone/push Build is failing Details
2024-04-26 23:24:14 +02:00
philipp lang 8f285b4aa6 Add filter for participants
continuous-integration/drone/push Build is failing Details
2024-04-26 23:20:03 +02:00
philipp lang 9954ba1ee4 Lint Select form field 2024-04-26 21:47:36 +02:00
philipp lang 35c817d1c2 Add subscription_id to nami fields 2024-04-25 23:48:51 +02:00
philipp lang 60c80deefe Fix editor
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-04-25 23:17:05 +02:00
philipp lang 868dc5cf02 Add description for condition blocks
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-25 22:49:07 +02:00
philipp lang 38ac195924 Add simple wrapper content for condition 2024-04-25 22:37:46 +02:00
philipp lang 36b195b78a Fix empty-option-value
continuous-integration/drone/push Build is passing Details
2024-04-25 22:01:55 +02:00
philipp lang 8e3054da49 Add: Delete participant
continuous-integration/drone/push Build is passing Details
2024-04-25 21:49:31 +02:00
philipp lang f05a919b9c Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-24 15:39:07 +02:00
philipp lang e0bd7c5add Fix tests
continuous-integration/drone/push Build is failing Details
2024-04-24 00:20:03 +02:00
philipp lang 47cbc3321c Fix tests
continuous-integration/drone/push Build is failing Details
2024-04-24 00:09:47 +02:00
philipp lang 2984ad9372 Fix tests
continuous-integration/drone/push Build is failing Details
2024-04-24 00:02:27 +02:00
philipp lang 0ba8c58c76 Fixed tests 2024-04-23 23:55:42 +02:00
philipp lang 0437511bf1 Add filter for attachments
continuous-integration/drone/push Build is failing Details
2024-04-23 23:48:09 +02:00
philipp lang 1328f359b2 Fix: Update active columns 2024-04-23 23:12:14 +02:00
philipp lang 4997895dfb Add heading in confirm registration mail 2024-04-23 23:03:29 +02:00
philipp lang 4f1c02acac Add test for blocks 2024-04-23 23:01:27 +02:00
philipp lang ae39c8dd31 Fix: Return emoty blocks
continuous-integration/drone/push Build is failing Details
2024-04-20 00:29:32 +02:00
philipp lang dbffb4b394 Change time for editorjs update
continuous-integration/drone/push Build is failing Details
2024-04-20 00:18:10 +02:00
philipp lang 1929c8c216 Add filter for mail top and mail bottom 2024-04-20 00:04:20 +02:00
philipp lang 21dfc4f0b2 Add findByKey to FieldCollection 2024-04-20 00:00:04 +02:00
philipp lang 5e2427ee81 Add condition for checkbox field 2024-04-19 23:57:05 +02:00
philipp lang 37c8f35b58 Add condition selector for mode 2024-04-19 22:13:55 +02:00
philipp lang 5310686b9c Mod condition data 2024-04-19 22:06:09 +02:00
philipp lang 2363be7d61 Add panel types in mail theme 2024-04-19 22:04:51 +02:00
philipp lang 2abe061c4f Update content tests 2024-04-19 17:42:59 +02:00
philipp lang fde1a9d169 Update mail views 2024-04-19 16:51:17 +02:00
philipp lang 1f4173caf8 Lint 2024-04-19 16:35:59 +02:00
philipp lang 6ad639730a Fix: hide form when tab is not opened
continuous-integration/drone/push Build is failing Details
2024-04-19 14:58:49 +02:00
philipp lang 096e44b767 Add conditions to files and email
continuous-integration/drone/push Build is failing Details
2024-04-19 13:49:47 +02:00
philipp lang e08ad63313 Add test for isDirty 2024-04-19 11:38:53 +02:00
philipp lang 594c45aede Fix: Store membership for non nami member
continuous-integration/drone/push Build is passing Details
2024-04-19 11:12:41 +02:00
philipp lang aa81843df1 Lint 2024-04-18 22:18:56 +02:00
philipp lang adf0ae183e Add condition for email files 2024-04-18 22:15:28 +02:00
philipp lang 4095d218bd Update adrema-form 2024-04-18 20:16:23 +02:00
philipp lang 4b2ac19b78 ignore groups file 2024-04-18 19:33:16 +02:00
philipp lang bf6e0fac85 Fix empty option
continuous-integration/drone/tag Build is passing Details
2024-04-18 19:01:54 +02:00
philipp lang 85560ebec2 Revert "Set hasEmptyOption"
This reverts commit daca017d96.
2024-04-18 18:59:58 +02:00
philipp lang daca017d96 Set hasEmptyOption
continuous-integration/drone/tag Build was killed Details
continuous-integration/drone/push Build was killed Details
2024-04-18 18:55:26 +02:00
philipp lang fd1e0bb9e1 Add empty option for group field
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-18 01:03:30 +02:00
philipp lang 913e45eb75 Add editorjs-alert package
continuous-integration/drone/push Build is passing Details
2024-04-17 23:46:29 +02:00
philipp lang 46ff7a0ca8 Add editor formatting for alerts
continuous-integration/drone/push Build is failing Details
2024-04-17 23:05:55 +02:00
philipp lang f70c0db783 Add draggable for fields
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is failing Details
2024-04-17 21:18:23 +02:00
philipp lang df4f911d8e Update adrema-form 2024-04-17 20:24:11 +02:00
philipp lang 2691894b78 Fixed tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-17 10:53:59 +02:00
philipp lang edffe0ef80 Fixed tests
continuous-integration/drone/push Build is failing Details
2024-04-17 10:19:56 +02:00
philipp lang 58bb5ec87f Update adrema-form
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-04-16 23:23:57 +02:00
philipp lang e480eb330e Add allowcustom field 2024-04-16 23:15:05 +02:00
philipp lang c62f8ec676 Fixed tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-15 16:37:36 +02:00
philipp lang 55d253aa7b Fixed tests
continuous-integration/drone/push Build is failing Details
2024-04-15 16:23:32 +02:00
philipp lang f84decbb52 Fixed tests 2024-04-15 16:20:29 +02:00
philipp lang 8117cfb4f4 Add number field
continuous-integration/drone/push Build is failing Details
2024-04-14 11:47:48 +02:00
philipp lang a6a8983ae9 Add mail attachments to registration mail 2024-04-14 10:49:44 +02:00
philipp lang 8b42a62b2d update adrema-form 2024-04-14 00:26:41 +02:00
philipp lang e6261d42ff Add mailattachments upload field for forms 2024-04-14 00:26:17 +02:00
philipp lang 56e0223492 Add test for email validation
continuous-integration/drone/push Build is failing Details
2024-04-13 21:57:58 +02:00
philipp lang 5e49e5bd59 Add test for checkbox field presenter 2024-04-13 21:49:29 +02:00
philipp lang 93d4511ee8 Add Email field
continuous-integration/drone/push Build is failing Details
2024-04-12 15:57:53 +02:00
philipp lang 63583b9b25 Add Boolean presenter for checkbox
continuous-integration/drone/push Build is failing Details
2024-04-12 15:42:43 +02:00
philipp lang 1509efd881 Add default required for field 2024-04-12 15:23:18 +02:00
philipp lang ab7e20becd Add searching for member
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-04-12 02:20:43 +02:00
philipp lang 0e2ebd9593 Add membership management 2024-04-12 02:11:30 +02:00
philipp lang 58feb20545 Add created_at column in participants table
continuous-integration/drone/push Build is failing Details
2024-04-12 00:14:02 +02:00
philipp lang a1b0f6496c Add: Remove option in FormBuilder
continuous-integration/drone/push Build is passing Details
2024-04-11 23:01:52 +02:00
philipp lang 45b559ea17 Add ActionButton in tables 2024-04-11 22:53:26 +02:00
philipp lang 34ab000e37 Update adrema-form
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-11 20:14:42 +02:00
philipp lang bd6ccf030b Add prefer_inner for group api
continuous-integration/drone/push Build is passing Details
2024-04-11 20:03:25 +02:00
philipp lang 2ba31a0678 Mod: Set relative url for member links in meilisearch response
continuous-integration/drone/push Build is passing Details
2024-04-10 16:23:50 +02:00
philipp lang edc7aaccd6 Add: default search option when searching for members
continuous-integration/drone/push Build is passing Details
2024-04-10 16:11:14 +02:00
philipp lang 5d1571012d Fix: hint should be optional
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-10 00:11:58 +02:00
philipp lang 43821ec416 Ad hint field
continuous-integration/drone/push Build is failing Details
2024-04-10 00:00:20 +02:00
philipp lang c3f58cebc6 Update adrema-form 2024-04-08 23:50:46 +02:00
philipp lang f05c85a035 Add other field matches for NamiField 2024-04-08 23:50:17 +02:00
philipp lang 0e69e7c7f1 Fix field replace
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-08 19:22:52 +02:00
philipp lang f3f092bdf5 fix adrema-form path
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-04-08 18:28:31 +02:00
philipp lang 44ea68cce7 Mod registration mail
continuous-integration/drone/push Build is failing Details
2024-03-24 11:09:56 +01:00
philipp lang c0096c0794 Remove adrema-plugin submodule
continuous-integration/drone/push Build is failing Details
2024-03-17 16:50:18 +01:00
philipp lang 05bcb376c8 Update oc-adrema-plugin 2024-03-17 16:42:47 +01:00
philipp lang 913cabc7a3 Mod Adrema plugin path
continuous-integration/drone/push Build is failing Details
2024-03-17 16:21:54 +01:00
philipp lang 7cc1f349a1 Update adrema-plugin 2024-03-17 02:08:14 +01:00
philipp lang 8d2f8ec03d Fix tests 2024-03-17 02:08:14 +01:00
philipp lang 9144ae1028 Add mail for registration 2024-03-17 02:08:14 +01:00
philipp lang c3a2417cac Lint 2024-03-17 02:08:14 +01:00
philipp lang 91943a6321 Add subject for participant mail 2024-03-17 02:08:14 +01:00
philipp lang 6f03063cba Add SpecialType to form field 2024-03-17 02:08:14 +01:00
philipp lang 5d576cda6a Add mail to participant 2024-03-17 02:08:14 +01:00
philipp lang 2a979d932e Add value for Participant fields 2024-03-17 02:08:14 +01:00
philipp lang 80def4abde --wip-- [skip ci] 2024-03-17 02:08:14 +01:00
philipp lang 64c2cb9408 Add value for field 2024-03-17 02:08:14 +01:00
philipp lang 78d6c6d864 Add participants parent and child in request filter 2024-03-17 02:08:14 +01:00
philipp lang a0842afd47 Add participants parent id 2024-03-17 02:08:14 +01:00
philipp lang 43846d1703 Add matching for member 2024-03-17 02:08:14 +01:00
philipp lang 171dd51200 Add email to NamiField 2024-03-17 02:08:14 +01:00
philipp lang c844f2143a Add data objects for form 2024-03-17 02:08:14 +01:00
philipp lang 6ac539417f Lint 2024-03-17 02:08:14 +01:00
philipp lang 56ad09c6fa Fix form 2024-03-17 02:08:14 +01:00
philipp lang 2f2e95cd23 Fix: Remove page param from search action input 2024-03-17 02:08:14 +01:00
philipp lang 3d270ce9a4 Fix: Remove active columns when field removed 2024-03-17 02:08:14 +01:00
philipp lang eaa880127d Add fresh Login for Remote login 2024-03-17 02:08:14 +01:00
philipp lang 6f334765bf Fix remote search 2024-03-17 02:08:13 +01:00
philipp lang b806cafc8b Add agegroups to form meta 2024-03-17 02:08:13 +01:00
philipp lang ada03a11ea Lint 2024-03-17 02:08:13 +01:00
philipp lang a12cb53274 Fixed tests 2024-03-17 02:08:13 +01:00
philipp lang 458c643615 Add remote search 2024-03-17 02:08:13 +01:00
philipp lang 60b0052622 Fix setting form meta when form has no fields 2024-03-17 02:08:13 +01:00
philipp lang 0bc00207b2 Add remote login 2024-03-17 02:08:13 +01:00
philipp lang 8cd2f74477 Add form meta route 2024-03-17 02:08:13 +01:00
philipp lang 9d11294fde Add update of active columns in participants table 2024-03-17 02:08:13 +01:00
philipp lang acec968963 Lint 2024-03-17 02:08:13 +01:00
philipp lang 3cbb4768e8 Add sorting and active_columns meta for form 2024-03-17 02:08:13 +01:00
philipp lang 09e3bcab9e Return namiTypes from form 2024-03-17 02:08:13 +01:00
philipp lang 66a76ad2b1 Fix: Match Group of member 2024-03-17 02:08:13 +01:00
philipp lang 5919082211 Add trait for creating form fields 2024-03-17 02:08:13 +01:00
philipp lang 2a5c203cc0 Lint 2024-03-17 02:08:13 +01:00
philipp lang 5f48b4e64d Add presenter for nami field 2024-03-17 02:08:13 +01:00
philipp lang 5f47729bb6 Add mitgliedsnr column to sub member 2024-03-17 02:08:13 +01:00
philipp lang c9cbf86626 Lint 2024-03-17 02:08:13 +01:00
philipp lang 8713f941c1 Fix: Register participant with no nami member 2024-03-17 02:08:13 +01:00
philipp lang 26ce8637c1 Mod field name of nami_type in FormBuilder 2024-03-17 02:08:13 +01:00
philipp lang ebf7a1d5c9 Add: Destroy formtemplate 2024-03-17 02:08:13 +01:00
philipp lang b86b2b6063 Add for_members field for sections 2024-03-17 02:08:13 +01:00
philipp lang 94397165c6 Lint 2024-03-17 02:08:13 +01:00
philipp lang 9d7d039530 Lint Registration 2024-03-17 02:08:13 +01:00
philipp lang 34fb96dabe Simplify test 2024-03-17 02:08:13 +01:00
philipp lang f601167893 Add FormTestCase 2024-03-17 02:08:13 +01:00
philipp lang 54b650fb91 Rename test method 2024-03-17 02:08:13 +01:00
philipp lang f24064b9f3 Add createMember method 2024-03-17 02:08:13 +01:00
philipp lang a96d879023 Set fields not fillable 2024-03-17 02:08:13 +01:00
philipp lang b194e77966 Add validation for other member fields 2024-03-17 02:08:13 +01:00
philipp lang a830f366ad Fix tests 2024-03-17 02:08:13 +01:00
philipp lang 974c73af71 Lint 2024-03-17 02:08:13 +01:00
philipp lang 445590e060 Add other fields from Member 2024-03-17 02:08:13 +01:00
philipp lang ef47480cc9 Add member registration via nami type 2024-03-17 02:08:13 +01:00
philipp lang 35b269c647 Add lastname nami field 2024-03-17 02:08:13 +01:00
philipp lang e508dd9e6f Add nami fields to form field 2024-03-17 02:08:13 +01:00
philipp lang 891f0c21ad Add presenters 2024-03-17 02:08:13 +01:00
philipp lang a0bcd99642 Lint 2024-03-17 02:08:13 +01:00
philipp lang 857051434e Lint 2024-03-17 02:08:13 +01:00
philipp lang c7b23df01e Add participant overview 2024-03-17 02:08:13 +01:00
philipp lang 7361dcccff Fix page navigation in useApiIndex 2024-03-17 02:08:13 +01:00
philipp lang 590696750b Add Backend for participant index 2024-03-17 02:08:13 +01:00
philipp lang 48383b25da Add participants count for form index 2024-03-17 02:08:13 +01:00
philipp lang de76e195e7 Move Api routes 2024-03-17 02:08:13 +01:00
philipp lang ff6c2bbc2c Update Adrema plugin 2024-03-17 02:08:13 +01:00
philipp lang 5d9d7a0ffc Add register action 2024-03-17 02:08:13 +01:00
philipp lang 89429f9812 Add options and maxToday method 2024-03-17 02:08:13 +01:00
philipp lang b813664632 Fix: snake method in tests 2024-03-17 02:08:13 +01:00
philipp lang a7394e12aa Add Type to FormtemplateFieldRequest 2024-03-17 02:08:13 +01:00
philipp lang ddb44d64d6 Add adrema_base_url 2024-03-17 02:08:13 +01:00
philipp lang 3d62970baf Fixed tests 2024-03-17 02:08:13 +01:00
philipp lang 9a3a0402d9 Set minHeight for editor 2024-03-17 02:08:13 +01:00
philipp lang 665b43c797 Add lists 2024-03-17 02:08:13 +01:00
philipp lang ee926467ed Add style for headings 2024-03-17 02:08:13 +01:00
philipp lang 4ffc14d503 Fix MemberTest 2024-03-17 02:08:13 +01:00
philipp lang 1edbdab8fd Add editorJS for Form Description 2024-03-17 02:08:13 +01:00
philipp lang 6e6a4595cd Lint 2024-03-17 02:08:13 +01:00
philipp lang e3a0ca7673 Fix searching via api 2024-03-17 02:08:13 +01:00
philipp lang 28c821eeaf Add searching and filtering for events 2024-03-17 02:08:13 +01:00
philipp lang e45a59c5ff Add from and to date to form index 2024-03-17 02:08:13 +01:00
philipp lang d3c1e89a03 Add media conversion for squared form header image format 2024-03-17 02:08:13 +01:00
Philipp Lang 6ede944d85 Remove laravel sail 2024-03-17 02:08:13 +01:00
Philipp Lang b69c895921 Add image to api response 2024-03-17 02:08:13 +01:00
Philipp Lang 539e41cffe Lint 2024-03-17 02:08:13 +01:00
philipp lang bdf3fa54a9 Add image component to form 2024-03-17 02:08:13 +01:00
philipp lang 97fabf0f24 Add image to form 2024-03-17 02:08:13 +01:00
philipp lang e011b52534 Add form api to display event overview on website 2024-03-17 02:08:13 +01:00
philipp lang e005ed0d0d lint 2024-03-17 02:08:13 +01:00
philipp lang ae19a6ed2b lint 2024-03-17 02:08:13 +01:00
philipp lang 4ce7d428d4 lint 2024-03-17 02:08:13 +01:00
philipp lang e6d0a30c7f lint 2024-03-17 02:08:12 +01:00
philipp lang d16f02c8b3 fix tests 2024-03-17 02:08:12 +01:00
philipp lang 888f4ee976 Lint 2024-03-17 02:08:12 +01:00
philipp lang 2a6e3aac03 Fix tests 2024-03-17 02:08:12 +01:00
philipp lang 7abf746897 Update Form Builder 2024-03-17 02:08:12 +01:00
philipp lang ed8e7b045d Fix drone 2024-03-17 02:08:12 +01:00
philipp lang 2a2cbd196d Add node 2024-03-17 02:08:12 +01:00
philipp lang 4690e0037f Mod adrema plugin 2024-03-17 02:08:12 +01:00
philipp lang 1d28827353 Update adrema-plugin 2024-03-17 02:08:12 +01:00
philipp lang 703084dbc1 update submodules 2024-03-17 02:08:12 +01:00
philipp lang 7aa445ca74 Mod modules 2024-03-17 02:08:12 +01:00
philipp lang a2d7a36fc1 mod submodule 2024-03-17 02:08:12 +01:00
philipp lang 23c60d4330 Fix submodules 2024-03-17 02:08:12 +01:00
philipp lang 79f1c71dd9 Fix tests 2024-03-17 02:08:12 +01:00
philipp lang 452416d0a4 fix tests 2024-03-17 02:08:12 +01:00
philipp lang 589b713907 Add form editor 2024-03-17 02:08:12 +01:00
philipp lang eb60852bbf Fix textarea hint 2024-03-17 02:08:12 +01:00
philipp lang c3db854eb5 Add formtemplate to form index 2024-03-17 02:08:12 +01:00
philipp lang 5cf49489d5 Add config to index 2024-03-17 02:08:12 +01:00
philipp lang 7d880c6e29 --wip-- [skip ci] 2024-03-17 02:08:12 +01:00
philipp lang 743c041c35 Add IndexAction for forms 2024-03-17 02:08:12 +01:00
philipp lang d3ad48ed30 Add more form fields 2024-03-17 02:08:12 +01:00
philipp lang 4776c0d71b Add eventform submodule 2024-03-17 02:08:12 +01:00
philipp lang 9355daee7e Lint 2024-03-17 02:08:12 +01:00
philipp lang 89b5cbd4b5 Add group field 2024-03-17 02:08:12 +01:00
philipp lang c8bc69ae30 Add date field 2024-03-17 02:08:12 +01:00
philipp lang 0fde33803b Add slot for meta info to formbuilder 2024-03-17 02:08:12 +01:00
philipp lang 1b5c83a414 add StoreForm route 2024-03-17 02:08:12 +01:00
philipp lang e0558e4b13 update form 2024-03-17 02:08:12 +01:00
philipp lang b421f85d89 Move Config to FormBuilder 2024-03-17 02:08:12 +01:00
philipp lang 0eb8928b22 Fix TextField Meta 2024-03-17 02:08:12 +01:00
philipp lang f1d4d3e428 Add StoreAction for form 2024-03-17 02:08:12 +01:00
philipp lang 5b2a290b49 Add FormtemplateUpdateActionTest 2024-03-17 02:08:12 +01:00
philipp lang f55c174019 Fix tests 2024-03-17 02:08:12 +01:00
philipp lang d597d5ea2b Add fakers for fields 2024-03-17 02:08:12 +01:00
Philipp Lang d4c8fdff3f Remove test for name 2024-03-17 02:08:12 +01:00
philipp lang b26935fc07 Add deleteSection 2024-03-17 02:08:12 +01:00
philipp lang 4ddf76943d Add column selector 2024-03-17 02:08:12 +01:00
philipp lang d7e7fb3c27 Add faker for TextField 2024-03-17 02:08:12 +01:00
philipp lang 87ee15936d Add default value for field to Request 2024-03-17 02:08:12 +01:00
Philipp Lang 6262ccdd28 Add validation for update 2024-03-17 02:08:12 +01:00
Philipp Lang b109d40ebb add field meta 2024-03-17 02:08:12 +01:00
Philipp Lang 3c81dfe7db Add fields 2024-03-17 02:08:12 +01:00
philipp lang cc52437568 fix field 2024-03-17 02:08:12 +01:00
philipp lang ac28466c8d Add checkboxes 2024-03-17 02:08:12 +01:00
philipp lang bde8d48807 Add fields 2024-03-17 02:08:12 +01:00
philipp lang 288533efd3 Add update for form 2024-03-17 02:08:12 +01:00
philipp lang 104b04b639 Add field management 2024-03-17 02:08:12 +01:00
philipp lang 8bf0019c98 Add form builder 2024-03-17 02:08:12 +01:00
philipp lang 9f85809195 Mod FormtemplateResource 2024-03-17 02:08:12 +01:00
philipp lang 131690262e Lint 2024-03-17 02:08:12 +01:00
philipp lang edb1eeb0d8 Add path alias for packages 2024-03-17 02:08:12 +01:00
philipp lang 2ecd4b9643 Ad backend for index and store 2024-03-17 02:08:12 +01:00
Philipp Lang ae679641d7 Add event module 2024-03-17 02:08:12 +01:00
philipp lang d692cf3bdf Set default text for subscription child
continuous-integration/drone/push Build is passing Details
2024-03-15 02:27:04 +01:00
philipp lang 339e76d874 Lint 2024-03-15 02:26:18 +01:00
Arwed Molitor 2d02c79c86 Set default text for subscription 2024-03-15 02:21:27 +01:00
Arwed Molitor e21e818ac6 Improve contribution BDKJ Hesse
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-03-12 14:06:19 +01:00
Arwed Molitor fecd461aef Improve contribution Frankfurt 2024-03-12 13:52:10 +01:00
philipp lang 58d7c5671f Lint
continuous-integration/drone/push Build is passing Details
2024-03-09 00:57:25 +01:00
philipp lang 54cf187ff5 Fix tests
continuous-integration/drone/push Build is failing Details
2024-03-09 00:45:29 +01:00
philipp lang 0575fe4e5c Lint
continuous-integration/drone/push Build is failing Details
2024-03-09 00:30:44 +01:00
philipp lang 3567dc3620 Update tex package
continuous-integration/drone/push Build is failing Details
2024-03-09 00:14:22 +01:00
philipp lang 4fcdf91414 Update laravel-nami
continuous-integration/drone/push Build is failing Details
2024-03-09 00:13:32 +01:00
philipp lang 94f8ea3b67 Add first_activity_id when existing member is stored in nami 2024-03-08 23:44:40 +01:00
philipp lang 32cc9feee0 Lint Member Store Test 2024-03-08 22:59:43 +01:00
philipp lang 4445304ef3 Update laravel-nami
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-03-08 22:26:52 +01:00
philipp lang d29f7b6e8a Fix member search for membership when one param is empty 2024-03-08 22:26:16 +01:00
philipp lang a25d983de0 Add efz for members
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-03-07 21:24:12 +01:00
philipp lang b80b7ea600 Add new invoice for member frontend
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-02-11 20:21:33 +01:00
philipp lang b0e4017780 Add subscriptions to invoice index
continuous-integration/drone/push Build is passing Details
2024-02-10 01:45:41 +01:00
philipp lang 1c93a977bf Add route for new invoice 2024-02-10 01:42:51 +01:00
philipp lang b738dd8192 Lint
continuous-integration/drone/push Build is passing Details
2024-02-10 01:17:24 +01:00
philipp lang 82c3ed2875 Lint
continuous-integration/drone/push Build is failing Details
2024-02-10 00:41:06 +01:00
philipp lang fe578beb9b Add mobile search modal
continuous-integration/drone/push Build is passing Details
2024-01-29 20:43:10 +01:00
philipp lang 0f8cef6490 lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-01-29 02:12:54 +01:00
philipp lang dde4336cb3 Add global search
continuous-integration/drone/push Build is failing Details
2024-01-29 01:37:28 +01:00
philipp lang 9985ed9e44 Add membership filter
continuous-integration/drone/push Build is failing Details
2024-01-29 00:13:03 +01:00
philipp lang cc8428e6b8 Add memory limit to base container 2024-01-28 21:53:54 +01:00
philipp lang 631725c0f9 Redirect meilisearch to container
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-01-28 19:14:12 +01:00
philipp lang f5d1313858 Fix meilisearch config
continuous-integration/drone/push Build is passing Details
2024-01-28 19:10:31 +01:00
philipp lang 3e6b81aab0 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2024-01-28 18:38:20 +01:00
philipp lang 52b7e39d4c Lint
continuous-integration/drone/push Build is failing Details
2024-01-28 18:28:09 +01:00
philipp lang d14a373a76 ignore docker files
continuous-integration/drone/push Build is failing Details
2024-01-28 18:12:40 +01:00
philipp lang b5f87f2368 Add jpeg support to base container 2024-01-28 18:12:17 +01:00
philipp lang 6fd0ba50b9 Fix drone
continuous-integration/drone/push Build is failing Details
2024-01-28 11:43:43 +01:00
philipp lang 4e378c8a57 Add member search via meilisearch 2024-01-28 11:43:43 +01:00
philipp lang 26d0f49568 Lint 2024-01-28 11:43:42 +01:00
philipp lang 994700e34a Ignore psych dir
continuous-integration/drone/push Build is passing Details
2024-01-28 00:03:39 +01:00
philipp lang ff4ad5daa3 Mod IndexTest
continuous-integration/drone/push Build is passing Details
2024-01-26 15:33:12 +01:00
philipp lang 998eb8931b Lint
continuous-integration/drone/push Build is failing Details
2024-01-26 15:06:16 +01:00
philipp lang e7ef0a38c8 Fix popup height and overflow
continuous-integration/drone/push Build is failing Details
2024-01-26 15:04:22 +01:00
philipp lang 5b0bb1c81c sleep before test
continuous-integration/drone/push Build is failing Details
2024-01-26 14:52:51 +01:00
philipp lang 18d57b1f4b Mod tests 2024-01-26 14:52:33 +01:00
philipp lang 9788ce8fe6 Fix tests
continuous-integration/drone/push Build is failing Details
2024-01-26 10:33:53 +01:00
philipp lang e5d03e862d Fix MemberIndexTest
continuous-integration/drone/push Build is failing Details
2024-01-26 10:28:05 +01:00
philipp lang 21b0d08864 Remove search test
continuous-integration/drone/push Build is failing Details
2024-01-26 01:13:36 +01:00
philipp lang 294d0c3cb5 Add meilisearch key to drone
continuous-integration/drone/push Build is failing Details
2024-01-26 00:54:32 +01:00
philipp lang c481359962 Fix drone
continuous-integration/drone/push Build is failing Details
2024-01-26 00:48:19 +01:00
philipp lang 96ef8f2198 Remove SearchTest 2024-01-26 00:47:22 +01:00
philipp lang 515af7724a Remove port from meilisearch container
continuous-integration/drone/push Build is failing Details
2024-01-26 00:41:49 +01:00
philipp lang 83a6421bfc Add meilisearch host 2024-01-26 00:41:38 +01:00
philipp lang 24b8ac182e Fix member index test
continuous-integration/drone/push Build is failing Details
2024-01-26 00:35:00 +01:00
philipp lang 21ea72047c Add meilisearch sync to deploy
continuous-integration/drone/push Build is failing Details
2024-01-26 00:21:27 +01:00
philipp lang baeed70886 Remove meilisearch from testing
continuous-integration/drone/push Build is failing Details
2024-01-26 00:18:46 +01:00
philipp lang 6be4697867 Add drone command for meilisearch
continuous-integration/drone/push Build is failing Details
2024-01-25 23:49:12 +01:00
philipp lang f1797ed049 Add meilisearch env to drone and docker
continuous-integration/drone/push Build encountered an error Details
2024-01-25 23:46:09 +01:00
philipp lang f204f10b21 Add meilisearch
continuous-integration/drone/push Build is failing Details
2024-01-25 23:40:29 +01:00
philipp lang 5e0dd8df62 Fix toast response error 2024-01-25 23:14:12 +01:00
philipp lang c14cff9118 Fix search fulltext reset
continuous-integration/drone/push Build is passing Details
2024-01-25 20:36:48 +01:00
philipp lang 857c397692 Mod volumes
continuous-integration/drone/push Build is passing Details
2024-01-01 22:39:47 +01:00
philipp lang 9e2b5411d8 Mod storage path for webservice container 2024-01-01 21:46:48 +01:00
philipp lang 8c32b881bc fix internal name
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-12-30 23:02:08 +01:00
philipp lang 221815fb7e fix syntax error
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-12-30 22:39:26 +01:00
philipp lang 3469aeef93 Add actions slot and fullwidth to popup
continuous-integration/drone/push Build is failing Details
2023-12-30 22:33:19 +01:00
philipp lang 6b0e0c37a5 Add group internal name and layer 2023-12-30 22:21:08 +01:00
philipp lang d630d8d6b4 Add listener for succeeded event 2023-12-30 19:28:25 +01:00
philipp lang 1dc797948e Lint 2023-12-30 19:02:15 +01:00
philipp lang b896c37c31 Fix tests 2023-12-30 18:46:47 +01:00
philipp lang eb14189bf0 Add group bulkstore backend 2023-12-30 17:52:29 +01:00
philipp lang 6972091ad0 Move group link to memberships 2023-12-30 17:51:08 +01:00
philipp lang 4cc47e64b2 Add popup group
continuous-integration/drone/push Build is passing Details
2023-12-22 00:49:19 +01:00
philipp lang b017d12e2e Fix namespace of MemberPaymentBlockTest
continuous-integration/drone/push Build is passing Details
2023-12-21 23:25:28 +01:00
Philipp Lang 12f6852299 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-12-21 13:38:42 +01:00
Philipp Lang fd75345675 Add texlive-extra-utils 2023-12-21 13:37:56 +01:00
Philipp Lang 225ea8f41d Add Poppler Utils to base container 2023-12-21 00:10:47 +01:00
Philipp Lang ebf856252c Add event for mass store
continuous-integration/drone/push Build is failing Details
2023-12-20 23:38:09 +01:00
Philipp Lang cc650ebf45 Add plugins dir to docker 2023-12-20 23:06:28 +01:00
Philipp Lang 267aaa1776 Only display promised_at when is_age_group
continuous-integration/drone/push Build is failing Details
2023-12-20 22:58:26 +01:00
Philipp Lang 11fe883b5c Remove split payments
continuous-integration/drone/push Build is failing Details
2023-12-20 22:11:07 +01:00
Philipp Lang acf280346f Add migration for invoices 2023-12-20 21:45:37 +01:00
Philipp Lang 3a3b20ed72 Remove Sendpayment form
continuous-integration/drone/push Build is failing Details
2023-12-19 02:45:09 +01:00
Philipp Lang 5d5b08ed78 Remove ports for socketi
continuous-integration/drone/push Build is failing Details
2023-12-19 02:19:18 +01:00
Philipp Lang 3697885bca Fix views 2023-12-19 02:18:58 +01:00
Philipp Lang 2a6fd1152b Remove old payments 2023-12-19 02:00:42 +01:00
Philipp Lang 156b92f765 Add Remember mail for sending 2023-12-18 02:17:31 +01:00
Philipp Lang afbfdf7ca2 Remove mail_name 2023-12-18 01:56:58 +01:00
Philipp Lang be29a284d5 Fix Send invoices 2023-12-18 01:15:16 +01:00
Philipp Lang 68a654494d Add display remember pdf 2023-12-18 00:16:58 +01:00
Philipp Lang f5ad0d46fd Mod Stub 2023-12-18 00:06:04 +01:00
Philipp Lang 8d0d05463f Mod usage in MassStoreAction 2023-12-17 23:29:01 +01:00
Philipp Lang 19dea7a061 Add link to invoice PDF to frontend 2023-12-17 23:27:55 +01:00
Philipp Lang f4dc8b24bc Add usage to invoice 2023-12-17 23:00:52 +01:00
Philipp Lang b0534279b6 Add DisplayPdfAction for invoices 2023-12-17 22:33:29 +01:00
Philipp Lang 551c658fa3 Lint 2023-12-17 21:59:51 +01:00
Philipp Lang 07a0c22a69 Remove old actions 2023-12-17 21:24:16 +01:00
Philipp Lang 2e8c41d5d9 Mod InvoicePosition in member overview 2023-12-17 21:13:52 +01:00
Philipp Lang 703c74a9f4 Lint 2023-12-17 02:03:39 +01:00
Philipp Lang bf8f6c87a8 Fix MemberPaymentsBlock 2023-12-17 01:49:12 +01:00
Philipp Lang 0f80844d20 Lint
continuous-integration/drone/push Build is failing Details
2023-12-17 01:10:26 +01:00
Philipp Lang a7b25e9b5f Fix: Delete invoice positions when deleting member 2023-12-17 01:02:56 +01:00
Philipp Lang 451680bd70 Add remove for invoice 2023-12-17 00:55:31 +01:00
Philipp Lang c598508ceb Add update for invoices 2023-12-17 00:45:03 +01:00
Philipp Lang 0b9eb77e77 Add: Store invoice 2023-12-16 23:53:18 +01:00
Philipp Lang ebeb9bc0b0 Add member meta to InvoiceResource 2023-12-16 23:52:41 +01:00
Philipp Lang 5a87d3e7f6 remove requestCallback from useIndex 2023-12-16 23:52:03 +01:00
Philipp Lang 02cd70e0ca Add innerWidth for Popup component 2023-12-16 22:59:25 +01:00
Philipp Lang 457d433722 Add Mets for InvoiceResource 2023-12-16 22:30:56 +01:00
Philipp Lang e37d98f168 Close popup after sending massstore 2023-12-16 20:35:40 +01:00
Philipp Lang 380c18a70e Add meta for InvoiceIndex 2023-12-16 20:35:28 +01:00
Philipp Lang 5b6380b429 Add deprecated for Status 2023-12-16 20:35:06 +01:00
Philipp Lang ff2d725714 Lint 2023-12-16 20:29:17 +01:00
Philipp Lang b738c5e6ca Add views for invoice index 2023-12-16 13:08:17 +01:00
Philipp Lang a755d63197 Add track jobs to mass store action 2023-12-16 11:44:32 +01:00
Philipp Lang 2ecdf6e362 Lint 2023-12-16 11:36:49 +01:00
Philipp Lang 58798146d4 Add via to invoice 2023-12-16 11:18:00 +01:00
Philipp Lang 27cbf8bcd9 Add InvoiceIndexAction 2023-12-16 01:13:49 +01:00
Philipp Lang 15b62e59fc Mod AllPayment so that it creates an invoice 2023-12-16 00:30:36 +01:00
Philipp Lang 5c40b4e64d Add InvoiceStoreAction
continuous-integration/drone/push Build is failing Details
2023-12-13 00:35:39 +01:00
Philipp Lang ad8511874d Add payment show pdf
continuous-integration/drone/push Build is failing Details
2023-12-10 04:38:11 +01:00
Philipp Lang 566ed704a6 Add payment_data for payments 2023-12-10 04:38:11 +01:00
Philipp Lang fc1b647b54 Lint 2023-12-10 04:38:10 +01:00
Philipp Lang 20836e7228 fix typo
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-11-24 14:46:18 +01:00
Philipp Lang 6e1f3f3a0a Add Stammgruppierung to member view
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-11-24 13:43:52 +01:00
Philipp Lang ebd321d166 fix tabs classes 2023-11-24 13:37:35 +01:00
Philipp Lang 69794b900f fix typo 2023-11-24 13:33:46 +01:00
Philipp Lang a1790e7126 Add Recertification field for members
continuous-integration/drone/push Build is passing Details
2023-11-24 13:31:34 +01:00
Philipp Lang 1e836b2a28 Fix bill table
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2023-11-16 12:10:07 +01:00
Philipp Lang f01c4f9d02 Lint 2023-11-16 12:07:07 +01:00
Philipp Lang 613096220f Add module management 2023-11-16 10:53:17 +01:00
Philipp Lang fc368bcd1a improve search performance in contribution member search
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-31 11:01:22 +01:00
Philipp Lang 972b1845ed ignore debugbar dir 2023-10-31 10:39:07 +01:00
Philipp Lang 7121e57cbb Improve search performance
continuous-integration/drone/push Build is passing Details
2023-10-31 10:38:32 +01:00
Philipp Lang a2b0de44b9 Update mariadb in drone 2023-10-31 09:26:48 +01:00
philipp lang e3d581626c Add NaMi Settings to change NaMi Login
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-31 00:11:32 +01:00
philipp lang fafac446c3 fix debounce
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-30 23:46:41 +01:00
philipp lang 56a5ec5885 Fix tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-30 23:11:10 +01:00
philipp lang a104adeb5a Fix: Add keypress event for FSelect 2023-10-30 23:09:47 +01:00
philipp lang 41d6a71d2f Fix rawurldecode
continuous-integration/drone/push Build is failing Details
2023-10-30 22:58:25 +01:00
philipp lang 97668add7e Fix: Allow umlauts in Contribution generator
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-27 00:48:50 +02:00
philipp lang 50d98c0335 Fix: Set From long name in City solingen document
continuous-integration/drone/push Build is passing Details
2023-10-27 00:15:02 +02:00
Philipp Lang bda8b9c293 fix tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-18 18:38:26 +02:00
Philipp Lang 7b6616c292 set memory limit for php container
continuous-integration/drone/push Build is failing Details
2023-10-18 18:30:18 +02:00
Philipp Lang 026e7674dd Lint
continuous-integration/drone/push Build is failing Details
2023-10-18 18:14:07 +02:00
Philipp Lang 3dc9513923 fix drone
continuous-integration/drone/push Build is failing Details
2023-10-18 18:07:56 +02:00
Philipp Lang 5207374e8b fix server
continuous-integration/drone/push Build is failing Details
2023-10-18 18:06:02 +02:00
Philipp Lang 8e733d899e mod drone
continuous-integration/drone/push Build was killed Details
2023-10-18 18:00:52 +02:00
Philipp Lang 89bcaf12c4 fix mysql ping
continuous-integration/drone/push Build was killed Details
2023-10-18 17:58:50 +02:00
Philipp Lang b83f30e35c fix mariadb in drone
continuous-integration/drone/push Build was killed Details
2023-10-18 17:50:18 +02:00
Philipp Lang e345ace428 use docker container for copydb
continuous-integration/drone/push Build encountered an error Details
2023-10-18 16:52:30 +02:00
Philipp Lang 9a898315a0 fix deleting actions 2023-10-18 16:52:30 +02:00
Philipp Lang a84d9f428d fix course destroy 2023-10-18 16:52:30 +02:00
Philipp Lang 36c0ebced0 Update course actions 2023-10-18 16:52:30 +02:00
Philipp Lang 6d4dda869a Add DestroyAction for payment 2023-10-18 16:52:30 +02:00
Philipp Lang 9813482741 Add update for payment 2023-10-18 16:52:30 +02:00
Philipp Lang 1e74a6055e Add Payment store 2023-10-18 16:52:30 +02:00
Philipp Lang c764f3d3b7 Add payment index 2023-10-18 16:52:30 +02:00
Philipp Lang 8846adef5b Fix tests 2023-10-18 16:52:30 +02:00
Philipp Lang 20833426ca Add queue events for memberships 2023-10-18 16:52:30 +02:00
Philipp Lang e60bc94b80 Add TracksJob to membership store action 2023-10-18 16:52:30 +02:00
Philipp Lang 356a69507e Mod: Set get method for membership 2023-10-18 16:52:30 +02:00
Philipp Lang 1fb2dd19e7 Rename Group actions 2023-10-18 16:52:30 +02:00
Philipp Lang 767239fb62 Fixed tests 2023-10-18 16:52:30 +02:00
Philipp Lang 2fbad36700 Remove MembershipController 2023-10-18 16:52:30 +02:00
Philipp Lang 37a6dd8330 Add sidebar for payments 2023-10-18 16:52:30 +02:00
Philipp Lang bfc4663ba4 Add loading for memberships sidebar 2023-10-18 16:52:30 +02:00
Philipp Lang 450e715acd Lint 2023-10-18 16:52:30 +02:00
Philipp Lang 128d9af3ee Lint 2023-10-18 16:52:30 +02:00
philipp lang a26f064698 Fix: Do not store maildispatcher members with same email address multiple times
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-11 23:13:59 +02:00
Philipp Lang ff245397d5 Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-19 20:14:52 +02:00
Philipp Lang e4ff680e4f fixed PluginTest
continuous-integration/drone/push Build is passing Details
2023-09-19 20:06:41 +02:00
Philipp Lang 3420a03fbc Cleanup after PluginsTest
continuous-integration/drone/push Build was killed Details
2023-09-19 19:57:40 +02:00
Philipp Lang 6780068ca1 fix mkdir
continuous-integration/drone/push Build was killed Details
2023-09-19 19:56:19 +02:00
Philipp Lang be0a8a3ddb Add Plugin manager
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build was killed Details
2023-09-19 00:13:36 +02:00
Philipp Lang 3d154c4154 Add api for fetching memberships
continuous-integration/drone/push Build is passing Details
2023-09-12 16:54:13 +02:00
Philipp Lang 85f0d6c515 Update README
continuous-integration/drone/push Build is passing Details
2023-09-12 12:19:10 +02:00
philipp lang 17eaa2e564 Add Password Reset
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-08 00:29:37 +02:00
philipp lang 6f4ee0b02d Lint 2023-09-07 22:52:33 +02:00
Philipp Lang dc832503b4 Fixed: subscription_id validation
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-07 16:48:51 +02:00
Philipp Lang 3a96b00307 Fixed: Add default model for members 2023-09-07 16:33:40 +02:00
Philipp Lang c89973032b Fix: Close mobile menu when navigating
continuous-integration/drone/push Build is passing Details
2023-09-07 16:06:17 +02:00
Philipp Lang 20c9b84e6e Lint
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-07 14:40:46 +02:00
Philipp Lang c554e506ea Update README 2023-09-07 14:40:44 +02:00
Philipp Lang 80dfebf63b Add Host-ENV for nginx webservice 2023-09-07 14:40:31 +02:00
Philipp Lang 6c9c27d6ab Add volume to redis container 2023-09-07 14:38:21 +02:00
Philipp Lang 554e1af245 Add BDKJ-Hesse to contribution generator
continuous-integration/drone/push Build is failing Details
2023-09-07 13:12:57 +02:00
Philipp Lang 349d821638 Add Frankfurt/Main to contribution generator 2023-09-07 13:12:57 +02:00
Philipp Lang ff6c0e462e Fix tests
continuous-integration/drone/push Build is passing Details
2023-09-07 13:12:47 +02:00
Philipp Lang 639d1850c7 Rename contribution documents
continuous-integration/drone/push Build is failing Details
2023-09-07 12:04:13 +02:00
philipp lang 38bd73cf5b Fix tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-07 00:28:53 +02:00
philipp lang f1ad653ba8 Fixed tests
continuous-integration/drone/push Build is failing Details
2023-09-07 00:22:44 +02:00
philipp lang 560881725d Upgrade ui-bool
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2023-09-06 23:45:45 +02:00
philipp lang 71da52791d Fixed date in member ShowTest
continuous-integration/drone/push Build is passing Details
2023-09-06 23:45:13 +02:00
philipp lang 946a6c93b2 Fixed tests 2023-09-06 23:45:03 +02:00
Philipp Lang b28525be7c Update .gitignore and change cookies volumes
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build was killed Details
2023-09-05 16:42:39 +02:00
Philipp Lang 0de90be8c3 Add membership status to member view
continuous-integration/drone/push Build is failing Details
2023-09-05 16:29:22 +02:00
Arwed Molitor 59c2c527fb Change tag order
continuous-integration/drone/push Build is passing Details
2023-08-30 15:08:45 +02:00
Arwed Molitor a009fabb15 Minor typo fixes 2023-08-30 15:08:45 +02:00
Arwed Molitor 5e416e5ed7 Enhance pagination 2023-08-30 15:08:44 +02:00
philipp lang cd22d41f28 Fix deploy
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-08-25 01:12:44 +02:00
philipp lang 1bdcc55d2a Fix useIndex
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2023-08-25 00:26:21 +02:00
philipp lang 2e9ab78203 Add Membership management
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build was killed Details
2023-08-25 00:23:38 +02:00
Philipp Lang a134be5f5b Add memory_limit for schedule
continuous-integration/drone/push Build is passing Details
2023-08-21 14:15:29 +02:00
philipp lang 8d54c5b47c Add dpsg köln to envoy
continuous-integration/drone/push Build is passing Details
2023-08-20 23:39:57 +02:00
philipp lang 391de0edde Add mobile version for member filter
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-20 23:37:11 +02:00
philipp lang 232917a8e6 Add composable dir to tailwind content 2023-08-20 23:36:38 +02:00
philipp lang 74b162cc23 Lint 2023-08-20 23:36:26 +02:00
philipp lang 37107915a1 Eslint: ignore multi word component rule 2023-08-20 23:35:57 +02:00
philipp lang 1ef4689d15 Fix: Load member list in mobile view 2023-08-20 22:47:17 +02:00
philipp lang ac2428caac Fix: memory_limit for drone tests
continuous-integration/drone/push Build is passing Details
2023-08-20 22:33:15 +02:00
Philipp Lang c260fcb4e4 Add trait for Queue event handling
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is failing Details
2023-08-17 12:46:48 +02:00
philipp lang 687ec80069 update github push
continuous-integration/drone/push Build is passing Details
2023-08-16 01:27:07 +02:00
philipp lang 74c5faaebd Add exception for deleting member
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-16 01:07:48 +02:00
philipp lang aeb926e165 Add Broadcast event when deleting member
continuous-integration/drone/push Build is passing Details
2023-08-16 00:43:28 +02:00
philipp lang 3263e93da7 Move member deletion to action 2023-08-15 23:03:51 +02:00
philipp lang 0ae11f753f Move nami delete member action 2023-08-15 23:00:01 +02:00
Philipp Lang 6dffb8d4ff Add base image
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-15 16:42:15 +02:00
Philipp Lang e8e309fccd mod default pusher host
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-15 16:28:10 +02:00
Philipp Lang a858fd40a7 Add DatabaseTransactions
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-15 15:24:03 +02:00
Philipp Lang 925754bd26 Add check for geolocation
continuous-integration/drone/push Build is failing Details
2023-08-15 15:11:12 +02:00
Philipp Lang 0e023a06ec Add wss port
continuous-integration/drone/push Build is passing Details
2023-08-15 15:07:55 +02:00
philipp lang 716c6079fe Lint
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-08-15 00:17:17 +02:00
philipp lang 658414c979 Add ClientMessage to payment controller
continuous-integration/drone/tag Build was killed Details
continuous-integration/drone/push Build is failing Details
2023-08-15 00:05:45 +02:00
philipp lang 4738c077d1 Fixed tests
continuous-integration/drone/push Build is failing Details
2023-08-15 00:01:12 +02:00
philipp lang f178d3ec86 Update client index when Member deleted 2023-08-14 23:57:15 +02:00
philipp lang 7e4961f3d8 Update DeleteJob as Action 2023-08-14 23:48:38 +02:00
philipp lang 2d9f79ee15 Update composer packages 2023-08-14 23:48:11 +02:00
Philipp Lang 6f133954ff Lint 2023-08-10 16:33:36 +02:00
Philipp Lang 59117682d0 Lint 2023-08-10 16:33:36 +02:00
philipp lang 1ac30202b1 Add composable for index 2023-08-10 16:33:36 +02:00
Philipp Lang 69afeeda65 Add eslint prettier 2023-08-10 16:33:36 +02:00
Philipp Lang eb5f03bd5a update envoy file
continuous-integration/drone/push Build is passing Details
2023-08-10 16:27:01 +02:00
Philipp Lang 215d08aeeb Add setting for seeder
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-07 21:32:56 +02:00
philipp lang 0c45e1b2f4 ignore log file
continuous-integration/drone/push Build is passing Details
2023-08-07 20:14:32 +02:00
philipp lang ae2eed10af add workers to example env
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-08-07 19:57:43 +02:00
philipp lang 0f88427dd5 Add config for horizon workers
continuous-integration/drone/push Build is passing Details
2023-08-07 19:53:48 +02:00
philipp lang 5e259e9455 Lint 2023-08-07 19:52:42 +02:00
Philipp Lang 891e4deac1 Add ResyncAction for Maildispatcher when updating memberships
continuous-integration/drone/push Build is passing Details
2023-07-30 11:09:03 +02:00
Philipp Lang 65aeb4aeaf Add websocket
continuous-integration/drone/push Build is passing Details
2023-07-25 17:23:48 +02:00
Philipp Lang 1141ad1cbf Fix deploy key
continuous-integration/drone/tag Build is passing Details
2023-07-25 15:35:20 +02:00
Philipp Lang 1eb1aa61e9 fix install
continuous-integration/drone/tag Build was killed Details
2023-07-25 13:28:36 +02:00
Philipp Lang 91270ea289 fix: install openssh
continuous-integration/drone/tag Build is failing Details
2023-07-25 12:59:32 +02:00
Philipp Lang 242bf146c0 Add gitea release 2023-07-25 12:30:28 +02:00
Philipp Lang 3dcab9d719 Fix Deployments
continuous-integration/drone/tag Build is failing Details
2023-07-25 12:27:34 +02:00
Philipp Lang 4d97c6ff8a Add deployments 2023-07-25 12:21:41 +02:00
Philipp Lang 9d3abb4b23 Add carddav and caldav redirect 2023-07-25 12:20:58 +02:00
Philipp Lang 0c5a3cd27d Fix: Set TrustProxies
continuous-integration/drone/tag Build is passing Details
2023-07-25 12:03:31 +02:00
Philipp Lang 1583e77756 Add schedule container
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-07-24 18:19:32 +02:00
Philipp Lang 21ce8874f9 Fixed tests
continuous-integration/drone/push Build is passing Details
2023-07-24 17:50:05 +02:00
Philipp Lang 5bd99b47b6 Merge entrypoints 2023-07-24 17:34:38 +02:00
philipp lang f11226b0a1 Dont require birthday field
continuous-integration/drone/push Build is failing Details
2023-07-24 16:55:07 +02:00
Philipp Lang 826cc43b92 set shell for horizon
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-07-21 11:50:40 +02:00
Philipp Lang f8d6cf6a92 Add volumes with correct permissions
continuous-integration/drone/tag Build is passing Details
2023-07-21 11:28:45 +02:00
Philipp Lang 62d6730071 Add nginx dockerfile 2023-07-20 23:45:06 +02:00
Philipp Lang 4672f96a5f Add volumes
continuous-integration/drone/tag Build is passing Details
2023-07-20 23:19:59 +02:00
Philipp Lang 9e39842183 ignore cookies for docker image 2023-07-20 23:04:04 +02:00
Philipp Lang ddebe7cc3c Update install
continuous-integration/drone/tag Build is passing Details
2023-07-20 22:58:51 +02:00
Philipp Lang b383a7a515 update dockerignore
continuous-integration/drone/tag Build is passing Details
2023-07-20 20:56:20 +02:00
Philipp Lang 36ea571464 ignore bootstrap cache
continuous-integration/drone/tag Build is failing Details
2023-07-20 20:34:43 +02:00
Philipp Lang 81b21f5d7f Fetch remove images
continuous-integration/drone/tag Build is passing Details
2023-07-20 20:28:19 +02:00
Philipp Lang 437125b573 remove chown in nginx build
continuous-integration/drone/tag Build is passing Details
2023-07-20 18:27:49 +02:00
Philipp Lang c0431a6857 Fix nginx build
continuous-integration/drone/tag Build is failing Details
2023-07-20 17:52:48 +02:00
Philipp Lang 3bd087f729 fix build
continuous-integration/drone/tag Build is failing Details
2023-07-20 16:57:30 +02:00
Philipp Lang 1d808f0e10 copy nginx file
continuous-integration/drone/tag Build is failing Details
2023-07-20 16:29:20 +02:00
Philipp Lang 1b2df8a59a add docker push for drone
continuous-integration/drone/tag Build was killed Details
2023-07-20 16:08:34 +02:00
philipp lang ad8200d6d5 remove local fonts
continuous-integration/drone/push Build was killed Details
2023-07-19 12:57:58 +02:00
philipp lang 0002249480 ignore public vendor dir
continuous-integration/drone/push Build was killed Details
2023-07-19 12:25:36 +02:00
philipp lang 31f9ab6297 fix font installer 2023-07-19 12:25:25 +02:00
philipp lang df7f56189d Add baskervaldx font
continuous-integration/drone/push Build was killed Details
2023-07-19 11:56:35 +02:00
philipp lang b25102cb65 dont log drone compile output 2023-07-19 11:55:49 +02:00
philipp lang 31f5faf93a update pipeline
continuous-integration/drone/push Build was killed Details
2023-07-19 11:01:12 +02:00
philipp lang 7d142aa864 fix errors 2023-07-19 11:00:57 +02:00
philipp lang 6734fdf3ca ignore public/build dir 2023-07-19 10:52:52 +02:00
philipp lang debe9969ae fixed tests
continuous-integration/drone/push Build is failing Details
2023-07-19 10:44:17 +02:00
philipp lang 07ca1d7903 Fix mailman type test 2023-07-19 10:38:22 +02:00
Philipp Lang 387b0e7ec4 Update docker fonts
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2023-07-18 14:18:44 +02:00
Philipp Lang 907a6ee04a Fix euro sign in invoices 2023-07-18 11:26:25 +02:00
Philipp Lang 2784651533 Update silvaletter 2023-07-18 11:24:52 +02:00
Philipp Lang 22b5d35567 Fix: Copy fonts to docker container 2023-07-18 10:02:08 +02:00
Philipp Lang cd35477253 Add texlive packages to docker
continuous-integration/drone/push Build is failing Details
2023-07-17 23:34:52 +02:00
Philipp Lang a4fd41dc98 ignore data dir in docker 2023-07-17 23:34:02 +02:00
philipp lang 07839767c4 remove mailing list
continuous-integration/drone/push Build is failing Details
2023-07-17 17:08:07 +02:00
philipp lang 9e00eed6c1 Add Create service for Mailman dispatcher type
continuous-integration/drone/push Build is failing Details
2023-07-17 16:50:05 +02:00
philipp lang 3d7e49965a Add maildispatcher test
continuous-integration/drone/push Build is passing Details
2023-07-17 11:50:26 +02:00
philipp lang 42fb61bf70 Hide edit button of subactivity when creating activity
continuous-integration/drone/push Build is passing Details
2023-07-15 17:43:15 +02:00
philipp lang 579f35beb9 Fix member deletion button
continuous-integration/drone/push Build is passing Details
2023-07-15 17:37:07 +02:00
philipp lang aa9b782897 Mark joined_at field as required 2023-07-15 17:30:58 +02:00
philipp lang 8ba433c6b8 update page components 2023-07-15 17:28:19 +02:00
philipp lang 7bffa6c5ae Add: Exclude members
continuous-integration/drone/push Build is passing Details
2023-07-10 11:36:58 +02:00
philipp lang 139c7623ab Simplify mail sync 2023-07-10 11:28:47 +02:00
philipp lang 1038f26171 Lint 2023-07-10 11:13:18 +02:00
philipp lang 59920bac1d Fix local maildispatcher casing
continuous-integration/drone/push Build is passing Details
2023-07-10 10:31:56 +02:00
Philipp Lang 71e6b0216f Lint
continuous-integration/drone/push Build is passing Details
2023-07-06 16:53:33 +02:00
Philipp Lang 7877f57a22 Remove deleted members on pull
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2023-07-06 14:29:35 +02:00
Philipp Lang bf33a91e7e Update to vue 3
Squashed commit of the following:

commit a91f51113b9680a0dd343aa8ab9b7bfaf6e8833b
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Thu Jul 6 13:55:42 2023 +0200

    change toast position

commit d99771122067d125404181580374e4497fa356b4
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 18:26:15 2023 +0200

    Add tooltips

commit c65efb92592a46b63d738a39c2205787bf8fc37a
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 18:01:20 2023 +0200

    Add prettier

commit fc0ecd6a6b93d867a498960d3c7613b087b3147e
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 17:57:56 2023 +0200

    Fix toolbar button tooltip

commit 4c2b2463ff9ab90a0f96a0909d5773c845962b38
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 17:39:38 2023 +0200

    Fixed maildispatcher index button

commit 33e46bb38880d16d236f6e4673d0a2efd58a3bff
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 17:37:40 2023 +0200

    Fix mailgateway form

commit ffb0a0ba120c447f162ea592cf87ec6ad51b4391
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 17:34:30 2023 +0200

    Fix filter for Maildispatcher

commit 64548178c0d65c5b69eee59cdafcf38d0d053a21
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 17:13:11 2023 +0200

    Add back button to initialize

commit 401d138e647e049058ee2821af7ee9e30d7786ec
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:42:21 2023 +0200

    Fix settings success message

commit 1e09006f5b73696e1fc0272dcb3112ea84392d2d
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:38:00 2023 +0200

    Fix save button in Settings

commit ad21a2a3bf28a61472c469fe64a704737bc54d69
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:32:11 2023 +0200

    Fix event name

commit cb7df3f5acc774b864a688a9e61cba9ac481fa7c
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:29:58 2023 +0200

    Fix event name

commit 46c52237de412397f88f4948a5617fb42fe7d142
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:27:17 2023 +0200

    Fixed hasFlash messages

commit 37b9e724cde5af7458be9847550334e62345e15b
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:27:00 2023 +0200

    Fix pagination reload event

commit a9be327a59680ff11d5f76356f64523fa06fd300
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:26:37 2023 +0200

    Remove console log

commit 39119c5be593074018cac883af45104f87a7640a
Author: philipp lang <philipp@aweos.de>
Date:   Sun Jul 2 00:04:52 2023 +0200

    Fix notification component in InstallLayout

commit a867053cd1283ce5fed0139e2ab66de804d7657a
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 03:08:20 2023 +0200

    Remove console log

commit 637338ad3456232892966e2d43fd3587e739f10e
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 03:07:23 2023 +0200

    Fix: import toasted

commit d190f814a23584f2f1de500e49e3b137eb8f4cfc
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 03:07:05 2023 +0200

    Update hasFlash toast

commit 6cd96ef5eafbbb3db8c0d21869bf3c91557d758c
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 03:06:38 2023 +0200

    Add toast notification on axios error

commit 1ba3d221e7e5fa2fd19d3d316de45c3daa6bedf8
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 01:34:40 2023 +0200

    Fix save button in activity VForm

commit 8089f8f0834a6dc64b959f2574e9fddcaa2724a8
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 01:32:03 2023 +0200

    Lint

commit cba4f25d317eba277baf527e61d4a810bbe03107
Author: philipp lang <philipp@aweos.de>
Date:   Sat Jul 1 01:31:15 2023 +0200

    Fix import for subactivity form

commit 83bbf9c4c44aea7ff33869e8ae27b86dba59985f
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 15:44:33 2023 +0200

    Drop leaflet map

commit f8d1fe08fa146ae8c637873add8901a2f6e5b0b2
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 15:29:51 2023 +0200

    fix toolbar

commit 44c48ec02b0a27e6296d5107fb53c99ad846aeb3
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 14:28:49 2023 +0200

    install new inertia middleware

commit b9b9cde58918d40e530afa8786e54a0f9eba2b73
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 13:49:33 2023 +0200

    Update save button

commit 8c1e9b143a2349bf33e934a21a039c8966d8e143
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 13:40:06 2023 +0200

    fix select

commit 46b6418f84e9bfc4ec5ce1ab9e6b02669fe7227d
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 13:09:08 2023 +0200

    update select

commit ea274669fded1fb905c89cd20b62f672b8f7b57a
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 13:07:22 2023 +0200

    fix switch

commit 048f9f1324c5c54f13d45f0a819855bb8274df6f
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Fri Jun 30 12:15:38 2023 +0200

    fix components

commit e4700e06aaa912d519d0313e2f2e76288e12dd9b
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Thu Jun 22 16:34:44 2023 +0200

    vue3 update

commit 2b196f2bd285e843ca86cd624f0dadbefe759786
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Thu Jun 22 13:08:55 2023 +0200

    Add page title

commit 30dfc5dca25b95ff5f25b976ae66c1ff350b0ebe
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Thu Jun 22 12:59:47 2023 +0200

    Fix map

commit 43f7d335f32691f1b02dcbbd4d01943dd4b7c752
Author: Philipp Lang <privat@zoomyboy.de>
Date:   Thu Jun 22 12:58:33 2023 +0200

    Update inertia
2023-07-06 13:56:19 +02:00
Philipp Lang 0b406e11f0 Lint
continuous-integration/drone/push Build is passing Details
2023-06-29 13:35:00 +02:00
Philipp Lang 9b2364bc34 Fix: Scope should have its own where clause
continuous-integration/drone/push Build is failing Details
2023-06-29 12:58:05 +02:00
Philipp Lang e37219b1ca Fix migration rollback 2023-06-29 12:57:06 +02:00
Philipp Lang 6fd16a7dfe fix queue name
continuous-integration/drone/push Build is passing Details
2023-06-15 15:40:58 +02:00
Philipp Lang 277259320a Fixed: Age group membership should be active
continuous-integration/drone/push Build is failing Details
2023-06-15 15:22:47 +02:00
Philipp Lang 45a1e165fa Add deploy for dpsgbergischland 2023-06-15 15:19:54 +02:00
philipp lang d38989f302 Lint
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-06-15 00:33:13 +02:00
philipp lang a434388bcb Fixed tests 2023-06-15 00:12:20 +02:00
philipp lang 48d9d9cc92 Fix: Delete local addresses when deleting maildispatcher 2023-06-15 00:08:01 +02:00
philipp lang c2016af587 Store maildispatcher 2023-06-14 23:20:37 +02:00
philipp lang 4057f9fc8d Fix Uuids for select 2023-06-14 23:20:13 +02:00
philipp lang 89f5489e86 Fix height of MultipleSelect 2023-06-14 23:19:46 +02:00
philipp lang 7497593bb2 Add ValidationAttributes for Maildispatcher 2023-06-14 23:19:19 +02:00
Philipp Lang 0080a54aaf Add mailgateway form
continuous-integration/drone/push Build is failing Details
2023-06-14 17:29:22 +02:00
Philipp Lang d41aa466b1 Add member filter 2023-06-14 17:12:03 +02:00
Philipp Lang 188429af55 Add Search action for contribution search 2023-06-14 17:12:03 +02:00
Philipp Lang 2cb04ee142 Add max height for multiple select window 2023-06-14 17:12:03 +02:00
philipp lang b87b37a673 Add create action for maildispatcher 2023-06-14 17:12:03 +02:00
philipp lang 8f3cc95300 Fixed mailman test 2023-06-14 17:12:03 +02:00
Philipp Lang 904ec829c1 Add member management for mailman 2023-06-14 17:12:03 +02:00
Philipp Lang a74d0936a2 --wip-- [skip ci] 2023-06-14 17:12:03 +02:00
philipp lang da3197395f Fixed: Match setting path when URL contains query string 2023-06-14 17:12:03 +02:00
philipp lang 20973b3664 Fixed: Add listeners for button 2023-06-14 17:12:03 +02:00
philipp lang b54472c14e Update mailgateway 2023-06-14 17:12:03 +02:00
philipp lang 8b2bdae5d6 Add update for mailgateway 2023-06-14 17:12:03 +02:00
philipp lang ab43d42869 Fixed tests 2023-06-14 17:12:03 +02:00
philipp lang 79f818c0f9 Fix index 2023-06-14 17:12:03 +02:00
philipp lang 4a452ef1fe Add type validation 2023-06-14 17:12:03 +02:00
philipp lang 36dcff9738 Simplify tests 2023-06-14 17:12:03 +02:00
philipp lang a880333f35 Add store button 2023-06-14 17:12:03 +02:00
philipp lang 68ecce179e Add params as type 2023-06-14 17:12:03 +02:00
philipp lang 06d512e8ae rename route 2023-06-14 17:12:03 +02:00
philipp lang 9442714086 Add indexTest for mailgateway 2023-06-14 17:12:03 +02:00
philipp lang c653a4b0c1 Add test for mailman type 2023-06-14 17:12:02 +02:00
Philipp Lang 0dcb3b7d5b Add mailman check 2023-06-14 17:12:02 +02:00
Philipp Lang a15b54f98d Add mailman type with params 2023-06-14 17:12:02 +02:00
Philipp Lang f75201dfaa Add: Store new mailgateway 2023-06-14 17:12:02 +02:00
Philipp Lang 27c61ff8af Add index for mail gateways 2023-06-14 17:12:02 +02:00
Philipp Lang d2a000cb31 Ad Contract for settings 2023-06-14 17:12:02 +02:00
Philipp Lang 62fb792e65 Lint
continuous-integration/drone/push Build is passing Details
2023-06-14 17:11:42 +02:00
Philipp Lang b2a7d2a760 Add multiple select for members
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2023-06-14 16:20:18 +02:00
Philipp Lang 9e1fe63c33 Fix svg sprite
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-06-01 11:31:12 +02:00
Philipp Lang 1d8b5b4670 Mod gitignore 2023-06-01 11:07:48 +02:00
Philipp Lang 526f2d3a6c add vite config 2023-06-01 11:05:24 +02:00
Philipp Lang fbb501519a add vite script 2023-06-01 11:05:13 +02:00
Philipp Lang 3485832262 fix component names 2023-06-01 11:05:03 +02:00
Philipp Lang 4bece4a761 Remove tailwind component layer 2023-06-01 11:03:59 +02:00
Philipp Lang b2b53c558e Lint 2023-06-01 11:03:53 +02:00
Philipp Lang 2e5385b565 Add vite package 2023-06-01 11:03:14 +02:00
Philipp Lang 754e3a0a82 ignore build folder 2023-06-01 11:02:55 +02:00
philipp lang 4e27dbfe67 Move other components
continuous-integration/drone/push Build is failing Details
2023-05-20 02:48:08 +02:00
philipp lang c68f1e00c4 Move boolean display 2023-05-20 02:44:41 +02:00
philipp lang d78740d508 Add new slot scope syntax 2023-05-20 02:38:38 +02:00
philipp lang 641f3a1098 Lint 2023-05-20 01:59:20 +02:00
philipp lang dbbe6f6171 Remove links 2023-05-20 01:46:59 +02:00
philipp lang e26b572575 Move page header component 2023-05-20 01:45:43 +02:00
philipp lang a526683082 Add tooltip slot to sidebar header 2023-05-20 01:12:53 +02:00
philipp lang 07d309f606 Update Tailwindcss 2023-05-20 00:57:57 +02:00
philipp lang 234380120e Load page components synchronously 2023-05-20 00:57:05 +02:00
Philipp Lang 72375affee Move components
continuous-integration/drone/push Build is passing Details
2023-05-19 01:07:34 +02:00
Philipp Lang d01322b1ad Move component subfolders 2023-05-18 23:22:45 +02:00
Philipp Lang f30eec0e80 update README
continuous-integration/drone/push Build is passing Details
2023-05-18 09:19:48 +02:00
philipp lang f1c55bedce Add options for search layers
continuous-integration/drone/push Build is passing Details
2023-05-18 01:13:28 +02:00
philipp lang 50dc714f18 Add doc for installation
continuous-integration/drone/push Build is passing Details
2023-05-17 02:32:40 +02:00
Philipp Lang b120e5a039 add build.sh 2023-05-17 00:30:39 +02:00
Philipp Lang 0a64f8ef0c add doc 2023-05-17 00:30:39 +02:00
philipp lang 978cc48385 Add api for contribution documents
continuous-integration/drone/push Build is passing Details
2023-05-17 00:22:43 +02:00
philipp lang 668555aff5 Add CheckClientCredentials route middleware 2023-05-16 23:21:55 +02:00
philipp lang 2bc576d3f6 Add passport package 2023-05-16 23:21:53 +02:00
Philipp Lang f150abd1ca Remove osm from phpstan
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-05-16 18:26:55 +02:00
Philipp Lang 03d514d107 Add geolocation for member map
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2023-05-16 17:19:56 +02:00
Philipp Lang 29b9959f09 Mod efz backgrounds
continuous-integration/drone/push Build is passing Details
2023-05-15 21:11:21 +02:00
Philipp Lang 07852aa72b Remove initializeAction from kernel
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-05-15 20:09:14 +02:00
Philipp Lang 09182821f8 Remove check when initializing 2023-05-15 19:59:28 +02:00
Philipp Lang 708b0cf386 Mod docker compose
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-05-15 19:48:37 +02:00
Philipp Lang 7ff735acac Add email column to csv
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-05-15 15:12:12 +02:00
Philipp Lang ef0672334c Fixed member form date fields
continuous-integration/drone/push Build is passing Details
2023-05-09 09:46:04 +02:00
Philipp Lang b21a89362b Add popup for deleting member
continuous-integration/drone/push Build is passing Details
2023-05-09 01:34:19 +02:00
Philipp Lang 646d92aaa6 Fix documentTest
continuous-integration/drone/push Build is passing Details
2023-05-08 23:10:08 +02:00
Philipp Lang 995c66cd8e update README
continuous-integration/drone/push Build is passing Details
2023-05-08 22:36:12 +02:00
Philipp Lang 042e5e6c0a update README
continuous-integration/drone/push Build is passing Details
2023-05-08 22:32:45 +02:00
Philipp Lang e9ee17236b update drone
continuous-integration/drone/push Build is passing Details
2023-05-08 21:24:23 +02:00
Philipp Lang 5c67a45537 update drone
continuous-integration/drone/push Build is passing Details
2023-05-08 20:59:46 +02:00
Philipp Lang 46f995711f update drone
continuous-integration/drone/push Build is failing Details
2023-05-08 20:05:51 +02:00
Philipp Lang aaee41863a update drone
continuous-integration/drone/push Build is failing Details
2023-05-08 17:11:45 +02:00
Philipp Lang 5b81c205f3 update gitmodules
continuous-integration/drone/push Build is failing Details
2023-05-08 16:09:40 +02:00
Philipp Lang a34d5ad305 mod gitmodules
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-05-08 15:56:16 +02:00
Philipp Lang 3cc35348ff Add search params for input
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is failing Details
2023-05-08 15:11:16 +02:00
Philipp Lang 48b1808497 Add test for login check 2023-05-07 21:17:28 +02:00
Philipp Lang ab53a80c4d Add search api 2023-05-07 21:15:17 +02:00
Philipp Lang f690246a7e Add action for login check 2023-05-05 13:22:38 +02:00
Philipp Lang 39a269d10a fixed tests 2023-05-05 12:28:22 +02:00
Philipp Lang 593386b16b Ad job for installing
continuous-integration/drone/push Build is failing Details
2023-05-05 12:22:28 +02:00
Philipp Lang 6135fbec3f update initializer 2023-05-05 12:02:58 +02:00
Philipp Lang 29c2ea738c update composer lock 2023-05-05 11:49:26 +02:00
Philipp Lang 8abe217430 fix silvaletter
continuous-integration/drone/push Build is passing Details
2023-05-05 11:25:06 +02:00
Philipp Lang 444a43cf32 update gitmodules to public repos 2023-05-04 17:36:28 +02:00
Philipp Lang 19bfe38a2d update readme
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-05-04 17:22:43 +02:00
Philipp Lang fb8c18553c update drone 2023-05-04 17:22:06 +02:00
Philipp Lang f74f42f2f1 --wip-- [skip ci]
continuous-integration/drone/tag Build is passing Details
2023-05-04 14:53:46 +02:00
Philipp Lang 1f725ef5fc update drone
continuous-integration/drone/push Build was killed Details
2023-05-04 14:51:57 +02:00
Philipp Lang 00c6719ce7 Remove rmemeber documents
continuous-integration/drone/tag Build encountered an error Details
2023-05-04 11:52:17 +02:00
philipp lang a3f4d0573b Fixed tests
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build encountered an error Details
2023-05-04 00:03:12 +02:00
philipp lang e11eebf6cd Update laravel-nami
continuous-integration/drone/push Build is failing Details
2023-05-03 22:36:17 +02:00
philipp lang ff637a5d88 Add tries for member job 2023-05-03 22:36:02 +02:00
philipp lang 5357106187 Lint 2023-05-03 21:26:27 +02:00
philipp lang 1632da9b61 fixed tests
continuous-integration/drone/push Build is passing Details
2023-05-03 00:25:04 +02:00
philipp lang f523362b90 Add toolbars 2023-05-02 23:57:20 +02:00
philipp lang 3c64dee689 remove member view
continuous-integration/drone/push Build is failing Details
2023-05-02 23:49:16 +02:00
philipp lang 55ef4efe50 Remove toolbars
continuous-integration/drone/push Build is passing Details
2023-05-02 23:13:00 +02:00
philipp lang b48a10250c Add page layout to all views 2023-04-29 23:41:26 +02:00
philipp lang 372e6ee8c4 Move menu to pinia store 2023-04-29 23:15:07 +02:00
philipp lang cdf2b2e429 Rename dashboard to home
continuous-integration/drone/push Build is passing Details
2023-04-29 21:30:41 +02:00
philipp lang 45968d7349 Fixed: Show only active memberships in testers block
continuous-integration/drone/push Build is passing Details
2023-04-29 21:20:04 +02:00
philipp lang d7305c1a2e Fixed tests
continuous-integration/drone/push Build is passing Details
2023-04-25 00:42:31 +02:00
philipp lang d73bcd376d Fixed: Delete courses with members 2023-04-25 00:32:44 +02:00
philipp lang 884ad31086 Add nested group filter
continuous-integration/drone/push Build is failing Details
2023-04-25 00:28:44 +02:00
philipp lang 58756b6094 Revert "Fixed: Delete member synchronously"
This reverts commit f3c907c624.
2023-04-24 23:39:08 +02:00
philipp lang f3c907c624 Fixed: Delete member synchronously 2023-04-24 23:37:20 +02:00
philipp lang c207fe0f07 Fixed page navigation
continuous-integration/drone/push Build is passing Details
2023-04-24 23:32:57 +02:00
philipp lang aba214614c Move letter to invoice
continuous-integration/drone/push Build is passing Details
2023-04-18 22:08:45 +02:00
philipp lang b0874cecda Drop querystring package
continuous-integration/drone/push Build is passing Details
2023-04-18 01:11:33 +02:00
philipp lang 6a9f3e5cec Fix filter
continuous-integration/drone/push Build is passing Details
2023-03-23 00:00:41 +01:00
philipp lang 85a3abcc82 Fixed: Show only active memberships in member index
continuous-integration/drone/push Build is failing Details
2023-03-22 23:43:09 +01:00
philipp lang 38d434aef8 Fixed: encode umlauts for filter
continuous-integration/drone/push Build is failing Details
2023-03-22 23:37:36 +01:00
Philipp Lang df178c8186 Add search to member filter
continuous-integration/drone/push Build is passing Details
2023-03-15 11:16:52 +01:00
philipp lang 2299e18876 Fix menu
continuous-integration/drone/push Build is passing Details
2023-03-15 00:34:24 +01:00
philipp lang 8669199b1a Add button to export members
continuous-integration/drone/push Build is passing Details
2023-03-15 00:08:20 +01:00
philipp lang 86590f93a5 Lint
continuous-integration/drone/push Build is failing Details
2023-03-14 23:57:52 +01:00
philipp lang 2fffc17ffc order csv members 2023-03-14 23:56:30 +01:00
philipp lang ea6a98af18 Add export action 2023-03-14 23:55:50 +01:00
philipp lang 529bdf32bf Lint
continuous-integration/drone/push Build is failing Details
2023-03-14 23:28:42 +01:00
philipp lang bb9599dcf6 Add member filter
continuous-integration/drone/push Build is failing Details
2023-03-14 23:27:15 +01:00
philipp lang 210172db64 lint
continuous-integration/drone/push Build is failing Details
2023-03-14 22:42:12 +01:00
philipp lang ed302377b5 Lint
continuous-integration/drone/push Build is failing Details
2023-03-14 22:40:46 +01:00
philipp lang f322396fd9 Lint
continuous-integration/drone/push Build is failing Details
2023-03-14 22:36:31 +01:00
philipp lang 6960b0295a Add validation for contribution generator
continuous-integration/drone/push Build is failing Details
2023-03-14 22:29:39 +01:00
philipp lang 1ba60a455f Fix php8 warning
continuous-integration/drone/push Build is passing Details
2023-03-09 02:26:04 +01:00
philipp lang 8069e2b4dd Add payload for ContributionController
continuous-integration/drone/push Build is passing Details
2023-03-09 02:14:24 +01:00
Philipp Lang 7ee1102a5d Lint
continuous-integration/drone/push Build is passing Details
2023-03-07 10:13:30 +01:00
Philipp Lang c0c7071ca5 Fixed: default null values for date
continuous-integration/drone/push Build is failing Details
2023-03-07 09:49:06 +01:00
Philipp Lang 7072f07879 Lint
continuous-integration/drone/push Build is failing Details
2023-03-07 09:37:49 +01:00
philipp lang 9598a44e13 Add: Edit subactivity
continuous-integration/drone/push Build is failing Details
2023-03-07 01:37:02 +01:00
philipp lang 4cb2dddb43 Return is_filterable for subactivity 2023-03-07 01:37:02 +01:00
philipp lang f12a83b849 update tests 2023-03-07 01:37:02 +01:00
philipp lang 9315dafbfb Add backend for updating subactivities 2023-03-07 01:37:02 +01:00
philipp lang 13c9d2f2c1 Fix color of textarea (Fixes #16) 2023-03-07 01:37:02 +01:00
philipp lang 5f7fd15cd7 Update npm packages & tailwindcss 2023-03-07 01:37:02 +01:00
Philipp Lang a3d9b69e79 fix: pull members with no fee
continuous-integration/drone/push Build is passing Details
2023-03-06 15:18:48 +01:00
Philipp Lang 0ee051879b mod telescope auth
continuous-integration/drone/push Build is passing Details
2023-03-06 15:11:16 +01:00
Philipp Lang f0d0a9387d fix: feeName can be null
continuous-integration/drone/push Build is passing Details
2023-03-06 10:47:23 +01:00
Philipp Lang 06b3f1f89c fix tests
continuous-integration/drone/push Build is failing Details
2023-03-06 09:49:43 +01:00
Philipp Lang bcefd9f356 fixed: create subscription on the fly 2023-03-06 09:49:03 +01:00
philipp lang 609d452e56 Add nullable fields
continuous-integration/drone/push Build is passing Details
2023-03-06 00:26:17 +01:00
philipp lang 241b46da53 display also nami activities
continuous-integration/drone/push Build is passing Details
2023-03-04 23:47:42 +01:00
philipp lang d776a66836 Add subactivity form as popup
continuous-integration/drone/push Build is passing Details
2023-03-04 15:23:45 +01:00
philipp lang 197c23354d fix: select subactivity
continuous-integration/drone/push Build is passing Details
2023-03-04 14:47:37 +01:00
philipp lang 0c0a049deb mod horizon
continuous-integration/drone/push Build is passing Details
2023-03-04 14:44:38 +01:00
philipp lang 15ce834dc0 Fix tests
continuous-integration/drone/push Build is passing Details
2023-03-04 12:51:49 +01:00
philipp lang b9c0abe49e Add filterable switch for activity
continuous-integration/drone/push Build is failing Details
2023-03-04 12:09:25 +01:00
philipp lang 7db9e10200 Add store Action for subactivity 2023-03-04 12:02:17 +01:00
philipp lang 9baf5eac6b Lint 2023-03-04 10:04:21 +01:00
philipp lang 287f6a8c27 mod drone config
continuous-integration/drone/push Build is passing Details
2023-03-04 09:58:19 +01:00
philipp lang 17a6a34957 fix #7: Add phone number formatting
continuous-integration/drone/push Build is passing Details
2023-03-03 00:30:33 +01:00
philipp lang fe8ea63fa5 Add mitgliedsnr
continuous-integration/drone/push Build is passing Details
2023-03-02 23:14:25 +01:00
philipp lang 5a9f04a48f Fixed: move comment textarea to edit page
continuous-integration/drone/push Build is passing Details
2023-03-02 23:04:03 +01:00
Philipp Lang 1d36c162e3 Remove queue retry_after dsetting
continuous-integration/drone/push Build is passing Details
2023-03-02 17:06:27 +01:00
philipp lang ae4941d1e4 Add comment
continuous-integration/drone/push Build is passing Details
2023-02-27 23:15:57 +01:00
philipp lang a66145e105 Add salutation field
continuous-integration/drone/push Build is passing Details
2023-02-27 22:40:47 +01:00
philipp lang 9f4f2683a3 Fix ShowTest
continuous-integration/drone/push Build is passing Details
2023-02-27 22:15:46 +01:00
philipp lang 222bca62ee Add from date for memberships
continuous-integration/drone/push Build is failing Details
2023-02-27 22:00:27 +01:00
philipp lang 4512a41344 Add drone
continuous-integration/drone/push Build is passing Details
2023-02-26 22:30:19 +01:00
philipp lang 912c4d5f6f Lint
continuous-integration/drone/push Build is passing Details
2023-02-26 21:47:52 +01:00
philipp lang cba65ce640 Add searching for member with scout
continuous-integration/drone/push Build is failing Details
2023-02-26 20:51:59 +01:00
philipp lang afa29b416b Remove ps pending and efz block for foreign groups
continuous-integration/drone/push Build is passing Details
2023-02-26 18:48:34 +01:00
philipp lang 1ad411bad0 Add member memberships for local groups
continuous-integration/drone/push Build is passing Details
2023-02-25 19:49:53 +01:00
philipp lang 8e382126fd Add: delete activity
continuous-integration/drone/push Build is passing Details
2023-02-25 19:12:07 +01:00
philipp lang b303373b73 add activity store
continuous-integration/drone/push Build is failing Details
2023-02-25 18:00:23 +01:00
philipp lang ea6e3f4766 Fix: show activity table on mobile screens 2023-02-25 17:20:52 +01:00
philipp lang 197690069a Add activity edit 2023-02-25 17:19:17 +01:00
philipp lang 067cbe6d9d Add activity index filter
continuous-integration/drone/push Build is failing Details
2023-02-23 22:43:13 +01:00
philipp lang a18214b803 Revert "--wip-- [skip ci]"
This reverts commit b00eaa7635.
2023-02-23 22:04:57 +01:00
Philipp Lang b00eaa7635 --wip-- [skip ci] 2023-02-23 22:04:07 +01:00
Philipp Lang e15e5355c9 Fix phpstan
continuous-integration/drone/push Build is passing Details
2023-02-23 16:41:02 +01:00
Philipp Lang 370f7f22c1 install php extensions when running phpstan
continuous-integration/drone/push Build was killed Details
2023-02-23 15:55:56 +01:00
Philipp Lang e7abc519b4 update larastan
continuous-integration/drone/push Build is failing Details
2023-02-23 15:31:29 +01:00
Philipp Lang 4004c425c6 update phpstan 2023-02-23 15:28:44 +01:00
Philipp Lang 1a54ade698 increase memory limit of phpstan
continuous-integration/drone/push Build was killed Details
2023-02-23 13:54:48 +01:00
Philipp Lang 93f1a1e7c5 lint
continuous-integration/drone/push Build was killed Details
2023-02-23 13:30:55 +01:00
Philipp Lang 0549529a0d add redis service in drone
continuous-integration/drone/push Build was killed Details
2023-02-23 13:03:06 +01:00
philipp lang 9afa34504c fixed: filter only for active memberships
continuous-integration/drone/push Build was killed Details
2023-02-23 01:30:31 +01:00
philipp lang 44876ed6bd add redis server to drone
continuous-integration/drone/push Build is failing Details
2023-02-23 01:23:45 +01:00
philipp lang b64c821e00 Fixed member block stats 2023-02-23 01:20:51 +01:00
philipp lang 2a49f83014 fixed initialize members
continuous-integration/drone/push Build is failing Details
2023-02-23 01:11:05 +01:00
philipp lang 211f93ec17 Fix member resync
continuous-integration/drone/push Build is failing Details
2023-02-23 00:38:17 +01:00
philipp lang de7ee9cda2 update drone
continuous-integration/drone/push Build is failing Details
2023-02-22 22:54:09 +01:00
philipp lang 25ffd8d1fa Remove Log 2023-02-22 22:51:53 +01:00
philipp lang b6a585fd70 Add Redis extension to drone
continuous-integration/drone/push Build is failing Details
2023-02-22 22:40:32 +01:00
philipp lang abc269d6c4 Lint 2023-02-22 22:39:13 +01:00
philipp lang 24d65e37c3 Remove log 2023-02-22 22:38:11 +01:00
Philipp Lang 407338d431 Fixed MembershipStoreAction
continuous-integration/drone/push Build is failing Details
2023-02-21 13:06:19 +01:00
Philipp Lang 58fdfe1e81 Fixed: Add group to membership 2023-02-21 13:02:31 +01:00
philipp lang de4daf705f Update composer
continuous-integration/drone/push Build is failing Details
2023-02-18 01:28:34 +01:00
philipp lang 13ad5ea55c Fixed: return letter path in mail 2023-02-18 01:22:58 +01:00
Philipp Lang ef537b919e Lots of linting
continuous-integration/drone/push Build is failing Details
2023-02-17 18:57:11 +01:00
Philipp Lang b5dfa80a1c Add types 2023-02-17 14:54:35 +01:00
Philipp Lang 531f44bc94 Refactor test 2023-02-17 12:29:33 +01:00
Philipp Lang 37cbf860d0 Fixed: Deleting local memberships 2023-02-17 11:43:08 +01:00
philipp lang 2c0b9217ec Fixed: Dont store local memberships in nami
continuous-integration/drone/push Build is failing Details
2023-02-17 02:14:32 +01:00
philipp lang 51ddefe30b Fixed: Dont display local activities and subactivities on create
continuous-integration/drone/push Build is failing Details
2023-02-17 01:57:06 +01:00
philipp lang f106f2455a Add Activity Store And Update 2023-02-17 01:50:44 +01:00
philipp lang 8462a572ac --wip-- [skip ci] 2023-02-15 01:36:59 +01:00
philipp lang 73fb79cd1a Fixed: Dont assign local subactivities when pulling 2023-02-15 01:35:41 +01:00
Philipp Lang ffd67feb6a Fixed Activity Index
continuous-integration/drone/push Build is failing Details
2023-02-14 14:32:34 +01:00
Philipp Lang 9b0a052cbe Add index for activity
continuous-integration/drone/push Build is failing Details
2023-02-14 14:27:11 +01:00
Philipp Lang 45f26ee8f8 Lint
continuous-integration/drone/push Build is failing Details
2023-02-14 13:59:52 +01:00
Philipp Lang d11c99dbcf Fixed tests 2023-02-14 13:57:21 +01:00
Philipp Lang 4a4f2aa8d1 Remove restore of members 2023-02-14 12:46:52 +01:00
Philipp Lang c463af3937 Add job for inserting members
continuous-integration/drone/push Build is failing Details
2023-02-13 15:56:20 +01:00
Philipp Lang 69451cb8ee Fixed tests 2023-02-13 09:12:41 +01:00
philipp lang 68996d863b change process number
continuous-integration/drone/push Build is failing Details
2023-02-13 01:34:05 +01:00
philipp lang e445fac564 change queue to long 2023-02-13 01:33:55 +01:00
philipp lang 3273a49336 Add bus
continuous-integration/drone/push Build is failing Details
2023-02-13 01:06:04 +01:00
philipp lang 2efcca2b6a Add bus 2023-02-13 00:14:51 +01:00
philipp lang 363f51872a Extract api from initializing 2023-02-12 23:18:58 +01:00
philipp lang a399c91a03 Update laravel-nami 2023-02-12 22:40:08 +01:00
philipp lang b7ddffb564 Lint
continuous-integration/drone/push Build is failing Details
2023-02-12 22:37:49 +01:00
philipp lang 5a01bb7ebc Lint
continuous-integration/drone/push Build is failing Details
2023-02-08 01:39:46 +01:00
philipp lang 826397e92a Lint 2023-02-08 00:16:35 +01:00
philipp lang 50bfa59c11 Add Resync test 2023-02-08 00:14:59 +01:00
philipp lang ecffc258df Fixed: run initialize members as command 2023-02-07 23:55:46 +01:00
philipp lang ae922bbee1 remove resync test 2023-02-07 23:44:30 +01:00
philipp lang 7448a09e5b Skip member when member data is corrupted 2023-02-07 23:44:00 +01:00
philipp lang 35a707dd66 --wip-- [skip ci] 2023-02-07 23:43:57 +01:00
philipp lang 311f1281f6 Fix tests 2023-02-07 23:42:49 +01:00
philipp lang 04cfd95892 Fixed: Joined at date can be null 2023-02-07 22:48:33 +01:00
philipp lang 2975b77da0 update laravel-nami 2023-02-07 02:47:00 +01:00
philipp lang f84c8d2cc4 Fixed: Fetch courses 2023-02-07 02:45:15 +01:00
philipp lang 3dfdd1ce7c move tests 2023-02-07 01:41:29 +01:00
philipp lang 5ecc90aa8f Test that member model is returned from MemberPullAction 2023-02-07 01:39:39 +01:00
philipp lang e2c07a597b Fixed tests 2023-02-07 01:38:27 +01:00
philipp lang 07fbba1d6a Add Factory for RequestTest 2023-02-07 00:43:27 +01:00
philipp lang b223dbf190 Add member attributes
continuous-integration/drone/push Build is failing Details
2023-02-06 01:25:41 +01:00
philipp lang c21aa54e85 Add memberships sync after member push 2023-02-06 01:08:39 +01:00
philipp lang 920f3efbfc Fix pull memberships action for local memberships 2023-02-06 00:57:37 +01:00
philipp lang 150593b5cf Fix PutMemberAction 2023-02-06 00:24:57 +01:00
philipp lang 329da67ad6 Lint 2023-02-05 23:38:28 +01:00
philipp lang 0ffce6b25e Update 2023-02-05 23:35:08 +01:00
Philipp Lang af2cb5688a Update inertia
continuous-integration/drone/push Build is passing Details
2023-01-04 12:41:32 +01:00
Philipp Lang 42d6e2f661 fixed: nr should not be numeric
continuous-integration/drone/push Build is passing Details
2023-01-04 12:40:59 +01:00
philipp lang 785f9e5689 Add frontend for allpayment
continuous-integration/drone/push Build is passing Details
2022-12-14 23:20:05 +01:00
Philipp Lang 8af0e2a16e Add payment for promises
continuous-integration/drone/push Build is passing Details
2022-12-14 15:49:12 +01:00
Philipp Lang 9740ea2be4 lint 2022-12-14 14:06:39 +01:00
philipp lang bd34c3e835 Add split for subscription
continuous-integration/drone/push Build is failing Details
2022-12-14 00:23:03 +01:00
philipp lang 49417981f1 Add frontend for subscription children
continuous-integration/drone/push Build is passing Details
2022-12-13 23:11:32 +01:00
philipp lang 20b1309ccc Add Subscription Update test
continuous-integration/drone/push Build is passing Details
2022-12-13 21:25:03 +01:00
philipp lang 8979ddc49d Lint tests
continuous-integration/drone/push Build is passing Details
2022-12-13 21:21:08 +01:00
philipp lang 15ba95e7e8 Add leaders to dashboard
continuous-integration/drone/push Build is passing Details
2022-12-13 21:13:51 +01:00
philipp lang 26965da04f Add stats to pagination even on one page 2022-12-13 21:02:47 +01:00
philipp lang 71c3e98c6b Add prune command for telescope 2022-12-13 21:00:38 +01:00
philipp lang cf5445a0e3 Add has promise
continuous-integration/drone/push Build is passing Details
2022-12-11 21:00:48 +01:00
philipp lang 945e65f49e fix membership sidebar
continuous-integration/drone/push Build is passing Details
2022-12-07 20:26:42 +01:00
philipp lang 94b405bcf9 Refactor DocumentFactory
continuous-integration/drone/push Build is failing Details
2022-12-07 00:40:53 +01:00
philipp lang 3a93d1585f Refactor Query of DocumentFactory 2022-12-06 23:58:44 +01:00
philipp lang 1f103b7539 Fixed: Display BillKind in Edit page
continuous-integration/drone/push Build is passing Details
2022-12-06 23:20:05 +01:00
philipp lang 74575998fa Add enum for bill kind 2022-12-06 23:11:57 +01:00
philipp lang b0f76b0ae2 Lint LetterRepository
continuous-integration/drone/push Build is passing Details
2022-12-06 22:16:37 +01:00
philipp lang 7ee4fe5166 Mod Pdf generateTest 2022-12-06 21:25:47 +01:00
philipp lang 530b3fa3c3 move links
continuous-integration/drone/push Build is passing Details
2022-12-05 00:45:22 +01:00
philipp lang bfd69d6f04 Add buttons for member index
continuous-integration/drone/push Build is passing Details
2022-12-05 00:21:24 +01:00
philipp lang be3336a18d Hide menu when navigating page
continuous-integration/drone/push Build is passing Details
2022-12-05 00:04:01 +01:00
philipp lang 1ab866a2fe fix searchbar click 2022-12-04 23:57:31 +01:00
philipp lang 55e5ae1809 fix login screen
continuous-integration/drone/push Build is passing Details
2022-12-04 23:54:07 +01:00
philipp lang 0a58d0ffdc Add responsive member form
continuous-integration/drone/push Build is passing Details
2022-12-04 23:47:25 +01:00
philipp lang f2d4ad5674 Add global save button 2022-12-04 23:40:35 +01:00
philipp lang b1c8fb6dd1 add save button to member edit page
continuous-integration/drone/push Build is passing Details
2022-12-02 00:52:13 +01:00
philipp lang f03ae5eede Add member edit layout
continuous-integration/drone/push Build is passing Details
2022-12-02 00:42:06 +01:00
philipp lang 4a31d3349a prevent field sizes from getting purged 2022-12-01 23:46:02 +01:00
philipp lang 19a3b9c1ee switch to tailwindcss nesting plugin
continuous-integration/drone/push Build is passing Details
2022-12-01 23:39:16 +01:00
philipp lang 5a97d0c84d Add mobile tables to member detail page
continuous-integration/drone/push Build is passing Details
2022-11-29 21:38:55 +01:00
philipp lang 4850f4ef5a mod children 2022-11-29 21:03:28 +01:00
Philipp Lang 4bde59ca11 add memory limit for phpstan
continuous-integration/drone/push Build is passing Details
2022-11-24 15:49:30 +01:00
Philipp Lang 713dc14b68 fixed phpstan
continuous-integration/drone/push Build was killed Details
2022-11-24 15:36:59 +01:00
Philipp Lang a2fa91ff03 fix phpstan version
continuous-integration/drone/push Build is failing Details
2022-11-24 15:26:55 +01:00
Philipp Lang 99c6299cfa add texlive fonts
continuous-integration/drone/push Build was killed Details
2022-11-24 15:04:42 +01:00
Philipp Lang 248aee8059 add fonts
continuous-integration/drone/push Build was killed Details
2022-11-24 14:46:07 +01:00
Philipp Lang d3d94dd51c fixed drone
continuous-integration/drone/push Build was killed Details
2022-11-24 14:26:26 +01:00
Philipp Lang 7257f2fe22 add xetex
continuous-integration/drone/push Build was killed Details
2022-11-24 14:09:49 +01:00
Philipp Lang 9308a75dcd mod texlive
continuous-integration/drone/push Build was killed Details
2022-11-24 13:41:41 +01:00
Philipp Lang ca384540f7 update texlive
continuous-integration/drone/push Build was killed Details
2022-11-24 13:13:31 +01:00
Philipp Lang 80e54813b7 move node
continuous-integration/drone/push Build is failing Details
2022-11-24 13:06:16 +01:00
Philipp Lang 758498ed71 add app_key secret
continuous-integration/drone/push Build is failing Details
2022-11-24 12:48:44 +01:00
Philipp Lang 4a3ea4ae58 mod db name
continuous-integration/drone/push Build is failing Details
2022-11-24 12:39:30 +01:00
Philipp Lang c43c0ece42 update env
continuous-integration/drone/push Build is failing Details
2022-11-24 12:33:46 +01:00
Philipp Lang bf69f80ece update drone
continuous-integration/drone/push Build is failing Details
2022-11-24 11:18:50 +01:00
Philipp Lang 7c28416660 add tests
continuous-integration/drone/push Build was killed Details
2022-11-24 11:15:43 +01:00
philipp lang 117f53df77 add mobile layout
continuous-integration/drone/push Build is passing Details
2022-11-24 00:59:40 +01:00
philipp lang e6801ab978 Extract components 2022-11-24 00:22:01 +01:00
philipp lang 5f6d19a5ff add tooltip for member table buttons 2022-11-24 00:07:50 +01:00
philipp lang 1e731a0661 Extract age groups component 2022-11-24 00:05:56 +01:00
philipp lang a1bcd08f5b add tooltips for member action buttons 2022-11-24 00:00:05 +01:00
philipp lang 8229f9a1aa update member table
continuous-integration/drone/push Build is passing Details
2022-11-23 23:49:07 +01:00
philipp lang 4388fc073b center lilie in member index 2022-11-23 23:25:43 +01:00
philipp lang 76c319a6a0 Simplify view 2022-11-23 23:24:32 +01:00
philipp lang acced9c054 add responsive layout for dashboard
continuous-integration/drone/push Build is passing Details
2022-11-23 01:11:20 +01:00
philipp lang 5a70d34164 fix home layout 2022-11-23 00:46:20 +01:00
philipp lang 3029fb276b update drone
continuous-integration/drone/push Build is passing Details
2022-11-23 00:40:35 +01:00
philipp lang 0a457d2bb5 update drone
continuous-integration/drone/push Build is passing Details
2022-11-23 00:36:10 +01:00
philipp lang fd9bc0ce6f update drone
continuous-integration/drone/push Build is failing Details
2022-11-23 00:31:35 +01:00
philipp lang 919ad62b41 update drone
continuous-integration/drone/push Build is failing Details
2022-11-23 00:28:20 +01:00
philipp lang 147f6af9d4 update drone
continuous-integration/drone/push Build is passing Details
2022-11-23 00:18:43 +01:00
philipp lang a54ebb6487 update drone
continuous-integration/drone/push Build is passing Details
2022-11-23 00:12:10 +01:00
philipp lang e1a77b8efc update drone
continuous-integration/drone/push Build is failing Details
2022-11-23 00:09:53 +01:00
philipp lang 070ebaaab1 run svg sprite locally
continuous-integration/drone/push Build is passing Details
2022-11-23 00:04:02 +01:00
philipp lang ace61dc470 disable node 2022-11-22 23:51:13 +01:00
930 changed files with 48820 additions and 30093 deletions

26
.app.env.example Normal file
View File

@ -0,0 +1,26 @@
APP_NAME="Adrema"
APP_ENV=production
APP_KEY=YOUR_APP_KEY
APP_DEBUG=false
APP_URL=http://localhost:8000
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME=me
DB_PASSWORD=secret_db_password
MYSQL_PASSWORD=secret_db_password
MEILI_MASTER_KEY=secret_meilisearch_password
PUSHER_APP_HOST=socketi
WORKERS=5
USER_EMAIL=admin@example.com
USER_PASSWORD=admin

View File

@ -1,2 +0,0 @@
\App\User::factory()->create();
\App\User::factory()->create();

14
.docker/base.Dockerfile Normal file
View File

@ -0,0 +1,14 @@
FROM php:8.3.11-fpm as php
WORKDIR /app
RUN ls /app
RUN apt-get update
RUN apt-get install -y rsync libcurl3-dev apt-utils zlib1g-dev libpng-dev libicu-dev libonig-dev unzip poppler-utils libpng-dev libjpeg-dev default-mysql-client libzip-dev imagemagick libmagickwand-dev
RUN apt-get install -y --no-install-recommends texlive-base texlive-latex-base texlive-pictures texlive-latex-extra texlive-lang-german texlive-plain-generic texlive-fonts-recommended texlive-fonts-extra texlive-extra-utils
RUN docker-php-ext-install pdo_mysql curl exif intl mbstring pcntl zip
RUN pecl install redis && docker-php-ext-enable redis
RUN pecl install imagick && docker-php-ext-enable imagick
RUN docker-php-ext-configure gd --with-jpeg
RUN docker-php-ext-install gd
RUN usermod -s /bin/bash www-data
RUN echo 'memory_limit = 2G' >> /usr/local/etc/php/conf.d/99-custom-php-memlimit.ini

6
.docker/bin/build_base Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
docker buildx build -f .docker/base.Dockerfile .
docker image tag sha256:... zoomyboy/adrema-base
docker push zoomyboy/adrema-base

22
.docker/nginx.Dockerfile Normal file
View File

@ -0,0 +1,22 @@
FROM composer:2.7.9 as composer
WORKDIR /app
COPY . /app
RUN composer install --ignore-platform-reqs --no-dev
RUN php artisan telescope:publish
RUN php artisan horizon:publish
FROM node:20.15.0-slim as node
WORKDIR /app
COPY . /app
RUN npm install && npm run prod && npm run img && rm -R node_modules
FROM nginx:1.21.6-alpine as nginx
WORKDIR /app
COPY --from=node /app /app
COPY --from=composer /app/public/vendor /app/public/vendor
COPY ./.docker/nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
VOLUME ["/app/public/storage"]
CMD ["nginx", "-g", "daemon off;"]

View File

@ -25,12 +25,40 @@ http {
root /app/public;
charset utf-8;
index index.php;
location /app/adremakey {
proxy_pass http://socketi:6001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
proxy_read_timeout 60;
proxy_connect_timeout 60;
}
location /indexes/members/search {
proxy_pass http://meilisearch:7700/indexes/members/search;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
proxy_read_timeout 60;
proxy_connect_timeout 60;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location = /.well-known/carddav {
return 301 $scheme://$host/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/dav;
}
location ~ /\.ht {
deny all;
}

27
.docker/php.Dockerfile Normal file
View File

@ -0,0 +1,27 @@
FROM composer:2.7.9 as composer
WORKDIR /app
COPY . /app
RUN composer install --ignore-platform-reqs --no-dev
FROM node:20.15.0-slim as node
WORKDIR /app
COPY . /app
RUN npm install && npm run prod && npm run img && rm -R node_modules
FROM zoomyboy/adrema-base:latest as php
COPY --chown=www-data:www-data . /app
COPY --chown=www-data:www-data --from=node /app/public /app/public
COPY --chown=www-data:www-data --from=composer /app/vendor /app/vendor
USER www-data
RUN php artisan telescope:publish
RUN php artisan horizon:publish
USER root
COPY ./.docker/php /bin
VOLUME ["/app/packages/laravel-nami/.cookies", "/app/storage/app", "/app/resources/views/tex/invoice"]
EXPOSE 9000
CMD /bin/php-entrypoint

46
.docker/php/entrypoint Executable file
View File

@ -0,0 +1,46 @@
#!/bin/bash
set -e
function wait_for_db {
while true; do
echo "waiting for Database init"
php -r 'new PDO("mysql:host='$DB_HOST';dbname='$DB_DATABASE'", "'$DB_USERNAME'", "'$DB_PASSWORD'");' > /dev/null && return 0
sleep 1
done
}
mkdir -p /app/packages/laravel-nami/.cookies || true
mkdir -p /app/storage/app/public || true
chown -R www-data:www-data /app/packages/laravel-nami/.cookies
chown -R www-data:www-data /app/storage/app
if [ $APP_KEY = "YOUR_APP_KEY" ]; then
echo "----------------------- Keinen APP KEY gefunden. Key wird generiert: $(su www-data -c 'php artisan key:generate --show') ----------------------- Füge diesen Key als APP_KEY ein ---------------------"
exit 1
fi
if [ $1 == "horizon" ]; then
wait_for_db
su www-data -c 'php artisan horizon'
fi
if [ $1 == "app" ]; then
# --------------------------- ensure appkey is set ----------------------------
wait_for_db
php -r '$connection = new PDO("mysql:host='$DB_HOST';dbname='$DB_DATABASE'", "'$DB_USERNAME'", "'$DB_PASSWORD'"); $connection->query("DESCRIBE migrations");' > /dev/null || php artisan migrate --seed --force
su www-data -c 'php artisan migrate --force'
php artisan scout:sync-index-settings
php-fpm -F -R -O
fi
if [ $1 == "schedule" ]; then
wait_for_db
while true; do
su www-data -c 'php artisan schedule:run -n'
sleep 60
done
fi

View File

@ -1,2 +1,17 @@
node_modules
vendor
**/node_modules
data
**/vendor
public/build
public/vendor
bootstrap/cache/services.php
bootstrap/cache/packages.php
bootstrap/cache/routes.php
packages/laravel-nami/.cookies
storage/logs/**
storage/temp/**
storage/debugbar/**
storage/app/tmp/**
cookies
storage/logs/laravel.log
.git
doc

View File

@ -1,26 +1,3 @@
# kind: pipeline
# type: ssh
# name: scoutrobot
#
# server:
# host: zoomyboy.de
# user: stammsilva
# ssh_key:
# from_secret: private_key
#
# clone:
# disable: true
#
# steps:
# - name: master
# commands:
# - /usr/local/bin/deploy_scoutrobot_master
# when:
# branch:
# - master
# event:
# - push
#
kind: pipeline
type: docker
name: default
@ -31,31 +8,140 @@ workspace:
steps:
- name: submodules
image: alpine/git
environment:
SSH_KEY:
from_secret: private_key
KNOWN_HOSTS:
from_secret: known_hosts
commands:
- mkdir $HOME/.ssh
- echo "$SSH_KEY" > $HOME/.ssh/id_rsa
- echo "$KNOWN_HOSTS" > $HOME/.ssh/known_hosts
- cat $HOME/.ssh/known_hosts
- chmod 600 $HOME/.ssh/id_rsa
- git submodule update --init --recursive
- name: composer
image: composer:2.2.7
- name: composer_dev
image: composer:2.7.9
commands:
- composer install --ignore-platform-reqs --dev
- name: mysql_healthcheck
image: mysql:oracle
commands:
- while ! mysqladmin ping -h db -u db -pdb --silent; do sleep 1; done
- name: ocdb_healthcheck
image: mysql:oracle
commands:
- while ! mysqladmin ping -h ownclouddb -u owncloud -powncloud --silent; do sleep 1; done
- name: oc_healthcheck
image: zoomyboy/adrema-base:latest
commands:
- while ! curl --silent 'http://owncloudserver:8080/ocs/v1.php/cloud/capabilities?format=json' -u admin:admin | grep '"status":"ok"'; do sleep 1; done
- name: node
image: node:20.15.0-slim
commands:
- npm ci && cd packages/adrema-form && npm ci && npm run build && rm -R node_modules && cd ../../ && npm run img && npm run prod && rm -R node_modules
- name: tests
image: zoomyboy/adrema-base:latest
commands:
- touch .env
- php artisan migrate
- php artisan test
- rm -f .env
- vendor/bin/phpstan analyse
environment:
APP_NAME: Scoutrobot
APP_KEY:
from_secret: app_key
APP_ENV: local
APP_DEBUG: true
APP_URL: http://scoutrobot.test
LOG_CHANNEL: stack
DB_CONNECTION: mysql
DB_HOST: db
REDIS_HOST: redis
DB_PORT: 3306
DB_DATABASE: db
DB_USERNAME: db
DB_PASSWORD: db
BROADCAST_DRIVER: log
CACHE_DRIVER: file
QUEUE_CONNECTION: sync
SESSION_DRIVER: file
SESSION_LIFETIME: 120
MAIL_FROM_NAME: '${APP_NAME}'
PDFLATEX_BIN: /usr/bin/pdflatex
XELATEX_BIN: /usr/bin/xelatex
SCOUT_DRIVER: database
MEILI_MASTER_KEY: abc
TEST_OWNCLOUD_DOMAIN: http://owncloudserver:8080
TEST_NEXTCLOUD_DOMAIN: http://nextcloudserver:80
- name: docker_app_push
image: plugins/docker
settings:
dockerfile: ./.docker/php.Dockerfile
repo: zoomyboy/adrema-app
username: zoomyboy
password:
from_secret: docker_hub_token
tags:
- latest
- ${DRONE_TAG}
pull_image: true
when:
event: tag
- name: docker_webservice_push
image: plugins/docker
settings:
dockerfile: ./.docker/nginx.Dockerfile
repo: zoomyboy/adrema-webservice
username: zoomyboy
password:
from_secret: docker_hub_token
tags:
- latest
- ${DRONE_TAG}
pull_image: true
when:
event: tag
- name: deploy
image: zoomyboy/adrema-base:latest
environment:
SSH_KEY:
from_secret: deploy_private_key
commands:
- apt-get update > /dev/null
- apt-get install -y openssh-client
- mkdir $HOME/.ssh
- echo "UserKnownHostsFile=/dev/null" >> $HOME/.ssh/config
- echo "StrictHostKeyChecking=no" >> $HOME/.ssh/config
- echo "$SSH_KEY" > $HOME/.ssh/id_rsa
- chmod 600 $HOME/.ssh/id_rsa
- ./vendor/bin/envoy run deploy
when:
event: tag
- name: github push
image: alpine/git
environment:
SSH_KEY:
from_secret: github_private_key
commands:
- mkdir $HOME/.ssh
- git config core.sshCommand "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
- echo "$SSH_KEY" > $HOME/.ssh/id_rsa
- chmod 600 $HOME/.ssh/id_rsa
- git remote add gh git@github.com:zoomyboy/adrema.git
- git push -f gh HEAD:master
when:
branch: master
event: push
- name: composer_no_dev
image: composer:2.7.9
commands:
- composer install --ignore-platform-reqs --no-dev
- name: node
image: node:17.9.0-slim
commands:
- npm install && npm run prod && rm -R node_modules
- name: compress
image: php:7.3
image: php:8.1.6
commands:
- apt-get update -yqq
- apt-get install -yqq zip tar
@ -73,6 +159,62 @@ steps:
when:
event: tag
services:
- name: db
image: mariadb:10.6.5
environment:
MARIADB_DATABASE: db
MARIADB_USER: db
MARIADB_PASSWORD: db
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes
- name: redis
image: redis
- name: meilisearch
image: getmeili/meilisearch:v1.6
commands:
- meilisearch --master-key="abc"
- name: ownclouddb
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: owncloud
MYSQL_USER: owncloud
MYSQL_PASSWORD: owncloud
MYSQL_DATABASE: owncloud
MARIADB_AUTO_UPGRADE: 1
- name: owncloudserver
image: owncloud/server:10.10.0
environment:
OWNCLOUD_DOMAIN: http://owncloudserver:8080
OWNCLOUD_TRUSTED_DOMAINS: owncloudserver
OWNCLOUD_DB_TYPE: mysql
OWNCLOUD_DB_NAME: owncloud
OWNCLOUD_DB_USERNAME: owncloud
OWNCLOUD_DB_PASSWORD: owncloud
OWNCLOUD_DB_HOST: ownclouddb
OWNCLOUD_ADMIN_USERNAME: admin
OWNCLOUD_ADMIN_PASSWORD: admin
OWNCLOUD_MYSQL_UTF8MB4: true
OWNCLOUD_REDIS_ENABLED: false
OWNCLOUD_REDIS_HOST: false
- name: nextclouddb
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: nextcloud
MYSQL_DATABASE: nextcloud
MARIADB_AUTO_UPGRADE: 1
- name: nextcloudserver
image: nextcloud
environment:
MYSQL_PASSWORD: nextcloud
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_HOST: nextclouddb
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: admin
NEXTCLOUD_TRUSTED_DOMAINS: nextcloudserver
trigger:
event:
- push

View File

@ -1,55 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
APP_MODE=
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_TEST_DATABASE=laraveltest
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
XELATEX=
PDFLATEX=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
NAMI_MGLNR=-1
NAMI_GROUP=-1
NAMI_PASSWORD=password
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

View File

@ -5,7 +5,8 @@
},
"extends": [
"eslint:recommended",
"plugin:vue/essential"
"plugin:vue/vue3-recommended",
"prettier"
],
"parserOptions": {
"ecmaVersion": "latest",
@ -14,6 +15,14 @@
"plugins": [
"vue"
],
"overrides": [
{
"files": [
"*.vue"
],
"rules": {
"vue/multi-word-component-names": "off"
}
}
]
}

52
.gitignore vendored
View File

@ -1,27 +1,43 @@
/node_modules
/public/hot
/public/storage
/public/js
/public/css
/public/fonts
/public/img
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
Homestead.json
Homestead.yaml
node_modules/
npm-debug.log
yarn-error.log
tags
/bootstrap/compiled.php
/app/storage/
/public/storage
/public/hot
/public/build
/public/vendor
/storage/temp
storage/*.key
/storage/media-library/*
/vendor/
Homestead.yaml
Homestead.json
.vagrant/
.phpunit.result.cache
/storage/temp/
/storage/debugbar/
/tests/Fileshare/oc_tmp/*
# User data files
/data/
/.app.env
.config/psysh
# Development files
/docker-compose.yml
/.env
/.env.backup
/.env.testing
# Editor config files
/.vscode/
# Temporary files
*.swp
*.swo
*.swm
/public/mix-manifest.json
resources/img/sprite.svg
/resources/img/sprite.svg
/public/sprite.svg
/.php-cs-fixer.cache
/groups.sql
/.phpunit.cache

20
.gitmodules vendored
View File

@ -1,9 +1,19 @@
[submodule "packages/silvaletter"]
path = packages/silvaletter
url = git@zoomyboy.de:silva/silvaletter.git
[submodule "packages/laravel-nami"]
path = packages/laravel-nami
url = git@github.com:DPSGKoeln/laravel-nami.git
url = https://git.zoomyboy.de/silva/laravel-nami-api
[submodule "packages/tex"]
path = packages/tex
url = git@zoomyboy.de:pille/tex.git
url = https://git.zoomyboy.de/pille/tex
[submodule "packages/adrema-form"]
path = packages/adrema-form
url = https://git.zoomyboy.de/silva/adrema-form.git
[submodule "packages/medialibrary-helper"]
path = packages/medialibrary-helper
url = https://git.zoomyboy.de/zoomyboy/medialibrary-helper.git
branch = version2
[submodule "packages/flysystem-webdav"]
path = packages/flysystem-webdav
url = https://github.com/zoomyboy/flysystem-webdav.git
[submodule "packages/table-document"]
path = packages/table-document
url = https://git.zoomyboy.de/zoomyboy/table-document.git

View File

@ -1,5 +1,5 @@
{
"printWidth": 120,
"printWidth": 200,
"singleQuote": true,
"tabWidth": 4,
"quoteProps": "consistent",

94
CHANGELOG.md Normal file
View File

@ -0,0 +1,94 @@
# Letzte Änderungen
### 1.12.2
- Zuschussliste Gallier
### 1.12.1
- In Teilnehmer-Liste von Veranstaltungen kann nun sortiert und gefiltert werden.
- Formulare: Feld Registrierung von / bis
### 1.11.5
- Fix: Synchronisation von NaMi-Mitgliedern
### 1.11.4
- Fix: Nicht an Präventions-Unterlagen für vergangene Veranstaltungen erinnern
### 1.11.1
- Es kann nun auch das Feld "Datenweiterverwendung" über Adrema gepflegt werden.
### 1.10.20
- Fixed: Bei Textfeldern wird nun die Einleitung dargestellt
### 1.10.19
- Fixed: Erweiterte Führungszeugnisse und Präventionsschulungen nur für aktive Mitgliedschaften auf Dashboard anzeigen
### 1.10.18
- Fixed: All Gruppen als Option anbieten bei Bedingungen
### 1.10.17
- Es können nun auch Bedingungen für Felder vom Typ Gruppierung definiert werden
### 1.10.16
- Rechnungen und Erinnerungen werden nun automatisch täglich um 10 Uhr verschickt
- Es kann eingestellt werden, nach wie vielen Wochen an Rechnungen erinnert werden soll (Standard: 12)
- Name und Profilbild des angemeldeten Benutzers wird nun oben rechts angezeigt
### 1.10.15
- "Für Mitglieder zusätzlich abfragen" kann nun im Formular auch gesetzt werden, wenn ein NaMi Feld ausgewählt ist.
### 1.10.14
- Fixed: Ist eine Präventionsschulung älter als 5 Jahre, so ist nur eine Auffrischungs-Schulung erforderlich
### 1.10.13
- Bei Veranstaltungs-Übersicht alle Veranstaltungen anzeigen
- Download von Teilnehmern als Tabellen-Dokument
- Spalte "Prävention" bei TN-Liste eingefügt für benötigte Unterlagen
### 1.10.11
- Bei Prävention auch an Verhaltenskodex erinnern
### 1.10.10
- Eine Formular-Vorlage kann nun auch Mail-Inhalte enthalten, die für die Formulare übernommen werden
### 1.10.9
- Nextcloud als neuen Type bei Datei-Verbindungen angelegt
### 1.10.8
- Anmeldeformulare: Bearbeiten von Teilnehmer\*innen ist nun möglich
### 1.10.7
- Anmeldeformulare: Versenden von Präventions-Unterlagen können nun an eine Feld-Bedingung geknüpft werden innerhalb der Veranstaltung
### 1.10.6
- Kleinere Fehler behoben
### 1.10.5
- Kleinere Fehler behoben
### 1.10.4
- Anmeldeformular: Erinnerung an Präventions-Unterlagen bei Teilnehmer\*innnen
### 1.10.3
- Anmeldeformulare: Ist NaMi-Feld "E-Mail" ausgewählt bei Formular-Feldern, muss die E-Mail-Adresse nun nicht mehr auf das Mitglied matchen. Dies ist nur noch bei Formular-Feldern mit NaMi-Feldern "Vorname", "Nachname" und "Geburtsdatum" der Fall.

View File

@ -1,19 +0,0 @@
FROM composer:2.2.7 as composer
WORKDIR /app
COPY . /app
RUN composer install --ignore-platform-reqs --no-dev
FROM node:17.9.0-slim as node
WORKDIR /app
COPY . /app
RUN npm install && npm run prod && rm -R node_modules
FROM php:8.1.6-fpm as php
RUN apt-get update && apt-get install -y libcurl3-dev apt-utils zlib1g-dev libpng-dev libicu-dev libonig-dev texlive
RUN docker-php-ext-install pdo_mysql curl gd intl mbstring
COPY --chown=www-data:www-data . /app
COPY --chown=www-data:www-data --from=node /app/public /app/public
COPY --chown=www-data:www-data --from=composer /app/vendor /app/vendor
EXPOSE 9000
CMD ["php-fpm", "-F", "-R", "-O"]

8
Envoy.blade.php Normal file
View File

@ -0,0 +1,8 @@
@servers(['docker' => ['stammsilva@zoomyboy.de', 'stammgallier@stamm-gallier.de', 'dpsg-lennep@zoomyboy.de', 'dpsgbergischland@zoomyboy.de', 'dpsg-koeln@dpsg-koeln.de']])
@task('deploy', ['on' => 'docker'])
cd $ADREMA_PATH
docker compose down
docker compose pull
docker compose up -d
@endtask

128
README.md
View File

@ -1,12 +1,126 @@
# DPSG Köln Adrema
# Adrema
## Installation
**Schön, dass du den Weg hierhin gefunden hast!**
Init and update git submodules to get laravel-nami Package
Da du diese Seite besuchst, gehörst du sicherlich zu den Leuten, die möglichst einfach die Daten ihrer Mitglieder pfelgen wollen. Das ist offiziell in der DPSG nur mit NaMi möglich.
Die AdReMa (= "AddRessManagement") macht das auch, nur einfacher, schöner und intuitiver als es NaMi tut.
![Mitglieder-Übersicht](https://git.zoomyboy.de/silva/adrema/raw/branch/master/doc/page/assets/img/member.jpg)
AdReMa kann von jedem und jeder genutzt werden, die einen NaMi-Account besitzt und Schreibrechte hat (i.d.R. sind das Stammesvorstände, e.V.-Mitglieder und andere, die Mitgliederdaten und deren Abrechungen und Beiträge pflegen müssen).
## Was kann ich mit AdReMa machen?
- Basisdaten von Mitgliedern anzeigen und bearbeiten
- Einfacher Filter nach Gruppierung, Tätigkeit, etc
- Detailansichten mit allen zugehörigen Daten
- Führungszeugnisse und Präventionssulungen nachhalten
- Beitragszahlungen eintragen
- Automatische Rechunungserstellung
- Eigenen Beitragssatz hinterlegen (z.B. interner Stammes-Jahresbeitrag)
- Generieren von Zuschusslisten (aktuell RdP NRW, Bdkj Hessen, Stadt Solingen, Stadt Remscheid, Stadt Frankfurt a. M.)
- Einpflegen von internen Tätigkeiten, die nicht in NaMi vorhanden sind (um z.B. stammes-interne AGs / AKs zu verwalten)
- Automatisches Erstellen und Managen von E-Mail-Verteilern mittels Mailman 3.0
- eFz-Bescheinigung abrufen für alle Leitenden (das kann in NaMi nur jede\*r für sich selbst)
- Ausbildungen eintragen (WBK-Bausteine)
- Abrufen von Kontakten ins eigene Telefonbuch (mittels CardDAV)
Ziel dieses Projektes ist es, viele Dinge, die man normalerweise manuell zu tun hat so gut es geht zu automatisieren oder zumindest zu vereinfachen. So kann man sich als Leitende\*r / Vorstand auf die wichtigeren Dinge konzentrieren wie Gruppenstunden, Lager, Leiterrunden, etc.
Außerdem ist AdReMa auch problemlos auf Handys und Tablets bedienbar ("mobiles Design")
## Installation des Produktivsystems
1. Herunterladen der Beispiel Docker-Compose
```cmd
curl https://git.zoomyboy.de/silva/adrema/raw/branch/master/docker-compose.prod.yml -o docker-compose.yml
```
composer install --no-dev
npm ci
npm run prod
php artisan serve
2. Herunterladen der Beispiel Environmentvariablen-Datei
```cmd
curl https://git.zoomyboy.de/silva/adrema/raw/branch/master/.app.env.example -o .app.env
```
3. In der `.app.env` notwendige Einstellungen vornehmen:
- `APP_URL`: Hier sollte die URL (mit HTTPS) stehen, unter der Adrema erreichbar sein soll (z.B. `https://adrema.stamm-bipi.de`)
- Mail-Server Einstellungen `MAIL_PORT`, `MAIL_HOST`, `MAIL_USERNAME`, `MAIL_PASSWORD` und `MAIL_ENCRYPTION` anpassen
- `MAIL_FROM_NAME`: Der Name, der als Absender von E-Mails gesetzt wird (z.B. `Stamm Bipi Service`)
- `MAIL_FROM_ADDRESS`: Die dazu gehörige E-Mail-Adresse, die natürlich für antworten erreichbar sein sollte (z.B. `vorstand@stamm-bipi.de`)
- `DB_PASSWORD` und `MYSQL_PASSWORD`: Mit dem selben sicheren Passwort für die Datenbank versehen
- `USER_EMAIL` und `USER_PASSWORD`: Einstellen des standard Adrema Logins
4. Container zur Gennerierung des App-Key starten
```cmd
docker compose up php
```
Nach einiger zeit wird ein App-Key generiert:
```cmd
Keinen APP KEY gefunden. Key wird generiert: base64:xxx
```
Container herunterfahren und entfernen
```cmd
docker compose down
```
5. Der generierte App-Key muss als Environmentvariable (`APP_KEY`) mit in den Docker-Container gegeben werden. Kopiere den App-Key in die Datei `.app.env`
```env
APP_KEY=base64:xxx
```
6. Alle Container starten
```cmd
docker compose up -d
```
7. Nach kurzer Zeit ist AdReMa über <http://localhost:8000> erreichbar und es kann sich mit dem zuvor festgelegten Login eingeloggt werden
### Individuelle anpassungen
#### Rechnungswesen
Bei dem Setup wird im Daten-Verzeichniss ein Ordner `./data/setup` angelegt. Hier kann das Logo des Stammes in den Briefkopf eingefügt werden. Zusätzlich kann der Text der Rechnung und der Zahlungserinnerung angepasst werden, dafür ist ein grundlegendes Verständnis für `.tex` Datein erforderlich.
## Nutzen des Entwicklungssystmes
1. Klonen des Reposetories
```cmd
git clone https://git.zoomyboy.de/silva/adrema.git
```
2. Kopieren der Beispiel Docker-Compose für das Entwickeln und nach Wünschen anpassen
```cmd
cp docker-compose.dev.yml docker-compose.yml
```
3. Kopieren der Beispiel Environmentvariablen-Datei
```cmd
cp .app.env.example .app.env
```
4. Submodule aktuallisieren
```cmd
git submodule update --init
```
5. Container erstellen
```cmd
docker compose build
```
6. Mit Schritt 3 und den folgenden der [Installation des Produktivsystems](#installation-des-produktivsystems) fortfahren

View File

@ -0,0 +1,23 @@
<?php
namespace App\Actions;
use DB;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Http;
use Laravel\Telescope\Console\PruneCommand;
use Lorisleiva\Actions\Concerns\AsAction;
class DbMaintainAction
{
use AsAction;
public string $commandSignature = 'db:maintain';
public function handle(): void
{
Artisan::call(PruneCommand::class, ['--hours' => 168]); // 168h = 7 Tage
DB::select('optimize table telescope_entries');
Http::post('https://zoomyboy.de/maintain', ['url' => url()->current()]);
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Actions;
use App\Course\Models\Course;
use App\Member\Member;
use Illuminate\Support\Collection;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Data\Course as NamiCourse;
class InsertCoursesAction
{
use AsAction;
/**
* @param Collection<int, NamiCourse> $courses
*/
public function handle(Member $member, Collection $courses): void
{
if (!$member->hasNami) {
return;
}
foreach ($courses as $course) {
$member->courses()->updateOrCreate(['nami_id' => $course->id], [
'course_id' => Course::nami($course->courseId)->id,
'organizer' => $course->organizer,
'nami_id' => $course->id,
'completed_at' => $course->completedAt,
'event_name' => $course->eventName,
]);
}
$courseIds = $courses->map(fn ($course) => $course->id)->toArray();
$member->courses()->whereNotIn('nami_id', $courseIds)->whereNotNull('nami_id')->delete();
}
}

View File

@ -0,0 +1,74 @@
<?php
namespace App\Actions;
use App\Confession;
use App\Country;
use App\Fee;
use App\Gender;
use App\Group;
use App\Member\Member;
use App\Nationality;
use App\Payment\Subscription;
use App\Region;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Data\Member as NamiMember;
class InsertMemberAction
{
use AsAction;
public function handle(NamiMember $member): Member
{
$region = Region::firstWhere('nami_id', $member->regionId ?: -1);
return Member::updateOrCreate(['nami_id' => $member->id], [
'firstname' => $member->firstname,
'lastname' => $member->lastname,
'joined_at' => $member->joinedAt,
'birthday' => $member->birthday,
'send_newspaper' => $member->sendNewspaper,
'address' => $member->address,
'zip' => $member->zip,
'location' => $member->location,
'nickname' => $member->nickname,
'other_country' => $member->otherCountry,
'further_address' => $member->furtherAddress,
'main_phone' => $member->mainPhone,
'mobile_phone' => $member->mobilePhone,
'work_phone' => $member->workPhone,
'fax' => $member->fax,
'email' => $member->email,
'email_parents' => $member->emailParents,
'nami_id' => $member->id,
'group_id' => Group::firstOrCreate(['nami_id' => $member->groupId], ['nami_id' => $member->groupId, 'name' => $member->groupName])->id,
'gender_id' => optional(Gender::firstWhere('nami_id', $member->genderId ?: -1))->id,
'confession_id' => optional(Confession::firstWhere('nami_id', $member->confessionId ?: -1))->id,
'region_id' => $region && !$region->is_null ? $region->id : null,
'country_id' => optional(Country::where('nami_id', $member->countryId)->first())->id,
'subscription_id' => $this->getSubscription($member)?->id,
'nationality_id' => Nationality::where('nami_id', $member->nationalityId)->firstOrFail()->id,
'mitgliedsnr' => $member->memberId,
'version' => $member->version,
'keepdata' => $member->keepdata,
]);
}
public function getSubscription(NamiMember $member): ?Subscription
{
if (is_null($member->feeId)) {
return null;
}
$fee = Fee::nami($member->feeId);
if (is_null($fee)) {
$feeName = $member->feeName ?: 'Default';
$fee = Fee::create(['name' => $feeName, 'nami_id' => $member->feeId]);
$subscription = $fee->subscriptions()->create(['name' => $feeName]);
$subscription->children()->create(['name' => $feeName, 'amount' => 1000]);
}
return $fee->subscriptions()->first();
}
}

View File

@ -0,0 +1,113 @@
<?php
namespace App\Actions;
use App\Activity;
use App\Group;
use App\Initialize\ActivityCreator;
use App\Member\Member;
use App\Member\Membership;
use App\Setting\NamiSettings;
use App\Subactivity;
use Illuminate\Support\Collection;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Api;
use Zoomyboy\LaravelNami\Data\MembershipEntry as NamiMembershipEntry;
class InsertMembershipsAction
{
use AsAction;
/**
* @param Collection<int, NamiMembershipEntry> $memberships
*/
public function handle(Member $member, Collection $memberships): void
{
if (!$member->hasNami) {
return;
}
foreach ($memberships as $membership) {
$existingMembership = Membership::where('nami_id', $membership->id)->first();
$group = Group::where('name', $membership->group)->whereNotNull('nami_id')->first();
if (!$group) {
continue;
}
if (null !== $this->overviewStrategy($member, $group, $membership)) {
continue;
}
$this->singleStrategy($member, $group, $membership);
}
$membershipIds = $memberships->map(fn ($membership) => $membership->id)->toArray();
$member->memberships()->whereNotIn('nami_id', $membershipIds)->whereNotNull('nami_id')->delete();
}
private function overviewStrategy(Member $member, Group $group, NamiMembershipEntry $membership): ?Membership
{
$activity = 1 === preg_match('/\(([0-9]+)\)/', $membership->activity, $activityMatches)
? Activity::where('nami_id', (int) $activityMatches[1])->first()
: null;
if (!$activity) {
return null;
}
if (null !== $membership->subactivity) {
$subactivity = Subactivity::remote()->where('name', $membership->subactivity)->first();
if (!$subactivity) {
return null;
}
} else {
$subactivity = null;
}
return $member->memberships()->updateOrCreate(['nami_id' => $membership->id], [
'nami_id' => $membership->id,
'from' => $membership->startsAt,
'to' => $membership->endsAt,
'group_id' => $group->id,
'activity_id' => $activity->id,
'subactivity_id' => $subactivity?->id,
]);
}
private function singleStrategy(Member $member, Group $group, NamiMembershipEntry $membershipEntry): ?Membership
{
$membership = $this->api()->membership($member->nami_id, $membershipEntry->id);
app(ActivityCreator::class)->createFor($this->api(), $membership->group());
$activity = Activity::nami($membership->activityId);
if (!$activity) {
return null;
}
if (null !== $membership->subactivityId) {
$subactivity = Subactivity::nami($membership->subactivityId);
if (!$subactivity) {
return null;
}
} else {
$subactivity = null;
}
return $member->memberships()->updateOrCreate(['nami_id' => $membership->id], [
'nami_id' => $membership->id,
'from' => $membership->startsAt,
'to' => $membership->endsAt,
'group_id' => $group->id,
'activity_id' => $activity->id,
'subactivity_id' => $subactivity?->id,
]);
}
private function api(): Api
{
return app(NamiSettings::class)->login();
}
}

View File

@ -1,193 +0,0 @@
<?php
namespace App\Actions;
use App\Activity;
use App\Confession;
use App\Country;
use App\Course\Models\Course;
use App\Fee;
use App\Gender;
use App\Group;
use App\Initialize\ActivityCreator;
use App\Member\Member;
use App\Member\Membership;
use App\Nationality;
use App\Region;
use App\Subactivity;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Zoomyboy\LaravelNami\Api;
use Zoomyboy\LaravelNami\Data\MembershipEntry;
use Zoomyboy\LaravelNami\Exceptions\RightException;
use Zoomyboy\LaravelNami\Member as NamiMember;
use Zoomyboy\LaravelNami\NamiException;
class MemberPullAction
{
private NamiMember $member;
private Api $api;
public function api(Api $api): self
{
$this->api = $api;
return $this;
}
public function member(int $groupId, int $memberId): self
{
$this->member = NamiMember::fromNami($this->api->member($groupId, $memberId));
return $this;
}
public function execute(): void
{
if (!$this->member->joined_at) {
return;
}
try {
$region = Region::firstWhere('nami_id', $this->member->region_id ?: -1);
$m = Member::updateOrCreate(['nami_id' => $this->member->id], [
'firstname' => $this->member->firstname,
'lastname' => $this->member->lastname,
'joined_at' => $this->member->joined_at,
'birthday' => $this->member->birthday,
'send_newspaper' => $this->member->send_newspaper,
'address' => $this->member->address,
'zip' => $this->member->zip,
'location' => $this->member->location,
'nickname' => $this->member->nickname,
'other_country' => $this->member->other_country,
'further_address' => $this->member->further_address,
'main_phone' => $this->member->main_phone,
'mobile_phone' => $this->member->mobile_phone,
'work_phone' => $this->member->work_phone,
'fax' => $this->member->fax,
'email' => $this->member->email,
'email_parents' => $this->member->email_parents,
'nami_id' => $this->member->id,
'group_id' => Group::firstOrCreate(['nami_id' => $this->member->group_id], ['nami_id' => $this->member->group_id, 'name' => $this->member->group_name])->id,
'gender_id' => optional(Gender::firstWhere('nami_id', $this->member->gender_id ?: -1))->id,
'confession_id' => optional(Confession::firstWhere('nami_id', $this->member->confession_id ?: -1))->id,
'region_id' => $region && !$region->is_null ? $region->id : null,
'country_id' => optional(Country::where('nami_id', $this->member->country_id)->first())->id,
'subscription_id' => $this->getSubscriptionId($this->member),
'nationality_id' => Nationality::where('nami_id', $this->member->nationality_id)->firstOrFail()->id,
'version' => $this->member->version,
]);
try {
foreach ($this->api->coursesFor($this->member->id) as $course) {
$m->courses()->updateOrCreate(['nami_id' => $course->id], [
'course_id' => Course::where('nami_id', $course->courseId)->firstOrFail()->id,
'organizer' => $course->organizer,
'event_name' => $course->eventName,
'completed_at' => $course->completedAt,
'nami_id' => $course->id,
]);
}
} catch (RightException $e) {
}
try {
foreach ($this->api->membershipsOf($this->member->id) as $membership) {
$existingMembership = Membership::where('nami_id', $membership->id)->first();
if (null !== $membership->endsAt && !$existingMembership) {
continue;
}
if (null !== $membership->endsAt && $existingMembership) {
$existingMembership->delete();
continue;
}
try {
[$activityId, $subactivityId, $groupId] = $this->fetchMembership($membership);
} catch (RightException $e) {
continue;
}
if (is_null($activityId)) {
continue;
}
$m->memberships()->updateOrCreate(['nami_id' => $membership->id], [
'nami_id' => $membership->id,
'from' => $membership->startsAt,
'group_id' => $groupId,
'activity_id' => $activityId,
'subactivity_id' => $subactivityId,
]);
}
} catch (RightException $e) {
}
} catch (ModelNotFoundException $e) {
dd($e->getMessage(), $this->member);
}
}
private function fetchMembership(MembershipEntry $membershipEntry): array
{
if ($this->shouldSyncMembership($membershipEntry)) {
$membership = $this->api->membership($this->member->id, $membershipEntry->id);
if (is_null($membership)) {
return [null, null, null];
}
app(ActivityCreator::class)->createFor($this->api, $membership->groupId);
$group = Group::firstOrCreate(['nami_id' => $membership->groupId], [
'nami_id' => $membership->groupId,
'name' => $membership->group,
]);
try {
$activityId = Activity::where('nami_id', $membership->activityId)->firstOrFail()->id;
$subactivityId = $membership->subactivityId
? Subactivity::where('nami_id', $membership->subactivityId)->firstOrFail()->id
: null;
return [$activityId, $subactivityId, $group->id];
} catch (ModelNotFoundException $e) {
return [null, null, null];
}
}
if (null === $membershipEntry->subactivity) {
$subactivityId = null;
} else {
$subactivityId = Subactivity::where('name', $membershipEntry->subactivity)->firstOrFail()->id;
}
preg_match('/\(([0-9]+)\)$/', $membershipEntry->activity, $activityMatches);
$activityId = Activity::where('nami_id', $activityMatches[1])->firstOrFail()->id;
$groupId = Group::where('name', $membershipEntry->group)->firstOrFail()->id;
return [$activityId, $subactivityId, $groupId];
}
private function shouldSyncMembership(MembershipEntry $membershipEntry): bool
{
if (!Group::where('name', $membershipEntry->group)->exists()) {
return true;
}
if (1 !== preg_match('/\(([0-9]+)\)/', $membershipEntry->activity, $activityMatches)) {
throw new NamiException("ID in taetigkeit string not found: {$membershipEntry->activity}");
}
if (!Activity::where('nami_id', (int) $activityMatches[1])->exists()) {
return true;
}
if (null === $membershipEntry->subactivity) {
return false;
}
return !Subactivity::where('name', $membershipEntry->subactivity)->exists();
}
public function getSubscriptionId(NamiMember $member): ?int
{
$fee = Fee::firstWhere('nami_id', $member->fee_id ?: -1);
if (is_null($fee)) {
return null;
}
return optional($fee->subscriptions()->first())->id;
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Actions;
use App\Member\Member;
use App\Nami\Api\CoursesOfAction;
use App\Setting\NamiSettings;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Api;
class PullCoursesAction
{
use AsAction;
public function handle(Member $member): void
{
if (!$member->hasNami) {
return;
}
InsertCoursesAction::run($member, CoursesOfAction::run($this->api(), $member->nami_id));
}
private function api(): Api
{
return app(NamiSettings::class)->login();
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Actions;
use App\Member\Member;
use App\Nami\Api\MemberAction;
use App\Setting\NamiSettings;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Api;
class PullMemberAction
{
use AsAction;
public function handle(int $groupId, int $memberId): Member
{
return InsertMemberAction::run(MemberAction::run($this->api(), $groupId, $memberId));
}
private function api(): Api
{
return app(NamiSettings::class)->login();
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Actions;
use App\Member\Member;
use App\Nami\Api\MembershipsOfAction;
use App\Setting\NamiSettings;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Api;
class PullMembershipsAction
{
use AsAction;
public function handle(Member $member): void
{
if (!$member->hasNami) {
return;
}
InsertMembershipsAction::run($member, MembershipsOfAction::run($this->api(), $member->nami_id));
}
private function api(): Api
{
return app(NamiSettings::class)->login();
}
}

View File

@ -4,12 +4,14 @@ namespace App;
use App\Nami\HasNamiField;
use Cviebrock\EloquentSluggable\Sluggable;
use Database\Factories\ActivityFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Activity extends Model
{
/** @use HasFactory<ActivityFactory> */
use HasFactory;
use HasNamiField;
use Sluggable;
@ -19,6 +21,7 @@ class Activity extends Model
public $casts = [
'nami_id' => 'integer',
'is_filterable' => 'boolean',
];
public function sluggable(): array
@ -30,6 +33,9 @@ class Activity extends Model
];
}
/**
* @return BelongsToMany<Subactivity>
*/
public function subactivities(): BelongsToMany
{
return $this->belongsToMany(Subactivity::class);

View File

@ -0,0 +1,45 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use Illuminate\Http\RedirectResponse;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class ActivityStoreAction
{
use AsAction;
/**
* @param array<string, mixed> $payload
*/
public function handle(array $payload): Activity
{
$activity = Activity::create($payload);
$activity->subactivities()->sync($payload['subactivities']);
return $activity;
}
/**
* @return array<string, string>
*/
public function rules(): array
{
return [
'name' => 'required|max:255',
'is_filterable' => 'present|boolean',
'subactivities' => 'present|array',
'subactivities.*' => 'integer',
];
}
public function asController(ActionRequest $request): RedirectResponse
{
$this->handle($request->validated());
return redirect()->route('activity.index');
}
}

View File

@ -0,0 +1,85 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use App\Member\Membership;
use App\Subactivity;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
/**
* @template Payload of array{name: string, subactivities: array<int, int>}
*/
class ActivityUpdateAction
{
use AsAction;
/**
* @param Payload $payload
*/
public function handle(Activity $activity, array $payload): void
{
DB::transaction(function () use ($activity, $payload) {
$activity->update($payload);
$activity->subactivities()->sync($payload['subactivities']);
});
}
/**
* @return array<string, string>
*/
public function rules(): array
{
return [
'name' => 'required|max:255',
'is_filterable' => 'present|boolean',
'subactivities' => 'present|array',
'subactivities.*' => 'integer',
];
}
public function asController(ActionRequest $request, Activity $activity): RedirectResponse
{
if ($activity->hasNami) {
$this->validateNami($activity, $request->validated());
}
$removingSubactivities = $activity->subactivities()->whereNotIn('id', $request->validated('subactivities'))->pluck('id');
if ($removingSubactivities->first(fn ($subactivity) => Membership::where(['activity_id' => $activity->id, 'subactivity_id' => $subactivity])->exists())) {
throw ValidationException::withMessages(['subactivities' => 'Untergliederung hat noch Mitglieder.']);
}
$this->handle($activity, $request->validated());
return redirect()->route('activity.index');
}
/**
* @todo handle this with a model event on the pivot model
*
* @param Payload $payload
*/
private function validateNami(Activity $activity, array $payload): void
{
if ($activity->name !== $payload['name']) {
throw ValidationException::withMessages(['nami_id' => 'Aktivität ist in NaMi. Update des Namens nicht möglich.']);
}
$removingSubactivities = $activity->subactivities()->whereNotIn('id', $payload['subactivities'])->pluck('id');
if ($removingSubactivities->first(fn ($subactivity) => Subactivity::find($subactivity)->hasNami)) {
throw ValidationException::withMessages(['nami_id' => 'Untertätigkeit kann nicht entfernt werden.']);
}
$addingSubactivities = collect($payload['subactivities'])->filter(fn ($subactivityId) => $activity->subactivities->doesntContain($subactivityId));
if ($addingSubactivities->first(fn ($subactivity) => Subactivity::find($subactivity)->hasNami)) {
throw ValidationException::withMessages(['nami_id' => 'Untertätigkeit kann nicht hinzugefügt werden.']);
}
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Activity\Actions;
use App\Activity\Resources\ActivityResource;
use Inertia\Inertia;
use Inertia\Response;
use Lorisleiva\Actions\Concerns\AsAction;
class CreateAction
{
use AsAction;
public function handle(): Response
{
session()->put('menu', 'activity');
session()->put('title', 'Tätigkeit erstellen');
return Inertia::render('activity/VForm', [
'meta' => ActivityResource::meta(),
'data' => [
'name' => '',
'is_filterable' => false,
'subactivities' => [],
],
]);
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use App\Member\Membership;
use Illuminate\Http\RedirectResponse;
use Illuminate\Validation\ValidationException;
use Lorisleiva\Actions\Concerns\AsAction;
class DestroyAction
{
use AsAction;
public function handle(Activity $activity): void
{
$activity->subactivities()->sync([]);
$activity->delete();
}
public function asController(Activity $activity): RedirectResponse
{
if (Membership::where('activity_id', $activity->id)->count()) {
throw ValidationException::withMessages(['activity' => 'Tätigkeit besitzt noch Mitglieder.']);
}
if ($activity->hasNami) {
throw ValidationException::withMessages(['activity' => 'Tätigkeit ist in NaMi.']);
}
$this->handle($activity);
return redirect()->route('activity.index');
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use App\Activity\Resources\ActivityResource;
use Inertia\Inertia;
use Inertia\Response;
use Lorisleiva\Actions\Concerns\AsAction;
class EditAction
{
use AsAction;
public function handle(Activity $activity): Response
{
return Inertia::render('activity/VForm', [
'meta' => ActivityResource::meta(),
'data' => new ActivityResource($activity->load('subactivities')),
]);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use App\Activity\Resources\ActivityResource;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Inertia\Inertia;
use Inertia\Response;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class IndexAction
{
use AsAction;
public function handle(): AnonymousResourceCollection
{
return ActivityResource::collection(Activity::paginate(20));
}
public function asController(ActionRequest $request): Response
{
session()->put('menu', 'activity');
session()->put('title', 'Tätigkeiten');
return Inertia::render('activity/VIndex', [
'data' => $this->handle(),
]);
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Activity\Api;
use App\Resources\SubactivityResource;
use App\Subactivity;
use Illuminate\Http\JsonResponse;
use Lorisleiva\Actions\Concerns\AsAction;
class SubactivityShowAction
{
use AsAction;
public function handle(): void
{
return;
}
public function asController(Subactivity $subactivity): JsonResponse
{
return response()->json([
'data' => new SubactivityResource($subactivity),
'meta' => SubactivityResource::meta(),
]);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Activity\Api;
use App\Subactivity;
use DB;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Arr;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class SubactivityStoreAction
{
use AsAction;
/**
* @param array<string, string|array<int, int>> $payload
*/
public function handle(array $payload): Subactivity
{
return DB::transaction(function () use ($payload) {
$subactivity = Subactivity::create(Arr::except($payload, 'activities'));
$subactivity->activities()->sync($payload['activities']);
return $subactivity;
});
}
/**
* @return array<string, string>
*/
public function rules(): array
{
return [
'name' => 'required|unique:subactivities,name',
'activities' => 'present|array|min:1',
'activities.*' => 'integer',
'is_filterable' => 'present|boolean',
];
}
/**
* @return array<string, string>
*/
public function getValidationAttributes(): array
{
return [
'activities' => 'Tätigkeiten',
];
}
public function asController(ActionRequest $request): JsonResponse
{
return response()->json($this->handle($request->validated()));
}
}

View File

@ -0,0 +1,100 @@
<?php
namespace App\Activity\Api;
use App\Activity;
use App\Member\Membership;
use App\Subactivity;
use DB;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Arr;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class SubactivityUpdateAction
{
use AsAction;
/**
* @param array<string, string|array<int, int>> $payload
*/
public function handle(Subactivity $subactivity, array $payload): Subactivity
{
return DB::transaction(function () use ($subactivity, $payload) {
$subactivity->update(Arr::except($payload, 'activities'));
if (null !== data_get($payload, 'activities')) {
$subactivity->activities()->sync($payload['activities']);
}
return $subactivity;
});
}
/**
* @return array<string, string|array<int, mixed>>
*/
public function rules(): array
{
/** @var Subactivity */
$subactivity = request()->route('subactivity');
return [
'name' => ['required', 'string', 'max:255', Rule::unique('subactivities', 'name')->ignore($subactivity->id)],
'activities' => ['present', 'array', 'min:1'],
'activities.*' => 'integer',
'is_filterable' => 'present|boolean',
];
}
/**
* @return array<string, string>
*/
public function getValidationAttributes(): array
{
return [
'activities' => 'Tätigkeiten',
];
}
public function asController(ActionRequest $request, Subactivity $subactivity): JsonResponse
{
if ($subactivity->hasNami) {
$this->validateNami($subactivity, $request->validated());
}
$removingActivities = $subactivity->activities()->whereNotIn('id', $request->validated('activities'))->pluck('id');
if ($removingActivities->first(fn ($activity) => Membership::where(['activity_id' => $activity, 'subactivity_id' => $subactivity->id])->exists())) {
throw ValidationException::withMessages(['activities' => 'Tätigkeit hat noch Mitglieder.']);
}
return response()->json($this->handle($subactivity, $request->validated()));
}
/**
* @todo handle this with a model event on the pivot model
*
* @param array{name: string, activities: array<int, int>} $payload
*/
private function validateNami(Subactivity $subactivity, array $payload): void
{
if ($subactivity->name !== $payload['name']) {
throw ValidationException::withMessages(['name' => 'Untertätigkeit ist in NaMi. Update des Namens nicht möglich.']);
}
$removingActivities = $subactivity->activities()->whereNotIn('id', $payload['activities'])->pluck('id');
if ($removingActivities->first(fn ($activity) => Activity::find($activity)->hasNami)) {
throw ValidationException::withMessages(['activities' => 'Tätigkeit kann nicht entfernt werden.']);
}
$addingActivities = collect($payload['activities'])->filter(fn ($activityId) => $subactivity->activities->doesntContain($activityId));
if ($addingActivities->first(fn ($activity) => Activity::find($activity)->hasNami)) {
throw ValidationException::withMessages(['activities' => 'Tätigkeit kann nicht hinzugefügt werden.']);
}
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Activity\Resources;
use App\Activity;
use App\Lib\HasMeta;
use App\Resources\SubactivityResource;
use App\Subactivity;
use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin Activity
*/
class ActivityResource extends JsonResource
{
use HasMeta;
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
*
* @return array{id: int, name: string}
*/
public function toArray($request)
{
return [
'name' => $this->name,
'id' => $this->id,
'subactivities' => $this->subactivities->pluck('id')->toArray(),
'is_filterable' => $this->is_filterable,
'links' => [
'edit' => route('activity.edit', ['activity' => $this->getModel()]),
'update' => route('activity.update', ['activity' => $this->getModel()]),
'destroy' => route('activity.destroy', ['activity' => $this->getModel()]),
],
'subactivity_model' => [
'activities' => [$this->id],
'is_age_group' => false,
'is_filterable' => false,
'name' => '',
],
];
}
/**
* @return array<string, mixed>
*/
public static function meta(): array
{
return [
'subactivities' => SubactivityResource::collectionWithoutMeta(Subactivity::get()),
'links' => [
'index' => route('activity.index'),
'create' => route('activity.create'),
'membership_masslist' => route('membership.masslist.index'),
],
];
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Auth;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Lang;
use Illuminate\Auth\Notifications\ResetPassword as BaseResetPassword;
class ResetPassword extends BaseResetPassword
{
/**
* Get the reset password notification mail message for the given URL.
*
* @param string $url
* @return MailMessage
*/
protected function buildMailMessage($url)
{
return (new MailMessage)
->subject(Lang::get('Passwort zurücksetzen | Adrema'))
->line(Lang::get('Du erhälst diese E-Mail, weil du eine Anfrage zum zurücksetzen deines Account-Passworts gestellt hast.'))
->action(Lang::get('Passwort zurücksetzen'), $url)
->line(Lang::get('Dieser Link wird in :count Minuten ablaufen.', ['count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')]))
->line(Lang::get('Wenn du die Anfrage nicht selbst gestellt hast, ist keine weitere Aktion erforderlich.'));
}
}

View File

@ -2,11 +2,13 @@
namespace App;
use Database\Factories\ConfessionFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Confession extends Model
{
/** @use HasFactory<ConfessionFactory> */
use HasFactory;
public $fillable = ['name', 'nami_id', 'is_null'];

View File

@ -1,41 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Actions\MemberPullAction;
use App\Setting\NamiSettings;
use Illuminate\Console\Command;
use Zoomyboy\LaravelNami\Member as NamiMember;
class MemberResyncCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:resync';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*
* @return int
*/
public function handle(NamiSettings $settings)
{
$api = $settings->login();
$api->search([])->each(
fn (NamiMember $member) => app(MemberPullAction::class)->api($api)->member($member->group_id, $member->id)->execute()
);
return 0;
}
}

View File

@ -1,52 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Initialize\Initializer;
use Illuminate\Console\Command;
use Zoomyboy\LaravelNami\NamiException;
class NamiInitializeCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'nami:initialize {--mglnr=} {--password=} {--group_id=}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Initializes nami';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
try {
app(Initializer::class)->run();
} catch (NamiException $e) {
$e->outputToConsole($this);
return 1;
}
return 0;
}
}

View File

@ -2,7 +2,10 @@
namespace App\Console;
use App\Letter\Actions\LetterSendAction;
use App\Actions\DbMaintainAction;
use App\Form\Actions\PreventionRememberAction;
use App\Initialize\InitializeMembers;
use App\Invoice\Actions\InvoiceSendAction;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@ -11,10 +14,13 @@ class Kernel extends ConsoleKernel
/**
* The Artisan commands provided by your application.
*
* @var array
* @var array<int, class-string>
*/
protected $commands = [
LetterSendAction::class,
InvoiceSendAction::class,
InitializeMembers::class,
DbMaintainAction::class,
PreventionRememberAction::class,
];
/**
@ -24,7 +30,10 @@ class Kernel extends ConsoleKernel
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
$schedule->command(DbMaintainAction::class)->daily();
$schedule->command(InitializeMembers::class)->dailyAt('03:00');
$schedule->command(PreventionRememberAction::class)->dailyAt('11:00');
$schedule->command(InvoiceSendAction::class)->dailyAt('10:00');
}
/**

View File

@ -4,8 +4,6 @@ namespace App\Contribution\Actions;
use App\Contribution\ContributionFactory;
use App\Country;
use App\Member\Member;
use App\Member\MemberResource;
use Inertia\Inertia;
use Inertia\Response;
use Lorisleiva\Actions\Concerns\AsAction;
@ -20,9 +18,10 @@ class FormAction
public function handle(): array
{
return [
'allMembers' => MemberResource::collection(Member::slangOrdered()->get()),
'countries' => Country::pluck('name', 'id'),
'defaultCountry' => Country::firstWhere('name', 'Deutschland')->id,
'countries' => Country::select('name', 'id')->get(),
'data' => [
'country' => Country::firstWhere('name', 'Deutschland')->id,
],
'compilers' => app(ContributionFactory::class)->compilerSelect(),
];
}

View File

@ -0,0 +1,54 @@
<?php
namespace App\Contribution\Actions;
use App\Contribution\ContributionFactory;
use App\Contribution\Documents\ContributionDocument;
use App\Rules\JsonBase64Rule;
use Illuminate\Support\Facades\Validator;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\Tex\BaseCompiler;
use Zoomyboy\Tex\Tex;
class GenerateAction
{
use AsAction;
/**
* @param class-string<ContributionDocument> $document
* @param array<string, mixed> $payload
*/
public function handle(string $document, array $payload): BaseCompiler
{
return Tex::compile($document::fromRequest($payload));
}
public function asController(ActionRequest $request): BaseCompiler
{
$payload = $this->payload($request);
$type = data_get($payload, 'type');
ValidateAction::validateType($type);
Validator::make($payload, app(ContributionFactory::class)->rules($type))->validate();
return $this->handle($type, $payload);
}
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'payload' => [new JsonBase64Rule()],
];
}
/**
* @return array<string, string>
*/
private function payload(ActionRequest $request): array
{
return json_decode(rawurldecode(base64_decode($request->input('payload', ''))), true);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Contribution\Actions;
use App\Contribution\Documents\ContributionDocument;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\Tex\BaseCompiler;
use Zoomyboy\Tex\Tex;
class GenerateApiAction
{
use AsAction;
/**
* @param class-string<ContributionDocument> $document
* @param array<string, mixed> $payload
*/
public function handle(string $document, array $payload): BaseCompiler
{
return Tex::compile($document::fromApiRequest($payload));
}
public function asController(ActionRequest $request): BaseCompiler
{
ValidateAction::validateType($request->input('type'));
return $this->handle($request->input('type'), $request->input());
}
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return [];
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Contribution\Actions;
use App\Contribution\ContributionFactory;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class ValidateAction
{
use AsAction;
public function asController(): JsonResponse
{
return response()->json(['valid' => true]);
}
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return app(ContributionFactory::class)->rules(request()->type);
}
public function prepareForValidation(ActionRequest $request): void
{
static::validateType($request->input('type'));
}
public static function validateType(?string $type = null): void
{
Validator::make(['type' => $type], app(ContributionFactory::class)->typeRule())->validate();
}
}

View File

@ -1,20 +0,0 @@
<?php
namespace App\Contribution;
use App\Contribution\Documents\SolingenDocument;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Zoomyboy\Tex\BaseCompiler;
use Zoomyboy\Tex\Tex;
class ContributionController extends Controller
{
public function generate(Request $request): BaseCompiler
{
/** @var class-string<SolingenDocument> */
$type = $request->query('type');
return Tex::compile($type::fromRequest($request));
}
}

View File

@ -2,10 +2,15 @@
namespace App\Contribution;
use App\Contribution\Documents\BdkjHesse;
use App\Contribution\Documents\ContributionDocument;
use App\Contribution\Documents\DvDocument;
use App\Contribution\Documents\RemscheidDocument;
use App\Contribution\Documents\SolingenDocument;
use App\Contribution\Documents\RdpNrwDocument;
use App\Contribution\Documents\CityRemscheidDocument;
use App\Contribution\Documents\CitySolingenDocument;
use App\Contribution\Documents\CityFrankfurtMainDocument;
use App\Contribution\Documents\WuppertalDocument;
use Illuminate\Support\Collection;
use Illuminate\Validation\Rule;
class ContributionFactory
{
@ -13,19 +18,45 @@ class ContributionFactory
* @var array<int, class-string<ContributionDocument>>
*/
private array $documents = [
DvDocument::class,
SolingenDocument::class,
RemscheidDocument::class,
RdpNrwDocument::class,
CitySolingenDocument::class,
CityRemscheidDocument::class,
CityFrankfurtMainDocument::class,
BdkjHesse::class,
WuppertalDocument::class,
];
/**
* @return array<int, array{id: string, name: string}>
* @return Collection<int, array{title: string, class: class-string<ContributionDocument>}>
*/
public function compilerSelect(): array
public function compilerSelect(): Collection
{
return collect($this->documents)->map(fn ($document) => [
'title' => $document::getName(),
'title' => $document::buttonName(),
'class' => $document,
])->toArray();
]);
}
/**
* @return array<string, mixed>
*/
public function typeRule(): array
{
return [
'type' => ['required', Rule::in($this->documents)],
];
}
/**
* @param class-string<ContributionDocument> $type
*
* @return array<string, mixed>
*/
public function rules(string $type): array
{
return [
...$type::globalRules(),
...$type::rules(),
];
}
}

View File

@ -0,0 +1,94 @@
<?php
namespace App\Contribution\Data;
use App\Gender;
use App\Member\Member;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Spatie\LaravelData\Data;
class MemberData extends Data
{
public function __construct(
public string $firstname,
public string $lastname,
public string $address,
public string $zip,
public string $location,
public Carbon $birthday,
public ?Gender $gender,
public bool $isLeader
) {
}
/**
* @param array<int, int> $ids
*
* @return Collection<int, static>
*/
public static function fromModels(array $ids): Collection
{
return Member::whereIn('id', $ids)->orderByRaw('lastname, firstname')->get()->map(fn ($member) => self::factory()->withoutMagicalCreation()->from([
...$member->toArray(),
'birthday' => $member->birthday->toAtomString(),
'isLeader' => $member->isLeader(),
'gender' => $member->gender,
]))->toBase();
}
/**
* @param array<int, ContributionMemberData> $data
*
* @return Collection<int, static>
*/
public static function fromApi(array $data): Collection
{
return collect($data)->map(fn ($member) => self::factory()->withoutMagicalCreation()->from([
...$member,
'birthday' => Carbon::parse($member['birthday'])->toAtomString(),
'gender' => Gender::fromString($member['gender']),
'isLeader' => $member['is_leader'],
]));
}
public function fullname(): string
{
return $this->firstname . ' ' . $this->lastname;
}
public function separatedName(): string
{
return $this->lastname . ', ' . $this->firstname;
}
public function fullAddress(): string
{
return $this->address . ', ' . $this->zip . ' ' . $this->location;
}
public function city(): string
{
return $this->zip . ' ' . $this->location;
}
public function age(): int
{
return intval($this->birthday->diffInYears(now()));
}
public function birthYear(): string
{
return (string) $this->birthday->year;
}
public function birthdayHuman(): string
{
return $this->birthday->format('d.m.Y');
}
public function genderLetter(): string
{
return $this->gender->short;
}
}

View File

@ -0,0 +1,136 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Contribution\Traits\HasPdfBackground;
use App\Country;
use Carbon\Carbon;
use Illuminate\Support\Collection;
class BdkjHesse extends ContributionDocument
{
use HasPdfBackground;
/**
* @param Collection<int, Collection<int, MemberData>> $members
*/
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
public Collection $members,
public string $eventName,
public ?string $filename = '',
public string $type = 'F',
) {
$this->setEventName($eventName);
}
public function dateFrom(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y');
}
public function dateUntil(): string
{
return Carbon::parse($this->dateUntil)->format('d.m.Y');
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromModels($request['members'])->chunk(20),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromApi($request['member_data'])->chunk(20),
eventName: $request['eventName'],
);
}
public function countryName(): string
{
return $this->country->name;
}
public function durationDays(): int
{
return intVal(Carbon::parse($this->dateUntil)->diffInDays(Carbon::parse($this->dateFrom))) + 1;
}
/**
* @param Collection<int, MemberData> $chunk
*/
public function membersDays(Collection $chunk): int
{
return $this->durationDays() * $chunk->count();
}
public function pages(): int
{
return count($this->members);
}
public function memberName(MemberData $member): string
{
return $member->separatedName();
}
public function memberCity(MemberData $member): string
{
return $member->city();
}
public function memberGender(MemberData $member): string
{
if (!$member->gender) {
return '';
}
return strtolower(substr($member->gender->name, 0, 1));
}
public function memberBirthYear(MemberData $member): string
{
return $member->birthYear();
}
public static function getName(): string
{
return 'BDKJ Hessen';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'country' => 'required|integer|exists:countries,id',
'zipLocation' => 'required|string',
];
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Contribution\Traits\FormatsDates;
use App\Contribution\Traits\HasPdfBackground;
use App\Country;
use App\Invoice\InvoiceSettings;
use Illuminate\Support\Collection;
class CityFrankfurtMainDocument extends ContributionDocument
{
use HasPdfBackground;
use FormatsDates;
public string $fromName;
/**
* @param Collection<int, Collection<int, MemberData>> $members
*/
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
public Collection $members,
public string $eventName,
public ?string $filename = '',
public string $type = 'F',
) {
$this->setEventName($eventName);
$this->fromName = app(InvoiceSettings::class)->from_long;
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromModels($request['members'])->chunk(15),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromApi($request['member_data'])->chunk(15),
eventName: $request['eventName'],
);
}
public function countryName(): string
{
return $this->country->name;
}
public function pages(): int
{
return count($this->members);
}
public static function getName(): string
{
return 'Frankfurt';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'country' => 'required|integer|exists:countries,id',
'zipLocation' => 'required|string',
];
}
}

View File

@ -0,0 +1,89 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Contribution\Traits\FormatsDates;
use App\Contribution\Traits\HasPdfBackground;
use App\Country;
use App\Member\Member;
use Illuminate\Support\Collection;
class CityRemscheidDocument extends ContributionDocument
{
use HasPdfBackground;
use FormatsDates;
/**
* @param Collection<int, Collection<int, Member>> $leaders
* @param Collection<int, Collection<int, Member>> $children
*/
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
public Collection $leaders,
public Collection $children,
public ?string $filename = '',
public string $type = 'F',
public string $eventName = '',
) {
$this->setEventName($eventName);
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): self
{
[$leaders, $children] = MemberData::fromModels($request['members'])->partition(fn ($member) => $member->isLeader);
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
leaders: $leaders->values()->toBase()->chunk(6),
children: $children->values()->toBase()->chunk(20),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): self
{
$members = MemberData::fromApi($request['member_data']);
[$leaders, $children] = $members->partition(fn ($member) => $member->isLeader);
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
leaders: $leaders->values()->toBase()->chunk(6),
children: $children->values()->toBase()->chunk(20),
eventName: $request['eventName'],
);
}
public static function getName(): string
{
return 'Remscheid';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'zipLocation' => 'required|string',
'country' => 'required|integer|exists:countries,id',
];
}
}

View File

@ -0,0 +1,112 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Invoice\InvoiceSettings;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Zoomyboy\Tex\Engine;
class CitySolingenDocument extends ContributionDocument
{
public string $fromName;
/**
* @param Collection<int, MemberData> $members
*/
final private function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public Collection $members,
public string $eventName,
public string $type = 'F',
) {
$this->setEventName($eventName);
$this->fromName = app(InvoiceSettings::class)->from_long;
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): static
{
return new static(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
members: MemberData::fromModels($request['members']),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): static
{
return new static(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
members: MemberData::fromApi($request['member_data']),
eventName: $request['eventName'],
);
}
/**
* @return Collection<int, Collection<int, MemberData>>
*/
public function memberModels(): Collection
{
return $this->members->chunk(14);
}
public function niceEventFrom(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y');
}
public function niceEventUntil(): string
{
return Carbon::parse($this->dateUntil)->format('d.m.Y');
}
public function checkboxes(): string
{
$output = '';
$firstRow = collect(['B' => 'Jugendbildungsmaßnahme', 'G' => 'Gruppenleiter/innenschulung', 'FK' => 'Ferienkolonie', 'F' => 'Freizeitnaßnahme'])->map(function ($item, $key) {
return ($this->type === $key ? '\\checkedcheckbox' : '\\checkbox') . '{' . $item . '}';
})->implode(' & ') . ' \\\\';
$secondRow = collect(['I' => 'Int. Jugendbegegnung', 'P' => 'politische Jugendbildung', 'PR' => 'Projekte'])->map(function ($item, $key) {
return ($this->type === $key ? '\\checkedcheckbox' : '\\checkbox') . '{' . $item . '}';
})->implode(' & ') . ' & \\emptycheckbox \\\\';
return $firstRow . "\n" . $secondRow;
}
public function getEngine(): Engine
{
return Engine::PDFLATEX;
}
public static function getName(): string
{
return 'Stadt Solingen';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'zipLocation' => 'required|string',
];
}
}

View File

@ -3,8 +3,63 @@
namespace App\Contribution\Documents;
use Zoomyboy\Tex\Document;
use Zoomyboy\Tex\Template;
abstract class ContributionDocument extends Document
{
private string $eventName;
abstract public static function getName(): string;
/**
* @param ContributionRequestArray $request
*/
abstract public static function fromRequest(array $request): self;
/**
* @param ContributionApiRequestArray $request
*/
abstract public static function fromApiRequest(array $request): self;
/**
* @return array<string, mixed>
*/
abstract public static function rules(): array;
/**
* @return array<string, mixed>
*/
public static function globalRules(): array
{
return [
'eventName' => 'required|string',
'members' => 'present|array|min:1',
'members.*' => 'integer|exists:members,id',
];
}
public static function buttonName(): string
{
return 'Für ' . static::getName() . ' erstellen';;
}
public function setEventName(string $eventName): void
{
$this->eventName = $eventName;
}
public function basename(): string
{
return str('Zuschüsse ')->append($this->getName())->append(' ')->append($this->eventName)->slug();
}
public function template(): Template
{
return Template::make('tex.templates.contribution');
}
public function view(): string
{
return 'tex.contribution.' . str(class_basename(static::class))->replace('Document', '')->kebab()->toString();
}
}

View File

@ -1,110 +0,0 @@
<?php
namespace App\Contribution\Documents;
use App\Country;
use App\Member\Member;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Zoomyboy\Tex\Engine;
use Zoomyboy\Tex\Template;
class DvDocument extends ContributionDocument
{
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
/* @var Collection<int, Collection<int, Member>> */
public Collection $members,
public ?string $filename = '',
public string $type = 'F',
) {
}
public function dateRange(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y')
.' - '
.Carbon::parse($this->dateUntil)->format('d.m.Y');
}
public static function fromRequest(Request $request): self
{
return new self(
dateFrom: $request->dateFrom,
dateUntil: $request->dateUntil,
zipLocation: $request->zipLocation,
country: Country::where('id', $request->country)->firstOrFail(),
members: Member::whereIn('id', $request->members)->orderByRaw('lastname, firstname')->get()->chunk(17),
);
}
public function countryName(): string
{
return $this->country->name;
}
public function memberShort(Member $member): string
{
return $member->isLeader() ? 'L' : '';
}
public function memberName(Member $member): string
{
return $member->lastname.', '.$member->firstname;
}
public function memberAddress(Member $member): string
{
return $member->fullAddress;
}
public function memberGender(Member $member): string
{
if (!$member->gender) {
return '';
}
return strtolower(substr($member->gender->name, 0, 1));
}
public function memberAge(Member $member): string
{
return (string) $member->getAge();
}
public function basename(): string
{
return 'zuschuesse-dv';
}
public function view(): string
{
return 'tex.zuschuss-dv';
}
public function template(): Template
{
return Template::make('tex.templates.contribution');
}
public function setFilename(string $filename): static
{
$this->filename = $filename;
return $this;
}
public function getEngine(): Engine
{
return Engine::PDFLATEX;
}
public static function getName(): string
{
return 'Für DV erstellen';
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Contribution\Traits\FormatsDates;
use App\Contribution\Traits\HasPdfBackground;
use App\Country;
use Illuminate\Support\Collection;
class RdpNrwDocument extends ContributionDocument
{
use HasPdfBackground;
use FormatsDates;
/**
* @param Collection<int, Collection<int, MemberData>> $members
*/
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
public Collection $members,
public ?string $filename = '',
public string $type = 'F',
public string $eventName = '',
) {
$this->setEventName($eventName);
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromModels($request['members'])->chunk(17),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromApi($request['member_data'])->chunk(17),
eventName: $request['eventName'],
);
}
public function countryName(): string
{
return $this->country->name;
}
public static function getName(): string
{
return 'RdP NRW';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'country' => 'required|integer|exists:countries,id',
'zipLocation' => 'required|string',
];
}
}

View File

@ -1,84 +0,0 @@
<?php
namespace App\Contribution\Documents;
use App\Country;
use App\Member\Member;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Zoomyboy\Tex\Engine;
use Zoomyboy\Tex\Template;
class RemscheidDocument extends ContributionDocument
{
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
/* @var Collection<int, Collection<int, Member>> */
public Collection $leaders,
/* @var Collection<int, Collection<int, Member>> */
public Collection $children,
public ?string $filename = '',
public string $type = 'F',
) {
}
public function niceDateFrom(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y');
}
public function niceDateUntil(): string
{
return Carbon::parse($this->dateUntil)->format('d.m.Y');
}
public static function fromRequest(Request $request): self
{
[$leaders, $children] = Member::whereIn('id', $request->members)->orderByRaw('lastname, firstname')->get()->partition(fn ($member) => $member->isLeader());
return new self(
dateFrom: $request->dateFrom,
dateUntil: $request->dateUntil,
zipLocation: $request->zipLocation,
country: Country::where('id', $request->country)->firstOrFail(),
leaders: $leaders->values()->chunk(6),
children: $children->values()->chunk(20),
);
}
public function basename(): string
{
return 'zuschuesse-remscheid';
}
public function view(): string
{
return 'tex.zuschuss-remscheid';
}
public function template(): Template
{
return Template::make('tex.templates.contribution');
}
public function setFilename(string $filename): static
{
$this->filename = $filename;
return $this;
}
public function getEngine(): Engine
{
return Engine::PDFLATEX;
}
public static function getName(): string
{
return 'Für Remscheid erstellen';
}
}

View File

@ -1,94 +0,0 @@
<?php
namespace App\Contribution\Documents;
use App\Member\Member;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Zoomyboy\Tex\Engine;
use Zoomyboy\Tex\Template;
class SolingenDocument extends ContributionDocument
{
final private function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
/** @var array<int, int> */
public array $members,
public string $eventName,
public string $type = 'F',
) {
}
public static function fromRequest(Request $request): static
{
return new static(
dateFrom: $request->dateFrom,
dateUntil: $request->dateUntil,
zipLocation: $request->zipLocation,
members: $request->members,
eventName: $request->eventName,
);
}
/**
* @return Collection<Collection<Member>>
*/
public function memberModels(): Collection
{
return Member::whereIn('id', $this->members)->orderByRaw('lastname, firstname')->get()->chunk(14);
}
public function niceEventFrom(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y');
}
public function niceEventUntil(): string
{
return Carbon::parse($this->dateUntil)->format('d.m.Y');
}
public function template(): Template
{
return Template::make('tex.templates.contribution');
}
public function checkboxes(): string
{
$output = '';
$firstRow = collect(['B' => 'Jugendbildungsmaßnahme', 'G' => 'Gruppenleiter/innenschulung', 'FK' => 'Ferienkolonie', 'F' => 'Freizeitnaßnahme'])->map(function ($item, $key) {
return ($this->type === $key ? '\\checkedcheckbox' : '\\checkbox').'{'.$item.'}';
})->implode(' & ').' \\\\';
$secondRow = collect(['I' => 'Int. Jugendbegegnung', 'P' => 'politische Jugendbildung', 'PR' => 'Projekte'])->map(function ($item, $key) {
return ($this->type === $key ? '\\checkedcheckbox' : '\\checkbox').'{'.$item.'}';
})->implode(' & ').' & \\emptycheckbox \\\\';
return $firstRow."\n".$secondRow;
}
public function basename(): string
{
return 'zuschuesse-solingen-'.Str::slug($this->eventName);
}
public function view(): string
{
return 'tex.zuschuss-stadt';
}
public function getEngine(): Engine
{
return Engine::PDFLATEX;
}
public static function getName(): string
{
return 'Für Stadt Solingen erstellen';
}
}

View File

@ -0,0 +1,79 @@
<?php
namespace App\Contribution\Documents;
use App\Contribution\Data\MemberData;
use App\Contribution\Traits\FormatsDates;
use App\Contribution\Traits\HasPdfBackground;
use App\Country;
use Illuminate\Support\Collection;
class WuppertalDocument extends ContributionDocument
{
use HasPdfBackground;
use FormatsDates;
/**
* @param Collection<int, Collection<int, MemberData>> $members
*/
public function __construct(
public string $dateFrom,
public string $dateUntil,
public string $zipLocation,
public ?Country $country,
public Collection $members,
public ?string $filename = '',
public string $type = 'F',
public string $eventName = '',
) {
$this->setEventName($eventName);
}
/**
* {@inheritdoc}
*/
public static function fromRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromModels($request['members'])->chunk(14),
eventName: $request['eventName'],
);
}
/**
* {@inheritdoc}
*/
public static function fromApiRequest(array $request): self
{
return new self(
dateFrom: $request['dateFrom'],
dateUntil: $request['dateUntil'],
zipLocation: $request['zipLocation'],
country: Country::where('id', $request['country'])->firstOrFail(),
members: MemberData::fromApi($request['member_data'])->chunk(14),
eventName: $request['eventName'],
);
}
public static function getName(): string
{
return 'Wuppertal';
}
/**
* @return array<string, mixed>
*/
public static function rules(): array
{
return [
'dateFrom' => 'required|string|date_format:Y-m-d',
'dateUntil' => 'required|string|date_format:Y-m-d',
'zipLocation' => 'required|string',
];
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Contribution\Traits;
use Carbon\Carbon;
trait FormatsDates
{
public function niceDateFrom(): string
{
return Carbon::parse($this->dateFrom)->format('d.m.Y');
}
public function niceDateUntil(): string
{
return Carbon::parse($this->dateUntil)->format('d.m.Y');
}
public function dateRange(): string
{
return implode(' - ', [$this->niceDateFrom(), $this->niceDateUntil()]);
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Contribution\Traits;
use Zoomyboy\Tex\Engine;
trait HasPdfBackground
{
public function getEngine(): Engine
{
return Engine::PDFLATEX;
}
}

View File

@ -3,11 +3,13 @@
namespace App;
use App\Nami\HasNamiField;
use Database\Factories\CountryFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
/** @use HasFactory<CountryFactory> */
use HasFactory;
use HasNamiField;

View File

@ -0,0 +1,46 @@
<?php
namespace App\Course\Actions;
use App\Course\Models\CourseMember;
use App\Lib\JobMiddleware\JobChannels;
use App\Lib\JobMiddleware\WithJobState;
use App\Lib\Queue\TracksJob;
use App\Setting\NamiSettings;
use Illuminate\Http\JsonResponse;
use Lorisleiva\Actions\Concerns\AsAction;
class CourseDestroyAction
{
use AsAction;
use TracksJob;
public function handle(int $courseId): void
{
$course = CourseMember::find($courseId);
app(NamiSettings::class)->login()->deleteCourse($course->member->nami_id, $course->nami_id);
$course->delete();
}
public function asController(CourseMember $course): JsonResponse
{
$this->startJob($course->id, $course->member->fullname);
return response()->json([]);
}
/**
* @param mixed $parameters
*/
public function jobState(WithJobState $jobState, ...$parameters): WithJobState
{
$memberFullname = $parameters[1];
return $jobState
->before('Ausbildung für ' . $memberFullname . ' wird gelöscht')
->after('Ausbildung für ' . $memberFullname . ' gelöscht')
->failed('Fehler beim Löschen der Ausbildung für ' . $memberFullname)
->shouldReload(JobChannels::make()->add('member')->add('course'));
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Course\Actions;
use App\Course\Models\CourseMember;
use App\Course\Resources\CourseMemberResource;
use App\Member\Member;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Lorisleiva\Actions\Concerns\AsAction;
class CourseIndexAction
{
use AsAction;
/**
* @return Collection<int, CourseMember>
*/
public function handle(Member $member): Collection
{
return $member->courses()->with('course')->get();
}
public function asController(Member $member): AnonymousResourceCollection
{
return CourseMemberResource::collection($this->handle($member))
->additional([
'meta' => CourseMemberResource::memberMeta($member),
]);
}
}

View File

@ -0,0 +1,72 @@
<?php
namespace App\Course\Actions;
use App\Course\Models\Course;
use App\Lib\JobMiddleware\JobChannels;
use App\Lib\JobMiddleware\WithJobState;
use App\Lib\Queue\TracksJob;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Http\JsonResponse;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class CourseStoreAction
{
use AsAction;
use TracksJob;
/**
* @param array<string, mixed> $attributes
*/
public function handle(Member $member, array $attributes): void
{
$course = Course::where('id', $attributes['course_id'])->firstOrFail();
$payload = collect($attributes)->only(['event_name', 'completed_at', 'organizer'])->merge([
'course_id' => $course->nami_id,
])->toArray();
$namiId = app(NamiSettings::class)->login()->createCourse($member->nami_id, $payload);
$member->courses()->create([
...$attributes,
'nami_id' => $namiId,
]);
}
/**
* @return array<string, string>
*/
public function rules(): array
{
return [
'organizer' => 'required|max:255',
'event_name' => 'required|max:255',
'completed_at' => 'required|date',
'course_id' => 'required|exists:courses,id',
];
}
public function asController(Member $member, ActionRequest $request): JsonResponse
{
$this->startJob($member, $request->validated());
return response()->json([]);
}
/**
* @param mixed $parameters
*/
public function jobState(WithJobState $jobState, ...$parameters): WithJobState
{
$member = $parameters[0];
return $jobState
->before('Ausbildung für ' . $member->fullname . ' wird gespeichert')
->after('Ausbildung für ' . $member->fullname . ' gespeichert')
->failed('Fehler beim Erstellen der Ausbildung für ' . $member->fullname)
->shouldReload(JobChannels::make()->add('member')->add('course'));
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace App\Course\Actions;
use App\Course\Models\Course;
use App\Course\Models\CourseMember;
use App\Lib\JobMiddleware\JobChannels;
use App\Lib\JobMiddleware\WithJobState;
use App\Lib\Queue\TracksJob;
use App\Setting\NamiSettings;
use Illuminate\Http\JsonResponse;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class CourseUpdateAction
{
use AsAction;
use TracksJob;
/**
* @param array<string, string> $attributes
*/
public function handle(CourseMember $course, array $attributes): void
{
app(NamiSettings::class)->login()->updateCourse(
$course->member->nami_id,
$course->nami_id,
[
...$attributes,
'course_id' => Course::find($attributes['course_id'])->nami_id,
]
);
$course->update($attributes);
}
/**
* @return array<string, string>
*/
public function rules()
{
return [
'organizer' => 'required|max:255',
'event_name' => 'required|max:255',
'completed_at' => 'required|date',
'course_id' => 'required|exists:courses,id',
];
}
public function asController(CourseMember $course, ActionRequest $request): JsonResponse
{
$this->startJob($course, $request->validated());
return response()->json([]);
}
/**
* @param mixed $parameters
*/
public function jobState(WithJobState $jobState, ...$parameters): WithJobState
{
$member = $parameters[0]->member;
return $jobState
->before('Ausbildung für ' . $member->fullname . ' wird gespeichert')
->after('Ausbildung für ' . $member->fullname . ' gespeichert')
->failed('Fehler beim Erstellen der Ausbildung für ' . $member->fullname)
->shouldReload(JobChannels::make()->add('member')->add('course'));
}
}

View File

@ -1,36 +0,0 @@
<?php
namespace App\Course\Controllers;
use App\Course\Models\CourseMember;
use App\Course\Requests\DestroyRequest;
use App\Course\Requests\StoreRequest;
use App\Course\Requests\UpdateRequest;
use App\Http\Controllers\Controller;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Http\RedirectResponse;
class CourseController extends Controller
{
public function store(Member $member, StoreRequest $request, NamiSettings $settings): RedirectResponse
{
$request->persist($member, $settings);
return redirect()->back()->success('Ausbildung erstellt');
}
public function update(Member $member, CourseMember $course, UpdateRequest $request, NamiSettings $settings): RedirectResponse
{
$request->persist($member, $course, $settings);
return redirect()->back()->success('Ausbildung aktualisiert');
}
public function destroy(Member $member, CourseMember $course, DestroyRequest $request, NamiSettings $settings): RedirectResponse
{
$request->persist($member, $course, $settings);
return redirect()->back()->success('Ausbildung gelöscht');
}
}

View File

@ -2,12 +2,16 @@
namespace App\Course\Models;
use App\Nami\HasNamiField;
use Database\Factories\Course\Models\CourseFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Course extends Model
{
/** @use HasFactory<CourseFactory> */
use HasFactory;
use HasNamiField;
public $timestamps = false;
public $fillable = ['name', 'nami_id'];
@ -20,4 +24,12 @@ class Course extends Model
->trim()
->replaceMatches('/ - .*/', '');
}
/**
* @return array<int, array{id: int, name: string}>
*/
public static function forSelect(): array
{
return static::select('name', 'id')->get()->toArray();
}
}

View File

@ -2,18 +2,33 @@
namespace App\Course\Models;
use App\Member\Member;
use Database\Factories\Course\Models\CourseMemberFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class CourseMember extends Model
{
/** @use HasFactory<CourseMemberFactory> */
use HasFactory;
/** @var array<int, string> */
public $guarded = [];
/**
* @return BelongsTo<Course, self>
*/
public function course(): BelongsTo
{
return $this->belongsTo(Course::class);
}
/**
* @return BelongsTo<Member, self>
*/
public function member(): BelongsTo
{
return $this->belongsTo(Member::class);
}
}

View File

@ -1,38 +0,0 @@
<?php
namespace App\Course\Requests;
use App\Course\Models\CourseMember;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Foundation\Http\FormRequest;
class DestroyRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, string>
*/
public function rules()
{
return [];
}
public function persist(Member $member, CourseMember $course, NamiSettings $settings): void
{
$settings->login()->deleteCourse($member->nami_id, $course->nami_id);
$course->delete();
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace App\Course\Requests;
use App\Course\Models\Course;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, string>
*/
public function rules()
{
return [
'organizer' => 'required|max:255',
'event_name' => 'required|max:255',
'completed_at' => 'required|date',
'course_id' => 'required|exists:courses,id',
];
}
public function persist(Member $member, NamiSettings $settings): void
{
$course = Course::where('id', $this->input('course_id'))->firstOrFail();
$payload = collect($this->input())->only(['event_name', 'completed_at', 'organizer'])->merge([
'course_id' => $course->nami_id,
])->toArray();
$namiId = $settings->login()->createCourse($member->nami_id, $payload);
$member->courses()->create($this->safe()->collect()->put('nami_id', $namiId)->toArray());
}
}

View File

@ -1,48 +0,0 @@
<?php
namespace App\Course\Requests;
use App\Course\Models\Course;
use App\Course\Models\CourseMember;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, string>
*/
public function rules()
{
return [
'organizer' => 'required|max:255',
'event_name' => 'required|max:255',
'completed_at' => 'required|date',
'course_id' => 'required|exists:courses,id',
];
}
public function persist(Member $member, CourseMember $course, NamiSettings $settings): void
{
$settings->login()->updateCourse(
$member->nami_id,
$course->nami_id,
$this->safe()->merge(['course_id' => Course::find($this->input('course_id'))->nami_id])->toArray()
);
$course->update($this->safe()->toArray());
}
}

View File

@ -2,6 +2,8 @@
namespace App\Course\Resources;
use App\Course\Models\Course;
use App\Member\Member;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
@ -28,6 +30,29 @@ class CourseMemberResource extends JsonResource
'course_name' => $this->course->name,
'course_id' => $this->course->id,
'course' => new CourseResource($this->whenLoaded('course')),
'links' => [
'update' => route('course.update', ['course' => $this->getModel()]),
'destroy' => route('course.destroy', ['course' => $this->getModel()]),
]
];
}
/**
* @return array<string, mixed>
*/
public static function memberMeta(Member $member): array
{
return [
'default' => [
'event_name' => '',
'completed_at' => null,
'course_id' => null,
'organizer' => ''
],
'courses' => Course::forSelect(),
'links' => [
'store' => route('member.course.store', ['member' => $member]),
]
];
}
}

View File

@ -14,7 +14,7 @@ class CourseResource extends JsonResource
*
* @param \Illuminate\Http\Request $request
*
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @return array<string, mixed>
*/
public function toArray($request)
{

View File

@ -1,9 +1,8 @@
<?php
namespace App\Home\Actions;
namespace App\Dashboard\Actions;
use App\Home\DashboardFactory;
use Illuminate\Http\Request;
use App\Dashboard\DashboardFactory;
use Inertia;
use Inertia\Response;
use Lorisleiva\Actions\Concerns\AsAction;
@ -22,11 +21,11 @@ class IndexAction
];
}
public function asController(Request $request): Response
public function asController(): Response
{
session()->put('menu', 'dashboard');
session()->put('title', 'Dashboard');
return Inertia::render('home/VIndex', $this->handle());
return Inertia::render('dashboard/VIndex', $this->handle());
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Home\Blocks;
namespace App\Dashboard\Blocks;
abstract class Block
{

View File

@ -1,13 +1,13 @@
<?php
namespace App\Home;
namespace App\Dashboard;
use App\Dashboard\Blocks\Block;
use App\Efz\EfzPendingBlock;
use App\Home\Blocks\Block;
use App\Invoice\MemberPaymentBlock;
use App\Member\PsPendingBlock;
use App\Membership\AgeGroupCountBlock;
use App\Membership\TestersBlock;
use App\Payment\MemberPaymentBlock;
class DashboardFactory
{

View File

@ -1,10 +1,12 @@
<?php
namespace App\Home;
namespace App\Dashboard;
use Illuminate\Routing\Router;
use Illuminate\Support\ServiceProvider;
use App\Dashboard\Actions\IndexAction as DashboardIndexAction;
class HomeServiceProvider extends ServiceProvider
class DashboardServiceProvider extends ServiceProvider
{
/**
* Register services.
@ -23,5 +25,8 @@ class HomeServiceProvider extends ServiceProvider
*/
public function boot()
{
app(Router::class)->middleware(['web', 'auth:web'])->group(function ($router) {
$router->get('/', DashboardIndexAction::class)->name('home');
});
}
}

View File

@ -8,9 +8,6 @@ use Sabre\CardDAV\Backend\AbstractBackend;
use Sabre\DAV\PropPatch;
use Sabre\VObject\Component\VCard;
/**
* @template M as array{lastmodified: int, etag: string, uri: string, id: int, size: int}
*/
class AddressBookBackend extends AbstractBackend
{
/**
@ -115,7 +112,7 @@ class AddressBookBackend extends AbstractBackend
*
* @param mixed $addressbookId
*
* @return array<int, M>
* @return array<int, AddressBookCard>
*/
public function getCards($addressbookId): array
{
@ -133,7 +130,7 @@ class AddressBookBackend extends AbstractBackend
* @param mixed $addressBookId
* @param string $cardUri
*
* @return M
* @return AddressBookCard|bool
*/
public function getCard($addressBookId, $cardUri)
{
@ -158,8 +155,9 @@ class AddressBookBackend extends AbstractBackend
* If the backend supports this, it may allow for some speed-ups.
*
* @param mixed $addressBookId
* @param array<int, string> $uris
*
* @return array
* @return array<int, mixed>
*/
public function getMultipleCards($addressBookId, array $uris)
{
@ -248,7 +246,7 @@ class AddressBookBackend extends AbstractBackend
}
/**
* @return M
* @return AddressBookCard
*/
private function cardMeta(Member $member): array
{

View File

@ -136,10 +136,11 @@ class Principal implements PrincipalBackendInterface
*
* @param string $principal
*
* @return array
* @return array<int, string>|null
*/
public function getGroupMemberSet($principal)
{
return [];
}
/**
@ -147,7 +148,7 @@ class Principal implements PrincipalBackendInterface
*
* @param string $principal
*
* @return array
* @return array<int, string>|null
*/
public function getGroupMembership($principal)
{
@ -164,6 +165,8 @@ class Principal implements PrincipalBackendInterface
* The principals should be passed as a list of uri's.
*
* @param string $principal
* @param array<int, string> $members
* @return void
*/
public function setGroupMemberSet($principal, array $members)
{
@ -175,7 +178,7 @@ class Principal implements PrincipalBackendInterface
private function userToPrincipal(User $user): array
{
return [
'{DAV:}displayname' => $user->name,
'{DAV:}displayname' => $user->firstname . ' ' . $user->lastname,
'uri' => 'principals/' . $user->email,
'{http://sabredav.org/ns}email-address' => $user->email,
];

View File

@ -9,6 +9,7 @@ use Sabre\CardDAV\AddressBookRoot;
use Sabre\CardDAV\Plugin as CardDAVPlugin;
use Sabre\DAV\Auth\Plugin as AuthPlugin;
use Sabre\DAV\Browser\Plugin as BrowserPlugin;
use Sabre\DAV\ServerPlugin;
use Sabre\DAVACL\AbstractPrincipalCollection;
use Sabre\DAVACL\Plugin as AclPlugin;
use Sabre\DAVACL\PrincipalCollection;
@ -50,6 +51,9 @@ class ServiceProvider extends BaseServiceProvider
];
}
/**
* @return array<int, ServerPlugin>
*/
private function plugins(): array
{
$authBackend = new AuthBackend();

View File

@ -2,7 +2,7 @@
namespace App\Efz;
use App\Home\Blocks\Block;
use App\Dashboard\Blocks\Block;
use App\Member\Member;
use Illuminate\Database\Eloquent\Builder;
@ -17,8 +17,9 @@ class EfzPendingBlock extends Block
return $query->where('efz', '<=', now()->subYears(5)->endOfYear())
->orWhereNull('efz');
})
->whereCurrentGroup()
->orderByRaw('lastname, firstname')
->whereHas('memberships', fn ($builder) => $builder->isLeader());
->whereHas('memberships', fn ($builder) => $builder->isLeader()->active());
}
/**

View File

@ -12,15 +12,14 @@ class Handler extends ExceptionHandler
/**
* A list of the exception types that are not reported.
*
* @var string[]
* @var array<int, class-string<Throwable>>
*/
protected $dontReport = [
];
protected $dontReport = [];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var string[]
* @var array<int, string>
*/
protected $dontFlash = [
'password',

View File

@ -0,0 +1,10 @@
<?php
namespace App\Exceptions;
use Exception;
class MemberNotInNamiException extends Exception
{
//
}

View File

@ -2,18 +2,28 @@
namespace App;
use App\Nami\HasNamiField;
use App\Payment\Subscription;
use Database\Factories\FeeFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Fee extends Model
{
/** @use HasFactory<FeeFactory> */
use HasFactory;
use HasNamiField;
/** @var array<int, string> */
public $fillable = ['name', 'nami_id'];
/** @var bool */
public $timestamps = false;
/**
* @return HasMany<Subscription>
*/
public function subscriptions(): HasMany
{
return $this->hasMany(Subscription::class);

View File

@ -0,0 +1,21 @@
<?php
namespace App\Fileshare\Actions;
use App\Fileshare\Models\Fileshare;
use App\Fileshare\Resources\FileshareResource;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Lorisleiva\Actions\Concerns\AsAction;
class FileshareApiIndexAction
{
use AsAction;
public function handle(): AnonymousResourceCollection
{
session()->put('menu', 'setting');
session()->put('title', 'Datei-Verbindungen');
return FileshareResource::collection(Fileshare::paginate(15));
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Fileshare\Actions;
use App\Fileshare\Models\Fileshare;
use App\Lib\Events\Succeeded;
use Illuminate\Validation\ValidationException;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class FileshareStoreAction
{
use AsAction;
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'type' => 'required|string|max:255|exclude',
'config' => 'array|exclude',
];
}
public function asController(ActionRequest $request): void
{
$type = $request->input('type')::from($request->input('config'));
if (!$type->check()) {
throw ValidationException::withMessages(['type' => 'Verbindung fehlgeschlagen']);
}
Fileshare::create([
...$request->validated(),
'type' => $type,
]);
Succeeded::message('Verbindung erstellt.')->dispatch();
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Fileshare\Actions;
use App\Fileshare\Models\Fileshare;
use App\Lib\Events\Succeeded;
use Illuminate\Validation\ValidationException;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class FileshareUpdateAction
{
use AsAction;
/**
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'type' => 'required|string|max:255|exclude',
'config' => 'array|exclude',
];
}
public function handle(ActionRequest $request, Fileshare $fileshare): void
{
$type = $request->input('type')::from($request->input('config'));
if (!$type->check()) {
throw ValidationException::withMessages(['type' => 'Verbindung fehlgeschlagen']);
}
$fileshare->update([
...$request->validated(),
'type' => $type,
]);
Succeeded::message('Verbindung bearbeitet.')->dispatch();
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Fileshare\Actions;
use App\Fileshare\Data\ResourceData;
use App\Fileshare\Models\Fileshare;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Spatie\LaravelData\DataCollection;
class ListFilesAction
{
use AsAction;
/**
* @return DataCollection<int, ResourceData>
*/
public function handle(ActionRequest $request, Fileshare $fileshare): DataCollection
{
return ResourceData::collect($fileshare->type->getSubDirectories($request->input('parent')), DataCollection::class)->wrap('data');
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Fileshare\ConnectionTypes;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Collection;
use Spatie\LaravelData\Data;
abstract class ConnectionType extends Data
{
abstract public function check(): bool;
/**
* @return array<string, mixed>
*/
abstract public static function defaults(): array;
abstract public static function title(): string;
abstract public function getFilesystem(): FilesystemAdapter;
/**
* @return array<int, array{label: string, key: string, type: string}>
*/
abstract public static function fields(): array;
/**
* @return array<int, mixed>
*/
public static function forSelect(): array
{
return self::types()
->map(fn ($file) => ['id' => $file, 'name' => $file::title(), 'defaults' => $file::defaults(), 'fields' => $file::fields()])
->toArray();
}
/**
* @return array<int, string>
*/
public function getSubDirectories(?string $parent): array
{
$filesystem = $this->getFilesystem();
return $filesystem->directories($parent ?: '/');
}
/**
* @return Collection<int, class-string<ConnectionType>>
*/
private static function types(): Collection
{
return collect(glob(base_path('app/Fileshare/ConnectionTypes/*')))
->map(fn ($file) => 'App\\Fileshare\\ConnectionTypes\\' . pathinfo($file, PATHINFO_FILENAME))
->filter(fn ($file) => $file !== static::class)
->values();
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace App\Fileshare\ConnectionTypes;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Facades\Http;
use League\Flysystem\Filesystem;
use League\Flysystem\WebDAV\WebDAVAdapter;
use Sabre\DAV\Client;
class NextcloudConnection extends OwncloudConnection
{
public function check(): bool
{
try {
$response = Http::withoutVerifying()
->withBasicAuth($this->user, $this->password)
->withHeaders(['OCS-APIRequest' => 'true'])
->acceptJson()
->get($this->baseUrl . '/ocs/v2.php/cloud/capabilities');
return $response->ok();
} catch (ConnectionException $e) {
return false;
}
}
public static function title(): string
{
return 'Nextcloud';
}
public function getFilesystem(): FilesystemAdapter
{
$adapter = new WebDAVAdapter(new Client([
'baseUri' => $this->baseUrl . '/remote.php/dav/files/' . $this->user,
'userName' => $this->user,
'password' => $this->password,
]), '/remote.php/dav/files/' . $this->user);
return new FilesystemAdapter(new Filesystem($adapter), $adapter);
}
}

View File

@ -0,0 +1,76 @@
<?php
namespace App\Fileshare\ConnectionTypes;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Facades\Http;
use League\Flysystem\Filesystem;
use League\Flysystem\WebDAV\WebDAVAdapter;
use Sabre\DAV\Client;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Spatie\LaravelData\Mappers\SnakeCaseMapper;
#[MapInputName(SnakeCaseMapper::class)]
#[MapOutputName(SnakeCaseMapper::class)]
class OwncloudConnection extends ConnectionType
{
public function __construct(
public string $user,
public string $password,
public string $baseUrl,
) {
}
public function check(): bool
{
try {
$response = Http::withoutVerifying()->withBasicAuth($this->user, $this->password)->acceptJson()->get($this->baseUrl . '/ocs/v1.php/cloud/capabilities?format=json');
return $response->ok();
} catch (ConnectionException $e) {
return false;
}
}
/**
* @inheritdoc
*/
public static function defaults(): array
{
return [
'user' => '',
'password' => '',
'base_url' => '',
];
}
public static function title(): string
{
return 'Owncloud';
}
/**
* @inheritdoc
*/
public static function fields(): array
{
return [
['label' => 'URL', 'key' => 'base_url', 'type' => 'text'],
['label' => 'Benutzer', 'key' => 'user', 'type' => 'text'],
['label' => 'Passwort', 'key' => 'password', 'type' => 'password'],
];
}
public function getFilesystem(): FilesystemAdapter
{
$adapter = new WebDAVAdapter(new Client([
'baseUri' => $this->baseUrl . '/remote.php/dav/files/' . $this->user,
'userName' => $this->user,
'password' => $this->password,
]), '/remote.php/dav/files/' . $this->user);
return new FilesystemAdapter(new Filesystem($adapter), $adapter);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Fileshare\Data;
use App\Fileshare\Models\Fileshare;
use Illuminate\Filesystem\FilesystemAdapter;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Mappers\SnakeCaseMapper;
#[MapInputName(SnakeCaseMapper::class)]
#[MapOutputName(SnakeCaseMapper::class)]
class FileshareResourceData extends Data
{
public function __construct(public int $connectionId, public string $resource)
{
}
public function getConnection(): Fileshare
{
return Fileshare::find($this->connectionId);
}
public function getStorage(): FilesystemAdapter
{
return $this->getConnection()->type->getFilesystem();
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Fileshare\Data;
use Spatie\LaravelData\Data;
class ResourceData extends Data
{
public function __construct(public string $name, public string $path, public string $parent)
{
}
public static function fromString(string $path): self
{
$dir = '/' . trim($path, '\\/');
return self::from([
'path' => $dir,
'name' => pathinfo($dir, PATHINFO_BASENAME),
'parent' => pathinfo($dir, PATHINFO_DIRNAME),
]);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Fileshare;
use App\Fileshare\Models\Fileshare;
use App\Fileshare\Resources\FileshareResource;
use App\Setting\LocalSettings;
class FileshareSettings extends LocalSettings
{
public static function group(): string
{
return 'fileshare';
}
public static function title(): string
{
return 'Datei-Verbindungen';
}
/**
* @inheritdoc
*/
public function viewData(): array
{
return [
'data' => FileshareResource::collection(Fileshare::paginate(15))
];
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Fileshare\Models;
use App\Fileshare\ConnectionTypes\ConnectionType;
use Database\Factories\Fileshare\Models\FileshareFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Fileshare extends Model
{
/** @use HasFactory<FileshareFactory> */
use HasFactory;
public $guarded = [];
public $casts = [
'type' => ConnectionType::class,
];
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Fileshare\Resources;
use App\Fileshare\ConnectionTypes\ConnectionType;
use App\Fileshare\Models\Fileshare;
use App\Lib\HasMeta;
use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin Fileshare
*/
class FileshareResource extends JsonResource
{
use HasMeta;
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array<string, mixed>
*/
public function toArray($request)
{
return [
'name' => $this->name,
'is_active' => $this->type->check(),
'type' => get_class($this->type),
'config' => $this->type->toArray(),
'id' => $this->id,
'type_human' => $this->type::title(),
'links' => [
'update' => route('fileshare.update', ['fileshare' => $this->getModel()]),
]
];
}
/**
* @return array<string, mixed>
*/
public static function meta(): array
{
return [
'default' => [
'name' => '',
'type' => null,
'config' => null,
],
'types' => ConnectionType::forSelect(),
'links' => [
'store' => route('fileshare.store'),
]
];
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Form\Actions;
use App\Form\FormSettings;
use Illuminate\Support\Facades\Http;
use Lorisleiva\Actions\Concerns\AsAction;
class ClearFrontendCacheAction
{
use AsAction;
public function handle(): void
{
Http::get(app(FormSettings::class)->clearCacheUrl);
}
}

View File

@ -0,0 +1,71 @@
<?php
namespace App\Form\Actions;
use App\Form\Models\Form;
use App\Form\Models\Participant;
use Illuminate\Database\Eloquent\Collection;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\TableDocument\SheetData;
use Zoomyboy\TableDocument\TableDocumentData;
class CreateExcelDocumentAction
{
use AsAction;
public Form $form;
/**
* @param Collection<int, Participant> $participants
*/
public function handle(Form $form, Collection $participants): string
{
$this->form = $form;
return file_get_contents($this->allSheet($participants)->compile($this->tempPath()));
}
/**
* @param Collection<int, Participant> $participants
*/
private function allSheet(Collection $participants): TableDocumentData
{
$document = TableDocumentData::from(['title' => 'Anmeldungen für ' . $this->form->name, 'sheets' => []]);
$headers = $this->form->getFields()->map(fn ($field) => $field->name)->toArray();
$document->addSheet(SheetData::from([
'header' => $headers,
'data' => $participants
->map(fn ($participant) => $this->form->getFields()->map(fn ($field) => $participant->getFields()->find($field)->presentRaw())->toArray())
->toArray(),
'name' => 'Alle',
]));
if ($this->form->export->groupBy) {
$groups = $participants->groupBy(fn ($participant) => $participant->getFields()->findByKey($this->form->export->groupBy)->presentRaw());
foreach ($groups as $name => $participants) {
$document->addSheet(SheetData::from([
'header' => $headers,
'data' => $participants
->map(fn ($participant) => $this->form->getFields()->map(fn ($field) => $participant->getFields()->find($field)->presentRaw())->toArray())
->toArray(),
'name' => $name,
]));
}
$document->addSheet(SheetData::from([
'header' => ['Wert', 'Anzahl'],
'data' => $groups->map(fn ($participants, $name) => [$name, (string) count($participants)])->toArray(),
'name' => 'Statistik',
]));
}
return $document;
}
private function tempPath(): string
{
return sys_get_temp_dir() . '/' . str()->uuid()->toString();
}
}

Some files were not shown because too many files have changed in this diff Show More