From 2c0e092e673a666ccb7a8b1b29bcbb362e486c81 Mon Sep 17 00:00:00 2001 From: Clemens Creutzburg Date: Wed, 2 Sep 2026 19:24:09 +0200 Subject: [PATCH] Website-Stand vom FTP-Server synchronisieren --- .git-ftp.log | 1 + .gitig | 0 .gitignore | 5 + .htaccess | 25 ++ .well-known/acme-challenge/.htaccess | 15 ++ ...FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI | 1 + admin/sql | 0 admin/sql/2026-03-20_schema_check.sql | 192 ---------------- admin/sql/2026-03-20_schema_migration.sql | 217 ------------------ ...teliste_mehrfach_zeitfenster_migration.sql | 99 -------- ...zeiterfassung_time_error_notifications.sql | 24 -- admin/sql/impfworkflow_tables.sql | 20 -- admin/tcpdf/tools/.htaccess | 1 + admin/trumbowyg/.bowerrc | 3 + admin/trumbowyg/.gitattributes | 6 + admin/trumbowyg/.github/FUNDING.yml | 3 + admin/trumbowyg/.github/ISSUE_TEMPLATE.md | 20 ++ admin/trumbowyg/.gitignore | 25 ++ admin/trumbowyg/.jshintrc | 29 +++ admin/trumbowyg/.npmignore | 15 ++ admin/trumbowyg/docs/.gitignore | 6 + admin/trumbowyg/docs/.jshintrc | 31 +++ ical/kalender.ical | 40 +--- ical/kalender.ics | 40 +--- intern/.htaccess | 4 + pcm.php | 72 +----- praxis.php | 94 ++++---- 27 files changed, 267 insertions(+), 721 deletions(-) create mode 100644 .git-ftp.log create mode 100644 .gitig create mode 100644 .htaccess create mode 100644 .well-known/acme-challenge/.htaccess create mode 100644 .well-known/acme-challenge/_FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI create mode 100644 admin/sql delete mode 100644 admin/sql/2026-03-20_schema_check.sql delete mode 100644 admin/sql/2026-03-20_schema_migration.sql delete mode 100644 admin/sql/2026-03-22_warteliste_mehrfach_zeitfenster_migration.sql delete mode 100644 admin/sql/2026-03-30_zeiterfassung_time_error_notifications.sql delete mode 100644 admin/sql/impfworkflow_tables.sql create mode 100644 admin/tcpdf/tools/.htaccess create mode 100644 admin/trumbowyg/.bowerrc create mode 100644 admin/trumbowyg/.gitattributes create mode 100644 admin/trumbowyg/.github/FUNDING.yml create mode 100644 admin/trumbowyg/.github/ISSUE_TEMPLATE.md create mode 100644 admin/trumbowyg/.gitignore create mode 100644 admin/trumbowyg/.jshintrc create mode 100644 admin/trumbowyg/.npmignore create mode 100644 admin/trumbowyg/docs/.gitignore create mode 100644 admin/trumbowyg/docs/.jshintrc create mode 100644 intern/.htaccess diff --git a/.git-ftp.log b/.git-ftp.log new file mode 100644 index 0000000..8bfe357 --- /dev/null +++ b/.git-ftp.log @@ -0,0 +1 @@ +00077aa09a2f4a21e4af14c732f37ef15feb6c38 diff --git a/.gitig b/.gitig new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore index 15efdab..d04cd50 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,8 @@ .vscode/ftp-sync.json .vscode/sftp.json + +sync_config.jsonc + +# Patient uploads are runtime data, never source-control content. +/upload/*/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..ccbf9f1 --- /dev/null +++ b/.htaccess @@ -0,0 +1,25 @@ +#php_value default_charset ?UTF-8? +#php_value mbstring.language UTF-8 +#php_value mbstring.internal_encoding UTF-8 +#php_value mbstring.http_output UTF-8 +#php_value mbstring.http_output UTF-8 + +#Options +FollowSymlinks +RewriteEngine On +RewriteBase / +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.+)$ /$1.php + + +RewriteEngine On + + + +RewriteCond %{HTTPS} !=on +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + + + + diff --git a/.well-known/acme-challenge/.htaccess b/.well-known/acme-challenge/.htaccess new file mode 100644 index 0000000..59c39aa --- /dev/null +++ b/.well-known/acme-challenge/.htaccess @@ -0,0 +1,15 @@ + + RewriteEngine off + + +# Require all granted +Satisfy Any +Order Deny,Allow +Allow from all + + + # Require all denied + Order Allow,Deny + Deny from all + + diff --git a/.well-known/acme-challenge/_FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI b/.well-known/acme-challenge/_FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI new file mode 100644 index 0000000..a92e423 --- /dev/null +++ b/.well-known/acme-challenge/_FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI @@ -0,0 +1 @@ +_FSqA3-cKWlxMr6kSntJ4ylybPWmFbUu4bn2JmQ-eaI.vmGDXlVdcMc4EthdhP9VWKal6uwIIFdAaw45JAOlmK8 \ No newline at end of file diff --git a/admin/sql b/admin/sql new file mode 100644 index 0000000..e69de29 diff --git a/admin/sql/2026-03-20_schema_check.sql b/admin/sql/2026-03-20_schema_check.sql deleted file mode 100644 index c710ee6..0000000 --- a/admin/sql/2026-03-20_schema_check.sql +++ /dev/null @@ -1,192 +0,0 @@ --- Prueft die fuer den aktuellen Impf-Workflow relevanten Tabellen, Spalten, --- Indizes und den Legacy-Migrationsstatus. --- Das Skript veraendert keine Daten. - -SELECT 'database' AS check_type, DATABASE() AS object_name, 'INFO' AS status; - -SELECT - 'table' AS check_type, - t.required_name AS object_name, - CASE - WHEN it.table_name IS NOT NULL THEN 'OK' - ELSE 'MISSING' - END AS status -FROM ( - SELECT 'impf_workflow_meta' AS required_name - UNION ALL SELECT 'impfstoff_workflow' - UNION ALL SELECT 'impfstoff_wochenplan' - UNION ALL SELECT 'impf_zeitraum' - UNION ALL SELECT 'impf_zeitraum_impfstoff' - UNION ALL SELECT 'warteliste_zeitraum' - UNION ALL SELECT 'warteliste' -) t -LEFT JOIN information_schema.tables it - ON it.table_schema = DATABASE() - AND it.table_name = t.required_name -ORDER BY t.required_name; - -SELECT - 'column' AS check_type, - CONCAT(c.table_name, '.', c.column_name) AS object_name, - CASE - WHEN ic.column_name IS NOT NULL THEN 'OK' - ELSE 'MISSING' - END AS status -FROM ( - SELECT 'impf_workflow_meta' AS table_name, 'meta_key' AS column_name - UNION ALL SELECT 'impf_workflow_meta', 'meta_value' - UNION ALL SELECT 'impf_workflow_meta', 'updated_at' - UNION ALL SELECT 'impfstoff_workflow', 'impfstoff_id' - UNION ALL SELECT 'impfstoff_workflow', 'dosen_pro_flasche' - UNION ALL SELECT 'impfstoff_wochenplan', 'plan_id' - UNION ALL SELECT 'impfstoff_wochenplan', 'impfstoff_id' - UNION ALL SELECT 'impfstoff_wochenplan', 'wochentag' - UNION ALL SELECT 'impfstoff_wochenplan', 'start' - UNION ALL SELECT 'impfstoff_wochenplan', 'ende' - UNION ALL SELECT 'impfstoff_wochenplan', 'impfortid' - UNION ALL SELECT 'impf_zeitraum', 'zeitraum_id' - UNION ALL SELECT 'impf_zeitraum', 'bezeichnung' - UNION ALL SELECT 'impf_zeitraum', 'wochentag' - UNION ALL SELECT 'impf_zeitraum', 'start' - UNION ALL SELECT 'impf_zeitraum', 'ende' - UNION ALL SELECT 'impf_zeitraum', 'impfortid' - UNION ALL SELECT 'impf_zeitraum_impfstoff', 'zeitraum_id' - UNION ALL SELECT 'impf_zeitraum_impfstoff', 'impfstoff_id' - UNION ALL SELECT 'warteliste_zeitraum', 'warteid' - UNION ALL SELECT 'warteliste_zeitraum', 'zeitraum_id' - UNION ALL SELECT 'warteliste_zeitraum', 'created_at' - UNION ALL SELECT 'warteliste', 'warteid' - UNION ALL SELECT 'warteliste', 'userid' - UNION ALL SELECT 'warteliste', 'impfenzeitraum' - UNION ALL SELECT 'warteliste', 'zeitraum_id' -) c -LEFT JOIN information_schema.columns ic - ON ic.table_schema = DATABASE() - AND ic.table_name = c.table_name - AND ic.column_name = c.column_name -ORDER BY c.table_name, c.column_name; - -SELECT - 'index' AS check_type, - CONCAT(i.table_name, '.', i.index_name) AS object_name, - CASE - WHEN isx.index_name IS NOT NULL THEN 'OK' - ELSE 'MISSING' - END AS status -FROM ( - SELECT 'warteliste' AS table_name, 'idx_warteliste_zeitraum' AS index_name - UNION ALL SELECT 'warteliste_zeitraum', 'idx_warteliste_zeitraum_zeitraum' - UNION ALL SELECT 'impfstoff_wochenplan', 'idx_impfstoff_wochenplan_impfstoff' - UNION ALL SELECT 'impfstoff_wochenplan', 'idx_impfstoff_wochenplan_wochentag' - UNION ALL SELECT 'impf_zeitraum', 'idx_impf_zeitraum_wochentag' - UNION ALL SELECT 'impf_zeitraum', 'idx_impf_zeitraum_impfort' - UNION ALL SELECT 'impf_zeitraum_impfstoff', 'idx_impf_zeitraum_impfstoff_impfstoff' -) i -LEFT JOIN information_schema.statistics isx - ON isx.table_schema = DATABASE() - AND isx.table_name = i.table_name - AND isx.index_name = i.index_name -GROUP BY i.table_name, i.index_name, isx.index_name -ORDER BY i.table_name, i.index_name; - -SELECT - 'meta' AS check_type, - 'impf_workflow_meta.legacy_wochenplan_migrated' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impf_workflow_meta' - ) THEN COALESCE(( - SELECT CONCAT('VALUE=', meta_value) - FROM impf_workflow_meta - WHERE meta_key = 'legacy_wochenplan_migrated' - LIMIT 1 - ), 'MISSING') - ELSE 'TABLE_MISSING' - END AS status; - -SELECT - 'meta' AS check_type, - 'impf_workflow_meta.legacy_warteliste_zeitraeume_migrated' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impf_workflow_meta' - ) THEN COALESCE(( - SELECT CONCAT('VALUE=', meta_value) - FROM impf_workflow_meta - WHERE meta_key = 'legacy_warteliste_zeitraeume_migrated' - LIMIT 1 - ), 'MISSING') - ELSE 'TABLE_MISSING' - END AS status; - -SELECT - 'data' AS check_type, - 'impfstoff_wochenplan rows' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impfstoff_wochenplan' - ) THEN CAST((SELECT COUNT(*) FROM impfstoff_wochenplan) AS CHAR) - ELSE 'TABLE_MISSING' - END AS status -UNION ALL -SELECT - 'data' AS check_type, - 'impf_zeitraum rows' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impf_zeitraum' - ) THEN CAST((SELECT COUNT(*) FROM impf_zeitraum) AS CHAR) - ELSE 'TABLE_MISSING' - END AS status -UNION ALL -SELECT - 'data' AS check_type, - 'impf_zeitraum_impfstoff rows' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impf_zeitraum_impfstoff' - ) THEN CAST((SELECT COUNT(*) FROM impf_zeitraum_impfstoff) AS CHAR) - ELSE 'TABLE_MISSING' - END AS status -UNION ALL -SELECT - 'data' AS check_type, - 'warteliste with zeitraum_id' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.columns - WHERE table_schema = DATABASE() - AND table_name = 'warteliste' - AND column_name = 'zeitraum_id' - ) THEN CAST((SELECT COUNT(*) FROM warteliste WHERE zeitraum_id IS NOT NULL) AS CHAR) - ELSE 'COLUMN_MISSING' - END AS status; - -SELECT - 'data' AS check_type, - 'warteliste_zeitraum rows' AS object_name, - CASE - WHEN EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'warteliste_zeitraum' - ) THEN CAST((SELECT COUNT(*) FROM warteliste_zeitraum) AS CHAR) - ELSE 'TABLE_MISSING' - END AS status; diff --git a/admin/sql/2026-03-20_schema_migration.sql b/admin/sql/2026-03-20_schema_migration.sql deleted file mode 100644 index 789abf6..0000000 --- a/admin/sql/2026-03-20_schema_migration.sql +++ /dev/null @@ -1,217 +0,0 @@ --- Bringt den SQL-Dump auf den vom aktuellen Quellcode erwarteten Stand. --- Die Migration ist idempotent und kann mehrfach ausgefuehrt werden. - -CREATE TABLE IF NOT EXISTS `impf_workflow_meta` ( - `meta_key` VARCHAR(100) NOT NULL, - `meta_value` VARCHAR(255) NOT NULL DEFAULT '', - `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`meta_key`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS `impfstoff_workflow` ( - `impfstoff_id` INT NOT NULL, - `dosen_pro_flasche` INT NOT NULL, - `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`impfstoff_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS `impfstoff_wochenplan` ( - `plan_id` INT NOT NULL AUTO_INCREMENT, - `impfstoff_id` INT NOT NULL, - `wochentag` TINYINT NOT NULL, - `start` TIME NOT NULL, - `ende` TIME NOT NULL, - `impfortid` INT NOT NULL, - `aktiv` TINYINT NOT NULL DEFAULT 1, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`plan_id`), - INDEX `idx_impfstoff_wochenplan_impfstoff` (`impfstoff_id`), - INDEX `idx_impfstoff_wochenplan_wochentag` (`wochentag`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS `impf_zeitraum` ( - `zeitraum_id` INT NOT NULL AUTO_INCREMENT, - `bezeichnung` VARCHAR(120) NOT NULL DEFAULT '', - `wochentag` TINYINT NOT NULL, - `start` TIME NOT NULL, - `ende` TIME NOT NULL, - `impfortid` INT NOT NULL, - `aktiv` TINYINT NOT NULL DEFAULT 1, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`zeitraum_id`), - INDEX `idx_impf_zeitraum_wochentag` (`wochentag`), - INDEX `idx_impf_zeitraum_impfort` (`impfortid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS `impf_zeitraum_impfstoff` ( - `zeitraum_id` INT NOT NULL, - `impfstoff_id` INT NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`zeitraum_id`, `impfstoff_id`), - INDEX `idx_impf_zeitraum_impfstoff_impfstoff` (`impfstoff_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS `warteliste_zeitraum` ( - `warteid` INT NOT NULL, - `zeitraum_id` INT NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`warteid`, `zeitraum_id`), - INDEX `idx_warteliste_zeitraum_zeitraum` (`zeitraum_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -DROP PROCEDURE IF EXISTS `migrate_praxis_schema_20260320`; -DELIMITER $$ -CREATE PROCEDURE `migrate_praxis_schema_20260320`() -BEGIN - DECLARE v_impf_zeitraum_exists INT DEFAULT 0; - DECLARE v_bezeichnung_exists INT DEFAULT 0; - DECLARE v_warteliste_exists INT DEFAULT 0; - DECLARE v_zeitraum_id_exists INT DEFAULT 0; - DECLARE v_warteliste_index_exists INT DEFAULT 0; - DECLARE v_warteliste_zeitraum_exists INT DEFAULT 0; - DECLARE v_warteliste_zeitraum_index_exists INT DEFAULT 0; - DECLARE v_legacy_plan_exists INT DEFAULT 0; - - SELECT COUNT(*) - INTO v_impf_zeitraum_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impf_zeitraum'; - - IF v_impf_zeitraum_exists > 0 THEN - SELECT COUNT(*) - INTO v_bezeichnung_exists - FROM information_schema.columns - WHERE table_schema = DATABASE() - AND table_name = 'impf_zeitraum' - AND column_name = 'bezeichnung'; - - IF v_bezeichnung_exists = 0 THEN - ALTER TABLE `impf_zeitraum` - ADD COLUMN `bezeichnung` VARCHAR(120) NOT NULL DEFAULT '' AFTER `zeitraum_id`; - END IF; - END IF; - - SELECT COUNT(*) - INTO v_warteliste_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'warteliste'; - - IF v_warteliste_exists > 0 THEN - SELECT COUNT(*) - INTO v_zeitraum_id_exists - FROM information_schema.columns - WHERE table_schema = DATABASE() - AND table_name = 'warteliste' - AND column_name = 'zeitraum_id'; - - IF v_zeitraum_id_exists = 0 THEN - ALTER TABLE `warteliste` - ADD COLUMN `zeitraum_id` INT NULL AFTER `impfenzeitraum`; - END IF; - - SELECT COUNT(*) - INTO v_warteliste_index_exists - FROM information_schema.statistics - WHERE table_schema = DATABASE() - AND table_name = 'warteliste' - AND index_name = 'idx_warteliste_zeitraum'; - - IF v_warteliste_index_exists = 0 THEN - ALTER TABLE `warteliste` - ADD INDEX `idx_warteliste_zeitraum` (`zeitraum_id`); - END IF; - END IF; - - SELECT COUNT(*) - INTO v_warteliste_zeitraum_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'warteliste_zeitraum'; - - IF v_warteliste_zeitraum_exists = 0 THEN - CREATE TABLE `warteliste_zeitraum` ( - `warteid` INT NOT NULL, - `zeitraum_id` INT NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`warteid`, `zeitraum_id`), - INDEX `idx_warteliste_zeitraum_zeitraum` (`zeitraum_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - SET v_warteliste_zeitraum_exists = 1; - ELSE - SELECT COUNT(*) - INTO v_warteliste_zeitraum_index_exists - FROM information_schema.statistics - WHERE table_schema = DATABASE() - AND table_name = 'warteliste_zeitraum' - AND index_name = 'idx_warteliste_zeitraum_zeitraum'; - - IF v_warteliste_zeitraum_index_exists = 0 THEN - ALTER TABLE `warteliste_zeitraum` - ADD INDEX `idx_warteliste_zeitraum_zeitraum` (`zeitraum_id`); - END IF; - END IF; - - SELECT COUNT(*) - INTO v_legacy_plan_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'impfstoff_wochenplan'; - - IF v_legacy_plan_exists > 0 AND v_impf_zeitraum_exists > 0 THEN - INSERT INTO `impf_zeitraum` (`bezeichnung`, `wochentag`, `start`, `ende`, `impfortid`, `aktiv`) - SELECT DISTINCT - '', - wp.`wochentag`, - wp.`start`, - wp.`ende`, - wp.`impfortid`, - wp.`aktiv` - FROM `impfstoff_wochenplan` wp - LEFT JOIN `impf_zeitraum` z - ON z.`wochentag` = wp.`wochentag` - AND z.`start` = wp.`start` - AND z.`ende` = wp.`ende` - AND z.`impfortid` = wp.`impfortid` - AND z.`aktiv` = wp.`aktiv` - WHERE z.`zeitraum_id` IS NULL; - - INSERT INTO `impf_zeitraum_impfstoff` (`zeitraum_id`, `impfstoff_id`) - SELECT DISTINCT - z.`zeitraum_id`, - wp.`impfstoff_id` - FROM `impfstoff_wochenplan` wp - INNER JOIN `impf_zeitraum` z - ON z.`wochentag` = wp.`wochentag` - AND z.`start` = wp.`start` - AND z.`ende` = wp.`ende` - AND z.`impfortid` = wp.`impfortid` - AND z.`aktiv` = wp.`aktiv` - LEFT JOIN `impf_zeitraum_impfstoff` m - ON m.`zeitraum_id` = z.`zeitraum_id` - AND m.`impfstoff_id` = wp.`impfstoff_id` - WHERE wp.`impfstoff_id` > 0 - AND m.`zeitraum_id` IS NULL; - - INSERT INTO `impf_workflow_meta` (`meta_key`, `meta_value`) - VALUES ('legacy_wochenplan_migrated', '1') AS `incoming` - ON DUPLICATE KEY UPDATE `meta_value` = `incoming`.`meta_value`; - END IF; - - IF v_warteliste_exists > 0 AND v_warteliste_zeitraum_exists > 0 THEN - INSERT IGNORE INTO `warteliste_zeitraum` (`warteid`, `zeitraum_id`) - SELECT `warteid`, `zeitraum_id` - FROM `warteliste` - WHERE `zeitraum_id` IS NOT NULL - AND `zeitraum_id` > 0; - - INSERT INTO `impf_workflow_meta` (`meta_key`, `meta_value`) - VALUES ('legacy_warteliste_zeitraeume_migrated', '1') AS `incoming` - ON DUPLICATE KEY UPDATE `meta_value` = `incoming`.`meta_value`; - END IF; -END $$ -DELIMITER ; - -CALL `migrate_praxis_schema_20260320`(); -DROP PROCEDURE IF EXISTS `migrate_praxis_schema_20260320`; diff --git a/admin/sql/2026-03-22_warteliste_mehrfach_zeitfenster_migration.sql b/admin/sql/2026-03-22_warteliste_mehrfach_zeitfenster_migration.sql deleted file mode 100644 index 8c2652f..0000000 --- a/admin/sql/2026-03-22_warteliste_mehrfach_zeitfenster_migration.sql +++ /dev/null @@ -1,99 +0,0 @@ --- Migration fuer Mehrfach-Zeitfenster in der Impfwarteliste. --- Idempotent: kann mehrfach ausgefuehrt werden. --- Bestehende Tabellen werden nicht neu aufgebaut, sondern nur erweitert. - -CREATE TABLE IF NOT EXISTS `impf_workflow_meta` ( - `meta_key` VARCHAR(100) NOT NULL, - `meta_value` VARCHAR(255) NOT NULL DEFAULT '', - `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`meta_key`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -DROP PROCEDURE IF EXISTS `migrate_warteliste_multi_zeitfenster_20260322`; -DELIMITER $$ -CREATE PROCEDURE `migrate_warteliste_multi_zeitfenster_20260322`() -BEGIN - DECLARE v_warteliste_exists INT DEFAULT 0; - DECLARE v_zeitraum_id_exists INT DEFAULT 0; - DECLARE v_warteliste_index_exists INT DEFAULT 0; - DECLARE v_warteliste_zeitraum_exists INT DEFAULT 0; - DECLARE v_warteliste_zeitraum_index_exists INT DEFAULT 0; - - SELECT COUNT(*) - INTO v_warteliste_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'warteliste'; - - IF v_warteliste_exists = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'Tabelle warteliste wurde nicht gefunden.'; - END IF; - - SELECT COUNT(*) - INTO v_zeitraum_id_exists - FROM information_schema.columns - WHERE table_schema = DATABASE() - AND table_name = 'warteliste' - AND column_name = 'zeitraum_id'; - - IF v_zeitraum_id_exists = 0 THEN - ALTER TABLE `warteliste` - ADD COLUMN `zeitraum_id` INT NULL AFTER `impfenzeitraum`; - END IF; - - SELECT COUNT(*) - INTO v_warteliste_index_exists - FROM information_schema.statistics - WHERE table_schema = DATABASE() - AND table_name = 'warteliste' - AND index_name = 'idx_warteliste_zeitraum'; - - IF v_warteliste_index_exists = 0 THEN - ALTER TABLE `warteliste` - ADD INDEX `idx_warteliste_zeitraum` (`zeitraum_id`); - END IF; - - SELECT COUNT(*) - INTO v_warteliste_zeitraum_exists - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'warteliste_zeitraum'; - - IF v_warteliste_zeitraum_exists = 0 THEN - CREATE TABLE `warteliste_zeitraum` ( - `warteid` INT NOT NULL, - `zeitraum_id` INT NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`warteid`, `zeitraum_id`), - INDEX `idx_warteliste_zeitraum_zeitraum` (`zeitraum_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - SET v_warteliste_zeitraum_exists = 1; - END IF; - - SELECT COUNT(*) - INTO v_warteliste_zeitraum_index_exists - FROM information_schema.statistics - WHERE table_schema = DATABASE() - AND table_name = 'warteliste_zeitraum' - AND index_name = 'idx_warteliste_zeitraum_zeitraum'; - - IF v_warteliste_zeitraum_index_exists = 0 THEN - ALTER TABLE `warteliste_zeitraum` - ADD INDEX `idx_warteliste_zeitraum_zeitraum` (`zeitraum_id`); - END IF; - - INSERT IGNORE INTO `warteliste_zeitraum` (`warteid`, `zeitraum_id`) - SELECT `warteid`, `zeitraum_id` - FROM `warteliste` - WHERE `zeitraum_id` IS NOT NULL - AND `zeitraum_id` > 0; - - INSERT INTO `impf_workflow_meta` (`meta_key`, `meta_value`) - VALUES ('legacy_warteliste_zeitraeume_migrated', '1') AS `incoming` - ON DUPLICATE KEY UPDATE `meta_value` = `incoming`.`meta_value`; -END $$ -DELIMITER ; - -CALL `migrate_warteliste_multi_zeitfenster_20260322`(); -DROP PROCEDURE IF EXISTS `migrate_warteliste_multi_zeitfenster_20260322`; diff --git a/admin/sql/2026-03-30_zeiterfassung_time_error_notifications.sql b/admin/sql/2026-03-30_zeiterfassung_time_error_notifications.sql deleted file mode 100644 index 5bf6ad1..0000000 --- a/admin/sql/2026-03-30_zeiterfassung_time_error_notifications.sql +++ /dev/null @@ -1,24 +0,0 @@ -CREATE TABLE IF NOT EXISTS time_error_notification_state ( - employee_id INT NOT NULL, - cycle_started_on DATE NOT NULL, - first_error_date DATE NOT NULL, - last_notification_stage VARCHAR(50) DEFAULT NULL, - last_notification_sent_at DATETIME DEFAULT NULL, - employee_day_1_sent_at DATETIME DEFAULT NULL, - employee_day_3_sent_at DATETIME DEFAULT NULL, - admin_day_7_sent_at DATETIME DEFAULT NULL, - updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (employee_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS time_error_notifications ( - id INT NOT NULL AUTO_INCREMENT, - employee_id INT NOT NULL, - cycle_started_on DATE NOT NULL, - notification_stage VARCHAR(50) NOT NULL, - recipient_email VARCHAR(255) NOT NULL, - sent_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (id), - UNIQUE KEY uniq_time_error_notification (employee_id, cycle_started_on, notification_stage, recipient_email) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/admin/sql/impfworkflow_tables.sql b/admin/sql/impfworkflow_tables.sql deleted file mode 100644 index a2cc821..0000000 --- a/admin/sql/impfworkflow_tables.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE IF NOT EXISTS impfstoff_workflow ( - impfstoff_id INT NOT NULL, - dosen_pro_flasche INT NOT NULL, - updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (impfstoff_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE IF NOT EXISTS impfstoff_wochenplan ( - plan_id INT NOT NULL AUTO_INCREMENT, - impfstoff_id INT NOT NULL, - wochentag TINYINT NOT NULL, - start TIME NOT NULL, - ende TIME NOT NULL, - impfortid INT NOT NULL, - aktiv TINYINT NOT NULL DEFAULT 1, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (plan_id), - INDEX idx_impfstoff_wochenplan_impfstoff (impfstoff_id), - INDEX idx_impfstoff_wochenplan_wochentag (wochentag) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/admin/tcpdf/tools/.htaccess b/admin/tcpdf/tools/.htaccess new file mode 100644 index 0000000..8d2f256 --- /dev/null +++ b/admin/tcpdf/tools/.htaccess @@ -0,0 +1 @@ +deny from all diff --git a/admin/trumbowyg/.bowerrc b/admin/trumbowyg/.bowerrc new file mode 100644 index 0000000..c8474bf --- /dev/null +++ b/admin/trumbowyg/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower_components/" +} diff --git a/admin/trumbowyg/.gitattributes b/admin/trumbowyg/.gitattributes new file mode 100644 index 0000000..2aa7647 --- /dev/null +++ b/admin/trumbowyg/.gitattributes @@ -0,0 +1,6 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# SCSS and JS files must always use LF for tools to work +*.js eol=lf +*.scss eol=lf \ No newline at end of file diff --git a/admin/trumbowyg/.github/FUNDING.yml b/admin/trumbowyg/.github/FUNDING.yml new file mode 100644 index 0000000..464afbb --- /dev/null +++ b/admin/trumbowyg/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: Alex-D +patreon: AlexandreDemode +custom: https://paypal.me/demodealexandre diff --git a/admin/trumbowyg/.github/ISSUE_TEMPLATE.md b/admin/trumbowyg/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..d5afd82 --- /dev/null +++ b/admin/trumbowyg/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ + + + +### Description + + + +### How to reproduce? + diff --git a/admin/trumbowyg/.gitignore b/admin/trumbowyg/.gitignore new file mode 100644 index 0000000..0cccd41 --- /dev/null +++ b/admin/trumbowyg/.gitignore @@ -0,0 +1,25 @@ +# Others +~$* +/.sass-cache +/uploaded-files +/node_modules +/bower_components +/dist +/src/ui/sass/_sprite* +/plugins/**/ui/sass/_sprite* + +# We use npm: ignore yarn +yarn.lock + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +# Mac crap +.DS_Store + +# IDEA +.idea +/nbproject diff --git a/admin/trumbowyg/.jshintrc b/admin/trumbowyg/.jshintrc new file mode 100644 index 0000000..37bf193 --- /dev/null +++ b/admin/trumbowyg/.jshintrc @@ -0,0 +1,29 @@ +{ + "bitwise": true, + "camelcase": true, + "esnext": true, + "curly": true, + "eqeqeq": true, + "forin": true, + "indent": 4, + "latedef": false, + "newcap": false, + "noarg": true, + "noempty": true, + "plusplus": true, + "quotmark": "single", + "undef": true, + "unused": true, + "strict": true, + "trailing": true, + "maxparams": 5, + "maxdepth": 5, + "maxstatements": 40, + "maxcomplexity": 20, + "maxlen": 1200, + "eqnull": true, + "browser": true, + "globals": { + "jQuery": false + } +} \ No newline at end of file diff --git a/admin/trumbowyg/.npmignore b/admin/trumbowyg/.npmignore new file mode 100644 index 0000000..8ea661b --- /dev/null +++ b/admin/trumbowyg/.npmignore @@ -0,0 +1,15 @@ +Gulpfile.js +banner.jpg +bower.json +src +docs +bower_components +.gitattributes +.gitignore +.jshintrc +.github +.idea +.bowerrc +sponsors +BACKERS.md +CONTRIBUTORS.md diff --git a/admin/trumbowyg/docs/.gitignore b/admin/trumbowyg/docs/.gitignore new file mode 100644 index 0000000..7a3c82e --- /dev/null +++ b/admin/trumbowyg/docs/.gitignore @@ -0,0 +1,6 @@ +/node_modules/ +/bower_components +/dist +/src +/plugins +uploaded-files/ \ No newline at end of file diff --git a/admin/trumbowyg/docs/.jshintrc b/admin/trumbowyg/docs/.jshintrc new file mode 100644 index 0000000..ceba412 --- /dev/null +++ b/admin/trumbowyg/docs/.jshintrc @@ -0,0 +1,31 @@ +{ + "bitwise": true, + "camelcase": true, + "esnext": true, + "curly": true, + "eqeqeq": true, + "forin": true, + "indent": 4, + "latedef": false, + "newcap": false, + "noarg": true, + "noempty": true, + "plusplus": true, + "quotmark": "single", + "undef": true, + "unused": true, + "strict": true, + "trailing": true, + "maxparams": 5, + "maxdepth": 5, + "maxstatements": 40, + "maxcomplexity": 20, + "maxlen": 1200, + "eqnull": true, + "browser": true, + "node": true, + "globals": { + "jQuery": false, + "hljs": false + } +} \ No newline at end of file diff --git a/ical/kalender.ical b/ical/kalender.ical index fefbe19..65c7e4f 100644 --- a/ical/kalender.ical +++ b/ical/kalender.ical @@ -5,47 +5,27 @@ CALSCALE:GREGORIAN METHOD:PUBLISH BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251002 -DTEND:20251005 +DTSTART:20260420 +DTEND:20260428 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251020 -DTEND:20251103 +DTSTART:20260403 +DTEND:20260407 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251223 -DTEND:20251228 +DTSTART:20260612 +DTEND:20260617 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251230 -DTEND:20260102 +DTSTART:20260810 +DTEND:20260822 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251231 -DTEND:20260102 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20251231 -DTEND:20260101 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260102 -DTEND:20260111 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260109 -DTEND:20260110 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260201 -DTEND:20260204 +DTSTART:20260911 +DTEND:20260919 END:VEVENT END:VCALENDAR diff --git a/ical/kalender.ics b/ical/kalender.ics index fefbe19..65c7e4f 100644 --- a/ical/kalender.ics +++ b/ical/kalender.ics @@ -5,47 +5,27 @@ CALSCALE:GREGORIAN METHOD:PUBLISH BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251002 -DTEND:20251005 +DTSTART:20260420 +DTEND:20260428 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251020 -DTEND:20251103 +DTSTART:20260403 +DTEND:20260407 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251223 -DTEND:20251228 +DTSTART:20260612 +DTEND:20260617 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251230 -DTEND:20260102 +DTSTART:20260810 +DTEND:20260822 END:VEVENT BEGIN:VEVENT SUMMARY:Urlaub -DTSTART:20251231 -DTEND:20260102 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20251231 -DTEND:20260101 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260102 -DTEND:20260111 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260109 -DTEND:20260110 -END:VEVENT -BEGIN:VEVENT -SUMMARY:Urlaub -DTSTART:20260201 -DTEND:20260204 +DTSTART:20260911 +DTEND:20260919 END:VEVENT END:VCALENDAR diff --git a/intern/.htaccess b/intern/.htaccess new file mode 100644 index 0000000..9d2be91 --- /dev/null +++ b/intern/.htaccess @@ -0,0 +1,4 @@ +RewriteEngine on + +RewriteCond %{HTTPS} !=on +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] \ No newline at end of file diff --git a/pcm.php b/pcm.php index 0eae639..ad164c5 100644 --- a/pcm.php +++ b/pcm.php @@ -21,72 +21,12 @@ $pcmContent = websiteContentGetByTitle($pdo, 'PCM - Seiteninhalt');
Praxis Creutzburg - -
- Primary Care Management -

PCM - die Qualifikation im Überblick

-

PCM stärkt Medizinische Fachangestellte in medizinischen, organisatorischen und kommunikativen Aufgaben rund um die hausärztliche Versorgung. Die ausführliche Einordnung dazu steht im folgenden Inhalt.

-
-
- - - -

Die Inhalte zur Qualifikation PCM werden derzeit vorbereitet.

- -
+

PCM - die Qualifikation im Überblick

+ + + +

Die Inhalte zur Qualifikation PCM werden derzeit vorbereitet.

+

Zurück zum Team

diff --git a/praxis.php b/praxis.php index 68ffc86..f31bdf6 100644 --- a/praxis.php +++ b/praxis.php @@ -192,15 +192,22 @@
Medizinische Fachangestellte, Primary Care Management B.Sc.

Dalia Alayan-Ibrahim

-

Praxismanagerin, PCM B.Sc.

-

Dalia Alayan-Ibrahim übernimmt in unserer Praxis die Organisation der Abläufe und die Verantwortung für den Personalbereich. Sie sorgt mit dafür, dass Termine, Kommunikation und interne Abläufe gut ineinandergreifen und Patientinnen und Patienten sich jederzeit gut begleitet fühlen.

-

Mit ihrem abgeschlossenen Studium im Bereich Primary Care Management (Bachelor of Science) bringt sie zusätzlich vertiefte Kompetenzen in Praxisorganisation, koordinierter Versorgung und teamorientiertem Arbeiten mit. Darüber hinaus übernimmt sie alle delegierten Tätigkeiten, führt Patientengespräche und betreut eine eigene Sprechstunde im dafür vorgesehenen Rahmen. Das stärkt die Struktur im Alltag und schafft mehr Raum für eine verlässliche Betreuung.

+

Praxismanagerin

+

Dalia Alayan-Ibrahim übernimmt in unserer Praxis als Praxisleitung die Organisation der Abläufe und die Verantwortung für den Personalbereich. +

+

Mit ihrem abgeschlossenen Studium im Bereich Primary Care Management (Bachelor of Science) bringt sie zusätzlich vertiefte Kompetenzen in Praxisorganisation, + koordinierter Versorgung und fachlicher Behandlung mit. + Sie übernimmt, über die normalen Tätigkeiten einer MFA hinaus, Patientengespräche und betreut Patienten in eine eigene Sprechstunde. +

+

Mehr über PCM

@@ -213,34 +220,14 @@
Medizinische Fachangestellte

Finja Baruth

-

Anmeldung, Assistenz, Labortätigkeiten und Praxisorganisation

-

Finja Baruth unterstützt unser Team in der Patientenaufnahme, in der täglichen Assistenz sowie bei vielen organisatorischen Abläufen im Praxisalltag. So bleibt der Ablauf auch an lebhaften Tagen verlässlich, freundlich und gut strukturiert.

+

Patientenaufnahme, Diagnostik, Labortätigkeiten und Praxisorganisation

+

Finja Baruth begleitet in unserer Praxis viele zentrale Abläufe von der Anmeldung bis zur Vorbereitung medizinischer Untersuchungen. Sie ist Ansprechperson für Patientinnen und Patienten, koordiniert Termine und Unterlagen, unterstützt bei diagnostischen Abläufen und trägt mit ihrer Arbeit dazu bei, dass Behandlungen strukturiert vorbereitet und im Alltag zuverlässig umgesetzt werden.

-
- - -
-
-
- Medizinische Fachangestellte -
-
- Medizinische Fachangestellte -

Svenja Vespermann

-

Assistenz, Labortätigkeiten und verlässliche Praxisabläufe

-

Svenja Vespermann sorgt mit dafür, dass Vorbereitungen, organisatorische Aufgaben und die praktische Unterstützung im Alltag sauber ineinandergreifen. Das schafft Ruhe im Tagesgeschäft und hilft, Patientinnen und Patienten gut durch die Praxis zu begleiten.

-
    -
  • Unterstützung bei Praxisorganisation und Assistenz
  • -
  • Labortätigkeiten und Mitwirkung bei diagnostischen Standardabläufen
  • -
  • Sorgfältige Vor- und Nachbereitung im Alltag
  • -
  • Typische Aufgaben in Anmeldung, Organisation und Behandlungsablauf
  • -
  • Teamarbeit mit Blick auf einen freundlichen Ablauf
  • +
  • Empfang, Patientenaufnahme und Koordination an der Anmeldung
  • +
  • Vorbereitung und Begleitung diagnostischer Untersuchungen
  • +
  • Labortätigkeiten, Probenmanagement und organisatorische Nachbereitung
  • +
  • Unterstützung bei Behandlungsabläufen und medizinischen Routinen im Praxisalltag
  • +
  • Sorgfältige Abstimmung zwischen Patienten, Team und Terminorganisation
@@ -251,14 +238,34 @@ Auszubildende zur MFA
- Auszubildende zur Medizinische Fachangestellte + Auszubildende zur Medizinischen Fachangestellten

Promise Nnodim

-

Lernen, Mitwachsen und Praxisnähe

-

Unsere Auszubildende zur Medizinischen Fachangestellten lernt die Abläufe in der Praxis Schritt für Schritt kennen und wächst dabei in die vielfältigen Aufgaben einer modernen Hausarztpraxis hinein. Begleitung, Lernen und Praxisnähe stehen dabei im Vordergrund.

+

Ausbildung mit Einblick in den gesamten Praxisalltag

+

Promise Nnodim lernt in ihrer Ausbildung die vielfältigen Abläufe unserer Hausarztpraxis Schritt für Schritt kennen. Dazu gehören der freundliche Umgang mit Patientinnen und Patienten, organisatorische Aufgaben an der Anmeldung sowie die praktische Unterstützung bei Untersuchungen und im täglichen Praxisbetrieb.

    -
  • Einblick in Anmeldung, Organisation und Assistenz
  • -
  • Begleitung durch erfahrene Kolleginnen und Kollegen
  • -
  • Frühe Verankerung im Team und in den Praxisabläufen
  • +
  • Einblicke in Anmeldung, Terminorganisation und Patientenbetreuung
  • +
  • Lernen und Mitarbeiten in Assistenz, Vorbereitung und Praxisorganisation
  • +
  • Begleitung durch erfahrene Kolleginnen im täglichen Ablauf
  • +
+
+ +
+
+
+
+ Svenja Vespermann +
+
+ Praxisassistentin +

Svenja Vespermann

+

Anmeldung, Patientenmanagement und Unterstützung im Praxisablauf

+

Svenja Vespermann unterstützt unser Team in der Praxis bei der Anmeldung, im Patientenmanagement und bei weiteren organisatorischen Aufgaben im täglichen Ablauf. So trägt sie dazu bei, dass Patientinnen und Patienten freundlich begleitet werden und die Abläufe im Praxisalltag verlässlich funktionieren.

+
    +
  • Unterstützung an der Anmeldung und im direkten Patientenkontakt
  • +
  • Mitarbeit im Patientenmanagement und in organisatorischen Abläufen
  • +
  • Weitere Tätigkeiten im täglichen Praxisablauf
  • +
  • Sorgfältige Unterstützung bei Assistenz- und Routinetätigkeiten
  • +
  • Teamarbeit für einen freundlichen und verlässlichen Ablauf
@@ -271,12 +278,13 @@
Praxisassistentin

Barbara Creutzburg

-

Unterstützung im Praxisalltag und organisatorische Begleitung

-

Barbara Creutzburg unterstützt die Praxis in organisatorischen und assistierenden Aufgaben und trägt dazu bei, dass Abläufe im Hintergrund zuverlässig vorbereitet und begleitet werden.

+

Anmeldung, Patientenmanagement und organisatorische Unterstützung

+

Barbara Creutzburg hilft in der Praxis bei der Anmeldung, im Patientenmanagement und bei weiteren Tätigkeiten im Praxisablauf. Mit ihrer Unterstützung werden organisatorische Aufgaben zuverlässig begleitet und Patientinnen und Patienten im Alltag gut betreut.

    -
  • Unterstützung bei organisatorischen Praxisaufgaben
  • -
  • Assistierende Tätigkeiten im täglichen Ablauf
  • -
  • Verlässliche Begleitung im Hintergrund
  • +
  • Mitarbeit an der Anmeldung und Unterstützung im Empfangsbereich
  • +
  • Unterstützung im Patientenmanagement
  • +
  • Weitere organisatorische Tätigkeiten im Praxisablauf
  • +
  • Verlässliche Unterstützung im täglichen Praxisgeschehen