<?php
  class kontobewegung
  {
      var $id;
      var $userId;
      var $kategorie;
      var $unterkategorie;
      var $praemienid;
      var $praemienhmid;
      var $kommentar;
      var $datum;
      var $datumerwerb;
      var $datumbescheinigung;
      var $beschreibung;
      var $wert;
      var $gueltig;
      var $zeitstempel;
      var $versanddatum;

      function __construct($row = '')
      {
          if ($row) {
              if (!empty($row['pkey'])) {
                  $this->id = $row['pkey'];
              }
              $this->userId = $row['userId'];
              if (!empty($row['kategorie'])) {
                  $this->kategorie = $row['kategorie'];
              }
              if (!empty($row['unterkategorie'])) {
                  $this->unterkategorie = $row['unterkategorie'];
              }
              if (!empty($row['praemienid'])) {
                  $this->praemienid = $row['praemienid'];
              } else {
                  $this->praemienid = 0;
              }

              if (!empty($row['praemienhmid'])) {
                  $this->praemienhmid = $row['praemienhmid'];
              } else {
                  $this->praemienhmid = 0;
              }


              if (!empty($row['kommentar'])) {
                  $this->kommentar = $row['kommentar'];
              }
              $this->datum = $row['datum'];
              if (!empty($row['datumerwerb'])) {
                  List($year,$month,$day) = explode('-',convertdate($row['datumerwerb']));
                  if ($year >= 1900)  {
                      $this->datumerwerb = convertdate($row['datumerwerb']);
                  } else {
                      $this->datumerwerb = '';
                  }
              }
              if (!empty($row['datumbescheinigung'])) {
                  List($year,$month,$day) = explode('-',convertdate($row['datumbescheinigung']));
                  if ($year >= 1900)  {
                      $this->datumbescheinigung = convertdate($row['datumbescheinigung']);
                  } else {
                      $this->datumbescheinigung = '';
                  }
              }
              $this->beschreibung = $row['beschreibung'];
              $this->wert = $row['wert'];
              if(empty($row['zeitstempel'])){
                  $this->zeitstempel = time();
              }
              if (!empty($row['gueltig'])) {
                  $this->gueltig = $row['gueltig'];
              }
              $this->versanddatum = $row['versanddatum'];
          }
          return $this;
      }


      function fetchbyid($id)
      {
          global $dbhandle;
          $query = "SELECT * FROM kontobewegungen WHERE pkey = $id AND geloescht != 1";
          $result = dbQuery($query) or error("Kann Kontoeintrag nicht lesen");
          if (dbNumRows($result)!=1) {
              return null;
          }
          $row = dbFetchRow($result);
          $kontobewegung = new kontoBewegung($row);
          return $kontobewegung;
      }

      function deleteEntry()
      {
          global $dbhandle;
          #$query = "DELETE FROM kontobewegungen WHERE pkey = " . $this->id . " LIMIT 1";
          $query = "UPDATE kontobewegungen SET geloescht = 1 , zeitstempel=" . time() . " WHERE pkey = " . $this->id . "";
          dbQuery($query);
      }

      function update()
      {
          global $dbhandle;
          $pkey = $this->id;
          $kategorie = $this->kategorie;
          $unterkategorie = $this->unterkategorie;
          $praemienid = $this->praemienid;
          $praemienhmid = $this->praemienhmid;
          $kommentar = _mysqlescapestring($this->kommentar);

          //$datum = $this->datum;
	      /**
	       * BUGFIX: Datum der Änderung springt zurück auf Mitternacht,
	       * deswegen hängen wir die Uhrzeit an das Datum
	       */
	      $datum = mktime(date("H"), date("i"), date("s"), date("m", $this->datum), date("d", $this->datum),date("Y", $this->datum));

          $datumerwerb = convertdate($this->datumerwerb);
          $versanddatum = $this->versanddatum;
          if ($datumerwerb == '') { $datumerwerb = '0000-01-01'; }
          if ($versanddatum == '') { $versanddatum = '0000-01-01';}
          $datumbescheinigung = convertdate($this->datumbescheinigung);
          if ($datumbescheinigung == '') { $datumbescheinigung = '0000-01-01'; }
          $beschreibung = _mysqlescapestring($this->beschreibung);
          $wert = $this->wert;
          if (!$wert) {
            $wert = 0;
          } elseif ($wert == '') {
            $wert = 0;
          }
          $gueltig = $this->gueltig;
          if ($gueltig == '') {
            $gueltig = 0;
          }
          $zeitstempel = time();
          $query = "UPDATE kontobewegungen SET kategorie = '$kategorie', " .
                   "unterkategorie = '$unterkategorie', " .
                   "praemienid = '$praemienid', " .
                   "praemienhmid = '$praemienhmid', " .
                   "kommentar = '$kommentar', " .
                   "datum = $datum, " .
                   "datumerwerb= '$datumerwerb', " .
                   "datumbescheinigung= '$datumbescheinigung', " .
                   "beschreibung = '$beschreibung', " .
                   "wert = " . intval($wert) . ', ' .
                   "gueltig = $gueltig, ".
                   "versanddatum = '$versanddatum', ".
                   "zeitstempel = $zeitstempel ".
                   "WHERE pkey = " . intval($pkey) . ' ';

          $result = dbQuery($query) or
              error("Konnte Kontobewegung nicht in Datenbank eintragen: " .  dbError($dbhandle) . $query);
          dbFreeResult($result);
      }


      /* Exportiert die Bestellungen innerhalb eines Zeitraumes
         in Excel-Listen */
      function exportbestellliste($type,$gutschein,$startdate,$enddate)
      {
          global $dbhandle;
          global $eucountries;
          global $exportpath;
          $loggedin = $_SESSION['loggedIn'];

          // Type = U18, O18, U, U
          if ($type != 'U' && $type != 'U18' && $type != 'O18')
          {
              error("Illegal type '$type' in function exportbestellliste");
          }
          /*
             IPO-Sachprämien:
             IPO Erwachsene: 120091
             IPO Kinder:     120091

             Cadooz-Gutscheine:
             Cadooz Erwachsene 1032566
             Cadooz Kinder incl.10 EUR Sportgutschein aus U-Untersuchungen 1032566
           */

          if ($gutschein)
          {
              if ($type == 'U' || $type == 'U18')
              {
                  $kundennr = 710814;
              } else {
                  $kundennr = 710810;
              }
          } else {
              if ($type == 'U')
              {
                  $kundennr = 120106;
              }
              if ($type == 'U18')
              {
                  $kundennr = 120105;
              }
              if ($type == 'O18')
              {
                  $kundennr = 120091;
              }
          }

          /* Sheet Name, File Name and Field names for Excel file */

          $name = "$type-";
          if ($type == 'U') {
              $name = "Zusatzpraemien-";
          }
          if ($gutschein) {
              $name .= "Gutscheine-";
          }
          $name .= 'Bestellungen';
          $filename = $startdate . '_-_' . $enddate . '_' . $name;
          if ($gutschein) {
              // Cadooz
              $fieldnames = array('Kundennr',$gutschein?'Nennwert':'Artikelnr','Anrede','Vorname',
                      'Nachname','Straße','PLZ','Ort','Bestelldatum','BestellId','Bezeichnung');
          } else {
              // IPO
              $zeile = array(
                      $timestamp,
                      $artikelnummer,
                      $hmnr,
                      $user->anrede,
                      $user->vorname,
                      $user->name,
                      $user->strasse,
                      '',
                      '',
                      '',
                      $user->plz,
                      $user->ort,
                      $bestelldatum,$pkey
                      );
              $fieldnames = array('Referenz_ID','Artikel_ID','Kundenartikelnummer','Anrede','Vorname',
                      'Name','Adresszusatz','Strasse','Hausnummer',
                      'Hausnummer_Zusatz','Länderkürzel','Postleitzahl',
                      'Ort','Kundennr','Bestelldatum','BestellId','Beschreibung','Buchungstext','KV-Nr.');
          }
          for ($i=0; $i < count($fieldnames); $i++)
          {
              $fieldnames[$i] = $fieldnames[$i];
          }

          $query = "SELECT *, kontobewegungen.pkey AS pkey, kontobewegungen.praemienid AS praemienid, 
                      DATE(FROM_UNIXTIME(kontobewegungen.datum)) AS bestelldatum, 
                      kontobewegungen.beschreibung as buchungstext 
                    FROM `kontobewegungen`, praemien
                    WHERE kontobewegungen.praemienid != ''
                      AND kontobewegungen.datum >= UNIX_TIMESTAMP('$startdate 00:00:00')
                      AND kontobewegungen.datum <= UNIX_TIMESTAMP('$enddate 23:59:59')
                      AND kontobewegungen.praemienid = praemien.id
                      AND praemien.praemientyp = '$type' AND praemien.geldpraemie = $gutschein  AND kontobewegungen.geloescht != 1";
          $result = dbQuery($query) or error("Kann Bestellungen nicht lesen: " . dbError($dbhandle));

          if ($result)
          {
              $data = array();
              while ($row = dbFetchRow($result))
              {
                  $pkey = $row['pkey'];
                  $userId = $row['userId'];
                  $user = new user(0,$userId);
                  if (!$user) {
                      print "User mit Id $userId existiert nicht\n";
                      die();
                  }
                  $buchungstext = stripslashes($row['buchungstext']);
                  $pkey = $row['pkey'];
                  if (preg_match('/^Spende/',$buchungstext)) {
                      continue;
                  }
                  $praemienid = $row['praemienid'];
                  $praemienhmid = $row['praemienhmid'];
                  $bestelldatum = $row['bestelldatum'];
                  preg_match('/Bestellung der Pr.mie:? (.*)$/', $buchungstext, $matches);
                  $praemientext = $matches[1];
                  if (preg_match('/^Spende/',$praemientext)) {
                      continue;
                  }
                  if (preg_match('/^.+? - (\\w+).*$/', $praemientext, $matches) ||
                          preg_match('/^(.*)$/', $praemientext, $matches))
                  {
                      $praemienartikeltext = str_replace('"','',stripslashes($matches[1]));

                      $subquery = "SELECT * FROM praemienartikel 
                          WHERE hmnr = $praemienhmid
                          AND praemienid = $praemienid";

                      $subresult = dbQuery($subquery) or
                          error ('Kann Artikel nicht suchen (' . $subquery . '): '  .
                                  dbError($dbhandle));
                      $subrow = '';
                      /* Suche nach Bestellbeschreibung */
                      if (dbNumRows($subresult) == 1) {
                          $subrow = dbFetchRow($subresult);
                      } else {
                      /* Suche nach Praemienid */
                          $subquery = "SELECT * FROM praemienartikel 
                              WHERE praemienid = $praemienid";
                          $subresult = dbQuery($subquery) or
                              error ('Kann Artikel nicht suchen (' . $subquery . '): '  .
                                      dbError($dbhandle));
                          if (dbNumRows($subresult) == 1) {
                              $subrow = dbFetchRow($subresult);
                          } else {
                              if (!$gutschein) {
                                  print "Kann Artikel nicht finden: '" .
                                      $praemienartikeltext . "' ($buchungstext)<br/>";
                                  //continue;
                              }
                          }
                      }
                      if ($subrow) {
                          $artikelnummer = $subrow['artikelnr'];
                          $hmnr = $subrow['hmnr'];
                          $anzeige = $subrow['anzeige'];
                          if ($anzeige == '') {
                              $anzeige = $row['name'];
                          }
                      } else {
                          $artikelnummer = $row['artikelnr'];
                          $hmnr = $row['hmnr'];
                          $anzeige = $row['anzeige'];
                          if ($anzeige == '') {
                              $anzeige = $row['name'];
                          }
                      }
                      if ($gutschein) {
                          $artikelnummer = 0;
                          if (!preg_match('/utschein/', $praemienartikeltext))
                          {
                              continue;
                          }
                          preg_match('/ ([0-9]+) Euro/',$praemienartikeltext ,$matches);
                          $artikelnummer = $matches[1];
                          // Cadooz-Format
                          $zeile = array(
                                  $kundennr,
                                  $artikelnummer,
                                  $user->anrede,
                                  $user->vorname,
                                  $user->name,
                                  $user->strasse,
                                  $user->plz,
                                  $user->ort,
                                  $bestelldatum,$pkey,'BestChoice'
                                  );

                      } else {
                          // IPO-Format
                          //TODO: timestamp ist hier die Referenz-ID, um die Versanddaten von IPO
                          //      spater den Teilnehmerdaten zuordnen zu koennen. Timestamp ist aber
                          //      untauglich. Hier muss eine eindeutige ID her
                          list($usec, $sec) = explode(" ", microtime());
                          $timestamp = (float)$usec + (float)$sec;

                          $lkz = $user->land;
                          foreach ($eucountries as $iso=>$land) {
                              if ($land == $user->land) {$lkz =$iso; break;}
                          }
                          $versnummerneu = $user->versnummerneu;
                          $zeile = array($pkey,
                                  $artikelnummer,$hmnr,
                                  $user->anrede,
                                  $user->vorname,
                                  $user->name,
                                  '',
                                  $user->strasse,
                                  '',
                                  '',
                                  $lkz,
                                  $user->plz,
                                  $user->ort,
                                  $kundennr,
                                  $bestelldatum,
                                  $pkey,
                                  $anzeige,
                                  $buchungstext,
                                  $versnummerneu);
                      }
                      array_push($data,$zeile);
                  } else {
                      print "Keine Zuordnung m&ouml;glich: $buchungstext<br/>\n";
                  }
              }
              $filename = $exportpath . '/bestelllisten/'.$filename;

            if ($gutschein) {
                //IPO: CSV Export
                $filename .=  '.csv';
                $csv = new Csvexport($filename, $fieldnames, $data);
                $csv->create();
            }
            else {
                $filename .= '.xls';
                $excel = new Excelexport($filename, substr($name, 0, 31),
                                                           $fieldnames, $data);
                $excel->create();
            }
          }

          $loggedin->log("Export Bestellliste - Typ: $type, Gutschein: $gutschein, Start: $startdate, Ende: $enddate",$loggedin->userId);
      }

      public function importbestelliste($file,$realname)
      {

          $pathinfo = pathinfo($realname);
          $fileext = $pathinfo['extension'];

          $type = 'cadooz';
          // Cadooz
          $fieldnames = array('Anrede','Vorname', 'Nachname', 'Strasse','PLZ',
                  'Ort','Land','Wert','Versanddatum','Bestellid');

          if ($fileext == 'xls') {
              $tableimporter = new Excelimport($filename, $fieldnames);
          } else {
              $tableimporter = new Csvimport($filename, $fieldnames);
          }
          $tableimporter->filename = $file;
          $tableimporter->fieldnames = $fieldnames;

          if (!$tableimporter->isValid()) {
              // IPO
              $tableimporter->fieldnames = array('BESTELLID','REFERENZ_ID','VERSANDDATUM');
              if (!$tableimporter->isValid()) {
                  return $tableimporter->errorcode;
              }
              $type = 'ipo';
          }

          $data = $tableimporter->datarows;

          foreach ($data as $row)
          {
              if ($type == 'cadooz') {
                  $versanddatum = $row['Versanddatum'];
                  $bestellid = $row['Bestellid'];
              } else {
                  $versanddatum = $row['VERSANDDATUM'];
                  $bestellid = $row['BESTELLID'];
              }

              if (preg_match("/^([0-9]+)\.([0-9]+)\.([0-9]+)$/",
                          $versanddatum, $matches) ||
                      preg_match("/^([0-9]+)\/([0-9]+)\/([0-9]+)$/",
                          $versanddatum,$matches)) {
                  $day = $matches[1];
                  $month = $matches[2];
                  $year = $matches[3];
                  if ($year < 2000) {
                      $year += 2000;
                  }
                  $versanddatum = "$year-$month-$day";
              } elseif (preg_match("/^([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})$/"
                          ,$versanddatum,$matches)) {
                  $day = $matches[3];
                  $month = $matches[2];
                  $year = $matches[1];
                  if ($year < 2000) {
                      $year += 2000;
                  }
                  $versanddatum = "$year-$month-$day";

              } else {
                  return false;
              }

              if($fileext == 'xls') {
                  /* Excel - Bug: Excel speichert ein Datum, indem es die Tage
                   * seit dem 1.1.1900 zaehlt, als Integer
                   * Leider ist seit Lotus1-2-3 ein Bug enthalten, der dazu
                   * fuehrt, dass der 29.02.1900 - den es nicht gab -
                   * mitgezaehlt wird. ExcelReader korrigiert diesen Bug nicht
                   * Darum muss ein Tag abgezogen werden
                   */
                  $timestamp = strtotime("$year-$month-$day");
                  $timestamp-=8640; /* minus ein tag */

                  $versanddatum = date('Y-m-d',$timestamp);
              }

              $kontobewegung = $this->fetchbyid($bestellid);
              if ($kontobewegung != null)
              {
                  $kontobewegung->versanddatum = $versanddatum;
                  $kontobewegung->update();
              } else {
              }
          }
      }
  }
