From c742fc12312c429648b76efe45ccddc560308bf7 Mon Sep 17 00:00:00 2001 From: oesi Date: Tue, 12 May 2015 12:28:34 +0200 Subject: [PATCH 1/9] =?UTF-8?q?Tempus:=20-=20Kollisionscheck=20ueberarbeit?= =?UTF-8?q?et=20-=20Kollisionsgrund=20wird=20nun=20im=20Tooltip=20angezeig?= =?UTF-8?q?t=20-=20Ressourcenzuordnung=20zu=20Stunden=20-=20Option=20hinzu?= =?UTF-8?q?gefuegt=20um=20alle=20Eintr=C3=A4ge=20einer=20Stunde=20anzuzeig?= =?UTF-8?q?en=20(zB=20Incominggruppen)=20-=20Option=20zum=20Drop=20auf=20b?= =?UTF-8?q?estehende=20Stunden=20hinzugef=C3=BCgt=20(UNR=20wird=20automati?= =?UTF-8?q?sch=20gleichgesetzt)=20-=20Fehler=20behoben=20beim=20Anlegen=20?= =?UTF-8?q?von=20Gruppen=20mit=20Logins=20>=2016=20Zeichen=20-=20Es=20koen?= =?UTF-8?q?nen=20jetzt=20mehrere=20Lektoren=20definiert=20werden=20die=20n?= =?UTF-8?q?icht=20kollidieren=20sollen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Anwesenheitslisten mit Barcode koennen nur fuer alle Studiengaenge auf einmal erstellt werden --- config/global.config-default.inc.php | 1 + content/dragboard.js.php | 51 +- content/fas.xul.php | 32 +- content/fasoverlay.js.php | 21 - content/functions.js.php | 58 +- content/lvplanung/ressourcedialog.js.php | 392 +++++ content/lvplanung/ressourcedialog.xul.php | 161 ++ content/lvplanung/stpl-week-overlay.js.php | 93 ++ content/lvplanung/timetable-week.xul.php | 35 +- content/pdfExport.php | 8 + .../student/studentabschlusspruefung.js.php | 115 +- .../studentabschlusspruefungoverlay.xul.php | 2 +- content/student/studentoverlay.js.php | 18 +- content/tempus.js.php | 33 - content/tempus.xul.php | 22 + content/tempusDBDML.php | 132 +- content/tempusoverlay.js.php | 21 - include/betriebsmittel.class.php | 215 ++- include/filter.class.php | 4 +- include/functions.inc.php | 12 + include/gruppe.class.php | 10 +- include/lehreinheit.class.php | 5 +- include/lehrstunde.class.php | 80 +- include/variable.class.php | 7 + include/wochenplan.class.php | 211 ++- locale/de-AT/tempus.dtd | 8 + rdf/anwesenheitsliste.xml.php | 44 +- rdf/betriebsmittel.rdf.php | 22 +- rdf/lehrstunde.rdf.php | 4 +- rdf/stundenplan_betriebsmittel.rdf.php | 162 ++ skin/tempus.css | 11 + system/FH-Complete.txp | 1424 ++++++++++++++--- system/checksystem.php | 43 +- vilesci/inventar/inventar_pflege.php | 17 + .../personen/anwesenheitslisten_barcode.php | 1 + 35 files changed, 2998 insertions(+), 477 deletions(-) create mode 100644 content/lvplanung/ressourcedialog.js.php create mode 100644 content/lvplanung/ressourcedialog.xul.php create mode 100644 rdf/stundenplan_betriebsmittel.rdf.php diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 05b64fd65..20d476c5c 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -150,4 +150,5 @@ define('STIP_USER_PASSWORD','password'); define('BEWERBERTOOL_STUDIENAUSWAHL_ANZEIGEN', true); define('BEWERBERTOOL_STANDORTAUSWAHL_ANZEIGEN', false); +define('KOLLISIONSFREIE_USER',serialize(array('_DummyLektor'))); ?> diff --git a/content/dragboard.js.php b/content/dragboard.js.php index 45e1fe27b..07012ca78 100644 --- a/content/dragboard.js.php +++ b/content/dragboard.js.php @@ -501,6 +501,25 @@ var boardObserver= var new_ort=evt.target.getAttribute("ort_kurzbz"); var kollisionsanzahl=evt.target.getAttribute("kollision"); } + else if(evt.target.tagName=="button") + { + + if(getvariable('allow_lehrstunde_drop')=='true') + { + // Wenn direkt auf die Stunde gezogen wird, wird der Raum uebernommen und die unr gleich gesetzt + ort=evt.target.getAttribute("ort_kurzbz"); + var new_unr=evt.target.getAttribute("unr"); + var new_ort=ort; + + // zusaetzlich wird diese zu allen Stunden (gesamter Block) dazugebucht + var new_blockung=getNewBlockung(evt.target); + } + else + { + alert('Bitte waehlen Sie einen Ort oder aktivieren Sie die Option allow_lehrstunde_drop'); + return false; + } + } else { if (dropdata.flavour.contentType=="application/tempus-lehrveranstaltung") @@ -518,11 +537,17 @@ var boardObserver= url+="&new_ort="+new_ort+"&kollisionsanzahl="+kollisionsanzahl; else url+="&aktion=stpl_move"; + + if(new_unr) + url+="&new_unr="+new_unr; + if(new_blockung) + url+="&new_blockung="+new_blockung; + url+="&mime="+dropdata.flavour.contentType; - //IDs der Stunden die verschoben werden dazuhaengen //idList = TimeTableWeekGetMarkedIdList(); //url+=idList; + //alert("url:"+url); if(new_ort=='' && ort=='') { alert('Es muss ein Ort gewaehlt werden'); @@ -535,6 +560,30 @@ var boardObserver= } }; +// Holt die Anzahl der Bloecke nach dem uebergebenen mit der selben unr +function getNewBlockung(item) +{ + var items = document.getElementsByTagName('button'); + var unr = item.getAttribute('unr'); + var stunde = item.getAttribute('stunde'); + var wochentag = item.getAttribute('wochentag'); + var blockung=1; + for each(var button in items) + { + if(button.id && button.id.startsWith('buttonSTPL')) + { + buttonunr=button.getAttribute('unr'); + buttonwochentag=button.getAttribute('wochentag'); + buttonstunde=button.getAttribute('stunde'); + + if(buttonunr==unr && buttonwochentag==wochentag && buttonstunde>stunde) + { + blockung=blockung+1; + } + } + } + return blockung; +} // **** // * Observer fuer den Lehrverbandstree diff --git a/content/fas.xul.php b/content/fas.xul.php index 68dce6a34..33e363829 100644 --- a/content/fas.xul.php +++ b/content/fas.xul.php @@ -125,25 +125,25 @@ foreach($addon_obj->result as $addon) - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + diff --git a/content/fasoverlay.js.php b/content/fasoverlay.js.php index 25a698bb7..627704180 100644 --- a/content/fasoverlay.js.php +++ b/content/fasoverlay.js.php @@ -688,27 +688,6 @@ function loadURL(event) if (url) contentFrame.setAttribute('src', url); }; -function parseRDFString(str, url) -{ - - try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - } catch(e) { - alert(e); - return; - } - - var memoryDS = Components.classes["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].createInstance(Components.interfaces.nsIRDFDataSource); - - var ios=Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); - baseUri=ios.newURI(url,null,null); - - var parser=Components.classes["@mozilla.org/rdf/xml-parser;1"].createInstance(Components.interfaces.nsIRDFXMLParser); - parser.parseString(memoryDS,baseUri,str); - - return memoryDS; -} - // **** // * Liefert eine HTML Liste mit den Koordinatorstunden // * fuer einen Fachbereich diff --git a/content/functions.js.php b/content/functions.js.php index af24c751e..d157d649b 100644 --- a/content/functions.js.php +++ b/content/functions.js.php @@ -103,6 +103,27 @@ function ParseReturnValue(response) //debug('data:'+this.dbdml_data+' errormsg:'+this.dbdml_errormsg+' return:'+this.dbdml_return ); } +function parseRDFString(str, url) +{ + try { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + } catch(e) { + alert(e); + return; + } + + var memoryDS = Components.classes["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].createInstance(Components.interfaces.nsIRDFDataSource); + + var ios=Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); + baseUri=ios.newURI(url,null,null); + + var parser=Components.classes["@mozilla.org/rdf/xml-parser;1"].createInstance(Components.interfaces.nsIRDFXMLParser); + parser.parseString(memoryDS,baseUri,str); + + return memoryDS; +} + + // **** // * Zeigt einen Text in der Statusbar an // **** @@ -259,4 +280,39 @@ String.prototype.startsWith = function(str) function getUsername() { return ''; -} \ No newline at end of file +} + +// **** +// * Laedt den Wert einer Variable aus der DB +// **** +function getvariable(variable) +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + // Request absetzen + + var url = 'content/fasDBDML.php'; + + var req = new phpRequest(url,'',''); + + req.add('type', 'getvariable'); + req.add('name', variable); + + var response = req.executePOST(); + + var val = new ParseReturnValue(response) + + if (!val.dbdml_return) + { + if(val.dbdml_errormsg=='') + alert(response) + else + alert(val.dbdml_errormsg) + return false; + } + else + { + return val.dbdml_data; + } +} + diff --git a/content/lvplanung/ressourcedialog.js.php b/content/lvplanung/ressourcedialog.js.php new file mode 100644 index 000000000..82ac65e64 --- /dev/null +++ b/content/lvplanung/ressourcedialog.js.php @@ -0,0 +1,392 @@ + + */ +require_once('../../config/vilesci.config.inc.php'); +require_once('../../config/global.config.inc.php'); +?> + +// *********** Globale Variablen *****************// +var RessourceZugeteiltTreeDatasource; //Datasource des RessourceZugeteiltTrees +var RessourceVerplanbarTreeDatasource; //Datasource des RessourceVerplanbarTrees +var RessourceStunden; +var RessourceDatum; +var RessourceStplIDs; +var RessourceZugeteiltTreeDoubleRefresh=false; +var RessourceVerplanbarTreeDoubleRefresh=false; + +// ********** Observer und Listener ************* // + +// **** +// * Observer fuer RessourceZugeteilt Tree +// * startet Rebuild nachdem das Refresh +// * der datasource fertig ist +// **** +var RessourceZugeteiltTreeSinkObserver = +{ + onBeginLoad : function(pSink) {}, + onInterrupt : function(pSink) {}, + onResume : function(pSink) {}, + onError : function(pSink, pStatus, pError) {}, + onEndLoad : function(pSink) + { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + document.getElementById('ressource-zugeteilt-tree').builder.rebuild(); + } +}; + +// **** +// * Nach dem Rebuild wird die Betriebsmittelzuordnung wieder +// * markiert +// **** +var RessourceZugeteiltTreeListener = +{ + willRebuild : function(builder) { }, + didRebuild : function(builder) + { + if(RessourceZugeteiltTreeDoubleRefresh) + { + // Doppeltes Rebuild damit nach leeren Trees korrekt geladen wird + RessourceZugeteiltTreeDoubleRefresh=false; + window.setTimeout("RessourceZugeteiltTreeRefresh()",10); + } + else + { + window.setTimeout(RessourceZugeteiltTreeSelectZuordnung,10); + } + } +}; + +// **** +// * Observer fuer RessourceVerplanbar Tree +// * startet Rebuild nachdem das Refresh +// * der datasource fertig ist +// **** +var RessourceVerplanbarTreeSinkObserver = +{ + onBeginLoad : function(pSink) {}, + onInterrupt : function(pSink) {}, + onResume : function(pSink) {}, + onError : function(pSink, pStatus, pError) {}, + onEndLoad : function(pSink) + { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + document.getElementById('ressource-verplanbar-tree').builder.rebuild(); + } +}; + +// **** +// * Nach dem Rebuild wird die Betriebsmittelzuordnung wieder +// * markiert +// **** +var RessourceVerplanbarTreeListener = +{ + willRebuild : function(builder) { }, + didRebuild : function(builder) + { + if(RessourceVerplanbarTreeDoubleRefresh) + { + // Doppeltes Rebuild damit nach leeren Trees korrekt geladen wird + RessourceVerplanbarTreeDoubleRefresh=false; + window.setTimeout("RessourceVerplanbarTreeRefresh()",10); + } + else + { + window.setTimeout(RessourceVerplanbarTreeSelectZuordnung,10); + } + } +}; + +// **** +// * Laedt die Trees +// **** +function RessourceInit(datum, stunden, stplids) +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + RessourceStunden = stunden; + RessourceDatum = datum; + RessourceStplIDs = stplids; + + // *** Zugeteilte Betriebsmittel *** + var ressourcezugeteilttree = document.getElementById('ressource-zugeteilt-tree'); + // TODO Parameter + url='rdf/stundenplan_betriebsmittel.rdf.php?ts='+gettimestamp(); + + for(i in stplids) + url = url+'&stundenplan_ids[]='+stplids[i]; + + //Alte DS entfernen + var oldDatasources = ressourcezugeteilttree.database.GetDataSources(); + while(oldDatasources.hasMoreElements()) + { + ressourcezugeteilttree.database.RemoveDataSource(oldDatasources.getNext()); + } + //Refresh damit die entfernten DS auch wirklich entfernt werden + ressourcezugeteilttree.builder.rebuild(); + + try + { + RessourceZugeteiltTreeDatasource.removeXMLSinkObserver(RessourceZugeteiltTreeSinkObserver); + ressourcezugeteilttree.builder.removeListener(RessourceZugeteiltTreeListener); + } + catch(e) + {} + + var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); + RessourceZugeteiltTreeDatasource = rdfService.GetDataSource(url); + RessourceZugeteiltTreeDatasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); + RessourceZugeteiltTreeDatasource.QueryInterface(Components.interfaces.nsIRDFXMLSink); + ressourcezugeteilttree.database.AddDataSource(RessourceZugeteiltTreeDatasource); + RessourceZugeteiltTreeDatasource.addXMLSinkObserver(RessourceZugeteiltTreeSinkObserver); + ressourcezugeteilttree.builder.addListener(RessourceZugeteiltTreeListener); + + + // *** Verplanbare Betriebsmittel *** + var ressourceverplanbartree = document.getElementById('ressource-verplanbar-tree'); + // TODO Parameter + url='rdf/betriebsmittel.rdf.php?datum='+datum+'&'+gettimestamp(); + + for(i in stunden) + url = url+'&stunde[]='+stunden[i]; + + //Alte DS entfernen + var oldDatasources = ressourceverplanbartree.database.GetDataSources(); + while(oldDatasources.hasMoreElements()) + { + ressourceverplanbartree.database.RemoveDataSource(oldDatasources.getNext()); + } + //Refresh damit die entfernten DS auch wirklich entfernt werden + ressourceverplanbartree.builder.rebuild(); + + try + { + RessourceVerplanbarTreeDatasource.removeXMLSinkObserver(RessourceVerplanbarTreeSinkObserver); + ressourceverplanbartree.builder.removeListener(RessourceVerplanbarTreeDatasource); + } + catch(e) + {} + + var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); + RessourceVerplanbarTreeDatasource = rdfService.GetDataSource(url); + RessourceVerplanbarTreeDatasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); + RessourceVerplanbarTreeDatasource.QueryInterface(Components.interfaces.nsIRDFXMLSink); + ressourceverplanbartree.database.AddDataSource(RessourceVerplanbarTreeDatasource); + RessourceVerplanbarTreeDatasource.addXMLSinkObserver(RessourceVerplanbarTreeSinkObserver); + ressourceverplanbartree.builder.addListener(RessourceVerplanbarTreeListener); +} + +// Hinzufuegen der Ressourcenzuordnung +function RessourceAdd() +{ + var tree = document.getElementById('ressource-verplanbar-tree'); + + if (tree.currentIndex==-1) + return; + + //Ausgewaehlte Nr holen + betriebsmittel_id=getTreeCellText(tree, "ressource-verplanbar-tree-betriebsmittel_id", tree.currentIndex); + + var url = 'content/tempusDBDML.php'; + var req = new phpRequest(url,'',''); + + req.add('type', 'addressource'); + req.add('betriebsmittel_id', betriebsmittel_id); + + for(i in RessourceStplIDs) + req.add('stpl_id[]', RessourceStplIDs[i]); + + for(i in RessourceStunden) + req.add('stunden[]', RessourceStunden[i]); + + var response = req.executePOST(); + + var val = new ParseReturnValue(response) + + if (!val.dbdml_return) + { + if(val.dbdml_errormsg=='') + alert(response) + else + alert(val.dbdml_errormsg) + } + else + { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + RessourcenReloadTrees(); + } + +} + +// Entfernen der Ressourcenzuordnung +function RessourceRemove() +{ + var tree = document.getElementById('ressource-zugeteilt-tree'); + + if (tree.currentIndex==-1) + return; + + var url = 'content/tempusDBDML.php'; + var req = new phpRequest(url,'',''); + + req.add('type', 'deleteressource'); + + var start = new Object(); + var end = new Object(); + var numRanges = tree.view.selection.getRangeCount(); + var paramList= ''; + var anzahl=0; + + for (var t = 0; t < numRanges; t++) + { + tree.view.selection.getRangeAt(t,start,end); + for (var v = start.value; v <= end.value; v++) + { + stundenplan_betriebsmittel_id = getTreeCellText(tree, 'ressource-zugeteilt-tree-stundenplan_betriebsmittel_id', v); + req.add('stundenplan_betriebsmittel_id[]', stundenplan_betriebsmittel_id); + } + } + + var response = req.executePOST(); + + var val = new ParseReturnValue(response) + + if (!val.dbdml_return) + { + if(val.dbdml_errormsg=='') + alert(response) + else + alert(val.dbdml_errormsg) + } + else + { + RessourcenReloadTrees(); + RessourcenDisableDetails() + } +} + +function RessourceZugeteiltTreeRefresh() +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + RessourceZugeteiltTreeDatasource.Refresh(false); +} + +function RessourceVerplanbarTreeRefresh() +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + RessourceVerplanbarTreeDatasource.Refresh(false); +} + +function RessourcenReloadTrees() +{ + + RessourceZugeteiltTreeDoubleRefresh=true; + RessourceVerplanbarTreeDoubleRefresh=true; + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + RessourceZugeteiltTreeDatasource.Refresh(false); + RessourceVerplanbarTreeDatasource.Refresh(false); +} + +// Speichert die Anmerkung +function RessourceSave() +{ + var stundenplan_betriebsmittel_id=document.getElementById('ressource-detail-stundenplan_betriebsmittel_id').value; + var anmerkung = document.getElementById('ressource-detail-anmerkung').value; + + var url = 'content/tempusDBDML.php'; + var req = new phpRequest(url,'',''); + + req.add('type', 'saveressource'); + req.add('stundenplan_betriebsmittel_id', stundenplan_betriebsmittel_id); + req.add('anmerkung', anmerkung); + + var response = req.executePOST(); + + var val = new ParseReturnValue(response) + + if (!val.dbdml_return) + { + if(val.dbdml_errormsg=='') + alert(response) + else + alert(val.dbdml_errormsg) + } + else + { + RessourcenReloadTrees(); + RessourcenDisableDetails(); + } +} + +function RessourcenDisableDetails() +{ + document.getElementById('ressource-detail-anmerkung').value=''; + document.getElementById('ressource-detail-anmerkung').disabled=true; + document.getElementById('ressource-detail-stundenplan_betriebsmittel_id').value=''; + document.getElementById('ressource-detail-speichern').disabled=true; +} + +/** + * Bei der Auswahl der zugeteilten Ressource wird diese geladen und die Anmerkung angezeigt + */ +function RessourceZugeteiltAuswahl() +{ + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + var tree = document.getElementById('ressource-zugeteilt-tree'); + + if (tree.currentIndex==-1) + return; + + //Ausgewaehlte Nr holen + var stundenplan_betriebsmittel_id=getTreeCellText(tree, "ressource-zugeteilt-tree-stundenplan_betriebsmittel_id", tree.currentIndex); + + var req = new phpRequest('rdf/stundenplan_betriebsmittel.rdf.php','',''); + req.add('stundenplan_betriebsmittel_id',stundenplan_betriebsmittel_id); + + var response = req.execute(); + // Datasource holen + var dsource=parseRDFString(response, 'http://www.technikum-wien.at/stundenplanbetriebsmittel'); + + dsource=dsource.QueryInterface(Components.interfaces.nsIRDFDataSource); + + var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]. + getService(Components.interfaces.nsIRDFService); + var subject = rdfService.GetResource("http://www.technikum-wien.at/stundenplanbetriebsmittel/" + stundenplan_betriebsmittel_id); + + var predicateNS = "http://www.technikum-wien.at/stundenplanbetriebsmittel/rdf"; + + //Daten holen + anmerkung = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#anmerkung" )); + beschreibung = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#beschreibung" )); + + document.getElementById('ressource-detail-anmerkung').disabled=false; + document.getElementById('ressource-detail-speichern').disabled=false; + + document.getElementById('ressource-detail-caption').label='Anmerkungen zu '+beschreibung; + document.getElementById('ressource-detail-anmerkung').value=anmerkung; + + document.getElementById('ressource-detail-stundenplan_betriebsmittel_id').value=stundenplan_betriebsmittel_id; +} + +function RessourceZugeteiltTreeSelectZuordnung() +{ +} + +function RessourceVerplanbarTreeSelectZuordnung() +{ +} diff --git a/content/lvplanung/ressourcedialog.xul.php b/content/lvplanung/ressourcedialog.xul.php new file mode 100644 index 000000000..ee9e6737c --- /dev/null +++ b/content/lvplanung/ressourcedialog.xul.php @@ -0,0 +1,161 @@ + + */ + +header("Cache-Control: no-cache"); +header("Cache-Control: post-check=0, pre-check=0",false); +header("Expires Mon, 26 Jul 1997 05:00:00 GMT"); +header("Pragma: no-cache"); +header("Content-type: application/vnd.mozilla.xul+xml"); + +require_once('../../config/vilesci.config.inc.php'); +echo ''."\n"; +echo ''; + +echo ''; +echo ''; + +$stunden = $_GET['stunde']; +$stplids = $_GET['stplid']; +$datum = $_GET['datum']; +?> +)' + > + +'; break; } diff --git a/include/functions.inc.php b/include/functions.inc.php index 8def2d31d..86ebfba73 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -322,6 +322,18 @@ function loadVariables($user) global $emailadressentrennzeichen; $emailadressentrennzeichen=','; } + + if(!isset($alle_unr_mitladen)) + { + global $alle_unr_mitladen; + $alle_unr_mitladen='false'; + } + if(!isset($allow_lehrstunde_drop)) + { + global $allow_lehrstunde_drop; + $allow_lehrstunde_drop='false'; + } + return $error_msg; } diff --git a/include/gruppe.class.php b/include/gruppe.class.php index 5cb5f7331..8e4d6ffbd 100644 --- a/include/gruppe.class.php +++ b/include/gruppe.class.php @@ -354,14 +354,14 @@ class gruppe extends basis_db $this->errormsg = 'Aktiv muss ein boolscher Wert sein'; return false; } - if(mb_strlen($this->updatevon)>16) + if(mb_strlen($this->updatevon)>32) { - $this->errormsg = 'Updatevon darf nicht laenger als 16 Zeichen sein'; + $this->errormsg = 'Updatevon darf nicht laenger als 32 Zeichen sein'; return false; } - if(mb_strlen($this->insertvon)>16) + if(mb_strlen($this->insertvon)>32) { - $this->errormsg = 'Insertvon darf nicht laenger als 16 Zeichen sein'; + $this->errormsg = 'Insertvon darf nicht laenger als 32 Zeichen sein'; return false; } @@ -568,4 +568,4 @@ class gruppe extends basis_db return $gruppe_kurzbz; } } -?> \ No newline at end of file +?> diff --git a/include/lehreinheit.class.php b/include/lehreinheit.class.php index 13d52dd5b..39876b229 100644 --- a/include/lehreinheit.class.php +++ b/include/lehreinheit.class.php @@ -21,6 +21,7 @@ */ require_once(dirname(__FILE__).'/basis_db.class.php'); require_once(dirname(__FILE__).'/log.class.php'); +require_once(dirname(__FILE__).'/../config/global.config.inc.php'); class lehreinheit extends basis_db { @@ -492,7 +493,7 @@ class lehreinheit extends basis_db foreach ($this->mitarbeiter_uid as $lkt) $sql_lkt.="OR mitarbeiter_uid=".$this->db_add_param($lkt).' '; $sql_lkt=mb_substr($sql_lkt,3); - $sql_lkt="(($sql_lkt) AND mitarbeiter_uid!='_DummyLektor')"; + $sql_lkt="(($sql_lkt) AND mitarbeiter_uid not in (".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER))."))"; // Datenbank abfragen $sql_query="SELECT $stpl_id FROM $stpl_table @@ -554,7 +555,7 @@ class lehreinheit extends basis_db foreach ($this->mitarbeiter_uid as $lkt) $sql_lkt.="OR uid='$lkt' "; $sql_lkt=mb_substr($sql_lkt,3); - $sql_lkt="(($sql_lkt) AND uid!='_DummyLektor')"; + $sql_lkt="(($sql_lkt) AND uid not in (".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER))."))"; $sql_query="SELECT reservierung_id AS id, uid AS lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde FROM lehre.vw_reservierung WHERE datum=".$this->db_add_param($datum)." AND stunde=".$this->db_add_param($stunde)." diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index e274b9ea0..ba3fe65d1 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -232,14 +232,16 @@ class lehrstunde extends basis_db * @param gruppe_kurzbz * */ - public function load_lehrstunden($type, $datum_von, $datum_bis, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe_kurzbz=NULL, $stpl_view='stundenplan', $idList=null, $fachbereich_kurzbz=null, $lva=NULL) + public function load_lehrstunden($type, $datum_von, $datum_bis, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe_kurzbz=NULL, $stpl_view='stundenplan', $idList=null, $fachbereich_kurzbz=null, $lva=NULL, $alle_unr_mitladen=false) { $num_rows_einheit=0; // Parameter Checken // Bezeichnung der Stundenplan-Tabelle und des Keys $stpl_id=$stpl_view.TABLE_ID; + $stpl_view_ohneschema=VIEW_BEGIN.$stpl_view; $stpl_view='lehre.'.VIEW_BEGIN.$stpl_view; + // Datum im Format YYYY-MM-TT ? if (!preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/",$datum_von) ) { @@ -338,9 +340,13 @@ class lehrstunde extends basis_db // Stundenplandaten ermitteln // Abfrage generieren - $sql_query_stdplan='SELECT * FROM '.$stpl_view; + if ($type!='idList') { + if($alle_unr_mitladen) + $sql_query_stdplan='SELECT '.$stpl_id.', datum, stunde, unr FROM '.$stpl_view; + else + $sql_query_stdplan='SELECT * FROM '.$stpl_view; $sql_query_lva=""; $sql_query=" WHERE datum>=".$this->db_add_param($datum_von)." AND datum<".$this->db_add_param($datum_bis); if ($type == 'lva') @@ -372,7 +378,7 @@ class lehrstunde extends basis_db if ($type=='student') $sql_query.=' AND gruppe_kurzbz IS NULL'; $sql_query.=' )'; - + for ($i=0;$i<$num_rows_einheit;$i++) { $row=$this->db_fetch_object($result_einheit,$i); @@ -382,16 +388,37 @@ class lehrstunde extends basis_db } $sql_query_orderby=' ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid'; $sql_query_stdplan.=$sql_query . $sql_query_lva . $sql_query_orderby; + + // Wenn aktiviert, werden alle Stunden mit der gleichen UNR geladen die zur selben Zeit stattfinden + if($alle_unr_mitladen) + { + $sql_query_stdplan=" + WITH lvplan(id, datum, stunde, unr) as + ( + $sql_query_stdplan + ) + SELECT + $stpl_view_ohneschema.* + FROM + ".$stpl_view.", lvplan + WHERE + $stpl_view_ohneschema.datum=lvplan.datum + AND $stpl_view_ohneschema.stunde=lvplan.stunde + AND $stpl_view_ohneschema.unr=lvplan.unr + ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid + "; + } } else { + $sql_query_stdplan='SELECT * FROM '.$stpl_view; $sql_query=''; foreach ($idList as $id) $sql_query.=" OR ".$stpl_id."=".$this->db_add_param($id); $sql_query=mb_substr($sql_query,3); $sql_query_stdplan.=' WHERE'.$sql_query; } - +//die($sql_query_stdplan); //Datenbankabfrage if (!$this->db_query($sql_query_stdplan)) { @@ -436,8 +463,9 @@ class lehrstunde extends basis_db $stunde->updatevon=$row->updatevon; $stunde->reservierung=false; $this->lehrstunden[$i]=$stunde; + } - + // Reservierungsdaten ermitteln if ($type!='idList' && $type!='fachbereich') { @@ -572,8 +600,8 @@ class lehrstunde extends basis_db // Datenbank abfragen $sql_query="SELECT $stpl_id AS id, lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde FROM $stpl_table WHERE datum=".$this->db_add_param($this->datum)." AND stunde=".$this->db_add_param($this->stunde)." AND (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." "; - if ($this->lektor_uid!='_DummyLektor') - $sql_query.=" OR (uid=".$this->db_add_param($this->lektor_uid)." AND uid!='_DummyLektor') "; + if (!in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER))) + $sql_query.=" OR (uid=".$this->db_add_param($this->lektor_uid)." AND uid not in (".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER))."))"; //Wenn eine Kollisionspruefung auf Studentenebene durchgefuehrt wird, werden die LVB nicht gecheckt if($kollision_student=='false') @@ -605,13 +633,15 @@ class lehrstunde extends basis_db if ($anz==0) { // Zeitsperren pruefen - if($ignore_zeitsperre=='false' && $this->lektor_uid!='_DummyLektor' && $this->kollision_zeitsperre()) + if($ignore_zeitsperre=='false' && !in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER)) && $this->kollision_zeitsperre()) return true; // Reservierungen pruefen if ($ignore_reservierung=='false' && $this->kollision_reservierung()) return true; + if($this->kollision_ressource()) + return true; return false; } else @@ -622,6 +652,36 @@ class lehrstunde extends basis_db } } + /** + * Prueft ob eine Kollision mit den zugeteilten Ressourcen vorhanden ist + * + * @return boolean true=kollision, false=keine kollision + */ + public function kollision_ressource() + { + $qry = "SELECT + tbl_betriebsmittel.beschreibung, tbl_stundenplandev.ort_kurzbz + FROM + lehre.tbl_stundenplan_betriebsmittel + JOIN lehre.tbl_stundenplandev USING(stundenplandev_id) + JOIN wawi.tbl_betriebsmittel USING(betriebsmittel_id) + WHERE + tbl_stundenplandev.datum=".$this->db_add_param($this->datum)." + AND tbl_stundenplandev.stunde=".$this->db_add_param($this->stunde)." + AND betriebsmittel_id IN(SELECT betriebsmittel_id FROM lehre.tbl_stundenplan_betriebsmittel WHERE stundenplandev_id=".$this->db_add_param($this->stundenplan_id).")"; + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + $this->errormsg='Kollision (Ressource)'.$row->beschreibung.'|'.$row->ort_kurzbz; + return true; + } + return false; + } + return false; + } + /** * Prueft ob eine Kollision mit den Zeitsperren vorhanden ist * @@ -668,8 +728,8 @@ class lehrstunde extends basis_db stunde=".$this->db_add_param($this->stunde)." AND (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." OR "; - if ($this->lektor_uid!='_DummyLektor') - $sql_query.="(uid=".$this->db_add_param($this->lektor_uid)." AND uid!='_DummyLektor') OR "; + if (!in_array($this->lektor_uid, unserialize(KOLLISIONSFREIE_USER))) + $sql_query.="(uid=".$this->db_add_param($this->lektor_uid)." AND uid not in(".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER)).")) OR "; $sql_query.="(studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem); if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') diff --git a/include/variable.class.php b/include/variable.class.php index 95dc966c4..e1ce0809a 100644 --- a/include/variable.class.php +++ b/include/variable.class.php @@ -268,6 +268,13 @@ class variable extends basis_db if (!isset($this->variable->max_kollision)) $this->variable->max_kollision='0'; + + if (!isset($this->variable->alle_unr_mitladen)) + $this->variable->alle_unr_mitladen='false'; + + if (!isset($this->variable->allow_lehrstunde_drop)) + $this->variable->allow_lehrstunde_drop='false'; + return true; } diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index c924f098c..4aac262b2 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -42,6 +42,7 @@ require_once(dirname(__FILE__).'/phrasen.class.php'); require_once(dirname(__FILE__).'/globals.inc.php'); require_once(dirname(__FILE__).'/sprache.class.php'); require_once(dirname(__FILE__).'/functions.inc.php'); +require_once(dirname(__FILE__).'/betriebsmittel.class.php'); class wochenplan extends basis_db { @@ -374,7 +375,7 @@ class wochenplan extends basis_db * @param datum Datum eines Tages in der angeforderten Woche * @return true oder false */ - public function load_week($datum, $stpl_view='stundenplan') + public function load_week($datum, $stpl_view='stundenplan', $alle_unr_mitladen=false) { // Pruefung der Attribute if (!isset($this->type)) @@ -398,7 +399,7 @@ class wochenplan extends basis_db // Stundenplandaten ermittlen $this->wochenplan=new lehrstunde(); - $anz=$this->wochenplan->load_lehrstunden($this->type,$this->datum_begin,$this->datum_end,$this->pers_uid,$this->ort_kurzbz,$this->stg_kz,$this->sem,$this->ver,$this->grp,$this->gruppe_kurzbz, $stpl_view, null,$this->fachbereich_kurzbz,$this->lva); + $anz=$this->wochenplan->load_lehrstunden($this->type,$this->datum_begin,$this->datum_end,$this->pers_uid,$this->ort_kurzbz,$this->stg_kz,$this->sem,$this->ver,$this->grp,$this->gruppe_kurzbz, $stpl_view, null,$this->fachbereich_kurzbz,$this->lva, $alle_unr_mitladen); if ($anz<0) { $this->errormsg=$this->wochenplan->errormsg; @@ -612,7 +613,7 @@ class wochenplan extends basis_db echo '">'; echo '

'; //Kalenderjump mit Hoverbox - jahreskalenderjump_hoverbox($this->link); + $this->jahreskalenderjump_hoverbox($this->link); return true; } @@ -845,7 +846,7 @@ class wochenplan extends basis_db $uEinheiten=array(); for($n=0;$nsearchForId($unr[$n], $uEinheiten); if($unrIndex===FALSE) { /* @@ -1108,6 +1109,7 @@ class wochenplan extends basis_db // Kontext Menue echo ' + @@ -1207,7 +1209,7 @@ class wochenplan extends basis_db $tooltip .= $bezeichnung; } } - echo ''; - + if (isset($this->std_plan[$i][$j][0]->lehrfach)) { // Daten aufbereiten @@ -1229,6 +1231,7 @@ class wochenplan extends basis_db unset($lvb); //$lvb=array(); $kollision=-1; + unset($kollisionsmeldungen); if (isset($a_unr)) unset($a_unr); foreach ($this->std_plan[$i][$j] as $lehrstunde) @@ -1279,9 +1282,16 @@ class wochenplan extends basis_db } $qry.="ORDER BY datum, stunde, student_uid LIMIT 1;"; - if($this->db_query($qry)) - if($this->db_num_rows()>0) + if($stud_result = $this->db_query($qry)) + { + if($this->db_num_rows($stud_result)>0) + { $kollision++; + $stud_row = $this->db_fetch_object($stud_result); + foreach($a_unr as $kollision_unr) + $kollisionsmeldungen[$kollision_unr][]=' Studentenkollision '.$stud_row->student_uid; + } + } } else @@ -1295,26 +1305,29 @@ class wochenplan extends basis_db $a=0; foreach ($a_unr as $unr) { - array_unique($a_lvb[$unr]); + $lvb_unr_arr[$a]=$unr; $lvb[$a++]=$a_lvb[$unr]; } - - for ($a=0;$astd_plan[$i][$j] as $lehrstunde) { if ($lehrstunde->unr==$unr) @@ -1374,17 +1395,34 @@ class wochenplan extends basis_db $reservierung=true; } else + { $paramList.='&stundenplan_id'.$z++.'='.$lehrstunde->stundenplan_id; - if(isset($lehrstunde->farbe)) + $stundenplan_ids[]=$lehrstunde->stundenplan_id; + } + if(isset($lehrstunde->farbe) && $farbe=='') $farbe=$lehrstunde->farbe; $titel=htmlspecialchars($lehrstunde->titel); $anmerkung=htmlspecialchars($lehrstunde->anmerkung); + $tooltip_anmerkung[]=$titel.' '.$anmerkung; } if(isset($raumcheck[$lehrstunde->ort]) && $raumcheck[$lehrstunde->ort]!=$lehrstunde->unr) + { $kollision++; + $kollisionsmeldungen[$lehrstunde->unr][]=" Ort ".$lehrstunde->ort; + $kollisionsmeldungen[$raumcheck[$lehrstunde->ort]][]=" Ort ".$lehrstunde->ort; + } else $raumcheck[$lehrstunde->ort]=$lehrstunde->unr; + + if(isset($lktcheck[$lehrstunde->lektor]) && $lktcheck[$lehrstunde->lektor]!=$lehrstunde->unr) + { + $kollision++; + $kollisionsmeldungen[$lehrstunde->unr][]=" LektorIn ".$lehrstunde->lektor; //." ".$lehrstunde->unr."!=".$lktcheck[$lehrstunde->lektor]; + $kollisionsmeldungen[$lktcheck[$lehrstunde->lektor]][]=" LektorIn ".$lehrstunde->lektor; //." ".$lehrstunde->unr."!=".$lktcheck[$lehrstunde->lektor]; + } + else + $lktcheck[$lehrstunde->lektor]=$lehrstunde->unr; } // Lektoren //if ($this->type!='lektor') @@ -1434,7 +1472,8 @@ class wochenplan extends basis_db $updatevonam.=$u.' '; // Blinken oder nicht ? - if ($kollision) + if (isset($kollisionsmeldungen[$unr]) + || (isset($kollisionsmeldung) && count($kollisionsmeldungen, COUNT_RECURSIVE)==0 && $kollision>0)) { $blink_ein='';// .$kollision; $blink_aus=''; @@ -1447,10 +1486,15 @@ class wochenplan extends basis_db $stg_obj = new studiengang(); $stg_obj->load($stg_kz); - + $tooltip_anmerkung = array_unique($tooltip_anmerkung); + $tooltip_gesamt = '('.$updatevonam.') '.implode(',',$tooltip_anmerkung); + + if(isset($kollisionsmeldungen[$unr])) + $tooltip_gesamt .= ' Kollision wegen:'.implode(',',array_unique($kollisionsmeldungen[$unr])); + // Ausgabe echo '