diff --git a/application/controllers/api/frontend/v1/tempus/Tags.php b/application/controllers/api/frontend/v1/tempus/Tags.php
index c5223cd9a..8e9d45788 100644
--- a/application/controllers/api/frontend/v1/tempus/Tags.php
+++ b/application/controllers/api/frontend/v1/tempus/Tags.php
@@ -20,6 +20,7 @@ class Tags extends Tag_Controller
]);
$this->config->load('tempus');
+ $this->load->model('ressource/KalenderNotiz_model', 'KalenderNotizModel');
}
public function getTag($readonly_tags = null)
@@ -30,14 +31,53 @@ class Tags extends Tag_Controller
{
parent::getTags($this->config->item('tempus_tags'));
}
- public function getTagsByCalendar($eindeutige_kalender_gruppen_id = null)
+
+ public function getTagsByCalendar($eindeutige_kalender_gruppen_id)
{
- parent::getTagsByAssignmentTypeValue('eindeutige_kalender_gruppen_id', $eindeutige_kalender_gruppen_id, $this->config->item('tempus_tags'));
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
+ $this->KalenderNotizModel->addSelect(
+ 'tbl_kalender_notiz.notiz_id as notiz_id,
+ typ_kurzbz as tag_typ_kurzbz,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $index_bezeichnung_mehrsprachig. ' as bezeichnung,
+ style,
+ beschreibung,
+ tag,
+ tbl_notiz.erledigt as done
+ '
+ );
+
+ $this->KalenderNotizModel->addJoin('public.tbl_notiz', 'tbl_kalender_notiz.notiz_id = public.tbl_notiz.notiz_id');
+ $this->KalenderNotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+
+ $this->KalenderNotizModel->addOrder('prioritaet');
+
+ $notiztypen = $this->KalenderNotizModel->loadWhere(array('aktiv' => true, 'eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
+ $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
}
+
public function addTag($withZuordnung = true, $updatable_tags = null)
{
- parent::addTag(true, $this->config->item('tempus_tags'));
+ $postData = $this->getPostJson();
+
+ $return = array();
+ foreach ($postData->values as $value)
+ {
+ $insertResult = parent::addTag(false, $this->config->item('tempus_tags'));
+
+ $insertZuordnung = $this->KalenderNotizModel->insert(array(
+ 'eindeutige_kalender_gruppen_id' => $value,
+ 'notiz_id' => $insertResult,
+ ));
+
+ if (isError($insertZuordnung))
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+ $return[] = ['eindeutige_kalender_gruppen_id' => $value, 'id' => $insertResult];
+ }
+ $this->terminateWithSuccess($return);
}
+
public function updateTag($updatable_tags = null)
{
parent::updateTag($this->config->item('tempus_tags'));
@@ -50,4 +90,13 @@ class Tags extends Tag_Controller
{
parent::doneTag($this->config->item('tempus_tags'));
}
+
+ public function _getLanguageIndex()
+ {
+ $this->load->model('system/Sprache_model', 'SpracheModel');
+ $this->SpracheModel->addSelect('index');
+ $result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
+
+ return hasData($result) ? getData($result)[0]->index : 1;
+ }
}
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 3659dfbff..8e9566ae9 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -34,7 +34,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
-
+
$this->loadPhrases([
'ui'
]);
@@ -122,36 +122,7 @@ class Tag_Controller extends FHCAPI_Controller
$notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true));
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
}
- public function getTagsByAssignmentTypeValue($zuordnung_typ, $zuordnung_id, $tags = null)
- {
- $language = $this->_getLanguageIndex();
- $index_bezeichnung_mehrsprachig = $language - 1;
- $this->NotizzuordnungModel->addSelect(
- 'tbl_notizzuordnung.notiz_id as notiz_id,
- typ_kurzbz as tag_typ_kurzbz,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $index_bezeichnung_mehrsprachig. ' as bezeichnung,
- style,
- beschreibung,
- tag,
- tbl_notiz.erledigt as done
- '
- );
-
- if (is_array($tags) && !isEmptyArray($tags))
- {
- $tags = $this->_filterTag($tags, false);
- $this->NotizzuordnungModel->db->where_in('tbl_notiz_typ.typ_kurzbz', $tags);
- }
-
- $this->NotizzuordnungModel->addJoin('public.tbl_notiz', 'public.tbl_notizzuordnung.notiz_id = public.tbl_notiz.notiz_id');
- $this->NotizzuordnungModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
-
- $this->NotizzuordnungModel->addOrder('prioritaet');
-
- $notiztypen = $this->NotizzuordnungModel->loadWhere(array('aktiv' => true, $zuordnung_typ => $zuordnung_id));
- $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
- }
public function addTag($withZuordnung = true, $updatable_tags = null)
{
$postData = $this->getPostJson();
diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php
index 935dfebb6..6315a6454 100644
--- a/application/libraries/KalenderLib.php
+++ b/application/libraries/KalenderLib.php
@@ -192,7 +192,7 @@ class KalenderLib
n.erledigt AS done,
nt.prioritaet AS prioritaet,
nz.eindeutige_kalender_gruppen_id
- FROM public.tbl_notizzuordnung AS nz
+ FROM lehre.tbl_kalender_notiz AS nz
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
) AS tag
diff --git a/application/models/ressource/KalenderNotiz_model.php b/application/models/ressource/KalenderNotiz_model.php
new file mode 100644
index 000000000..63cb5b100
--- /dev/null
+++ b/application/models/ressource/KalenderNotiz_model.php
@@ -0,0 +1,14 @@
+dbTable = 'lehre.tbl_kalender_notiz';
+ $this->pk = array('eindeutige_kalender_gruppen_id', 'notiz_id');
+ }
+}
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index 5e947ff25..d4c2a9975 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -107,8 +107,8 @@ require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.php');
require_once('dbupdate_3.4/77949_tempus_synchronisation.php');
require_once('dbupdate_3.4/78287_tempus_raumzuordnung.php');
-
require_once('dbupdate_3.4/78285_tempus_stundenraster.php');
+require_once('dbupdate_3.4/83437_kalender_notiz_tbl.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '
Pruefe Tabellen und Attribute!
';
diff --git a/system/dbupdate_3.4/83437_kalender_notiz_tbl.php b/system/dbupdate_3.4/83437_kalender_notiz_tbl.php
new file mode 100644
index 000000000..2d56e9837
--- /dev/null
+++ b/system/dbupdate_3.4/83437_kalender_notiz_tbl.php
@@ -0,0 +1,227 @@
+db_query('SELECT 0 FROM lehre.tbl_kalender_notiz WHERE 0 = 1'))
+{
+ //TODO zuordnung typ definieren
+ $qry = 'CREATE TABLE lehre.tbl_kalender_notiz (
+ eindeutige_kalender_gruppen_id UUID NOT NULL,
+ notiz_id integer NOT NULL,
+
+ CONSTRAINT tbl_kalender_notiz_pk PRIMARY KEY (eindeutige_kalender_gruppen_id, notiz_id),
+ CONSTRAINT tbl_kalender_notiz_notiz_fk FOREIGN KEY (notiz_id)
+ REFERENCES public.tbl_notiz (notiz_id)
+ ON DELETE CASCADE ON UPDATE CASCADE
+ );';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_kalender_notiz: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_kalender_notiz table created';
+
+ $qry = 'GRANT SELECT ON TABLE lehre.tbl_kalender_notiz TO web;';
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_kalender_notiz: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on lehre.tbl_kalender_notiz';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE lehre.tbl_kalender_notiz TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_kalender_notiz: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on lehre.tbl_kalender_notiz';
+
+ // Delete the related note when its calendar-note assignment no longer exists.
+ $qry = 'CREATE OR REPLACE FUNCTION lehre.cleanup_notiz_on_kalender_notiz_delete()
+ RETURNS trigger
+ LANGUAGE plpgsql
+ SECURITY DEFINER
+ SET search_path = pg_catalog
+ AS $function$
+ BEGIN
+ DELETE FROM public.tbl_notiz
+ WHERE notiz_id = OLD.notiz_id
+ AND NOT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender_notiz
+ WHERE eindeutige_kalender_gruppen_id = OLD.eindeutige_kalender_gruppen_id
+ AND notiz_id = OLD.notiz_id
+ );
+
+ RETURN OLD;
+ END;
+ $function$;
+
+ CREATE TRIGGER cleanup_notiz_on_kalender_notiz_delete
+ AFTER DELETE ON lehre.tbl_kalender_notiz
+ FOR EACH ROW
+ EXECUTE PROCEDURE lehre.cleanup_notiz_on_kalender_notiz_delete();';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_notiz cleanup trigger: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_notiz cleanup trigger created';
+}
+
+// Delete note assignments after a physical delete or when every row in the
+// calendar group has an inactive status.
+$qry = 'CREATE OR REPLACE FUNCTION lehre.cleanup_kalender_notiz()
+ RETURNS trigger
+ LANGUAGE plpgsql
+ SECURITY DEFINER
+ SET search_path = pg_catalog
+ AS $function$
+ DECLARE
+ gruppen_id UUID;
+ BEGIN
+ IF TG_OP = \'DELETE\' THEN
+ gruppen_id := OLD.eindeutige_kalender_gruppen_id;
+ ELSIF TG_OP = \'UPDATE\' THEN
+ IF (NEW.status_kurzbz IS DISTINCT FROM \'deleted\'
+ AND NEW.status_kurzbz IS DISTINCT FROM \'archived\')
+ OR OLD.status_kurzbz IS NOT DISTINCT FROM NEW.status_kurzbz
+ THEN
+ RETURN NEW;
+ END IF;
+
+ gruppen_id := NEW.eindeutige_kalender_gruppen_id;
+ ELSE
+ RETURN NULL;
+ END IF;
+
+ IF NOT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender
+ WHERE eindeutige_kalender_gruppen_id = gruppen_id
+ AND status_kurzbz IS DISTINCT FROM \'deleted\'
+ AND status_kurzbz IS DISTINCT FROM \'archived\'
+ )
+ THEN
+ DELETE FROM lehre.tbl_kalender_notiz
+ WHERE eindeutige_kalender_gruppen_id = gruppen_id;
+ END IF;
+
+ IF TG_OP = \'DELETE\' THEN
+ RETURN OLD;
+ END IF;
+
+ RETURN NEW;
+ END;
+ $function$;';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_kalender_notiz cleanup function: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_kalender_notiz cleanup function created';
+
+$result = $db->db_query("SELECT 1
+ FROM pg_catalog.pg_trigger AS t
+ JOIN pg_catalog.pg_class AS c ON c.oid = t.tgrelid
+ JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace
+ WHERE n.nspname = 'lehre'
+ AND c.relname = 'tbl_kalender'
+ AND t.tgname = 'cleanup_kalender_notiz'
+ AND NOT t.tgisinternal");
+
+if ($db->db_num_rows($result) === 0)
+{
+ $qry = 'CREATE TRIGGER cleanup_kalender_notiz
+ AFTER DELETE OR UPDATE OF status_kurzbz ON lehre.tbl_kalender
+ FOR EACH ROW
+ EXECUTE PROCEDURE lehre.cleanup_kalender_notiz();';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_kalender_notiz cleanup trigger: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_kalender_notiz cleanup trigger created';
+}
+
+// Delete resource assignments after a physical delete or when every row in the
+// calendar group has an inactive status.
+$qry = 'CREATE OR REPLACE FUNCTION lehre.cleanup_betriebsmittel_kalender()
+ RETURNS trigger
+ LANGUAGE plpgsql
+ SECURITY DEFINER
+ SET search_path = pg_catalog
+ AS $function$
+ DECLARE
+ gruppen_id UUID;
+ BEGIN
+ IF TG_OP = \'DELETE\' THEN
+ gruppen_id := OLD.eindeutige_kalender_gruppen_id;
+ ELSIF TG_OP = \'UPDATE\' THEN
+ IF (NEW.status_kurzbz IS DISTINCT FROM \'deleted\'
+ AND NEW.status_kurzbz IS DISTINCT FROM \'archived\')
+ OR OLD.status_kurzbz IS NOT DISTINCT FROM NEW.status_kurzbz
+ THEN
+ RETURN NEW;
+ END IF;
+
+ gruppen_id := NEW.eindeutige_kalender_gruppen_id;
+ ELSE
+ RETURN NULL;
+ END IF;
+
+ IF NOT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender
+ WHERE eindeutige_kalender_gruppen_id = gruppen_id
+ AND status_kurzbz IS DISTINCT FROM \'deleted\'
+ AND status_kurzbz IS DISTINCT FROM \'archived\'
+ )
+ THEN
+ DELETE FROM lehre.tbl_betriebsmittel_kalender
+ WHERE eindeutige_kalender_gruppen_id = gruppen_id;
+ END IF;
+
+ IF TG_OP = \'DELETE\' THEN
+ RETURN OLD;
+ END IF;
+
+ RETURN NEW;
+ END;
+ $function$;';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_betriebsmittel_kalender cleanup function: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_betriebsmittel_kalender cleanup function created';
+
+$result = $db->db_query("SELECT 1
+ FROM pg_catalog.pg_trigger AS t
+ JOIN pg_catalog.pg_class AS c ON c.oid = t.tgrelid
+ JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace
+ WHERE n.nspname = 'lehre'
+ AND c.relname = 'tbl_kalender'
+ AND t.tgname = 'cleanup_betriebsmittel_kalender'
+ AND NOT t.tgisinternal");
+
+if ($db->db_num_rows($result) === 0)
+{
+ $qry = 'CREATE TRIGGER cleanup_betriebsmittel_kalender
+ AFTER DELETE OR UPDATE OF status_kurzbz ON lehre.tbl_kalender
+ FOR EACH ROW
+ EXECUTE PROCEDURE lehre.cleanup_betriebsmittel_kalender();';
+
+ if (!$db->db_query($qry))
+ echo 'lehre.tbl_betriebsmittel_kalender cleanup trigger: '.$db->db_last_error().'
';
+ else
+ echo '
lehre.tbl_betriebsmittel_kalender cleanup trigger created';
+}
+
+$result = $db->db_query("SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = 'public'
+ AND table_name = 'tbl_notizzuordnung'
+ AND column_name = 'eindeutige_kalender_gruppen_id'");
+
+if ($db->db_num_rows($result) === 1)
+{
+ $qry = "ALTER TABLE public.tbl_notizzuordnung
+ DROP COLUMN eindeutige_kalender_gruppen_id";
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_notizzuordnung: '.$db->db_last_error().'
';
+ else
+ echo '
public.tbl_notizzuordnung: eindeutige_kalender_gruppen_id column removed';
+}