Source for file class.NOCHFREI.php
Documentation is available at class.NOCHFREI.php
* Stellt die Verbindung zur Datenbank 'nochfrei' her.
* Stellt Methoden zum Auslesen und schreiben in diese Datenbank zur Verfügung
* @author Kay Koch, <kay.koch@gmx.de>
* @subpackage foundation_tables
die('This file was generated for PHP 5');
* Basisklasse aller Klassen mit Datenbankzugriff.
* stellt Methoden und Objekte zur Fehlermeldung und zum Datenbankzugriff zur
require_once ('src/foundation/tables/class.PARENTTABLES.php');
/* user defined includes */
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd9-includes begin
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd9-includes end
/* user defined constants */
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd9-constants begin
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd9-constants end
* Stellt die Verbindung zur Datenbank 'nochfrei' her.
* Stellt Methoden zum Auslesen und schreiben in diese Datenbank zur Verfügung
* @author Kay Koch, <kay.koch@gmx.de>
* @subpackage foundation_tables
* Beinhaltet den Datenbanknamen (nochfrei)
* liefert ein 2-D Array mit freien Plätzen an allen Tagen die sich
* in der Datenbank befinden
* Im ersten Feld befinden sich die freien Plätze pro Tag. Index der
* Felder ist das Datum im SQL-Format.
* Im zweiten Feld befindeten sich die zum Tag passende maximale Anzahl an
* Plätzen. Index auch hier das Datum.
* @author Kay Koch, <kay.koch@gmx.de>
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd5 begin
// auslesen aller freien Plätze des aktuellen Sees (und eventuell des angegebenen Tages)
$sql =
"SELECT datum, sumTag FROM $this->dbTableName WHERE see_id= '" .
$this->getSea()->see_id .
"'";
if ($datum !=
null) // Daten für bestimmten Tag auslesen
$sql .=
" AND datum ='$datum' LIMIT 1";
else // Daten für die für diesen See geltende Anmeldefrist auslesen
$sql .=
" AND datum > SUBDATE('" .
$this->getFlags()->lastBackupDate .
"', INTERVAL 6 DAY) AND datum <= ADDDATE('" .
$this->getFlags()->lastBackupDate .
"', INTERVAL '" .
$this->getSea()->wochenImVorraus .
"'*7+1 DAY) ";
$tblNochfrei =
$this->select($sql, true);
foreach ($tblNochfrei as $rowNochfrei) {
// Die zum Datum gehörende maximale Anzahl wird geladen
$this->oMaxfrei->setParams($this->getSea()->see_id, $rowNochfrei['datum']);
$rowMaxfrei =
$this->oMaxfrei->getRow();
// speichern der Restplätze
$returnValue['rest'][$rowNochfrei['datum']] =
$rowNochfrei['sumTag'];
// speichern der maximalen Plätze
$returnValue['max'][$rowNochfrei['datum']] =
$rowMaxfrei['sumTag'];
// section -64--88-122--2-f41e9:1009a89d5b2:-7fd5 end
return (array)
$returnValue;
* liefert ein 2-D Array mit freien Plätzen am gewählten Tag
* Im ersten Feld befinden sich die freien Plätze pro Stunde. Index der
* Felder ist die Stunde (hh:mm).
* Im zweiten Feld befindeten sich die zur Stunde passende maximale Anzahl
* freien Plätzen. Index auch hier die Stunde.
* @author Kay Koch, <kay.koch@gmx.de>
// section -64--88-122--2-f41e9:1009a89d5b2:-7f4b begin
// Anführungsstriche für * verboten, ansonsten ein muss
$stunde =
($stunde =
"*") ?
$stunde :
"'$stunde'";
// auslesen aller freien Plätze des aktuellen Sees (alle Stunden) am ausgewählten Tag
$sql =
"SELECT $stunde FROM $this->dbTableName WHERE (see_id=" .
$this->getSea()->see_id .
" AND datum='$datum') LIMIT 1";
$returnValue =
$this->checkAllowedTimeRange($this->select($sql, false), $this->getSea()->see_id, $datum);
// section -64--88-122--2-f41e9:1009a89d5b2:-7f4b end
return (array)
$returnValue;
* Löscht die Datenbank'nochfrei'.
* Erstellt neue Datensätze mit der max. Anzahl an freien Plätzen
* Der frühste und späteste Anmeldetermin wird ausgelesen und für ALLE Seen
* Die Tabelle wird mit den entsprechenden Werten gefüllt.
* Zusätzlich werden 21 Tage vorher und 14 Tage nachher leere Termine eingefügt
* @author Kay Koch, <kay.koch@gmx.de>
$returnValue = (bool)
false;
// section -64--88-122--2-933bcb:100f60e4e57:-7fee begin
// Alle alten Termine löschen
#$this->truncate("TRUNCATE TABLE `blockaden`");
$this->truncate("TRUNCATE TABLE `archiv`");
$this->truncate("TRUNCATE TABLE `buchungen`");
#$this->truncate("TRUNCATE TABLE `nachttermine`");
$tableMaxFrei =
$this->oMaxfrei->getRow();
$arrSeen =
parent :: $oSeen->all;
$arrFeiertage =
src_tools_TIME :: getFeiertage();
// erstes und letztes Datum herausfinden
foreach ($arrSeen as $see_id =>
$oSee) {
$minDate =
($oSee->saisonStart <
$minDate) ?
$oSee->saisonStart :
$minDate; // niedriegstes Datum
$maxDate =
($oSee->saisonEnde >
$maxDate) ?
$oSee->saisonEnde :
$maxDate; // höchstes Datum
// zusätzliche Tage am Ende hinzufügen
foreach ($arrSeen as $see_id =>
$oSee) {
// Starttermin zum Einfügen ist drei Wochen vor erstem Datum
// 14 Tage vor Beginn mit 0 füllen
while ($aktDay <
$oSee->saisonStart) {
$sql =
"INSERT INTO `$this->dbTableName` (`see_id`,`datum`) VALUES('$see_id','$aktDay');";
// Tauchzeit mit entsprechenden Werten füllen
while ($aktDay <
$oSee->saisonEnde) {
$insertArray =
$tableMaxFrei[$see_id][$aktWeekDay];
$insertArray['wochentag'] =
$aktDay;
$insertString =
"('" .
join("','", $insertArray) .
"')";
$sql =
"INSERT INTO `$this->dbTableName` VALUES $insertString;";
// bis 14 Tage nach Ende mit 0 füllen
while ($aktDay <
$maxDateAdd) {
$sql =
"INSERT INTO `$this->dbTableName` (`see_id`,`datum`) VALUES('$see_id','$aktDay');";
// Beginn der Tauchsaison eintragen
$oFlags->setSaisonDates($minDate, $maxDate);
// section -64--88-122--2-933bcb:100f60e4e57:-7fee end
return (bool)
$returnValue;
* veringert freie Plätze um übergebenen Wert am übergebenen Tag zur
* @author Kay Koch, <kay.koch@gmx.de>
public function decrease($see_id, $datum =
null, $stunde =
null, $anzahl =
0) {
// section -64--88-122--2-933bcb:100f60e4e57:-7faf begin
$setAdd =
($stunde ==
"00:00") ?
"" :
", `$stunde` = `$stunde`- $anzahl ";
$sql =
"UPDATE " .
$this->dbTableName .
" SET `sumTag` = `sumTag`-$anzahl $setAdd WHERE see_id=$see_id AND datum='$datum' LIMIT 1";
$returnValue =
$this->update($sql);
// section -64--88-122--2-933bcb:100f60e4e57:-7faf end
return (int)
$returnValue;
* erhöht die Anzal der freie Plätze wenn die Buchung nicht abgeholt wurde
* @author Kay Koch, <kay.koch@gmx.de>
public function increase($see_id, $datum, $stunde, $anzahl) {
// section -64--88-122--2-1328c7a:10297cab611:-7ffe begin
$setAdd =
($stunde ==
"00:00") ?
"" :
", `$stunde` = `$stunde`+'$anzahl' ";
$sql =
"UPDATE " .
$this->dbTableName .
" SET `sumTag` = `sumTag`+'$anzahl' $setAdd WHERE see_id='$see_id' AND datum='$datum' LIMIT 1";
$returnValue =
$this->update($sql);
// section -64--88-122--2-1328c7a:10297cab611:-7ffe end
return (int)
$returnValue;
* überprüft und liefert ein Array mit den freien Plätzen die sich innerhalb
* erlaubten Tauchbereiches befinden
* @author Kay Koch, <kay.koch@gmx.de>
private function checkAllowedTimeRange($rowPlaces, $see_id, $datum) {
// section -64--88-122--2--264ee0f5:103e4c700eb:-7fc8 begin
// alle maximalen Plätze für einen Tag und einem See
$this->oMaxfrei->setParams($see_id, $datum);
$rowMaxPlaces =
$this->oMaxfrei->getRow();
$startTime =
$this->getSea()->getStartTime($datum); // erste angezeigte Uhrzeit
$oNightdive->setParams($see_id, $datum);
if ($oNightdive->isNightDive()) { // ist ein Nachtauchgang
$endTime =
$oNightdive->getChangedEnd(); // Endzeit bei Nachttauchgang
$rowMaxPlaces =
array_merge($rowMaxPlaces, $oNightdive->getMaxNightPlaces()); // maximale Anzahl
$endTime =
$this->getSea()->getEndTime($datum); // letzte angezeigt Uhrzeit
foreach ($rowPlaces as $hour =>
$places) { // durchlaufen aller Werte
if ($hour >=
$startTime AND $hour <=
$endTime) { // erlaubte Uhrzeit
$returnValue['rest'][$hour] =
$places; // RestPlätze
$returnValue['max'][$hour] =
$rowMaxPlaces[$hour]; // maximale Plätze
// section -64--88-122--2--264ee0f5:103e4c700eb:-7fc8 end
return (array)
$returnValue;
* erstellt ein Objekt der Klasse MAXFREI
* @author Kay Koch, <kay.koch@gmx.de>
// section -64--88-122--2--264ee0f5:103e4c700eb:-7fc3 begin
// section -64--88-122--2--264ee0f5:103e4c700eb:-7fc3 end
* @author Kay Koch, <kay.koch@gmx.de>
// section -64--88-122--2--6176e79b:103fa06a375:-7fb8 begin
// lädt alle alten Einträge bis zum nächsten Update (heute + $intervall)
$weekLimit =
$this->getFlags()->getWhereWeekLimit();
$seeLimit =
(!empty ($see_id)) ?
"AND `see_id`='$see_id'" :
"";
$sql =
"SELECT * FROM " .
$this->dbTableName .
$weekLimit .
" " .
$seeLimit .
" ORDER by see_id,datum ASC";
$returnValue =
$this->select($sql, true, "see_id", "datum");
// section -64--88-122--2--6176e79b:103fa06a375:-7fb8 end
return (array)
$returnValue;
* löscht freie Plätze eines Sees
* @author Kay Koch, <kay.koch@gmx.de>
$returnValue = (bool)
false;
// section -64--88-122--2-7189e523:104671b0211:-7fea begin
// löscht alle Einträge eines Sees
$sql =
"DELETE FROM $this->dbTableName WHERE `see_id` = $see_id";
// section -64--88-122--2-7189e523:104671b0211:-7fea end
return (bool)
$returnValue;
* Reduziert die freien Plätze aufgrund von Blokaden
* @param array $data Blockadedaten
* @return boolean Bestäigung
public function blockDates($data, $reset =
false) {
$this->blockDay($data, $reset);
$this->blockHour($data, $reset);
* @param array $data Daten
private function blockHour($data, $reset) {
$nrTime = (int)
substr($data['stunde'], 0, 3); // Beginn der Blockade als Int
$anzahl =
($reset) ?
$data['anzahl'] : -
1 *
$data['anzahl']; // positive Anzahl beim Reset
for ($i =
0; $i <
$data['anzahlStunden']; $i++
) {
$sql .=
" `sumTag` = `sumTag` + '$anzahl', `$hour` = `$hour` + '$anzahl',";
$sql =
substr($sql, 0, -
1); // letztes Komma löschen
$returnValue =
$this->update($sql);
* @param array $data Daten
private function blockDay($data, $reset) {
$this->oMaxfrei->setParams($data['see_id'], $data['datum']);
$tableMaxFrei =
$this->oMaxfrei->getRow();
unset
($tableMaxFrei['see_id']);
unset
($tableMaxFrei['wochentag']);
foreach ($tableMaxFrei as $key =>
$value) {
$sql .=
" `$key` = '$value',";
$sql .=
" `$key` = '0',";
$sql =
substr($sql, 0, -
1); // letztes Komma löschen
$returnValue =
$this->update($sql);
* erstellt einen String mit WHERE-Klausel
* abhängig von der art der Wiederholung, Datum und see_id wird der
* passende WHERE... Sql-Anhang zurückgeliefert
* @param array $data Daten
$returnValue =
" WHERE `see_id` = '" .
$data['see_id'] .
"'";
switch ($data['wiederholung']) {
$returnValue .=
" AND `datum` = '" .
$data['datum'] .
"';";
$returnValue .=
" AND `datum` >= '" .
$data['datum'] .
"' AND DAYOFWEEK(`datum`) = DAYOFWEEK('" .
$data['datum'] .
"');";
$returnValue .=
" AND `datum` >= '" .
$data['datum'] .
"' AND `datum` < ADDDATE('" .
$data['datum'] .
"', INTERVAL " .
$data['anzahlWiederholung'] .
" DAY);";
* liefert ein 2-D-Array mit den augenblicklichen Werten und den Maximalen
* @param integer $see_id SeeID
* @param integer $datum Datum
* @return array $returnValue
public function getEntry($see_id, $datum) {
$sql =
"SELECT * FROM " .
$this->dbTableName .
" WHERE `see_id` ='$see_id' AND `datum`='$datum' LIMIT 1";
$returnValue =
$this->select($sql);
$this->oMaxfrei->setParams($see_id, $datum);
$returnValue[] =
$this->oMaxfrei->getRow();
* aktualisiert die Tabelle mit übergebenen Daten
* @since 1.1 - 27.02.2007
* @param array $data neue Einträge
* @return boolean $returnValue
foreach ($tmp as $key =>
$value) {
$sql .=
" `$key` = '$value',";
$sql =
substr($sql, 0, -
1); // letztes Komma löschen
$sql .=
" WHERE `see_id` = '" .
$data['see_id'] .
" ' AND `datum` = '" .
$data['datum'] .
"' LIMIT 1;";
$returnValue =
$this->update($sql);
* erstellt ein Kalenderfile im ics-Format
* Die Datei wird im infos-ordner unter dem Namen
* "kalender_seename.ics" abgespeichert
* @param int see_id id des Sees
* @return boolean $returnValue
foreach ($this->getOLdEntries($see_id) as $see_id =>
$arrDates) {
$content =
"BEGIN:VCALENDAR\nCALSCALE:GREGORIAN\nPRODID:-//Ximian//NONSGML Evolution Calendar//EN\nVERSION:2.0\n";
$oSee =
parent :: $oSeen->getSeen($see_id);
if ($oSee->buchbarProTag) {
$rowTpl =
src_tools_TEMPLATE :: getTemplate("calendar_day");
foreach ($arrDates as $arrDate) {
$content .=
sprintf($rowTpl, $i++
, $icsDatum1, $icsDatum2, $arrDate['sumTag']);
foreach ($arrDates as $arrDate) {
$startTime =
$oSee->getStartTime($arrDate['datum']);
$endTime =
$oSee->getEndTime($arrDate['datum']);
foreach ($arrDate as $hour =>
$places) {
$icsStunde1 =
substr($hour, 0, 2) .
"0000";
$icsStunde2 =
sprintf('%02d', (int)
$hour +
1) .
"0000";
$content .=
sprintf($rowTpl, $i++
, $icsDatum .
$icsStunde1, $icsDatum .
$icsStunde2, $places);
$content .=
"END:VCALENDAR";
* liest alle Blockaden und Nachttermine neu in die Nochfrei/Buchungen ein
* @return boolean $returnValue
$arrNTGS =
$oNTG->getRow();
foreach ($arrNTGS as $arrData) {
foreach ($arrData as $data) {
$ft = (int)
"21"; // erste Uhrzeit für NTGs
$lt = (int)
substr($data['uhrzeitEnde'], 0, 3); // letzte Uhrzeit für NTGs
for ($h =
$ft; $h <=
$lt; $h++
) {
if (!$this->increase($data['see_id'], $data['datum'], $h .
":00", $sub *
$data[$h .
":00"]))
$arrBlocks =
$oBlock->getRowByID();
foreach ($arrBlocks as $data) {
$oVereine->setParams($data['verein_nr']);
$data['name'] =
(!empty ($data['info'])) ?
$oVereine->name .
", " .
$data['info'] :
$oVereine->name;
$oBuchungen->blockDates($data);
} /* end of class src_foundation_tables_NOCHFREI */
Documentation generated on Sat, 24 Mar 2007 09:59:43 +0100 by phpDocumentor 1.3.1