{"id":20655935,"url":"https://github.com/it-at-m/eappointment","last_synced_at":"2026-02-13T13:00:56.539Z","repository":{"id":206418923,"uuid":"694035605","full_name":"it-at-m/eappointment","owner":"it-at-m","description":"The current appointment system of the city of Munich has been replaced by Zeitmanagementsystem (ZMS) provided by the state of Berlin.","archived":false,"fork":false,"pushed_at":"2026-02-02T18:03:44.000Z","size":190470,"stargazers_count":18,"open_issues_count":95,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-03T01:58:42.931Z","etag":null,"topics":["appointment-booking","appointment-management-system","appointment-scheduling","appointments-manager","city","county-level","ddev","docker","eappointments","government","government-app","keycloak","municipal-software","municipalities","php","sso","sso-authentication","sso-login","twig","vuejs"],"latest_commit_sha":null,"homepage":"https://opensource.muenchen.de/software/zeitmanagementsystem.html","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/it-at-m.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-09-20T07:49:43.000Z","updated_at":"2026-02-02T16:33:50.000Z","dependencies_parsed_at":"2025-04-10T15:31:03.896Z","dependency_job_id":"b5ce0742-b06a-4a9e-a96d-fcf989002f7e","html_url":"https://github.com/it-at-m/eappointment","commit_stats":null,"previous_names":["it-at-m/eappointment"],"tags_count":114,"template":false,"template_full_name":null,"purl":"pkg:github/it-at-m/eappointment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Feappointment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Feappointment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Feappointment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Feappointment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/it-at-m","download_url":"https://codeload.github.com/it-at-m/eappointment/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Feappointment/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29121678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T10:47:47.471Z","status":"ssl_error","status_checked_at":"2026-02-05T10:45:08.119Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appointment-booking","appointment-management-system","appointment-scheduling","appointments-manager","city","county-level","ddev","docker","eappointments","government","government-app","keycloak","municipal-software","municipalities","php","sso","sso-authentication","sso-login","twig","vuejs"],"created_at":"2024-11-16T18:13:09.123Z","updated_at":"2026-02-05T12:00:49.239Z","avatar_url":"https://github.com/it-at-m.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv id=\"top\"\u003e\u003c/div\u003e\n\n\u003c!-- PROJECT SHIELDS --\u003e\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n\u003c!-- [![EUPL License][license-shield]][license-url] --\u003e\n\n# E-Appointment\n\u003cimg width=\"200\" align=\"right\" alt=\"web-app-manifest-512x512\" src=\"https://github.com/user-attachments/assets/5dc7c4db-cc17-47a4-ad11-25e096b4e7e8\" /\u003e\n\nThis monorepo contains the Munich-specific adjustments to the original Berlin version. You can explore the original project here: https://gitlab.com/eappointment/eappointment\n\nPublic E-Appointment is a software for online booking of appointments and processing of queues such as calling appointment numbers and collecting statistics on services provided.\n\nThe software has been used in public administration in the German capital Berlin for more than 20 years and has been redeveloped under a new license since 2016. This allows the software to be re-released under the EUPL, an open source license recognized by OSI.\n\nIt is planned to release the software as open source in the course of 2022/2024. This requires a number of adjustments, so that step by step the individual components of the software will be published here.\nOn the one hand, the documentation of the software is published in this repository, on the other hand, new ideas and further developments are planned here, which apply across the board for the other repositories.\n\nThe ZMS system is intended to manage human waiting queues. It has the following features:\n\n* make appointments via a calender and initiate a process to manage an appointment\n* import requests (services) and providers (locations) from external sources\n* manage scopes for appointments, including a four level hierarchy of owner-\u003eorganisation-\u003edepartment-\u003escope\n* manage opening hours including closed days\n* login-system with different access levels\n* ticketprinter support for customers without appointments (authenticated, lockable, timeable)\n* calldisplay support\n* collecting statistics like waiting time or served clients per day\n* emergency call for employees\n\n[Code Coverage ZMSAPI and ZMSCITIZENAPI Documentation](https://it-at-m.github.io/eappointment/)\n\n\n## Projects\n\n### ZMS\nThe original project to replace commercial proprietary software with the open source Berlin solution ZMS and went live with each city agency/department. This foundational project established the core appointment management system infrastructure for Munich's municipal services.\n\n### MPDZBS\nThe creation of the PHP zmscitizenapi and the replacement of the first open source Vue2 frontend ([eappointment-buergeransicht](https://github.com/it-at-m/eappointment-buergeransicht)) with the Vue3 zmscitizenview/[refarch](https://refarch.oss.muenchen.de/) citizen frontend, plus the creation of the city's Vue patternlab ([muc-patternlab-vue](https://github.com/it-at-m/muc-patternlab-vue)). This project modernized the citizen-facing components and established design system standards.\n\n### ZMSKVR\nTo add still needed features and requirements for the city's agencies/departments and improve weaknesses in user experiences. This includes implementing features in zmscitizenview that were not completed by MPDZBS, ensuring comprehensive functionality for all municipal departments.\n\n### MUXDBS\nBuilds on MPDZBS following the Reifegradmodell (Maturity Level Model) as an implementation framework for Onlinezugangsgesetz (OZG - Online Access Act) compliance ([digitale-verwaltung.de](https://www.digitale-verwaltung.de/Webs/DV/DE/onlinezugangsgesetz/ozg-grundlagen/info-reifegradmodell/info-reifegradmodell-node.html)) and adds additional components to zmscitizenview which will allow things such as login with BundID, BayernID and Elster for seamless online citizen appointments. This project represents the next maturity level of digital government services following federal implementation guidelines.\n\n## Contact\n[Overview](https://opensource.muenchen.de/software/zeitmanagementsystem.html)\nBerlinOnline Stadtportal GmbH \u0026 Co KG Contact: \n\nMunich Contact: it@M - opensource@muenchen.de\n\nBerlinOnline Stadtportal GmbH \u0026 Co KG and it@M.\n\n\u003ctable border=\"0\" cellpadding=\"0\" cellspacing=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://service.berlin.de/i9f/r1/images/logo_berlin_m_srgb.svg\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd style=\"padding-right: 30px;\"\u003e\u003cimg src=\"https://gitlab.com/eappointment/zmsstatistic/-/raw/main/public/_css/images/bo_logo.svg?ref_type=heads\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://assets.muenchen.de/logos/lhm/logo-lhm-muenchen.svg\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/58515289\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n\u003cimg width=\"200\" align=\"right\" alt=\"web-app-manifest-512x512\" src=\"https://github.com/user-attachments/assets/5dc7c4db-cc17-47a4-ad11-25e096b4e7e8\" /\u003e\n\nDieses Monorepo enthält die München-spezifischen Anpassungen der ursprünglichen Berliner Version. Das ursprüngliche Projekt kannst du hier erkunden: https://gitlab.com/eappointment/eappointment\n\nDie Public E-Appointment-Software ist eine Software für die Online-Buchung von Terminen und die Bearbeitung von Warteschlangen, wie das Aufrufen von Terminnummern und das Sammeln von Statistiken über erbrachte Dienstleistungen.\n\nDie Software wird seit mehr als 20 Jahren in der öffentlichen Verwaltung der deutschen Hauptstadt Berlin verwendet und wird seit 2016 unter einer neuen Lizenz weiterentwickelt. Dies ermöglicht eine Wiederveröffentlichung der Software unter der EUPL, einer von der OSI anerkannten Open-Source-Lizenz.\n\nEs ist geplant, die Software im Laufe der Jahre 2022/2024 als Open Source zu veröffentlichen. Dafür sind einige Anpassungen erforderlich, sodass die einzelnen Komponenten der Software schrittweise hier veröffentlicht werden.\n\nEinerseits wird die Dokumentation der Software in diesem Repository veröffentlicht, andererseits sind hier neue Ideen und Weiterentwicklungen geplant, die bereichsübergreifend für die anderen Repositories gelten.\n\nDas ZMS-System dient zur Verwaltung von Warteschlangen für Menschen. Es bietet folgende Funktionen:\n\n* Termine über einen Kalender vereinbaren und einen Prozess zur Verwaltung eines Termins initiieren\n* Anfragen (Dienste) und Anbieter (Standorte) aus externen Quellen importieren\n* Verwaltung von Terminbereichen, einschließlich einer vierstufigen Hierarchie von Eigentümer-\u003eOrganisation-\u003eAbteilung-\u003eBereich\n* Verwaltung von Öffnungszeiten einschließlich geschlossener Tage\n* Login-System mit verschiedenen Zugriffsebenen\n* Abholung von Dokumenten\n* Unterstützung für Ticketdrucker für Kunden ohne Termine (authentifiziert, abschließbar, zeitgesteuert)\n* Unterstützung für Anzeigesysteme für Aufrufe\n* Sammeln von Statistiken wie Wartezeiten oder bedienten Kunden pro Tag\n* Notruf für Mitarbeiter\n\n[Code-Abdeckung ZMSAPI und ZMSCITIZENAPI Dokumentation](https://it-at-m.github.io/eappointment/)\n\n## Projekte\n\n### ZMS\nDas ursprüngliche Projekt zur Ersetzung kommerzieller proprietärer Software durch die Open-Source-Berlin-Lösung ZMS und ging mit jeder städtischen Behörde/Abteilung live. Dieses grundlegende Projekt etablierte die Kerninfrastruktur des Terminverwaltungssystems für Münchens kommunale Dienstleistungen.\n\n### MPDZBS\nDie Erstellung der PHP zmscitizenapi und der Ersatz des ersten Open-Source Vue2-Frontends ([eappointment-buergeransicht](https://github.com/it-at-m/eappointment-buergeransicht)) durch das Vue3 zmscitizenview/[refarch](https://refarch.oss.muenchen.de/) Bürger-Frontend, plus die Erstellung des städtischen Vue-Patternlabs ([muc-patternlab-vue](https://github.com/it-at-m/muc-patternlab-vue)). Dieses Projekt modernisierte die bürgerseitigen Komponenten und etablierte Design-System-Standards.\n\n### ZMSKVR\nUm noch benötigte Funktionen und Anforderungen für die städtischen Behörden/Abteilungen hinzuzufügen und Schwächen in der Benutzererfahrung zu verbessern. Dies umfasst die Implementierung von Funktionen in zmscitizenview, die von MPDZBS nicht abgeschlossen wurden, um umfassende Funktionalität für alle kommunalen Abteilungen sicherzustellen.\n\n### MUXDBS\nBaut auf MPDZBS auf und folgt dem Reifegradmodell (Reifegradmodell) als Implementierungsrahmen für Onlinezugangsgesetz (OZG) Compliance ([digitale-verwaltung.de](https://www.digitale-verwaltung.de/Webs/DV/DE/onlinezugangsgesetz/ozg-grundlagen/info-reifegradmodell/info-reifegradmodell-node.html)) und fügt zusätzliche Komponenten zu zmscitizenview hinzu, die Dinge wie Login mit BundID, BayernID und Elster für nahtlose Online-Bürgertermine ermöglichen werden. Dieses Projekt repräsentiert das nächste Reifegradniveau digitaler Regierungsdienstleistungen entsprechend den bundesweiten Implementierungsrichtlinien.\n\n## Kontakt\nBerlinOnline Stadtportal GmbH \u0026 Co KG Kontakt: \n\nMunich Kontakt: it@M - opensource@muenchen.de\n\nBerlinOnline Stadtportal GmbH \u0026 Co KG und it@M.\n\n\u003ctable border=\"0\" cellpadding=\"0\" cellspacing=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://service.berlin.de/i9f/r1/images/logo_berlin_m_srgb.svg\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd style=\"padding-right: 30px;\"\u003e\u003cimg src=\"https://gitlab.com/eappointment/zmsstatistic/-/raw/main/public/_css/images/bo_logo.svg?ref_type=heads\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://assets.muenchen.de/logos/lhm/logo-lhm-muenchen.svg\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/58515289\" height=\"30\" align=\"center\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n----\n\n## Getting Started\n\n### Using DDEV\n- `ddev start`\n- `ddev exec ./cli modules loop composer install`\n- `ddev exec ./cli modules loop npm install`\n- `ddev exec ./cli modules loop npm build`\n\n### Using Podman (Devcontainer)\n\u003e **Note for macOS users:** You may need to add `export DOCKER_HOST=unix:///var/run/docker.sock` to your `~/.zshrc` or run it in your terminal before using devcontainer commands.\n\u003e ```\n\u003e source ~/.zshrc\n\u003e podman machine stop\n\u003e podman machine start\n\u003e devcontainer up --workspace-folder .\n\u003e ```\n\n- `devcontainer up --workspace-folder .`\n- `podman exec -it zms-web bash -lc \"./cli modules loop composer install\"`\n- `podman exec -it zms-web bash -lc \"./cli modules loop npm install\"`\n- `podman exec -it zms-web bash -lc \"./cli modules loop npm build\"`\n\n\u003cbr\u003e\n\n- `cd zmscitizenview`\n- `npm install`\n- `npm run build`\n- `npm run dev`\n- `npm run test`\n\n## Keycloak Setup\n\nKeycloak is configured to use the hostname `keycloak.local` instead of `localhost` to work for both browser redirects and server-side API calls from inside containers. This is necessary because:\n\n- **Browser** (running on your host machine) needs to access Keycloak via a hostname that resolves to `127.0.0.1`\n- **PHP code** (running inside the container) needs to access Keycloak via a hostname that resolves through Docker/Podman network DNS\n\nUsing `localhost` doesn't work because inside the container, `localhost` refers to the container itself, not the host machine where Keycloak is exposed.\n\n### Adding keycloak.local to /etc/hosts\n\nYou need to add `keycloak.local` to your system's hosts file so it resolves to `127.0.0.1`:\n\n**macOS:**\n```bash\necho \"127.0.0.1 keycloak.local\" | sudo tee -a /etc/hosts\n```\nEnter your Mac password when prompted.\n\n**Ubuntu/Linux:**\n```bash\necho \"127.0.0.1 keycloak.local\" | sudo tee -a /etc/hosts\n```\n\n**Windows:**\n1. Open Notepad as Administrator (Right-click → Run as administrator)\n2. Open `C:\\Windows\\System32\\drivers\\etc\\hosts`\n3. Add this line at the end:\n   ```\n   127.0.0.1 keycloak.local\n   ```\n4. Save the file\n\n**Verify it worked:**\n```bash\n# macOS/Linux\nping -c 1 keycloak.local\n\n# Windows\nping keycloak.local\n```\nYou should see it resolve to `127.0.0.1`.\n\nAfter adding the entry, restart the Keycloak container:\n```bash\n# Podman\npodman restart zms-keycloak\n\n# DDEV\nddev restart\n```\n\n## Import Database\n\n### Using DDEV\n- `ddev import-db --file=.resources/zms.sql`\n- `ddev exec zmsapi/vendor/bin/migrate --update`\n\n### Using Podman\n- `podman exec -i zms-db mysql -u root -proot db \u003c .resources/zms.sql`\n- `podman exec -it zms-web bash -lc \"cd zmsapi \u0026\u0026 vendor/bin/migrate --update\"`\n\nImport Berlin or Munich DLDB data via the [hourly cronjob](#cronjobs).\n\n## Dependency Check for PHP Upgrades\nPass the PHP version that you would want to upgrade to and recieve information about dependency changes patch, minor, or major for each module.\ne.g.\n- `ddev exec ./cli modules check-upgrade 8.1`\n- `ddev exec ./cli modules check-upgrade 8.2`\n- `ddev exec ./cli modules check-upgrade 8.3`\n\n## Code Quality Checks\nWe use PHPCS (following PSR-12 standards) and PHPMD to maintain code quality and detect possible issues early. These checks run automatically in our GitHub Actions pipeline but can also be executed locally.\n\n### Using DDEV\n0. Run PHP code formatting all at once:\n- `ddev exec \"./cli modules loop 'vendor/bin/phpcs --standard=psr12 src/'\" \u0026\u0026 ddev exec \"./cli modules loop 'vendor/bin/phpcbf --standard=psr12 src'\"`\n1. Enter the container:\n- `ddev ssh`\n2. Go to the desired module directory:\n- `cd zmsadmin`\n3. Run PHPCS (PSR-12 standard):\n- `vendor/bin/phpcs --standard=psr12 src/`\n- ```\n  You can automatically fix many PHPCS formatting issues by running:\n  - vendor/bin/phpcbf --standard=psr12 src/\n  or\n  - phpcs --standard=psr12 --fix src/\n  ```\n4. Run PHPMD (using the phpmd.rules.xml in the project root):\n- `vendor/bin/phpmd src/ text ../phpmd.rules.xml`\n\n### Using Podman\n0. Run PHP code formatting all at once:\n- `podman exec -it zms-web bash -lc \"./cli modules loop 'vendor/bin/phpcs --standard=psr12 src/'\" \u0026\u0026 podman exec -it zms-web bash -lc \"./cli modules loop 'vendor/bin/phpcbf --standard=psr12 src'\"`\n1. Enter the container:\n- `podman exec -it zms-web bash`\n2. Go to the desired module directory:\n- `cd zmsadmin`\n3. Run PHPCS (PSR-12 standard):\n- `vendor/bin/phpcs --standard=psr12 src/`\n- ```\n  You can automatically fix many PHPCS formatting issues by running:\n  - vendor/bin/phpcbf --standard=psr12 src/\n  or\n  - phpcs --standard=psr12 --fix src/\n  ```\n4. Run PHPMD (using the phpmd.rules.xml in the project root):\n- `vendor/bin/phpmd src/ text ../phpmd.rules.xml`\n\nWe use `prettier-codeformat` for checking and formatting code style in zmscitizenview. You can use format function to fix \ncode style (lint) problems:\n1. Go to `zmscitizenview`\n2. Run: `npm run format`\n\n## Unit Testing\nTo run unit tests locally refer to the [Github Workflows](https://github.com/it-at-m/eappointment/blob/main/.github/workflows/unit-tests.yaml) and in your local docker container run:\n\n### Using DDEV\n- `ddev ssh`\n- `cd {zmsadmin, zmscalldisplay, zmsdldb, zmsentities, zmsmessaging, zmsslim, zmsstatistic, zmsticketprinter}`\n- `./vendor/bin/phpunit`\n\n### Using Podman\n- `podman exec -it zms-web bash`\n- `cd {zmsadmin, zmscalldisplay, zmsdldb, zmsentities, zmsmessaging, zmsslim, zmsstatistic, zmsticketprinter}`\n- `./vendor/bin/phpunit`\n\n- Usefule flags for `./vendor/bin/phpunit`:\n  * `--display-warnings`\n  * `--display-deprecations`\n  * `--display-notices`\n  * `--display-errors`\n  * `--display-failures`\n  * `--debug` - Provides detailed test execution information including deprecation warnings and memory usage\n\n\n### Special Cases (zmsapi zmsdb \u0026 zmsclient)\n\n**zmsclient:**\n\nFor `zmsclient` you need the php base image which starts a local mock server. This json in the mocks must match the signature the entity returned in the requests (usually this is the issue whenever tests fail in `zmsclient`). \n\n**Using Docker:**\n\n```bash\ncd zmsclient\ndocker-compose down \u0026\u0026 docker-compose up -d \u0026\u0026 docker exec zmsclient-test-1 ./vendor/bin/phpunit\n```\n\n**Using Podman:**\n\n```bash\ncd zmsclient\n./zmsclient-test\n./zmsclient-test --filter \"testSetKeyBasic\"\n```\n\nThe `zmsclient-test` script automatically detects and uses Docker or Podman, restarts containers for clean state, and runs PHPUnit tests.\n\n#### Traditional Method (overwrites local DB)\nFor the modules **zmsapi** and **zmsdb**, test data must be imported. Please note that this will overwrite your local database.\n\n**zmsapi:**\n\nUsing DDEV:\n```bash\ncd zmsapi\nrm -rf data\nln -s vendor/eappointment/zmsdb/tests/Zmsdb/fixtures data\nddev ssh\ncd zmsapi\nvendor/bin/importTestData --commit\n./vendor/bin/phpunit\n```\n\nUsing Podman:\n```bash\ncd zmsapi\nrm -rf data\nln -s vendor/eappointment/zmsdb/tests/Zmsdb/fixtures data\npodman exec -it zms-web bash\ncd zmsapi\nvendor/bin/importTestData --commit\n./vendor/bin/phpunit\n```\n\n**zmsdb:**\n\nUsing DDEV:\n```bash\nddev ssh\ncd zmsdb\nbin/importTestData --commit\n./vendor/bin/phpunit\n```\n\nUsing Podman:\n```bash\npodman exec -it zms-web bash\ncd zmsdb\nbin/importTestData --commit\n./vendor/bin/phpunit\n```\n\n#### Containerized Testing (Recommended - isolated environment)\n\nRun your tests in clean, disposable containers to ensure they don’t affect your local system or database:\n\n```bash\n# Enter your web container\npodman exec -it zms-web bash  # Podman\nddev ssh                      # DDEV\n\n# Run zmsdb tests\n./zmsdb/zmsdb-test                    # Run all tests\n./zmsdb/zmsdb-test --filter=\"StatusTest::testBasic\"  # Run specific test\n\n# Run zmsapi tests\n./zmsapi/zmsapi-test                   # Run all tests\n./zmsapi/zmsapi-test --filter=\"StatusGetTest::testRendering\"  # Run specific test\n```\n\n**Available PHPUnit Flags:**\n\n```bash\n# Test Selection (filter is a regex matching against \"Namespace\\TestClass::testMethod\")\n--filter=\"TestClass::testMethod\"  # Run specific test method\n--filter=\"TestClass\"              # Run all tests in a class\n--filter=\"testMethod\"             # Run all tests with matching method name\n--filter=\"pattern\"                # Run tests matching regex pattern\n\n# Output \u0026 Verbosity\n--verbose                         # More detailed output\n--debug                           # Debug information\n--stop-on-failure                 # Stop on first failure\n--stop-on-error                   # Stop on first error\n--stop-on-warning                 # Stop on first warning\n\n# Coverage \u0026 Reports\n--coverage-text                   # Text coverage report\n--coverage-html=dir               # HTML coverage report\n--coverage-clover=file.xml        # XML coverage report\n\n# Test Execution\n--group=\"groupName\"               # Run tests in specific group\n--exclude-group=\"groupName\"       # Exclude tests in group\n--testsuite=\"suiteName\"           # Run specific test suite\n```\n\n**Examples:**\n\n```bash\n# Run specific test with verbose output\nbash zmsdb-test --filter=\"StatusTest::testBasic\" --verbose\n\n# Run all tests in a class and stop on first failure\nbash zmsapi-test --filter=\"StatusGetTest\" --stop-on-failure\n\n# Run tests with coverage report\nbash zmsdb-test --coverage-text\n\n# Run tests excluding a specific group\nbash zmsapi-test --exclude-group=\"slow\"\n```\n\n### API Testing (zmsapiautomation)\n\n**zmsapiautomation** provides Java REST-assured based API tests for ZMS APIs. These tests validate the REST API endpoints directly.\n\n**Using the test runner script (Recommended):**\n\nThe `zmsapiautomation-test` script must be run from inside the container. It automatically handles database setup, migrations, and test execution:\n\n```bash\n# Enter your web container first\npodman exec -it zms-web bash  # Podman\nddev ssh                      # DDEV\n\n# Run zmsapiautomation tests\ncd zmsapiautomation\nbash zmsapiautomation-test                    # Run all tests\nbash zmsapiautomation-test -Dtest=StatusEndpointTest  # Run specific test class\nbash zmsapiautomation-test -Dtest=StatusEndpointTest#statusEndpointShouldBeOk  # Run specific test method\nbash zmsapiautomation-test -Dtest=*EndpointTest  # Run all tests matching pattern\n```\n\n**Maven Test Filtering:**\n\nThe script supports Maven Surefire test filtering using the `-Dtest` parameter:\n\n```bash\n# Run a specific test class\nbash zmsapiautomation-test -Dtest=StatusEndpointTest\n\n# Run a specific test method\nbash zmsapiautomation-test -Dtest=StatusEndpointTest#statusEndpointShouldBeOk\n\n# Run multiple test classes\nbash zmsapiautomation-test -Dtest=StatusEndpointTest,OfficesAndServicesEndpointTest\n\n# Run tests matching a pattern\nbash zmsapiautomation-test -Dtest=*EndpointTest\n\n# Run tests with additional Maven options\nbash zmsapiautomation-test -Dtest=StatusEndpointTest -Dmaven.test.failure.ignore=true\n```\n\n**Environment Configuration:**\n\nThe script runs natively inside the container and uses environment variables. Default endpoints:\n\n- `BASE_URI`: `http://localhost/terminvereinbarung/api/2`\n- `CITIZEN_API_BASE_URI`: `http://localhost/terminvereinbarung/api/citizen`\n\nYou can override these defaults:\n\n```bash\nBASE_URI=http://localhost/terminvereinbarung/api/2 bash zmsapiautomation-test\nCITIZEN_API_BASE_URI=http://localhost/terminvereinbarung/api/citizen bash zmsapiautomation-test\n```\n\n**What the Script Does:**\n\n1. Backs up the current database\n2. Clears application caches\n3. Drops all database tables for a clean state\n4. Imports base database schema from `.resources/zms.sql`\n5. Runs Flyway migrations for test data\n6. Runs PHP migrations\n7. Executes hourly cronjob to import Munich DLDB data (if configured)\n8. Performs health checks on both APIs\n9. Runs Maven tests with REST-assured\n10. Collects and displays test results\n11. Restores the original database\n12. Cleans up test artifacts\n\n**Data Preparation (Optional):**\n\nTo import Munich DLDB data during test setup:\n\n```bash\nZMS_CRONROOT=1 ZMS_SOURCE_DLDB_MUNICH=\"\u003cmunich-source-url\u003e\" bash zmsapiautomation-test\n```\n\n**Running Tests Directly with Maven (inside container):**\n\nFor development without the full setup script (assumes database is already prepared):\n\n```bash\ncd zmsapiautomation\nmvn test\nmvn test -Dtest=StatusEndpointTest\n```\n\n**References:**\n- REST-assured: https://github.com/rest-assured/rest-assured\n\n### Common Errors\n\n- If you encounter `Too many levels of symbolic links`, remove the `\u003cexclude\u003e` rule for the vendor directory in the module's phpunit.xml.\n- If you get `No data path given in /var/www/html/zmsdb/src/Zmsdb/Source/Zmsdldb.php:29`, make sure your zmsdb/config.php contains the following line:\n  ```php\n  \\BO\\Zmsdb\\Source\\Zmsdldb::$importPath = realpath(dirname(__FILE__) . '/tests/Zmsdb/fixtures/');\n  ```\n\n## Cronjobs\nTo run cronjobs locally use ddev or podman\n\n### Using DDEV\n\n**Hourly cronjob with city-specific flags or default (which is also Berlin but compatible with dldb-mapper for now):**\n```bash\nddev exec zmsapi/cron/cronjob.hourly\nddev exec zmsapi/cron/cronjob.hourly --city=berlin\nddev exec zmsapi/cron/cronjob.hourly --city=munich\n```\n\n**Other cronjobs:**\n```bash\nddev exec zmsapi/cron/cronjob.minutly\nddev exec zmsapi/cron/cronjob.daily\n```\n\n### Using Podman\n\n**Hourly cronjob with city-specific flags or default (which is also Berlin but compatible with dldb-mapper for now):**\n```bash\npodman exec -it zms-web bash -lc \"zmsapi/cron/cronjob.hourly\"\npodman exec -it zms-web bash -lc \"zmsapi/cron/cronjob.hourly --city=berlin\"\npodman exec -it zms-web bash -lc \"zmsapi/cron/cronjob.hourly --city=munich\"\n```\n\n**Other cronjobs:**\n```bash\npodman exec -it zms-web bash -lc \"zmsapi/cron/cronjob.minutly\"\npodman exec -it zms-web bash -lc \"zmsapi/cron/cronjob.daily\"\n```\n\n## Branch Naming Convention\nTo keep our branch names organized and easily understandable, we follow a specific naming convention for all branches created in this repository. Please adhere to this convention when creating new branches:\n\n1. **type**: The type of work the branch represents. This should be one of the following:\n   - `feature`: For new features or enhancements.\n   - `bugfix`: For bug fixes.\n   - `hotfix`: For urgent fixes that need to be applied quickly.\n   - `cleanup`: For code refactoring, or documentation updates.\n   - `docs`: For updating documentation such as the README.md CODE_OF_CONDUCT.md LICENSE.md CHANGELOG.md CONTRIBUTING.md. Providing a ticket number or project for docs is optional.\n   - `chore`: For maintaining and updating dependencies, libraries, PHP/Node/Twig Versions, or other maintenance work.\n\n2. **project**: The project identifier. This should be:\n   - `zms` for the ZMS project.\n   - `zmskvr` for the ZMSKVR project.\n   - `mpdzbs` for the MPDZBS project.\n   - `muxdbs`for the MUXDBS project.\n\n3. **issue number**: The ticket or issue number related to this branch (use digits only). This helps track the branch to a specific issue in the project management system.\n\n4. **description**: A brief, lowercase description of the branch's purpose, using only lowercase letters, numbers, and hyphens (`-`).\n\n- Always use lowercase letters and hyphens for the description.\n- The issue number should be a numeric ID corresponding to the relevant ticket or task.\n- Descriptions should be concise and informative, summarizing the branch's purpose.\n\n#### Examples\n\n- **Feature Branch**: `feature-zms-12345-this-is-a-feature-in-the-zms-project`\n- **Bugfix Branch**: `bugfix-mpdzbs-67890-fix-crash-on-startup`\n- **Hotfix Branch**: `hotfix-zmskvr-98765-critical-fix-for-login`\n- **Cleanup Branch**: `cleanup-mpdzbs-11111-remove-unused-code`\n- **Chore Branch**: `chore-zms-2964-composer-update`\n- **Docs Branch**: `docs-zmskvr-0000-update-readme` `docs-zms-release-40-update-changelog`\n- **Feature Branch**: `feature-muxdbs-54321-add-bundid-integration`\n\n#### Regular Expression\n\nThe branch name must match the following regular expression:\n`^(feature|hotfix|bugfix|cleanup|maintenance|docs)-(zms|zmskvr|mpdzbs|muxdbs)-[0-9]+-[a-z0-9-]+$`\n\n**For further commit rules please refer to https://www.conventionalcommits.org/en/v1.0.0-beta.4/**\n- **feat(ZMS-123): commit message**\n- **fix(ZMSKVR-123): commit message**\n- **clean(ZMS-123): commit message**\n- **chore(ZMSKVR-123): commit message**\n- **docs(ZMS-123): commit message**\n\nPlease only branch features and bugfixes from the integration branch `next`. Hotfixes may be branched from `main`.\n```mermaid\n---\nconfig:\n  gitGraph:\n    parallelCommits: true\n---\n\ngitGraph LR:\n  commit tag: \"2.25.00-muc1\"\n  branch next order: 30\n  commit\n  \n  checkout main\n  branch hotfix-1 order: 5\n  commit\n  checkout main\n  merge hotfix-1 tag: \"2.25.00-muc1-hotfix1\"\n\n  checkout next\n  merge main id: \"Merge-back\"\n  commit\n\n  branch feature1 order: 40\n  commit id: \"Feature für Sprint 1\"\n  commit type: HIGHLIGHT id: \"Erste Überprüfung\"\n\n  checkout next\n  merge feature1\n\n\n  checkout next\n  commit type: HIGHLIGHT id: \"Tests Sprint 1\"\n  commit type: HIGHLIGHT id: \"Sprint 1 fertiggestellt\"\n\n  checkout main\n  merge next\n  commit type: HIGHLIGHT id: \"Abnahme Tests\"\n  commit tag: \"2.25.00-muc2\" \n```\n## Dependency Graph\n`zmscitizenview` and `refarch-gateway` are built on top of `zmscitizenapi`, but they do not directly pull dependencies from it. Similarly, while `zmscitizenapi` sends requests to `zmsapi`, `zmsapi` is not a direct dependency of `zmscitizenapi`.\n```mermaid\n%%{init: {\"flowchart\": {\"defaultRenderer\": \"elk\"}} }%%\ngraph TD;\n    %% Main ZMS module dependencies\n    zmsapi --\u003e zmsslim \u0026 zmsclient \u0026 zmsdldb \u0026 zmsdb \u0026 zmsentities;\n    zmsadmin --\u003e mellon \u0026 zmsclient \u0026 zmsslim \u0026 zmsentities;\n    zmscalldisplay --\u003e mellon \u0026 zmsclient \u0026 zmsentities \u0026 zmsslim;\n    zmsstatistic --\u003e mellon \u0026 zmsentities \u0026 zmsslim \u0026 zmsclient;\n    zmsmessaging --\u003e mellon \u0026 zmsclient \u0026 zmsentities \u0026 zmsslim;\n    zmsticketprinter --\u003e mellon \u0026 zmsclient \u0026 zmsentities \u0026 zmsslim;\n\n    zmsdb --\u003e zmsentities \u0026 zmsdldb \u0026 mellon;\n    zmsclient --\u003e zmsentities \u0026 zmsslim \u0026 mellon;\n    zmsentities --\u003e mellon;\n    zmsslim --\u003e mellon;\n\n    %% zmscitizenapi dependencies\n    zmscitizenapi --\u003e mellon \u0026 zmsslim \u0026 zmsclient \u0026 zmsentities;\n\n    %% Build dependencies (dashed lines)\n    zmscitizenapi -.-\u003e zmsapi;\n    refarch-gateway -.-\u003e zmscitizenapi;\n    zmscitizenview -.-\u003e refarch-gateway;\n\n    %% Group refarch-gateway and zmscitizenview into a subgraph\n    subgraph refarch [refarch]\n        style refarch stroke-dasharray: 5\n        refarch-gateway\n        zmscitizenview\n    end\n\n    %% Group remaining modules into dashed PHP-style subgraph\n    subgraph zms_modules [ZMS PHP Modules]\n        style zms_modules stroke-dasharray: 5, 5, 1, 5\n        zmsapi\n        zmsadmin\n        zmscalldisplay\n        zmsstatistic\n        zmsmessaging\n        zmsticketprinter\n        zmsdb\n        zmsclient\n        zmsentities\n        zmsslim\n        zmsdldb\n        mellon\n        zmscitizenapi\n    end\n\n    %% Styling for the three modules\n    classDef citizenapi fill:#e1f5fe,stroke:#01579b,stroke-width:2px;\n    classDef gateway fill:#f3e5f5,stroke:#4a148c,stroke-width:2px;\n    classDef citizenview fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px;\n\n    class zmscitizenapi citizenapi;\n    class refarch-gateway gateway;\n    class zmscitizenview citizenview;\n```\n\n## Screenshot\n![screenshot](https://github.com/user-attachments/assets/54d360e9-c47b-4f3c-b849-5966a8766af9)\n![combined_image](https://github.com/user-attachments/assets/87902e60-fe90-48a0-bf60-c5edec210dc9)\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/it-at-m/eappointment.svg?style=for-the-badge\n[contributors-url]: https://github.com/it-at-m/eappointment/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/it-at-m/eappointment.svg?style=for-the-badge\n[forks-url]: https://github.com/it-at-m/eappointment/network/members\n[stars-shield]: https://img.shields.io/github/stars/it-at-m/eappointment.svg?style=for-the-badge\n[stars-url]: https://github.com/it-at-m/eappointment/stargazers\n[issues-shield]: https://img.shields.io/github/issues/it-at-m/eappointment.svg?style=for-the-badge\n[issues-url]: https://github.com/it-at-m/eappointment/issues\n[license-shield]: https://img.shields.io/github/license/it-at-m/eappointment.svg?style=for-the-badge\n[license-url]: https://github.com/it-at-m/eappointment/blob/main/LICENSE\n[product-screenshot]: images/screenshot.png\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fit-at-m%2Feappointment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fit-at-m%2Feappointment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fit-at-m%2Feappointment/lists"}