- Scrollposition im Tempus bleibt erhalten

- Raumvorschlag zeigt nun auch Räume mit Kollisionen an (steuerbar über max_kollision)
- Semesterplan zeigt nun auch die Zeitsperren der Lektoren an
- Markieren von mehreren Stunden im Tempus unterstützt jetzt STRG und SHIFT
- Löschen von mehreren (markierten) Lehreinheiten möglich
- CSV Export für Uniflow Drucksystem
- SQL Injection Fixes
This commit is contained in:
Andreas Österreicher
2010-06-09 09:21:14 +00:00
parent 5a2b0f8b2f
commit 67af91fc52
17 changed files with 631 additions and 268 deletions
+13
View File
@@ -295,6 +295,12 @@ function loadVariables($user)
$kollision_student='false';
}
if (!isset($max_kollision))
{
global $max_kollision;
$max_kollision='0';
}
if (!isset($ignore_zeitsperre))
{
global $ignore_zeitsperre;
@@ -324,6 +330,13 @@ function writeCISlog($stat, $rm = '')
');
}
function Debuglog($entry)
{
$handle = fopen(LOG_PATH.'debug.log','a');
fwrite($handle, $entry);
fclose($handle);
}
// ***************************************************************
// * Liefert das Studiensemester in dem sich
// * das uebergebene Datum befindet
+23 -23
View File
@@ -598,11 +598,11 @@ public function loadVeranstaltung($veranstaltungskategorie_kurzbz="",$veranstalt
// Suche nach einer einzigen Veranstaltung_id
if (!is_array($this->veranstaltung_id) && !empty($this->veranstaltung_id) )
{
$qry.=" AND ".$this->schemaSQL.".tbl_veranstaltung.veranstaltung_id=".$this->veranstaltung_id." ";
$qry.=" AND ".$this->schemaSQL.".tbl_veranstaltung.veranstaltung_id=".addslashes($this->veranstaltung_id)." ";
}
elseif (is_array($this->veranstaltung_id) && count($this->veranstaltung_id)>0 )
{
$qry.=" AND ".$this->schemaSQL.".tbl_veranstaltung.veranstaltung_id in (".implode(",",$this->veranstaltung_id).") ";
$qry.=" AND ".$this->schemaSQL.".tbl_veranstaltung.veranstaltung_id in (".addslashes(implode(",",$this->veranstaltung_id)).") ";
}
// Suche nach einer einzigen Veranstaltungskategorie_kurzbz
@@ -627,44 +627,44 @@ public function loadVeranstaltung($veranstaltungskategorie_kurzbz="",$veranstalt
}
if (!empty($this->start_jahr) && empty($this->ende_jahr))
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY')='".$this->start_jahr."'";
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY')='".addslashes($this->start_jahr)."'";
elseif (empty($this->start_jahr) && !empty($this->ende_jahr) )
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY')='".$this->ende_jahr."'";
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY')='".addslashes($this->ende_jahr)."'";
elseif (empty($this->start_jahr) && !empty($this->ende_jahr) )
{
$qry.=" AND '".$this->start_jahr."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY') ";
$qry.=" AND '".$this->ende_jahr."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY') ";
$qry.=" AND '".addslashes($this->start_jahr)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY') ";
$qry.=" AND '".addslashes($this->ende_jahr)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYY') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYY') ";
}
if (!empty($this->start_jahr_monat) && empty($this->ende_jahr_monat) )
$qry.=" AND '".$this->start_jahr_monat."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM')";
$qry.=" AND '".addslashes($this->start_jahr_monat)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM')";
elseif (empty($this->start_jahr_monat) && !empty($this->ende_jahr_monat) )
$qry.=" AND '".$this->start_jahr_monat."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM')";
$qry.=" AND '".addslashes($this->start_jahr_monat)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM')";
elseif (!empty($this->start_jahr_monat) && !empty($this->ende_jahr_monat) )
{
$qry.=" AND '".$this->start_jahr_monat."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM') ";
$qry.=" AND '".$this->ende_jahr_monat."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM') ";
$qry.=" AND '".addslashes($this->start_jahr_monat)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM') ";
$qry.=" AND '".addslashes($this->ende_jahr_monat)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMM') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMM') ";
}
if (!empty($this->start_jahr_woche) && empty($this->ende_jahr_woche) )
$qry.=" AND '".$this->start_jahr_woche."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'')";
$qry.=" AND '".addslashes($this->start_jahr_woche)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'')";
elseif (empty($this->start_jahr_woche) && !empty($this->ende_jahr_woche) )
$qry.=" AND '".$this->start_jahr_woche."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'')";
$qry.=" AND '".addslashes($this->start_jahr_woche)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') and to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'')";
elseif (!empty($this->start_jahr_woche) && !empty($this->ende_jahr_woche) )
{
$qry.=" AND '".$this->start_jahr_woche."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'') ";
$qry.=" AND '".$this->ende_jahr_woche."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'') ";
$qry.=" AND '".addslashes($this->start_jahr_woche)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'') ";
$qry.=" AND '".addslashes($this->ende_jahr_woche)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYIW'') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYIW'') ";
}
if (!empty($this->start_jahr_monat_tag) && empty($this->ende_jahr_monat_tag) )
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD')>='".$this->start_jahr_monat_tag."'";
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD')>='".addslashes($this->start_jahr_monat_tag)."'";
elseif (empty($this->start_jahr_monat_tag) && !empty($this->ende_jahr_monat_tag) )
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD')<='".$this->ende_jahr_monat_tag."'";
$qry.=" AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD')<='".addslashes($this->ende_jahr_monat_tag)."'";
elseif (!empty($this->start_jahr_monat_tag) && !empty($this->ende_jahr_monat_tag) )
{
$qry.=" AND '".$this->start_jahr_monat_tag."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD') ";
$qry.=" AND '".$this->ende_jahr_monat_tag."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD') ";
$qry.=" AND '".addslashes($this->start_jahr_monat_tag)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD') ";
$qry.=" AND '".addslashes($this->ende_jahr_monat_tag)."' between to_char(".$this->schemaSQL.".tbl_veranstaltung.start, 'YYYYMMDD') AND to_char(".$this->schemaSQL.".tbl_veranstaltung.ende, 'YYYYMMDD') ";
}
if ($this->suchtext)
@@ -672,10 +672,10 @@ public function loadVeranstaltung($veranstaltungskategorie_kurzbz="",$veranstalt
$this->suchtext='%'.$this->suchtext.'%';
$this->suchtext=str_replace(' ','%',$this->suchtext);
$this->suchtext=str_replace('%%','%',addslashes($this->suchtext));
$qry.=" AND ( ".$this->schemaSQL.".tbl_veranstaltungskategorie.veranstaltungskategorie_kurzbz like '".$this->suchtext."'
OR ".$this->schemaSQL.".tbl_veranstaltungskategorie.bezeichnung like '".$this->suchtext."'
OR ".$this->schemaSQL.".tbl_veranstaltung.beschreibung like '".$this->suchtext."'
OR ".$this->schemaSQL.".tbl_veranstaltung.inhalt like '".$this->suchtext."' ) ";
$qry.=" AND ( ".$this->schemaSQL.".tbl_veranstaltungskategorie.veranstaltungskategorie_kurzbz like '".addslashes($this->suchtext)."'
OR ".$this->schemaSQL.".tbl_veranstaltungskategorie.bezeichnung like '".addslashes($this->suchtext)."'
OR ".$this->schemaSQL.".tbl_veranstaltung.beschreibung like '".addslashes($this->suchtext)."'
OR ".$this->schemaSQL.".tbl_veranstaltung.inhalt like '".addslashes($this->suchtext)."' ) ";
}
// Entscheiden welche Daten angezeigt werden Public oder fuer Mitarbeiter alles
+1 -1
View File
@@ -590,7 +590,7 @@ class lehreinheit extends basis_db
else
{
$row=$this->db_fetch_row($erg_stpl);
$this->errormsg="Kollision mit StundenplanID($stpl_table.$stpl_id): $row[0]";
$this->errormsg="Kollision mit StundenplanID($stpl_id): $row[0] | $datum | $ort";
return false;
}
}
+3
View File
@@ -261,6 +261,9 @@ class variable extends basis_db
if (!isset($this->variable->kollision_student))
$this->variable->kollision_student='false';
if (!isset($this->variable->max_kollision))
$this->variable->max_kollision='0';
return true;
}
+153 -46
View File
@@ -137,7 +137,6 @@ class wochenplan extends basis_db
*/
public function load_data($type, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe=NULL)
{
///////////////////////////////////////////////////////////////////////
// Parameter Checken
// Typ des Stundenplans
if ($type=='student' || $type=='lektor' || $type=='verband' || $type=='gruppe' || $type=='ort')
@@ -191,7 +190,6 @@ class wochenplan extends basis_db
$this->gruppe_kurzbz=$gruppe;
///////////////////////////////////////////////////////////////////////
// Zusaetzliche Daten ermitteln
//personendaten
if ($this->type=='student' || $this->type=='lektor')
@@ -848,7 +846,7 @@ class wochenplan extends basis_db
* @param datum Datum eines Tages in der angeforderten Woche
* @return true oder false
*/
public function draw_week_xul($semesterplan, $uid, $wunsch=null, $ignore_kollision=false, $kollision_student=false)
public function draw_week_xul($semesterplan, $uid, $wunsch=null, $ignore_kollision=false, $kollision_student=false, $max_kollision=0)
{
//echo $wunsch;
global $cfgStdBgcolor;
@@ -866,7 +864,7 @@ class wochenplan extends basis_db
echo '<popupset>
<popup id="stplPopupMenue">
<menuitem label="Raumvorschlag" oncommand="StplSearchRoom(document.popupNode);" />
<menuitem label="Entfernen" oncommand="onStplDelete(\'stpl_delete_single\');" />
<menuitem label="Entfernen" oncommand="TimeTableWeekMarkiere(document.popupNode);TimetableDeleteEntries()" />
</popup>
</popupset>';
@@ -1087,6 +1085,7 @@ class wochenplan extends basis_db
$z=0;
$reservierung=false;
foreach ($this->std_plan[$i][$j] as $lehrstunde)
{
if ($lehrstunde->unr==$unr)
{
// Lektoren
@@ -1123,7 +1122,7 @@ class wochenplan extends basis_db
$titel=htmlspecialchars($lehrstunde->titel);
$anmerkung=htmlspecialchars($lehrstunde->anmerkung);
}
}
// Lektoren
//if ($this->type!='lektor')
$lektor=array_unique($lektor);
@@ -1186,28 +1185,31 @@ class wochenplan extends basis_db
$stg_obj->load($stg_kz);
// Ausgabe
echo '<button id="buttonSTPL'.$count++.'"
echo '<button id="buttonSTPL'.$count.'"
tooltiptext="('.$updatevonam.') '.$titel.' - '.$anmerkung.'"
style="border-width:1px;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';"
styleOrig="border-width:1px;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';" ';
style="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';"
styleOrig="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';" ';
if ($berechtigung->isBerechtigt('lehre/lvplan',$stg_obj->oe_kurzbz,'uid'))
echo ' context="stplPopupMenue" ';
if ($berechtigung->isBerechtigt('lehre/lvplan',$stg_obj->oe_kurzbz,'u'))
echo 'ondraggesture="nsDragAndDrop.startDrag(event,listObserver)" ';
//onclick="return onStplSearchRoom(event, event.target);"
echo 'ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
ondragover="nsDragAndDrop.dragOver(event,boardObserver)"
onclick="return onStplSearchRoom(event, event.target);"
oncommand="onStplDetail(event);"
oncommand="TimeTableWeekClick(event)"
ondblclick="TimeTableWeekDblClick(event)"
aktion="stpl"
unr="'.$unr.'"
markiert="false"
elem="stundenplan'.$i.$j.'"
idList="'.$paramList.'" stpltype="'.$this->type.'"
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'"
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'" wochentag="'.$i.'"
pers_uid="'.$this->pers_uid.'" ort_kurzbz="'.$this->ort_kurzbz.'">';
echo '<label align="center">'.$blink_ein;
$count++;
//echo $lf;
echo mb_substr($lf, 0,-strlen('<html:br />'));
if($titel!='' && !$reservierung)
@@ -1227,19 +1229,35 @@ class wochenplan extends basis_db
}
}
if (isset($this->std_plan[$i][$j][0]->frei_orte))
foreach ($this->std_plan[$i][$j][0]->frei_orte as $f_ort)
{
//orte sortieren => AnzahlKollisionen ASC, Ort_kurzbz ASC
$keys=array();
$values=array();
foreach ($this->std_plan[$i][$j][0]->frei_orte as $key=>$value)
{
echo '<label value="'.$f_ort.'"
styleOrig=""
ondragenter="nsDragAndDrop.dragEnter(event,boardObserver)"
ondragexit="nsDragAndDrop.dragExit(event,boardObserver)"
ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'"
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
stpltype="'.$this->type.'"
/>';
$keys[]=$key;
$values[]=$value;
}
array_multisort($values, SORT_ASC, $keys, SORT_ASC, $this->std_plan[$i][$j][0]->frei_orte);
foreach ($this->std_plan[$i][$j][0]->frei_orte as $f_ort=>$anzahl)
{
if($anzahl<=$max_kollision)
{
echo '<label value="'.$f_ort.($anzahl>0?'('.$anzahl.')':'').'"
styleOrig=""
ondragenter="nsDragAndDrop.dragEnter(event,boardObserver)"
ondragexit="nsDragAndDrop.dragExit(event,boardObserver)"
ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'"
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
stpltype="'.$this->type.'" ort_kurzbz="'.$f_ort.'" kollision="'.$anzahl.'"
'.($anzahl>0?'tooltiptext="'.$anzahl.' Kollision(en)"':'').'
/>';
}
}
}
echo '</vbox>'.$this->crlf;
}
echo "</row>";
@@ -1440,16 +1458,62 @@ class wochenplan extends basis_db
// freie Plaetze in den Stundenplan eintragen.
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
{
for ($s=1;$s<=$max_stunde;$s++)
if (!$raster[$t][$s]->kollision && ($s+$block)<=($max_stunde+1))
{
if (($s+$block)<=($max_stunde+1))
{
if (count($raster[$t][$s]->ort)>0)
$this->std_plan[$t][$s][0]->frei_orte=array_diff($orte,$raster[$t][$s]->ort);
else
$this->std_plan[$t][$s][0]->frei_orte=$orte;
// Alle infrage kommenden Orte zuweisen
foreach($orte as $ort)
{
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]:0);
}
// Besetzte Raueme eintragen
foreach($raster[$t][$s]->ort as $ort)
{
if(in_array($ort, $orte))
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
// Gruppenkollision eintragen
if($raster[$t][$s]->kollision)
{
foreach($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
{
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
// Blockung beruecksichtigen
for ($b=1;$b<$block && ($s+$block)<=($max_stunde+1);$b++)
$this->std_plan[$t][$s][0]->frei_orte=array_diff($this->std_plan[$t][$s][0]->frei_orte,$raster[$t][$s+$b]->ort);
{
if(!$raster[$t][$s+$b]->kollision)
{
//Wenn keine Gruppenkollision vorhanden ist, nur die Raumkollision eintragen
foreach($raster[$t][$s+$b]->ort as $ort)
{
if(in_array($ort, $orte))
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
else
{
// Bei Gruppenkollision kollidieren alle Raeume
foreach($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
{
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
}
}
else
{
// Wenn sich die Stunden mit der Blockung nicht ausgehen, dann keine Raeume anzeigen
$this->std_plan[$t][$s][0]->frei_orte = array();
}
}
}
return true;
}
@@ -1629,7 +1693,7 @@ class wochenplan extends basis_db
// Raeume die in Frage kommen aufgrund der Raumtypen
$sql_query="SELECT DISTINCT ort_kurzbz, hierarchie FROM public.tbl_ort
JOIN public.tbl_ortraumtyp USING (ort_kurzbz) WHERE ($rtype) AND aktiv AND ort_kurzbz NOT LIKE '\\\\_%' ORDER BY hierarchie,ort_kurzbz"; //
//echo $sql_query;
//die($sql_query);
if(!$this->db_query($sql_query))
{
$this->errormsg=$this->db_last_error();
@@ -1664,6 +1728,7 @@ class wochenplan extends basis_db
{
// Raster vorbereiten
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
{
for ($s=$min_stunde;$s<=$max_stunde;$s++)
{
if (isset($raster[$t][$s]))
@@ -1671,7 +1736,8 @@ class wochenplan extends basis_db
$raster[$t][$s]->ort=array();
$raster[$t][$s]->kollision=false;
}
}
// Stundenplanabfrage bauen (Wo ist Kollision?)
$sql_query="SELECT DISTINCT datum, stunde FROM $stpl_table
WHERE datum>='".addslashes($datum_begin)."' AND datum<'".addslashes($datum_end)."' AND
@@ -1720,32 +1786,73 @@ class wochenplan extends basis_db
$jahr=mb_substr($row->datum, 0,4);
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
$raster[$tag][$row->stunde]->ort[]=$row->ort_kurzbz;
//if ($row->ort_kurzbz=='EDV6.10' && $tag==2 && $row->stunde==8)
// $this->errormsg.=htmlspecialchars($row->ort_kurzbz).'/'.$mtag.'/'.$month;
}
// freie Plaetze in den Stundenplan eintragen.
// Moegliche Orte fuer den Vorschlag in den Stundenplan eintragen.
// $this->std_plan[$t][$s][0]->frei_orte ist ein Array mit den in Frage kommenden Orten
// der Wert von $this->std_plan[$t][$s][0]->frei_orte[$ort_kurzbz] gibt an, wie viele
// kollisionen bei der Zuteilung entstehen
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
{
for ($s=1;$s<=$max_stunde;$s++)
if (!$raster[$t][$s]->kollision && ($s+$block)<=($max_stunde+1))
{
//Blockung passt in die Maximalstundenanzahl
if (($s+$blck)<=($max_stunde+1))
{
// Besetzte Orte von den freien abziehen
if (count($raster[$t][$s]->ort)>0 && $count==0)
$this->std_plan[$t][$s][0]->frei_orte=array_diff($orte,$raster[$t][$s]->ort);
elseif ($count==0)
$this->std_plan[$t][$s][0]->frei_orte=$orte;
elseif (count($raster[$t][$s]->ort)>0)
$this->std_plan[$t][$s][0]->frei_orte=array_diff($this->std_plan[$t][$s][0]->frei_orte,$raster[$t][$s]->ort);
if($count==0)
{
// Freie Orte beim 1. Durchlauf zuteilen
foreach($orte as $ort)
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]:0);
}
// Besetzte Orte eintragen
foreach ($raster[$t][$s]->ort as $ort)
{
if(in_array($ort, $orte))
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
//Kollision mit Gruppe
if($raster[$t][$s]->kollision)
{
foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
{
if(in_array($ort, $orte))
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
// Blockung beruecksichtigen
for ($b=1;$b<$block && ($s+$block)<=($max_stunde+1);$b++)
{
if (!$raster[$t][$s+$b]->kollision)
$this->std_plan[$t][$s][0]->frei_orte=array_diff($this->std_plan[$t][$s][0]->frei_orte,$raster[$t][$s+$b]->ort);
{
// Wenn keine Gruppenkollision vorhanden ist, dann die kollidierenden Raeume eintragen
foreach ($raster[$t][$s+$b]->ort as $ort)
{
if(in_array($ort, $orte))
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
else
$this->std_plan[$t][$s][0]->frei_orte=array();
{
// Bei Gruppenkollision den Wert bei allen Raumen erhoehen
foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
{
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
}
}
}
}
elseif($raster[$t][$s]->kollision)
else
{
// Wenn sich die Verplanung mit der Blockung nicht mehr ausgeht, dann keine Raeume vorschlagen
$this->std_plan[$t][$s][0]->frei_orte=array();
}
}
}
// Variablen abgleichen
$rest-=$block;
if ($block>$rest)
+3 -3
View File
@@ -355,9 +355,9 @@ class zeitsperre extends basis_db
FROM
campus.tbl_zeitsperre
WHERE
vondatum<='$datum' AND bisdatum>='$datum' AND
(vonstunde<='$stunde' OR vonstunde is null) AND
(bisstunde>='$stunde' OR bisstunde is null) AND
vondatum<='$datum' AND bisdatum>='$datum' AND
((vondatum='$datum' AND vonstunde<='$stunde') OR vonstunde is null OR vondatum<>'$datum') AND
((bisdatum='$datum' AND bisstunde>='$stunde') OR bisstunde is null OR bisdatum<>'$datum') AND
mitarbeiter_uid='$user'";
if($result = $this->db_query($qry))
+2 -2
View File
@@ -169,7 +169,7 @@ class zeitwunsch extends basis_db
// Zeitsperren abfragen
$sql="SELECT vondatum,vonstunde,bisdatum,bisstunde
FROM campus.tbl_zeitsperre
WHERE mitarbeiter_uid='".addslashes($uid)."' AND vondatum<='$ende' AND bisdatum>'$start'";
WHERE mitarbeiter_uid='".addslashes($uid)."' AND vondatum<='$ende' AND bisdatum>='$start'";
if(!$this->db_query($sql))
{
$this->errormsg=$this->db_last_error();
@@ -260,7 +260,7 @@ class zeitwunsch extends basis_db
// Zeitsperren abfragen
$sql="SELECT vondatum,vonstunde,bisdatum,bisstunde
FROM campus.tbl_zeitsperre
WHERE mitarbeiter_uid IN ($sql_query_le) AND vondatum<='$ende' AND bisdatum>'$start'";
WHERE mitarbeiter_uid IN ($sql_query_le) AND vondatum<='$ende' AND bisdatum>='$start'";
if(!$this->db_query($sql))
{
$this->errormsg = $this->db_last_error();