This project was created as a case study for a master's thesis used to analyze productivity and software quality outcomes in a distributed agile development context.
- Version: 9.2.0 (
APP_VERSIONinconfig.php) - Stack: PHP 8 (PDO/MySQL), Twig, Apache, jQuery/Bootstrap 4, SCSS
Requires Docker Desktop with Compose v2+.
docker compose up --build- Images:
php:8.5-apache,mysql:lts,composer:lts(official Docker Hub images) - First start creates DB
clinicAppointmentAppand importsdocker/db/init/01-clinicappointmentapp.sql - App DB user:
caba/caba- root:caba_root(local only, change before any shared use) - Env used by the PHP container:
APP_URL,DB_HOST,DB_USER,DB_PASS,DB_NAME(seecompose.yaml) - Stop:
docker compose down- add-vto delete the MySQL volume and re-seed next start
- PHP 8.1+ with
pdo_mysql, Apache (or equivalent) withmod_rewrite, Composer deps (composer install) - Create MySQL database
clinicAppointmentApp - Import
docker/db/init/01-clinicappointmentapp.sql(or a dump underassets/backups/) - Set env (or edit
config.php):APP_URL,DB_HOST,DB_USER,DB_PASS,DB_NAME - Default non-Docker
APP_URLishttp://localhost/caba/- the vhost path must match that URL (or setAPP_URLto your real base). JS readsAPP_URLfrom the page and falls back tohttp://localhost/caba/when it is not set.
Roles in DB: 1 receptionist, 2 doctor, 3 patient.
Demo logins from docker/db/init/01-clinicappointmentapp.sql (local only). The password for each account is the username duplicated (admin -> adminadmin, emad -> emademad).
- Receptionist:
admin - Doctors:
emad,heba,reem,eman,sameer,omar - Patients:
safaa,saeed,lina,shima,marwa,mazen,ahmed,mohammed
If the MySQL volume already exists from an older seed, recreate it (docker compose down -v then up --build) for these passwords to apply.
- Edit files under
scss/, not the generated CSS - App loads
css/style.min.cssandcss/rtl.min.css(config.php) - Local rebuild typically goes through gulp (
gulpfile.js) / sass, the Docker image does not run a frontend build pipeline (scss/is dockerignored)
- Debug left on:
APP_DEBUGisTRUE, Twig debug is on, anddisplay_errorsis forced on inconfig.php(even though the Docker image enables productionphp.ini). - Weak auth: passwords stored as MD5 with a static salt (
class.user.php). - Secrets in source: Gmail SMTP credentials in
sendEmail.php. AES key hardcoded inbackend/functions.php. - PWA incomplete:
service-worker.jsis fully commented out. Registration/PWA bits commented in Twig. Referencedmanifest.json/ Apple touch icons are missing. .htaccesshost rules: non-localhosthosts are redirected tohttps://www.…. Awkward for LAN IPs or custom hostnames.- Seed dump quirks: dump originated as a phpMyAdmin export for
techrjfw_cabadb. Includes old session rows and content that may not match a clean install. - No automated tests and no CI configuration in this repo.
- Composer lock targets older Symfony/Twig minors while Docker runs PHP 8.5.
E_DEPRECATEDis filtered inconfig.phpso those vendor notices do not flood the UI. - Docker DB port
3306published on the host..
| Path | Purpose |
|---|---|
pages/ |
PHP page entrypoints |
backend/ |
API, classes, DB helpers |
templates/ |
Twig templates |
js/, css/, scss/ |
Front-end assets |
uploads/ |
Runtime uploads (mounted as a volume in Compose) |
docker/db/init/ |
MySQL first-boot SQL |
Dockerfile, compose.yaml |
Container setup |
