<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT);

//error_reporting(0);
include_once(dirname(__FILE__)."/../conf/main.conf.php");
include_once(dirname(__FILE__)."/../phpwf/plugins/class.mysql.php");
include_once(dirname(__FILE__)."/../phpwf/plugins/class.secure.php");
include_once(dirname(__FILE__)."/../phpwf/plugins/class.user.php");
include_once(dirname(__FILE__)."/../www/lib/imap.inc.php");
include_once(dirname(__FILE__)."/../www/lib/class.erpapi.php");

if(is_file(dirname(__FILE__)."/../www/lib/class.erpapi_custom.php"))
  include_once(dirname(__FILE__)."/../www/lib/class.erpapi_custom.php");

include_once(dirname(__FILE__)."/../www/lib/class.httpclient.php");
$aes = '';
$phpversion = (String)phpversion();
if($phpversion[0] == '7' && (int)$phpversion[2] > 0)$aes = '2';
if($aes == 2 && is_file(dirname(__FILE__)."/../www/lib/class.aes".$aes.".php"))
{
  include_once(dirname(__FILE__)."/../www/lib/class.aes".$aes.".php");
}else
  include_once(dirname(__FILE__)."/../www/lib/class.aes.php");
include_once(dirname(__FILE__)."/../www/lib/class.remote.php");
//include_once(dirname(__FILE__)."/coface_log.php");
//include_once(dirname(__FILE__)."/coface_io.php");

if(is_file("objectapi/mysql/_gen/object.gen.artikel.php"))
  include_once("objectapi/mysql/_gen/object.gen.artikel.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.artikel.php");
if(is_file("objectapi/mysql/_gen/object.gen.adresse.php"))
  include_once("objectapi/mysql/_gen/object.gen.adresse.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.adresse.php");
if(is_file("objectapi/mysql/_gen/object.gen.auftrag_position.php"))
  include_once("objectapi/mysql/_gen/object.gen.auftrag_position.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.auftrag_position.php");
if(is_file("objectapi/mysql/_gen/object.gen.auftrag.php"))
  include_once("objectapi/mysql/_gen/object.gen.auftrag.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.auftrag.php");
if(is_file("objectapi/mysql/_gen/object.gen.lager_platz_inhalt.php"))
  include_once("objectapi/mysql/_gen/object.gen.lager_platz_inhalt.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.lager_platz_inhalt.php");
if(is_file("objectapi/mysql/_gen/object.gen.verkaufspreise.php"))
  include_once("objectapi/mysql/_gen/object.gen.verkaufspreise.php");
	else
  include_once(dirname(__FILE__)."/../www/objectapi/mysql/_gen/object.gen.verkaufspreise.php");

class coface_Daten
{
  public $Struktur;
  public $Daten;
  
  public function istGleich(&$Datensatz)
  {
    foreach($this->Daten as $k => $v)
    {
      if($v)
      {
        if(false !== ($val = $Datensatz->GetDataByName($k)))
        {
          if($val != $v)
          {
            //echo $val." <> ".$v;
            return false;
          }
        } else {
          echo " no val:  ".$v."\r\n";
          return false;
        }
      }
    }
    foreach($Datensatz->Daten as $k => $v)
    {
      if($v)
      {
        if(false !== ($val = $this->GetDataByName($k)))
        {
          if($val != $v)
          {
            //echo $val." <> ".$v;
            return false;
          }
        } else 
        {
          echo " no val:  ".$v."\r\n";
          return false;
        }
      }
    }
    return true;
  }
  
  public function getByName($name)
  {
    if(!$this->Struktur) return false;
    foreach($this->Struktur as $k => $v)
    {
      if($v[1] == strtoupper($name))return $v;
    }
    return false;
  }
  
  public function getByNr($nr)
  {
    if(isset($this->Struktur[$nr]))return $this->Struktur[$nr];
    return false;
  }
  
  protected function KeineSonderzeichen($text)
  {
    $text = str_replace ("ä", "ae", $text);
    $text = str_replace ("Ä", "Ae", $text);
    $text = str_replace ("ö", "oe", $text);
    $text = str_replace ("Ö", "Oe", $text);
    $text = str_replace ("ü", "ue", $text);
    $text = str_replace ("Ü", "Ue", $text);
    $text = str_replace ("ß", "ss", $text);
    $text = str_replace ("&", "u", $text);
    $text = preg_replace('#[^-_.A-Za-z0-9]', '', $text);
    return $text;
  }
  
  public function GetDataByName($name)
  {
    if(isset($this->Daten[$name]))return $this->Daten[$name];
    return false;
  }
  
  public function FillFromArray(&$arr)
  {
    foreach($this->Struktur as $k => $v)
    {
      if(isset($arr[$v[1]]) && !is_null($arr[$v[1]]))
      {
        if(!$this->FillData($v[1], $arr[$v[1]]))
        {
          return false;
        }
      }
    }
    if($this->getByName('FLNUM')!==false && isset($arr['FLNUM']) && isset($this->FLNUM))$this->FLNUM = (int)$arr['FLNUM'];
    return true;
  }
  
  public function FillData($name, $wert)
  {
    $wert = str_replace('NONBLOCKINGZERO','', $wert);
    if(($name == 'DBCOTRY' || $name == 'DBLANG') && !$wert)$wert = 'DE';
    $wert = html_entity_decode($wert);
    
    $name = trim(strtoupper($name));
    $found = false;
    foreach($this->Struktur as $k => $v)
    {
      if($v[1] == $name)$found = $k;
    }
    if(!$found)return false;
    if(substr($this->Struktur[$found][3],0,1) == 'A')
    {
      if(strpos($this->Struktur[$found][3],'Sonerzeichen') !== false)$wert = $this->KeineSonderzeichen($wert);
      $this->Daten[$name] = mb_substr($wert, 0, $this->Struktur[$found][2],'UTF-8');
      return true;
    } elseif(substr($this->Struktur[$found][3],0,1) == 'N'){
      $wert = str_replace(',','.', $wert);
      if(!is_numeric($wert))return false;
      if($this->Struktur[$found][3] == 'N')
      {
        $wert = (int)$wert;
        if($wert < 0)return false;
        if($wert >= pow(10,$this->Struktur[$found][2]))return false;
        $this->Daten[$name] = $wert;
        return true;
      }
      $vz = false;
      if($vzpos = strpos($this->Struktur[$found][3],'VZ+'))
      {
        $vz = true;
        $Str = substr($this->Struktur[$found][3], $vzpos + 3);
      } else {
        $Str = $this->Struktur[$found][3];
        if($KPos = strpos($Str, '('))$Str = substr($Str, $KPos + 1);
      }
      if($Kpos = strrpos($Str, ')'))$Str = substr($Str, 0, $Kpos);
      $Komma = false;
      if(strpos($Str, ','))$Komma = true;
      $Nachkomma = 0;
      if($Komma)
      {
        $Stellen = preg_split("/,/", $Str);
        if(isset($Stellen[1]))$Nachkomma = $Stellen[1];
        $vorkomma = $Stellen[0];
      } else {
        $vorkomma = (int)$Str;
      }
      if(!$vz){
        if($wert < 0)
        {
          return false;
        }
      }
      $wert = round($wert, $Nachkomma);
      if(round(abs($wert)) >= pow(10, $vorkomma))
      {
        return false;
      }
      $this->Daten[$name] = $wert;
      return true;
      
    } elseif(substr($this->Struktur[$found][3],0,10) == 'TT.MM.JJJJ'){
      if($wert == '0000-00-00')
      {
        $this->Daten[$name] = null;
      }else{
        if(strpos($wert,'.'))
        {
          $werta = preg_split("/\./", $wert);
          if(count($werta) == 3)
          {
            
            $this->Daten[$name] = $werta[2].''.$werta[1].''.$werta[0];
            return true;
          }
        }
        if(false ===($ts = strtotime($wert)))
        {
          if(strpos($wert,'-'))
          {
            $werta = preg_split("/\-/", $wert);
            if(count($werta) == 3)
            {
              
              $this->Daten[$name] = str_replace('-','',$wert);
              return true;
            } else return false;
          }
          return false;
        }
        $this->Daten[$name] = date("Ymd", $ts);
      }
      
      return true;
    }
    
    if(isset($this->Struktur[$name]))
    {
      if($this->Struktur)
      $this->Daten[$name] = $wert;
      return true;
    }
    return false;
  }
  
  function genFeldnamenzeile()
  {
    $erg = '';
    foreach($this->Struktur as $k => $v)
    {
      if($erg != '')$erg .= ';'; 
      $erg .= '"'.$v[1].'"';
    }
    return $erg;
  }
  
  function genDatenZeile()
  {
    $erg = '';
    foreach($this->Struktur as $k => $v)
    {
      if($erg != '')$erg .= ';'; 
      $erg .= '"';
      if(isset($this->Daten[$v[1]]))
      {
        if(substr($v[3],0,1) == 'N')
        {
          if($v[3] == 'N')
          {
            $wert = str_replace('.',',',$this->Daten[$v[1]]);
            //$erg .= (strlen($wert)< $v[2]?str_repeat('0',$v[2]-strlen($wert)):'').$wert;
            $erg .= $wert;
          } else {
            $erg .= str_replace('.',',',$this->Daten[$v[1]]);  
          }
        } else {
          $erg .= $this->Daten[$v[1]];
        }
      }
      $erg .= '"';
    }
    return $erg;    
  }
  
  function pruefe()
  {
    foreach($this->Struktur as $k => $v)
    {
      if($v[4] == 'M')
      {
        if(!isset($this->Daten[$v[1]]))return false;
        if($this->Daten[$v[1]] == '')return false;
      }
    }
    return true;
  }
  
}


class coface_OP_Kopf extends coface_Daten
{
  function __construct() {
    $this->Struktur[1] = array(1 => 'FLNUM', 2 => 6, 3 => 'N', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[2] = array(1 => 'FLDATE', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[3] = array(1 => 'CLNAME1', 2 => 35, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[4] = array(1 => 'CLNAME2', 2 => 35, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[5] = array(1 => 'CLPLACE', 2 => 35, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[6] = array(1 => 'CLZIP', 2 => 10, 3 => 'A', 4 => 'M',               5 => '', 6 => '');
    $this->Struktur[7] = array(1 => 'CLSTREET', 2 => 35, 3 => 'A', 4 => 'M',            5 => '', 6 => '');
    $this->Struktur[8] = array(1 => 'CLNR', 2 => 10, 3 => 'A', 4 => 'M',                5 => '', 6 => '');
    $this->Struktur[9] = array(1 => 'FLBELANZ', 2 => 8, 3 => 'N', 4 => 'M',             5 => '', 6 => '');
    $this->Struktur[10] = array(1 => 'FLBELSUM', 2 => 20, 3 => 'N (VZ+16,2)', 4 => 'M', 5 => '', 6 => '');
  }
}

class coface_OP_Daten extends coface_Daten
{
  var $FLNUM;
  
  function __construct($FLNUM = 0) {
    $this->FLNUM = $FLNUM;
    $this->Struktur[1] = array(1 => 'OPCLNR', 2 => 10, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[2] = array(1 => 'OPDBNR', 2 => 15, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[3] = array(1 => 'OPITMTYP', 2 => 5, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[4] = array(1 => 'OPITMNR', 2 => 20, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[5] = array(1 => 'OPITMNRREF', 2 => 20, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[6] = array(1 => 'OPITMDTL', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[7] = array(1 => 'OPITMDAT', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[8] = array(1 => 'OPITMDTD', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[9] = array(1 => 'OPAMT', 2 => 22, 3 => 'N (VZ+18,2)', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[10] = array(1 => 'OPCUR', 2 => 3, 3 => 'A', 4 => '', 5 => 'M', 6 => '');
    $this->Struktur[11] = array(1 => 'OPAMTMN', 2 => 22, 3 => 'N (VZ+18,2)', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[12] = array(1 => 'OPCURMN', 2 => 3, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[13] = array(1 => 'OPITMDLV', 2 => 1, 3 => 'N', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[14] = array(1 => 'OPITMTAX', 2 => 3, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[15] = array(1 => 'OPITMDY1', 2 => 3, 3 => 'N', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[16] = array(1 => 'OPITMRD1', 2 => 6, 3 => 'N (3,2)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[17] = array(1 => 'OPITMDY2', 2 => 3, 3 => 'N', 4 => '', 5 => 'K', 6 => '');
    $this->Struktur[18] = array(1 => 'OPITMRD2', 2 => 6, 3 => 'N (3,2)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[19] = array(1 => 'OPITMDY3', 2 => 3, 3 => 'N', 4 => '', 5 => 'K', 6 => '');
    $this->Struktur[20] = array(1 => 'OPITMTXT', 2 => 254, 3 => 'A', 4 => '', 5 => 'K', 6 => '');
    
  }
  
}

class coface_DB_Kopf extends coface_Daten 
{
  function __construct() {
    $this->Struktur[1] = array(1 => 'FLNUM', 2 => 6, 3 => 'N', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[2] = array(1 => 'FLDATE', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[3] = array(1 => 'CLNAME1', 2 => 35, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[4] = array(1 => 'CLNAME2', 2 => 35, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[5] = array(1 => 'CPLACE', 2 => 35, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[6] = array(1 => 'CLZIP', 2 => 10, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[7] = array(1 => 'CLSTREET', 2 => 35, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[8] = array(1 => 'CLNR', 2 => 10, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[9] = array(1 => 'FLITNR', 2 => 8, 3 => 'N', 4 => 'M', 5 => '', 6 => '');

  }
}

class coface_DB_Daten extends coface_Daten 
{
  var $FLNUM;
  function __construct($FLNUM = 0) {
    $this->FLNUM = $FLNUM;
    $this->Struktur[1] = array(1 => 'DBCLNR', 2 => 10, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[2] = array(1 => 'DBNR', 2 => 15, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[3] = array(1 => 'DBNRZE', 2 => 15, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[4] = array(1 => 'DBNAME1', 2 => 40, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[5] = array(1 => 'DBNAME2', 2 => 40, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[6] = array(1 => 'DBKEY', 2 => 10, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[7] = array(1 => 'DBSTREET', 2 => 46, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[8] = array(1 => 'DBSTREETNR', 2 => 6, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[9] = array(1 => 'DBZIP', 2 => 12, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[10] = array(1 => 'DBPLACE', 2 => 30, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[11] = array(1 => 'DBCOTRY', 2 => 2, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[12] = array(1 => 'DBPOBOX', 2 => 12, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[13] = array(1 => 'DBPOZIP', 2 => 12, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[14] = array(1 => 'DBPOCO', 2 => 12, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[15] = array(1 => 'DBLANG', 2 => 2, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[16] = array(1 => 'DBCONTAC', 2 => 40, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[17] = array(1 => 'DBTEL', 2 => 24, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[18] = array(1 => 'DBTELEXT', 2 => 6, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[19] = array(1 => 'DBFAX', 2 => 24, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[20] = array(1 => 'DBFAXEXT', 2 => 6, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[21] = array(1 => 'DBEMAIL', 2 => 70, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[22] = array(1 => 'DBVATID', 2 => 14, 3 => 'A (keine Sonderzeichen)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[23] = array(1 => 'DBPAYCON', 2 => 10, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[24] = array(1 => 'DBITTRM', 2 => 3, 3 => 'N', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[25] = array(1 => 'DBLITYP', 2 => 1, 3 => 'A', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[26] = array(1 => 'DBLIMIT', 2 => 26, 3 => 'N (23,2)', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[27] = array(1 => 'DBCURLMT', 2 => 3, 3 => 'A', 4 => '', 5 => 'M', 6 => '');
    $this->Struktur[28] = array(1 => 'DBDALIEFF', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[29] = array(1 => 'DBDALITO', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'M', 5 => '', 6 => '');
    $this->Struktur[30] = array(1 => 'DBLIMITS', 2 => 26, 3 => 'N (23,2)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[31] = array(1 => 'DBCURRS', 2 => 3, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[32] = array(1 => 'DBDALISEFF', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[33] = array(1 => 'DBDALISTO', 2 => 10, 3 => 'TT.MM.JJJJ', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[34] = array(1 => 'DBNRCO', 2 => 9, 3 => 'A (keine Sonderzeichen)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[35] = array(1 => 'DBCINR', 2 => 12, 3 => 'A (keine Sonderzeichen)', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[36] = array(1 => 'DBFLGEX', 2 => 1, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
    $this->Struktur[37] = array(1 => 'DBREMARKS', 2 => 254, 3 => 'A', 4 => 'K', 5 => '', 6 => '');
  }
}


class coface_gen_DB
{
  var $app;
  function __construct(&$app)
  {
    $this->app = $app;
  }
  
  function Insert( $datensatz)
  {
    $classname = get_class($datensatz);
    if(!$classname)return false;
    if(!class_exists($classname)){
      //echo "Klasse existiert nicht";
      return false;
    }
    
    if(!isset($datensatz->Struktur))
    {
      //echo "Struktur existiert nicht";
      return false;
    }
    $sql = "insert into ".$classname." (";
    $first = true;
    foreach($datensatz->Struktur as $k => $v)
    {
      if(!$first)$sql .= ",";
      $first = false;
      $sql .= $v[1];
    }
    if(isset($datensatz->FLNUM))
    {
      $sql .= ', FLNUM';
    }
    $sql .= ") values (";
    $first = true;
    foreach($datensatz->Struktur as $k => $v)
    {
      if(!$first)$sql .= ", ";
      $first = false;
      if(isset($datensatz->Daten[$v[1]]))
      {
        if(substr($datensatz->Struktur[$k][3],0,1) == 'A')
        {
          $sql .= "'".$datensatz->Daten[$v[1]]."' ";
        } elseif(substr($datensatz->Struktur[$k][3],0,1) == 'N'){
          if($datensatz->Struktur[$k][3] == 'N')
          {
            $sql .= (int)$datensatz->Daten[$v[1]];
          } else {
            $vz = false;
            if($vzpos = strpos($datensatz->Struktur[$k][3],'VZ+'))
            {
              $vz = true;
              $Str = substr($datensatz->Struktur[$k][3], $vzpos + 3);
            } else {
              $Str = $datensatz->Struktur[$k][3];
              
              if($KPos = strpos($Str, '('))$Str = substr($Str, $KPos + 1);
              
            }
            if($Kpos = strrpos($Str, ')'))$Str = substr($Str, 0, $Kpos);
            $Komma = false;
            if(strpos($Str, ','))$Komma = true;
            $Nachkomma = 0;
            if($Komma)
            {
              $Stellen = preg_split("/,/", $Str);
              if(isset($Stellen[1]))$Nachkomma = $Stellen[1];
              $vorkomma = $Stellen[0];
            } else {
              $vorkomma = (int)$Str;
            }
            if($Nachkomma)
            {
              $sql .= (float)$datensatz->Daten[$v[1]];
            } else {
              $sql .= (int)$datensatz->Daten[$v[1]];
            }
          }
        } elseif(substr($datensatz->Struktur[$k][3],0,10) == 'TT.MM.JJJJ'){
          if(strpos($datensatz->Daten[$v[1]],'.'))
          {
            $arr = preg_split("/\./", $datensatz->Daten[$v[1]]);
            $sql .= "'".$arr[2].'-'.$arr[1].'-'.$arr[0]."' ";
          } else {
            $sql .= "'".$datensatz->Daten[$v[1]]."' ";      
          }
        }
      }else {
        $sql .= " NULL ";
      }
    }
    if(isset($datensatz->FLNUM))
    {
      $sql .= ', '.($datensatz->FLNUM?(int)$datensatz->FLNUM:'NULL');
    }
    $sql .= ")";
    return $sql;
  }
  
  function genCreate($classname)
  {
    if(!class_exists($classname)){
      echo "Klasse existiert nicht";
      return false;
    }
    $tmp = new $classname();
    if(!isset($tmp->Struktur))
    {
      echo "Struktur existiert nicht";
      return false;
    }
    $sql = "create table ".$classname." (
    id int(11) NOT NULL AUTO_INCREMENT,
    " ;
    
    foreach($tmp->Struktur as $k => $v)
    {
      $sql .= $v[1]. " ";
      if(substr($tmp->Struktur[$k][3],0,1) == 'A')
      {
        $sql .= " varchar(".$tmp->Struktur[$k][2].") ";
      } elseif(substr($tmp->Struktur[$k][3],0,1) == 'N'){
        if($tmp->Struktur[$k][3] == 'N')
        {
          $sql .= " int(15) ";
        } else {
          $vz = false;
          if($vzpos = strpos($tmp->Struktur[$k][3],'VZ+'))
          {
            $vz = true;
            $Str = substr($tmp->Struktur[$k][3], $vzpos + 3);
          } else {
            $Str = $tmp->Struktur[$k][3];
            
            if($KPos = strpos($Str, '('))$Str = substr($Str, $KPos + 1);
            
          }
          if($Kpos = strrpos($Str, ')'))$Str = substr($Str, 0, $Kpos);
          $Komma = false;
          if(strpos($Str, ','))$Komma = true;
          $Nachkomma = 0;
          if($Komma)
          {
            
            $Stellen = preg_split("/,/", $Str);
            if(isset($Stellen[1]))$Nachkomma = $Stellen[1];
            $vorkomma = $Stellen[0];
          } else {
            $vorkomma = (int)$Str;
          }
          if($Nachkomma)
          {
            $sql .= " decimal(".((int)$Nachkomma+(int)$vorkomma).",".((int)$Nachkomma).") ";
            
          } else {
            $sql .= " int(15) ";
          }

        }
        
      } elseif(substr($tmp->Struktur[$k][3],0,10) == 'TT.MM.JJJJ'){
        $sql .= " date ";      
      }
      $sql .= "DEFAULT NULL,\r\n";
    }
    if(strpos($classname,'Daten') !== false)$sql .= "FLNUM int(11) DEFAULT NULL, ";
    $sql .= "PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
    return $sql;
  }
}



class cofaceConfig
{
  public static $Kundennummer = '2099/001';
  public static $ExcelRoh = 'Entwickler.xlt';
  public static $kvoid = 1;
  public static $FTPServer = '';
  public static $FTPPort = null;
  public static $FTPUser = null;
  public static $FTPPW = null;
  public static $Folder = 'coface/';
  public function init()
  {
    if(strpos(self::$ExcelRoh,dirname(__FILE__))===false)self::$ExcelRoh = dirname(__FILE__).'/'.self::$ExcelRoh;
    if(strpos(self::$Folder,dirname(__FILE__))===false)self::$Folder = dirname(__FILE__).'/'.self::$Folder;
  }
}

cofaceConfig::init();

class app_t {
  var $DB;
  var $User;
  var $erp;
}

if(!isset($app)){
	$app = new app_t();
	$conf = new Config();
  $app->Conf = &$conf;
  $app->User = new User($app);
	$app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass,null,$conf->WFdbport);
	$erp = new erpAPI($app);
	$app->erp = $erp;
	$remote = new Remote($app);
}


//$tmpgenDB = new coface_gen_DB($app);
/*echo $tmpgenDB->genCreate("coface_OP_Kopf");
echo $tmpgenDB->genCreate("coface_OP_Daten");
echo $tmpgenDB->genCreate("coface_DB_Kopf");
echo $tmpgenDB->genCreate("coface_DB_Daten");
echo "\r\n";*/
//$tmp = new coface_DB_Daten();
//$tmp->FillData("DBCLNR","ABCDEFGH");
//$tmp->FillData("DBLIMIT", 5.2);
//echo $tmpgenDB->Insert($tmp);
//echo "\r\n";
//$job->maxlinesperfile = 3000;
/*if(isset($argv[1]) && strpos($argv[1],'file=') !== false)
{
  $log = new coface_log($app);
  $job = new cofaceIOJob($app, $log);
  print_r($job->getFileInfo(str_replace('file=','',$argv[1])));
}elseif(isset($_GET['file']) ){
  $log = new coface_log($app);
  $job = new cofaceIOJob($app, $log);
  print_r($job->getFileInfo($_GET['file']));
}else{
  
  if(isset($argv[1]) && strpos($argv[1],'runall') !== false || isset($_GET['runall']) || (isset($_GET['cmd']) && $_GET['cmd'] == 'runall'))
  {
    $log = new coface_log($app);
    $job = new cofaceIOJob($app, $log);
    $job->runAll();
  }
}
*/


function cmp($a, $b)
{
  return strcasecmp($a, $b);
}

if(isset($argv[1]) && $argv[1] == 'all')
{
$tmp = new WaWisioncoface($app);
echo $tmp->getAll();
echo $tmp->Hochladen();
print_r($tmp->error);
}

if(isset($argv[1]) && $argv[1] == 'export')
{
  $sammlung = new coface_Sammlung($app);
  //$tmp = new WaWisioncoface($app);
  echo $sammlung->lastDateinummer();
  $sammlung->Export();
  $sammlung->Hochladen();
}
if(isset($argv[1]) && is_file($argv[1]))
{
  $tmp = new WaWisioncoface($app);
  $tmp->ImportEdison($argv[1]);
  $tmp->Hochladen();
}


class WaWisioncoface
{
  var $app;
  var $sammlung;
  var $error;
  function __construct(&$app)
  {
    $this->app = $app;
  }
  
  public function Hochladen()
  {
    if($this->sammlung->Hochladen())return true;
    if($this->sammlung->error)$this->error[] = $this->sammlung->error;
    return false;
  }
  
  function ImportEdison($datei)
  {
    $this->sammlung = new coface_Sammlung($this->app);
    $DBs = false;
    $OPs = false;
    if(strrpos($datei,'/') === false)
    {
      $datei = dirname(__FILE__).'/'.$datei;
    }
    if(!file_exists($datei))return false;
    if($fh = fopen($datei,'r'))
    {
      if($header = fgetcsv($fh,0,";") !== FALSE)
      {
        $i = 0;
        while (($data = fgetcsv($fh, 0, ";",'"')) !== FALSE) {
          $i++;
          //if($i % 1000 = 0)echo ".";
          if(isset($data[10])){
            $betrag = round((float)str_replace(",",".",trim($data[10])),2);
            
            $belegdatum = $data[2];
            $belegnummer = $data[3];
            $kundennummer = $data[1];
            
            if(!isset($DBs[$kundennummer]))$DBs[$kundennummer] = true;
            
            $belegnummer = str_replace("NR",'',$belegnummer);
            $belegnummer = str_replace(".",'',$belegnummer);
            $tmp['belegnummer'] = trim($belegnummer);
            $tmp['betrag'] = $betrag;
            $tmp['buchungstext'] = trim($data[11]);
            $status = $data[15];
            $mahnbar = trim($data[16]) == 'nicht mahnbar'?0:1;
            $mahnstufe = $data[8];
            $tmp['status'] = $status;
            $tmp['mahnbar'] = $mahnbar;
            $tmp['mahnstufe'] = $mahnstufe;
            if(!isset($OPs[$kundennummer]))$OPs[$kundennummer] = false;
            $OPs[$kundennummer][] = $tmp;
            unset($tmp);
            
            

            /*
            if($betrag > 0)
            {
              $belegnummer1 = trim($data[3]);
              if($belegnummer1)
              {
                $rechnungid = $this->app->DB->Select("select id from rechnung where belegnr like '".addslashes($belegnummer1)."' limit 1");
                if($rechnungid)
                {
                  echo "offene Rechnung: ".$rechnungid."   ".$belegnummer1."  ".$betrag."\r\n";
                  $this->app->DB->Update("update rechnung set zahlungssstatus = 'offen' where id = ".$rechnungid);
                } else {
                  echo "offene Rechnung nicht gefunden: ".$belegnummer1."   ".$betrag."\r\n";
                  
                }
                
              }
            }*/
            
          }
        }
        fclose($fh);
        $anzdb = 0;
        $anzgr0 = 0;
        $anzadr = 0;
        $anzops = 0;
        if(isset($DBs) && is_array($DBs))
        {
          foreach($DBs as $k => $v)
          {
            $anzdb++;
            if(isset($OPs[$k]) && is_array($OPs[$k]))
            {
              
              $adresse = $this->app->DB->select("SELECT id from adresse where kundennummer like '".$k."' limit 1");
              if($adresse)
              {
                $anzadr++;
                $gesamtoffen = 0;
                $rechnungsnr = '';
                echo "\r\n".$k." count: ". count($OPs[$k])." - ";
                foreach($OPs[$k] as $k2 => $v2)
                {
                  $anzops++;
                  //echo $v2['betrag']." ";
                  echo $v2['belegnummer']." ";
                  if($v2['belegnummer'] && (int)$v2['belegnummer']."" == $v2['belegnummer'] && substr($v2['belegnummer'],0,1) == '4')$rechnungsnr = $v2['belegnummer'];
                  $gesamtoffen += $v2['betrag'];
                }
                echo " Betrag: ".$gesamtoffen." Rnr: ".$rechnungsnr;
                if($gesamtoffen > 0 && $rechnungsnr)
                {
                  echo $gesamtoffen;
                  $rechnung = $this->app->DB->SelectArr("SELECT * from rechnung where belegnr = '".$rechnungsnr."' limit 1");
                  if($rechnung)
                  {
                    $rechnung = reset($rechnung);
                    $DB = new coface_DB();
                    if(!$rechnung['kundennummer'])$rechnung['kundennummer'] = $k;
                    $DB->SetAdr($rechnung);
                    $this->sammlung->addDB($DB);
                    $Rechnungen = false;
                    $kombEinzahlungen = false;
                    
                    foreach($OPs[$k] as $k2 => $v2)
                    {
                      $isrechnung = false;
                      $isgutschrift = false;
                      if($v2['belegnummer'] && is_numeric($v2['belegnummer']) && substr($v2['belegnummer'],0,1) == '4')
                      {
                        $tmprechnung = $this->app->DB->SelectArr("SELECT * from rechnung where belegnr = '".$v2['belegnummer']."' limit 1");
                        if($tmprechnung)
                        {
                          $isrechnung = true;
                          if(!isset($Rechnungen[$v2['belegnummer']]))$Rechnungen[$v2['belegnummer']] = false;
                          $Rechnungen[$v2['belegnummer']][] = $v2;
                        }
                        //Rechnung
                        
                      }elseif($v2['belegnummer'] && is_numeric($v2['belegnummer']) && substr($v2['belegnummer'],0,1) == '9')
                      {
                        //Gutschrift
                        $tmpgutschrift = $this->app->DB->SelectArr("SELECT adresse, rechnungid from gutschrift where belegnr = '".$v2['belegnummer']."' limit 1");
                        if($tmpgutschrift)
                        {
                          $tmpgutschrift = reset($tmpgutschrift);
                          if($tmpgutschrift['rechnungid'])
                          {
                            $rechnungsnrg = $this->app->DB->Select("SELECT belegnr where id = ".$tmpgutschrift['rechnungid']." limit 1");
                            if($rechnungsnrg)
                            {
                              $Rechnungen[$rechnungsnrg][] = $v2;
                              $isgutschrift = true;
                            } else {
                              if(!isset($Rechnungen['unbekannteGS']))$Rechnungen['unbekannteGS'] = false;
                              $Rechnungen['unbekannteGS'][] = $v2;
                              $isgutschrift = true;
                              
                            }
                            
                          } else {
                            if(!isset($Rechnungen['unbekannteGS']))$Rechnungen['unbekannteGS'] = false;
                            $Rechnungen['unbekannteGS'][] = $v2;
                            $isgutschrift = true;
                          }
                        }
                      }
                      if(!isgutschrift && !isrechnung)
                      {
                        $split = preg_split('/,/',$v2['buchungstext']);
                        if(is_array($split))
                        {
                          foreach($split as $k3 => $v3)
                          {
                            $split2 = preg_split('/:/',$v3);
                            {
                              if(is_array($split2))
                              {
                                if(isset($split2[1]))
                                {
                                  if(is_numeric(trim($split2[1])) && substr(trim($split2[1]),0,1) == '4')
                                  {
                                    $rechnungsnrg = $this->app->DB->Select("SELECT * from rechnung where belegnr = ".trim($split2[1])." limit 1");
                                    if($rechnugsnrg)
                                    {
                                      if(!isset($kombEinzahlungen[$k2]))$kombEinzahlungen[$k2] = false;
                                      $kombEinzahlungen[$k2][] = $rechnungsnrg;
                                    }else{
                                      
                                    }
                                    
                                  }
                                  
                                } else {
                                  if(is_numeric(trim($split2[0])) && substr(trim($split2[0]),0,1) == '4')
                                  {
                                    $rechnungsnrg = $this->app->DB->Select("SELECT * from rechnung where belegnr = ".trim($split2[0])." limit 1");
                                    if($rechnugsnrg)
                                    {
                                      if(!isset($kombEinzahlungen[$k2]))$kombEinzahlungen[$k2] = false;
                                      $kombEinzahlungen[$k2][] = $rechnungsnrg;
                                    }else{
                                      
                                    }
                                  }
                                }
                                
                                
                              }
                              
                              
                            }
                            
                          }
                          if(!isset($kombEinzahlungen[$k2]))
                          {
                            if(!isset($Rechnungen['unbekannt']))$Rechnungen['unbekannt'] = false;
                            $Rechnungen['unbekannt'][] = $v2;
                          }
                          
                        }
                        
                      }
                      
                      
                    }
                    if(isset($Rechnungen) && $Rechnungen && !isset($Rechnungen['unbekannt']) && !isset($Rechnungen['unbekannteGS']))
                    {
                      echo ".";
                      foreach($Rechnungen as $k4 => $v4)
                      {
                        if($k4 != 'unbekannt' && $k4 != 'unbekannteGS'){
                          if(is_array($v4))
                          {
                            $gesbetrag = 0;
                            foreach($v4 as $k5 => $v5)
                            {
                              $gesbetrag += $v5['betrag'];
                            }
                            if($gesbetrag > 0)
                            {
                              /*
                              if(isset($kombEinzahlungen))
                              {
                                foreach($kombEinzahlungen as $k6 => $v6)
                                {
                                  foreach($v6 as $k7 => $v7)
                                  {
                                    if($v7['belegnr'] == $k4)
                                    {
                                      if($OPs[$k][$k6]['betrag'] >= $gesbetrag)
                                      {
                                        
                                      }else{
                                        
                                      }
                                    }
                                    
                                  }
                                  
                                }
                                
                              }*/
                              foreach($v4 as $k5 => $v5)
                              {
                                if(substr($v5['belegnummer'],0,1) == '4')
                                {
                                  if($v5['betrag'] > 0)
                                  {
                                    
                                    
                                    $OP = new coface_OP();
                                    $OP->SetBelegnummer($v5['belegnummer']);
                                    $OP->SetBelegnummerRef($v5['belegnummer']);
                                    $OP->DebitorenRechnung();
                                    
                                    $OP->SetData($rechnung);
                                    $OP->SetBelegdatum($v5['belegdatum']);
                                    if($v5['mahnstufe'])$OP->SetMahnstufe($v5['mahnstufe']);
                                    $OP->SetBetrag($v5['betrag']);
                                    $OP->SetBelegdatum($rechnung['datum']);
                                    if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
                                    $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));
                                    $this->sammlung->addOP($OP);
                                  
                                  }else{
                                    $OP = new coface_OP();
                                    $OP->SetBelegnummer($v5['belegnummer']);
                                    $OP->SetBelegnummerRef($v5['belegnummer']);
                                    
                                    $OP->SetData($rechnung);
                                    if($v5['mahnstufe'])$OP->SetMahnstufe($v5['mahnstufe']);
                                    $OP->DebitorenZahlung();
                                    $OP->SetBelegdatum($rechnung['datum']);
                                    if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
                                    $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));

                                    $OP->SetBetrag($v5['betrag']);
                                    
                                  }
                                  
                                }elseif(substr($v5['belegnummer'],0,1) == '9')
                                {
                                  $OP = new coface_OP();
                                  $OP->DebitorenGutschrift();
                                  $OP->SetBelegnummer($v5['belegnummer']);
                                  $OP->SetBelegnummerRef($k4);
                                    
                                  $OP->SetData($rechnung);
                                  if($v5['mahnstufe'])$OP->SetMahnstufe($v5['mahnstufe']);
                                  $OP->SetBelegdatum($rechnung['datum']);
                                  if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
                                  $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));

                                  $OP->SetBetrag($v5['betrag']);
                                  $this->sammlung->addOP($OP);
                                }
                                
                                
                              }
                              
                              
                            }
                            
                          }
                        }
                        
                      }
                      
                    }
                    
                    
                    $anzgr0++;
                  } else {
                    
                    echo "SELECT * from rechnung where belegnr = '".$rechnungsnr."' limit 1\r\n ";
                  }
                }
              }
            }
            
            
            
          }
                $this->sammlung->SpeichernInDB();
      $this->sammlung->Export();
        }
        die ("Anzahl: ".$anzdb." ".$anzgr0." ".$anzadr." ".$anzops);
        
      }
      
      
      
      $OP = new coface_OP();
      $DB = new coface_DB();
      $OP->SetBelegnummer($rechnung['belegnr']);
      $OP->SetBelegnummerRef($rechnung['belegnr']);
      $DB->SetAdr($rechnung);
      $OP->SetData($rechnung);
      $OP->SetBelegdatum($rechnung['datum']);
/*
            $OP = new coface_OP();
            $DB = new coface_DB();
            $OP->SetBelegnummer($rechnung['belegnr']);
            $OP->SetBelegnummerRef($rechnung['belegnr']);
            $DB->SetAdr($rechnung);
            $OP->SetData($rechnung);
            $OP->SetBelegdatum($rechnung['datum']);
            if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
   
            $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));
            switch($rechnung['mahnwesen'])
            {
              case 'mahnung1':
                $OP->SetMahnstufe(1);
              break;
              case 'mahnung2':
                $OP->SetMahnstufe(2);
              break;          
              case 'mahnung3':
                $OP->SetMahnstufe(3);
              break;
            }
            if($rechnung['zahlungszielskonto'])
            {
              $OP->SetSkonto($rechnung['zahlungszieltageskonto'],$rechnung['zahlungszielskonto']);
            }
            if(isset($corechnungen) && isset($corechnungen[$rechnung['belegnr']]))
            {
              //Alte Rechnung nehmen und verrechnen
            }
            if($rechnung['status'] == 'storniert')
            {
              //$this->Create
              $OP->StornoRechnung();
            } else {
              if($rechnung['ist'] != $rechnung['soll'])
              {
                $OP->SetBetrag($rechnung['soll']-$rechnung['ist']);
              }
              if($rechnung['ist'] > 0)$OP->Restposten();
              
            }
            $this->sammlung->addDB($DB);
            $this->sammlung->addOP($OP);

*/
      return true;
    } else return false;
    
    
    
    
  }
  
  public function getAll()
  {
    $this->sammlung = new coface_Sammlung($this->app);
    //inner join auftrag.a on r.auftrag = a.belegnr 
    $rechnungen_akt = $this->app->DB->SelectArr("select r.*, g.id as gid, g.belegnr as gbelegnr,  g.ist as gist, g.soll as gsoll from rechnung r left join gutschrift g on r.id = g.rechnungid where (r.zahlungsstatus = 'offen' or (r.zahlungsstatus = 'bezahlt' and r.ist <> r.soll and r.ist <> r.soll - r.soll * r.zahlungszielskonto / 100)) and (r.status = 'versendet' or r.status = 'storniert') and r.belegnr <> ''  order by belegnr limit 1000");
    $lastOP = $this->app->DB->Select("select max(FLNUM) from coface_OP_Daten");
    if($lastOP)
    {
      $cofaceversendete_rechnungen = $this->app->DB->SelectArr("select r.*, c.* from rechnung r inner join coface_OP_Daten c on r.belegnr = c.OPITMNR where c.FLNUM = ".$lastOP." order by belegnr");
      if($cofaceversendete_rechnungen)
      {
        foreach($cofaceversendete_rechnungen as $k => $v)
        {
          $corechnungen[$v['belegnr']] = $v;
        }
        unset($cofaceversendete_rechnungen);
      }
      $cofaceversendete_gutschriften = $this->app->DB->SelectArr("select r.*, g.id as gid, g.belegnr as gbelegnr,  g.ist as gist, g.soll as gsoll from rechnung r inner join gutschrift g on r.id = g.rechnungid inner join coface_OP_Daten on g.belegnr = c.OPITMNR where c.FLNUM = ".$lastOP." order by belegnr");
      
      if($cofaceversendete_gutschriften)
      {
        foreach($cofaceversendete_gutschriften as $k => $v)
        {
          $cogutschriften[$v['gbelegnr']] = $v;
        }
        unset($cofaceversendete_gutschriften);
      }
      
      $OPSaldo_alt = $this->app->DB->Select("select sum(OPAMTMN) from coface_OP_Daten where FLNUM = ".$lastOP);
    } else {
      echo "Keine alten Daten\r\n";
      $OPSaldo_alt = 0;
    }
    
    //$zahlungen_akt = $this->app->DB->SelectArr("select ke.*, k.iban, k.swift from kontoauszuege_zahlungseingang ke inner join kontoauszuege ka on ke.kontoauszug = ka.id inner join konten k on ka.konto = k.id order by ke.datum");
    
    
    if($rechnungen_akt || isset($corechnungen))
    {
      echo "akt Rechnungen\r\n";
      if($rechnungen_akt)
      {
        $letztebelegnr = '';
        $altrechnung = false;
        foreach($rechnungen_akt as $k => $rechnung)
        {
          echo ".";
          if($letztebelegnr != $rechnung['belegnr'])
          {
            $letztebelegnr = $rechnung['belegnr'];
            $gleichenr = false;
          } else {
            $gleichenr = true;
          }
          if(!$gleichenr){
            $OP = new coface_OP();
            $DB = new coface_DB();
            $OP->SetBelegnummer($rechnung['belegnr']);
            $OP->SetBelegnummerRef($rechnung['belegnr']);
            $DB->SetAdr($rechnung);
            $OP->SetData($rechnung);
            $OP->SetBelegdatum($rechnung['datum']);
            if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
   
            $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));
            switch($rechnung['mahnwesen'])
            {
              case 'mahnung1':
                $OP->SetMahnstufe(1);
              break;
              case 'mahnung2':
                $OP->SetMahnstufe(2);
              break;          
              case 'mahnung3':
                $OP->SetMahnstufe(3);
              break;
            }
            if($rechnung['zahlungszielskonto'])
            {
              $OP->SetSkonto($rechnung['zahlungszieltageskonto'],$rechnung['zahlungszielskonto']);
            }
            if(isset($corechnungen) && isset($corechnungen[$rechnung['belegnr']]))
            {
              //Alte Rechnung nehmen und verrechnen
            }
            if($rechnung['status'] == 'storniert')
            {
              //$this->Create
              $OP->StornoRechnung();
            } else {
              if($rechnung['ist'] != $rechnung['soll'])
              {
                $OP->SetBetrag($rechnung['soll']-$rechnung['ist']);
              }
              if($rechnung['ist'] > 0)$OP->Restposten();
              
            }
            $this->sammlung->addDB($DB);
            $this->sammlung->addOP($OP);
          }
          if(!is_null($rechnung['gsoll']) && $rechnung['gbelegnr'])
          {
            $OP = new coface_OP();
            $DB = new coface_DB();
            $OP->SetBelegnummerRef($rechnung['belegnr']);
            $OP->SetBelegnummer($rechnung['gbelegnr']);
            $DB->SetAdr($rechnung);
            $OP->SetData($rechnung);
            $OP->SetBelegdatum($rechnung['datum']);
            if($rechnung['versendet_am'] && $rechnung['versendet_am'] != '0000-00-00')$OP->SetLieferdatum($rechnung['versendet_am']);
   
            $OP->SetFaelligkeitsdatum(date('Y-m-d',strtotime($rechnung['datum']) + 86400 * (int)$rechnung['zahlungszieltage']));
            switch($rechnung['mahnwesen'])
            {
              case 'mahnung1':
                $OP->SetMahnstufe(1);
              break;
              case 'mahnung2':
                $OP->SetMahnstufe(2);
              break;          
              case 'mahnung3':
                $OP->SetMahnstufe(3);
              break;
            }
            if($rechnung['zahlungszielskonto'])
            {
              $OP->SetSkonto($rechnung['zahlungszieltageskonto'],$rechnung['zahlungszielskonto']);
            }
            
            $OP->DebitorenGutschrift();
            $OP->SetBetrag($rechnung['gsoll']);
            
            $this->sammlung->addDB($DB);
            $this->sammlung->addOP($OP);
          }
          $altrechnung = $rechnung;
        }
      }
      $this->sammlung->SpeichernInDB();
      $this->sammlung->Export();
      return true;
    } else {
      echo "leer";
      return false;
    }
  }
  

}

/*
$foobar = new coface_export($app);
echo "\r\n";
echo $foobar->genEntwickler();
echo "\r\n";*/
class coface_export
{
  private $dateinummer;
  private $OPHeader;
  private $OPDaten;
  private $DBHeader;
  private $DBDaten;
  private $OPDatenalt;
  private $DBDatenalt;
  private $Dateinamen;
  private $app;
  private $Folder;
  private $Entwicklerdateiid;
  private $DateinameOP;
  private $DateinameDB;
  private $DateinameEntwickler;
  public $error;
  
  function __construct(&$app)
  {
    $this->app = $app;
    $this->OPHeader = new coface_OP_Kopf();
    $this->OPHeader->FillData('FLBELANZ',0);
    $this->OPHeader->FillData('FLBELSUM',0);
    
    $this->DBHeader = new coface_DB_Kopf();
    $this->DBHeader->FillData('FLITNR',0);
    $this->Folder = cofaceConfig::$Folder;
    if(is_null($this->Folder))$this->Folder = dirname(__FILE__).'/';
    if($firmendaten = $this->app->DB->SelectArr("select name, strasse, plz, ort from firmendaten limit 1"))$firmendaten = reset($firmendaten);
    if($firmendaten)
    {
      $this->OPHeader->FillData('CLNAME1',$firmendaten['name']);
      $this->OPHeader->FillData('CLZIP',$firmendaten['plz']);
      $this->OPHeader->FillData('CLPLACE',$firmendaten['ort']);
      $this->OPHeader->FillData('CLSTREET',$firmendaten['strasse']);
      $this->OPHeader->FillData('CLNR',cofaceConfig::$Kundennummer);
      
      $this->DBHeader->FillData('CLNAME1',$firmendaten['name']);
      $this->DBHeader->FillData('CLZIP',$firmendaten['plz']);
      $this->DBHeader->FillData('CLPLACE',$firmendaten['ort']);
      $this->DBHeader->FillData('CLSTREET',$firmendaten['strasse']);
      $this->DBHeader->FillData('CLNR',cofaceConfig::$Kundennummer);
    }
  }
  
  function getFromDB($dateinummer, $alt = false)
  {
    if(!$alt)
    {
      $this->dateinummer = (int)$dateinummer;
      $this->Entwicklerdateiid = $this->app->DB->Select("Select dateiid from coface_dateien where FLNUM = ".(int)$dateinummer);
    }
    $sql = "Select * from coface_OP_Daten where FLNUM = ".(int)$dateinummer." order by OPITMNR";
    if($query = $this->app->DB->Query($sql))
    {
      while($row = $this->app->DB->Fetch_Array($query))
      {
        $tmp = new coface_OP_Daten();
        if($tmp->FillFromArray($row))
        {
          $this->addOP($tmp, $alt);
        } else {
          $this->error[] = "OP Daten fehlerhaft";
        }
      }
    } else {
      $this->error[] = "Fehler beim Laden der OP Daten";
    }
    $sql = "Select * from coface_DB_Daten where FLNUM = ".(int)$dateinummer." order by DBNR";
    if($query = $this->app->DB->Query($sql))
    {
      while($row = $this->app->DB->Fetch_Array($query))
      {
        $tmp = new coface_DB_Daten();
        if($tmp->FillFromArray($row))
        {
          $this->addDB($tmp, $alt);
        }else{
          $this->error[] = "DB Daten fehlerhaft";
        }
      }
    } else {
      $this->error[] = "Fehler beim Laden der DB_Daten";
    }  
  }  
  
  function genDiff()
  {
    
    
  }
  
  function addOP(&$datensatz, $alt = false)
  {
    if(!$alt)
    {
      $this->OPDaten[] = $datensatz;
      $this->OPHeader->FillData('FLBELANZ',$this->OPHeader->GetDataByName('FLBELANZ')+1);
      $this->OPHeader->FillData('FLBELSUM',$this->OPHeader->GetDataByName('FLBELSUM')+$datensatz->GetDataByName('OPAMT'));
    } else {
      $this->OPDatenalt[] = $datensatz;
    }
  }
  
  function addDB(&$datensatz, $alt = false)
  {
    if(!$alt)
    {
      $this->DBDaten[] = $datensatz;
      $this->DBHeader->FillData('FLITNR',$this->DBHeader->GetDataByName('FLITNR')+1);
    } else {
      $this->DBDatenalt[] = $datensatz;
    }
  }
  
  function setEntwicklerDateiId($val)
  {
    $this->Entwicklerdateiid = (int)$val;
  }
  
  function genEntwickler()
  {
    //if(!$this->dateinummer)return false;
    $tmp = $this->app->erp->GetTMP().md5(mt_rand()).'.xls';
    $path = str_replace(basename($_SERVER['SCRIPT_FILENAME']), "", $_SERVER['SCRIPT_FILENAME']);
    $path = $path."../userdata/dms/";
    $path = $path.$this->app->Conf->WFdbname;
    while(file_exists($tmp))
    {
      $tmp = $this->app->erp->GetTMP().md5(mt_rand()).'.xls';  
    }
    
    $xls = new coface_excel();
    //TODO Füllen
    
    
    
    $xls->save($tmp);
    if(file_exists($tmp))
    {
      $fileid = $this->app->erp->CreateDatei($this->app->erp->Dateinamen('Entwickler_'.date('Ymd').'.xls'),"Entwickler ".date('d.m.Y'),"","",$tmp,$this->app->User->GetName(),false, $path);
      $this->Entwicklerdateiid = $fileid;
      $this->app->erp->AddDateiStichwort($fileid,"Entwickler","coface",$this->dateinummer);
      @unlink($tmp);
      return true;
    } else return false;
    return $tmp;
    
  }
  
  function genDateien()
  {
    if(!is_array($this->OPDaten) || count($this->OPDaten) < 1)
    {
      echo "OPDaten leer";
      $this->error[] = "OPDaten leer";
      return false;
    }
    if(!is_array($this->DBDaten)|| count($this->DBDaten)< 1)
    {
      $this->error[] = "DBDaten leer";
      return false;
    }    
    if($this->dateinummer)
    {
      $FLNUM = $this->dateinummer;
    } else {
      $FLNUM = $this->app->DB->Select("Select max(FLNUM) from coface_OP_Kopf");
    }
    if(!$FLNUM)$FLNUM = 1;
    $this->dateinummer = $FLNUM;
    /*if(!$this->Entwicklerdateiid)
    {
      $this->Entwicklerdateiid = $this->DB->Select("select datei from datei_stichwoerter where objekt = 'coface' and subjekt = 'Entwickler' and parameter = ".(int)$this->dateinummer);
    }
    if(!$this->Entwicklerdateiid)
    { 
      $this->error[] = "Keine Entwicklerdatei";
      return false;
    }*/
    $this->DBHeader->FillData('FLNUM', $FLNUM);
    $this->OPHeader->FillData('FLNUM', $FLNUM);
    $this->DBHeader->FillData('FLDATE', date('d.m.Y'));
    $this->OPHeader->FillData('FLDATE', date('d.m.Y'));
    $sumop = 0;
    foreach($this->OPDaten as $key => $val)
    {
      if($wert = $val->GetDataByName('OPAMTMN'))$sumop += $wert;
    }
    $this->OPHeader->FillData('FLBELSUM',$sumop);

    $DateinameOP = $this->Folder.'OP_'.str_replace('/','',cofaceConfig::$Kundennummer).'_EUR_'.date('Ymd').'.csv';
    $DateinameDB = $this->Folder.'DB_'.str_replace('/','',cofaceConfig::$Kundennummer).'_EUR_'.date('Ymd').'.csv';
    //$DateinameEntwickler = $this->Folder.'Entwickler.xls';
    /*if(file_exists($DateinameOP) || file_exists($DateinameDB) || file_exists($DateinameEntwickler))
    {
      $this->error[] = "Datei(en) existiert/en bereits";
      return false;
    }*/
    //OP
    if($fh = fopen($DateinameOP, 'w'))
    {
      fputs($fh, iconv('utf8','ISO-8859-1', $this->OPHeader->genFeldnamenzeile()."\r\n"));
      fputs($fh, iconv('utf8','ISO-8859-1', $this->OPHeader->genDatenZeile()."\r\n"));
      $first = true;
      foreach($this->OPDaten as $k => $v)
      {
        if($first)
        {
          fputs($fh, iconv('utf8','ISO-8859-1', $v->genFeldnamenzeile()."\r\n"));
        }
        $first = false;
        fputs($fh, iconv('utf8','ISO-8859-1', $v->genDatenZeile()."\r\n"));
      }
      fclose($fh);
      $this->DateinameOP = $DateinameOP;
      echo $DateinameOP;
    } else return false;
    //DB
    if($fh = fopen($DateinameDB, 'w'))
    {
      fputs($fh, iconv('utf8','ISO-8859-1', $this->DBHeader->genFeldnamenzeile()."\r\n"));
      fputs($fh, iconv('utf8','ISO-8859-1', $this->DBHeader->genDatenZeile()."\r\n"));
      $first = true;
      foreach($this->DBDaten as $k => $v)
      {
        if($first)
        {
          fputs($fh, iconv('utf8','ISO-8859-1', $v->genFeldnamenzeile()."\r\n"));
        }
        $first = false;
        fputs($fh, iconv('utf8','ISO-8859-1', $v->genDatenZeile()."\r\n"));
      }
      fclose($fh);
      $this->DateinameDB = $DateinameDB;
      echo $DateinameDB;
    } else return false;
    //Entwickler
    if($quelle = $this->app->erp->GetDateiPfad($this->Entwicklerdateiid))
    {
      if(@copy($quelle, $DateinameEntwickler))$this->DateinameEntwickler = $DateinameEntwickler;
    }
    return true;
  }
  function Hochladen()
  {
    if(!$this->dateinummer)return false;
    if(!$this->DateinameDB || !file_exists($this->DateinameDB))return false;
    if(!$this->DateinameOP || !file_exists($this->DateinameOP))return false;
    if(!$this->DateinameEntwickler || !file_exists($this->DateinameEntwickler))return false;
    $ftp = new coface_SFTP($this->app);
    if(!$ftp->connect())return false;
    if($ftp->uploadFile($this->DateinameDB)
      && $ftp->uploadFile($this->DateinameOP)
      && $ftp->uploadFile($this->DateinameEntwickler))
    {
      return $this->app->DB->Update("update coface_dateien set status = 'gesendet' where FLNUM = ".(int)$this->dateinummer);
    } 
    return false;
  }
}
/*
$ftp = new coface_SFTP($app);
if($ftp->connect())
{
  echo "OK\r\n";
  print_r($ftp->getFilesOnServer());
  echo $ftp->uploadFile(dirname(__FILE__).'/Entwickler.xlt');
}else{
  echo "failed\r\n";
}*/

class coface_SFTP
{
  private $app;
  private $connection;
  private $sftp;
  function __construct(&$app)
  {
    $this->app = $app;
  }
  
  function connect($server = '192.168.0.26',$username = 'root', $pw = 'G25yw3bEsp', $port = 22 )
  {
    if(false === ($this->connection = ssh2_connect($server, $port)))return false;
    if(!ssh2_auth_password($this->connection, $username, $pw))return false;
    if(false === ($sftp = ssh2_sftp($this->connection)))return false;
    return true;
  }
  
  function uploadFile($datei)
  {
    $ziel = basename($datei);
    echo "Lade hoch: ".$datei."\r\n";
    return ssh2_scp_send($this->connection, $datei, $ziel, 0644);
  }
  
  function getFilesOnServer()
  {
    $stream = ssh2_exec($this->connection,'ls -l');
    stream_set_blocking($stream, true);
    // Whichever of the two below commands is listed first will receive its appropriate output.  The second command receives nothing
    $erg =  stream_get_contents($stream);
    // Close the streams       
    fclose($stream);
    
    $erga = explode("\n",$erg);
    foreach($erga as $k => $v)
    {
      $l[$k] = preg_split("/[\s,]+/", $v);
      if(strpos($l[$k][7],':') === false)
      {
        $t = strtotime($l[$k][6].' '.$l[$k][5].' '.$l[$k][7]);
      }
      else
      {
        $t = strtotime($l[$k][6].' '.$l[$k][5].' '.date("Y").' '.$l[$k][7]);
      }
      $datei['filename'] = trim($l[$k][8]);
      $datei['ftptime'] = $t;
      $datei['filesize'] = trim($l[$k][4]);
      if($datei['filename'] != '')$ergliste[] = $datei;
    }
    if(!isset($ergliste))return false;
    return $ergliste;
  }
  
}

class coface_Sammlung
{
  private $DBs;
  private $OPs;
  private $app;
  private $genDB;
  private $newDateinummer;
  private $export;
  private $ftp;
  public $error;
  
  function __construct(&$app)
  {
    $this->app = $app;
  }
  
  function addOP($OP)
  {
    $this->OPs[] = $OP->Data;
  }
  
  function addDB($DB)
  {
    $found = false;
    if(is_array($this->DBs) && count($this->DBs) > 0)
    {
      foreach($this->DBs as $k => $v)
      {
        if($DB->Data->istGleich($v))$found = true;
        
      }
    }
    if(!$found)$this->DBs[] = $DB->Data;
  }
  
  function SpeichernInDB()
  {
    if(!is_array($this->DBs) || !is_array($this->OPs))return false;
    if(count($this->DBs) < 1 || count($this->OPs) < 1)return false;
    $this->newDateinummer = 1 + (int)$this->app->DB->Select("select max(FLNUM) from coface_dateien");
    $this->genDB = new coface_gen_DB($this->app);
    if(!$this->app->DB->Insert("insert into coface_dateien (FLNUM) values (".$this->newDateinummer.")"))return false;
    foreach($this->OPs as $k => $OP)
    {
      $OP->FLNUM = $this->newDateinummer;
      //echo $this->genDB->Insert($OP)."\r\n";
      $this->app->DB->Insert($this->genDB->Insert($OP));
    }
    foreach($this->DBs as $k => $DB)
    {
      $DB->FLNUM = $this->newDateinummer;
      //echo $this->genDB->Insert($DB)."\r\n";
      $this->app->DB->Insert($this->genDB->Insert($DB));
    }
  }
  
  function lastDateinummer()
  {
     return $this->newDateinummer = (int)$this->app->DB->Select("select max(FLNUM) from coface_dateien");
  }
  
  function Export()
  {
    echo "new export\r\n";
    $this->export = new coface_export($this->app);
    echo "getFromDB\r\n";
    $this->export->getFromDB($this->newDateinummer);
    //alte Daten
    $alt = $this->app->DB->Select("select max(FLNUM) from coface_dateien where status 'gesendet'");
    if($alt)$this->export->getFromDB($alt, true);
    $this->export->genEntwickler();
  }
  
  function Hochladen()
  {
    echo "Hochladen";
    if(!$this->export)
    {
      $this->error[] = "Export nicht geladen";
      return false;
    }
    if(!$this->export->genDateien())
    {
      if($this->export->error)$this->error[] = $this->export->error;
      $this->error[] = "Fehler beim generieren von Dateien";
      return false;
    }
    if($this->export->Hochladen())return true;
    $this->error[] = "Fehler beim Hochladen";
    return false;
  }
  
}

class coface_DB
{
  public $Data;
  function __construct()
  {
    $this->Data = new coface_DB_Daten();
    $this->Data->FillData('DBCOTRY', 'DE');
    $this->Data->FillData('DBLANG', 'DE');
    $this->Data->FillData('DBCLNR',cofaceConfig::$Kundennummer);
    $this->Data->FillData('DBLITYP','0');
    $this->Data->FillData('DBLIMIT',0);
    $this->Data->FillData('DBCURLMT','EUR');
    $this->Data->FillData('DBDALIEFF','01.01.2000');
    $this->Data->FillData('DBDALITO','31.12.2099');
  } 
  
  function SetAdr($val)
  {
    if(!is_array($val))return false;
    if(isset($val['name']))$this->Data->FillData('DBNAME1', $val['name']);
    if(isset($val['ansprechpartner']))$this->Data->FillData('DBCONTAC', $val['ansprechpartner']);
    if(isset($val['strasse']))$this->Data->FillData('DBSTREET', $val['strasse']);
    if(isset($val['plz']))$this->Data->FillData('DBZIP', $val['plz']);
    if(isset($val['ort']))$this->Data->FillData('DBPLACE', $val['ort']);
    if(isset($val['kundennummer']))$this->Data->FillData('DBNR', $val['kundennummer']);
    if(isset($val['kundennummer']))$this->Data->FillData('DBNRZE', $val['kundennummer']);
    if(isset($val['land']))$this->Data->FillData('DBCOTRY', $val['land']);
  }
  
  function SetLimitUnbekannt($val)
  {
    $this->Data->FillData('DBLITYP','2');
    $this->Data->FillData('DBLIMIT',(float)$val);
  }
  
  function SetLimitBekannt($val)
  {
    $this->Data->FillData('DBLITYP','1');
    $this->Data->FillData('DBLIMIT',(float)$val);
  }
}



class coface_OP
{
  public $Data;
  function __construct()
  {
    $this->Data = new coface_OP_Daten();
    $this->Data->FillData('OPCLNR',cofaceConfig::$Kundennummer);
    $this->Data->FillData('OPITMTYP', 'DR');
    $this->Data->FillData('OPCUR', 'EUR');
    $this->Data->FillData('OPCURMN', 'EUR');
  }
  
  public function SetBelegnummer($val)
  {
    $this->Data->FillData('OPITMNR', $val);
  }
  
  public function SetBelegnummerRef($val)
  {
    $this->Data->FillData('OPITMNRREF', $val);
  }
  
  public function SetData($val)
  {
    if(isset($val['kundennummer']))$this->Data->FillData('OPDBNR', $val['kundennummer']);
  }
  
  public function SetLieferdatum($val)
  {
    $this->Data->FillData('OPITMDTL', $val);
  }
  
  public function SetBelegdatum($val)
  {
    $this->Data->FillData('OPITMDAT', $val);
    if(!$this->Data->GetDataByName('OPITMDTL'))$this->Data->FillData('OPITMDTL', $val);
  }
  
  public function SetFaelligkeitsdatum($val)
  {
    $this->Data->FillData('OPITMDTD', $val);
  }
  
  public function SetMahnstufe($val)
  {
    $this->Data->FillData('OPITMDLV', (int)$val);
  }
  
  public function SetSkonto($Tage, $val)
  {
    $this->Data->FillData('OPITMDY1', (int)$Tage);
    $this->Data->FillData('OPITMRD1', (float)$val);
  }
  
  public function SetSkonto2($Tage, $val)
  {
    $this->Data->FillData('OPITMDY2', (int)$Tage);
    $this->Data->FillData('OPITMRD2', (float)$val);
  }
  
  public function SetSkonto3($Tage, $val = 0)
  {
    $this->Data->FillData('OPITMDY3', (int)$Tage);
  }
  
  public function SetText($val)
  {
    $this->Data->FillData('OPITMTXT', ($val));
  }
  
  public function SetBetrag($val)
  {
    $val = (float)$val;
    switch($this->Data->GetDataByName('OPITMTYP'))
    {
      case 'DR':
      case 'SG':
      case 'WS':
        if($val < 0)$val = -$val;
      break;
      case 'DG':
      case 'DZ':
      case 'SR':
        if($val > 0)$val = -$val;
      break;
    }
    $this->Data->FillData('OPAMT', $val);
    $this->Data->FillData('OPAMTMN', $val);
  }
  
  
  public function DebitorenRechnung()
  {
    $this->Data->FillData('OPITMTYP', 'DR');
  }
  
  public function DebitorenGutschrift()
  {
    $this->Data->FillData('OPITMTYP', 'DG');
    
  }
  public function DebitorenZahlung()
  {
    $this->Data->FillData('OPITMTYP', 'DZ');
  }
  
  public function StornoRechnung()
  {
    $this->Data->FillData('OPITMTYP', 'SR');  
  }
  public function StornoGutschrift()
  {
    $this->Data->FillData('OPITMTYP', 'SG');
  }
  
  public function Restposten()
  {
    $this->Data->FillData('OPITMTYP', 'RP');
  }
  
  public function Warenstreit()
  {
    $this->Data->FillData('OPITMTYP', 'WS');
  }
  
}
if(isset($argv[1]) && strpos(strtoupper($argv[1]),'EXCELTEST') !== false)
{
  $xlt = new coface_excel('Entwickler2.xlt');
  /*
  $nr = $xlt->AddPage("Test");
  if($nr)
  {
    if($xlt->AddElement($nr,'A1','moo'))
    {
      $xlt->save('EXCELTEST.xls');
    }
  }*/
  $xlt->InsertJournal("RE-Journal", "Debitor","Debitor-Nr.","1234","05.05.2015","30.07.2015","10.00");
  $xlt->InsertJournal("RE-Journal", "Debitor","Debitor-Nr.","1234","05.05.2015","30.07.2015","10.00");
  $xlt->InsertJournal("RE-Journal", "Debitor","Debitor-Nr.","1234","05.05.2015","30.07.2015","10.00");
  $xlt->InsertJournal("RE-Journal", "Debitor","Debitor-Nr.","1234","05.05.2015","30.07.2015","10.00");
  $xlt->AddZahlungseingang('Musterbank', "Debitor", "05.05.2015", "123456", '980.00', '20.00', '1000.00');
  $xlt->AddZahlungseingang('Musterbank', "Debitor 2", "05.05.2015", "123456", '80.00', '20.00', '100.00');
  $xlt->AddZahlungseingang('Musterbank', "Debitor 3", "05.05.2015", "123456", '1980.00', '20.00', '2000.00');
  $xlt->save('EXCELTEST2.xls');
}
if(isset($argv[1]) && strpos(strtoupper($argv[1]),'EDISON') !== false)
{
$tmp = new WaWisioncoface($app);
$tmp->ImportEdison("OPListe_31.05.2015.csv");
}

/*
$xlt = new coface_excel();
$xlt->AnzahlGutschriften = 1;
$xlt->GemGutschriften = 'ABC';
$xlt->SaldoGutschriften = 12.10;
$xlt->Absender = 
"Firma ABC
Muster Str. 5
86343 Königsbrunn";
$xlt->save('bla.xls');
*/
class coface_excel
{
  public $Datum;
  public $KundenNr;
  public $Ansprechpartner = "";
  public $Absender = "";
  
  public $OPSaldoalt = 0;
  public $DatumOP = "";
  public $AnzahlRechnungen = 0;
  public $AnzahlStornoRechnungen = 0;
  public $AnzahlGutschriften = 0;
  public $AnzahlStornoGutschriften = 0;
  public $AnzahlRestposten = 0;
  public $AnzahlStornoRestposten = 0;

  public $GemRechnungen = "";
  public $GemStornoRechnungen = "";
  public $GemGutschriften = "";
  public $GemStornoGutschriften = "";
  public $GemRestposten = "";
  public $GemStornoRestposten = "";
  
  public $SaldoRechnungen = 0;
  public $SaldoStornoRechnungen = 0;
  public $SaldoGutschriften = 0;
  public $SaldoStornoGutschriften = 0;
  public $SaldoRestposten = 0;
  public $SaldoStornoRestposten = 0;
  
  public $AnzahlZahlungseingaenge = 0;
  public $Netto = 0;
  public $Abzuege = 0;
  public $Brutto = 0;
  public $OPSaldoNeu = 0;
  public $eigenenHausbankkonto  = 0;
  public $CFKonto = 0;
  
  private $anz;
  
  
  function __construct($Excelfile = null)
  {
    require_once dirname(__FILE__)."/PHPExcel.php";
    $this->KundenNr = cofaceConfig::$Kundennummer;
    $this->Datum = date("d.m.Y");
    $this->DatumOP = date("d.m.Y");
    $this->_oPHPExcel = new PHPExcel();
    $this->_oExcelReader = new PHPExcel_Reader_Excel5();
    $this->_oExcelReader->setReadDataOnly(false);
    if(is_null($Excelfile))
    {
      $this->_oPHPExcel = $this->_oExcelReader->load(cofaceConfig::$ExcelRoh);
    } else {
      $this->_oPHPExcel = $this->_oExcelReader->load($Excelfile);
    }
    if($this->_oPHPExcel->getSheetCount() > 1)
    {
      for($i = 1; $i < $this->_oPHPExcel->getSheetCount(); $i++)
      {
        $this->_oPHPExcel->setActiveSheetIndex($i);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('A5','Kunden-Nr. '.cofaceConfig::$Kundennummer);
        if($i == $this->_oPHPExcel->getSheetCount() - 1)
        {
          $this->_oPHPExcel->getActiveSheet()->SetCellValue('G7',date("d.m.Y"));
        }else{
          $this->_oPHPExcel->getActiveSheet()->SetCellValue('F7',date("d.m.Y"));  
        }
        
        
        
      }
      
      
    }
    
  }
  
  function InsertJournalNr($Sheetname, $Journalnr)
  {
    if($nr && $Sheetname)
    {
      if($this->_oPHPExcel->sheetNameExists($Sheetname))
      {
        if(!isset($this->anz[$Sheetname]))$this->anz[$Sheetname] = 0;
        $this->anz[$Sheetname]++;
        $nr = $this->_oPHPExcel->getIndex($this->_oPHPExcel->getSheetByName($Sheetname));
        if($nr)
        {
          $this->_oPHPExcel->setActiveSheetIndex($nr);
          $this->_oPHPExcel->getActiveSheet()->SetCellValue('D7',$Journalnr);
        }
      }
    }
  }
  //TO Kundenname
  function InsertJournal($Sheetname, $Debitor,$DebitorNr,$Belegnummer,$Belegdatum,$Faelligkeitsdatum,$Betrag)
  {
    if($this->_oPHPExcel->sheetNameExists($Sheetname))
    {
      if(!isset($this->anz[$Sheetname]))$this->anz[$Sheetname] = 0;
      $this->anz[$Sheetname]++;
      $nr = $this->_oPHPExcel->getIndex($this->_oPHPExcel->getSheetByName($Sheetname));
      if($nr)
      {
        $this->_oPHPExcel->setActiveSheetIndex($nr);
        if($this->anz[$Sheetname] > 2)
        {
          $this->_oPHPExcel->getActiveSheet()->insertNewRowBefore($this->anz[$Sheetname]+9,1);
        }
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('A'.($this->anz[$Sheetname]+9),$Debitor);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('B'.($this->anz[$Sheetname]+9),$DebitorNr);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('C'.($this->anz[$Sheetname]+9),$Belegnummer);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('D'.($this->anz[$Sheetname]+9),$Belegdatum);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('E'.($this->anz[$Sheetname]+9),$Faelligkeitsdatum);
        
        if($this->anz[$Sheetname] > 1)$this->_oPHPExcel->getActiveSheet()->duplicateStyle($this->_oPHPExcel->getActiveSheet()->getStyle('F10'), 'F'.($this->anz[$Sheetname]+9));
        
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz[$Sheetname]+9),$Betrag);
        //echo 'F'.($this->anz[$Sheetname]+9).' '.$Betrag. ' F'.($this->anz[$Sheetname]+($this->anz[$Sheetname] > 2?-1:0)+11)." ".'=Summe(F10:F'.($this->anz[$Sheetname]+($this->anz[$Sheetname] > 2?-1:0)+10).')'."\r\n";
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz[$Sheetname]+($this->anz[$Sheetname] > 2?-1:0)+11),'=SUM(F10:F'.($this->anz[$Sheetname]+($this->anz[$Sheetname] > 2?-1:0)+10).')');
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz[$Sheetname]+($this->anz[$Sheetname] > 2?-1:0)+12),'');
        switch($Sheetname)
        {
          case 'RE-Journal':
            $this->AnzahlRechnungen = $this->anz[$Sheetname];
            $this->GemRechnungen = $Sheetname;
            $this->SaldoRechnungen += $Betrag;
          break;
          case 'RG-Storno Journal':
            $this->AnzahlStornoRechnungen = $this->anz[$Sheetname];
            $this->GemStornoRechnungen = $Sheetname;
            $this->SaldoStornoRechnungen += $Betrag;
          break;
          case 'GS-Journal':
            $this->AnzahlGutschriften = $this->anz[$Sheetname];
            $this->GemGutschriften = $Sheetname;
            $this->SaldoGutschriften += $Betrag;
          break;
          case 'GS-Storno Journal':
            $this->AnzahlStornoGutschriften = $this->anz[$Sheetname];
            $this->GemStornoGutschriften = $Sheetname;
            $this->SaldoStornoGutschriften += $Betrag;
          break;
          case 'Restposten':
            $this->AnzahlRestpostenn = $this->anz[$Sheetname];
            $this->GemRestposten = $Sheetname;
            $this->SaldoRestposten += $Betrag;
          break;
          case 'Restposten Storno Journal':
            $this->AnzahlStornoRestposten = $this->anz[$Sheetname];
            $this->GemStornoRestposten = $Sheetname;
            $this->SaldoStornoRestposten += $Betrag;
          break;
        }
      }
    }
  }
  
  function AddZahlungseingang($Bank, $Debitor, $BelegDatumAuszug, $Belegnummer, $Netto, $Abzuege, $Brutto)
  {
    if($this->_oPHPExcel->sheetNameExists('ZE-Journal'))
    {
      if(!isset($this->anz['ZE-Journal']))$this->anz['ZE-Journal'] = 0;
      $this->anz['ZE-Journal']++;
      $nr = $this->_oPHPExcel->getIndex($this->_oPHPExcel->getSheetByName('ZE-Journal'));
      if($nr)
      {
        $this->_oPHPExcel->setActiveSheetIndex($nr);
        if($this->anz['ZE-Journal'] > 2)
        {
          $this->_oPHPExcel->getActiveSheet()->insertNewRowBefore($this->anz['ZE-Journal']+9,1);
        }
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('A'.($this->anz['ZE-Journal']+9),$Bank);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('B'.($this->anz['ZE-Journal']+9),$Debitor);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('C'.($this->anz['ZE-Journal']+9),$BelegDatumAuszug);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('D'.($this->anz['ZE-Journal']+9),$Belegnummer);
        
        
        if($this->anz['ZE-Journal'] > 1)$this->_oPHPExcel->getActiveSheet()->duplicateStyle($this->_oPHPExcel->getActiveSheet()->getStyle('E10'), 'E'.($this->anz['ZE-Journal']+9));
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('E'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+11),'=SUM(E10:E'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+10).')');
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('E'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+12),'');
        if($this->anz['ZE-Journal'] > 1)$this->_oPHPExcel->getActiveSheet()->duplicateStyle($this->_oPHPExcel->getActiveSheet()->getStyle('F10'), 'F'.($this->anz['ZE-Journal']+9));
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+11),'=SUM(F10:F'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+10).')');
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+12),'');
        if($this->anz['ZE-Journal'] > 1)$this->_oPHPExcel->getActiveSheet()->duplicateStyle($this->_oPHPExcel->getActiveSheet()->getStyle('G10'), 'G'.($this->anz['ZE-Journal']+9));
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('G'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+11),'=SUM(G10:G'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+10).')');
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('G'.($this->anz['ZE-Journal']+($this->anz['ZE-Journal'] > 2?-1:0)+12),'');
        
        
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('E'.($this->anz['ZE-Journal']+9),$Netto);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('F'.($this->anz['ZE-Journal']+9),$Abzuege);
        $this->_oPHPExcel->getActiveSheet()->SetCellValue('G'.($this->anz['ZE-Journal']+9),$Brutto);
        $this->AnzahlZahlungseingaenge = $htis->anz['ZE-Journal'];
        $this->Netto += $Netto;
        $this->Abzuege += $Abzuege;
        $this->Brutto += $Brutto;
      }
    }
  }
  
  function removeUnusedSheets()
  {
    $toremove = array();
    if(!isset($this->anz) || !isset($this->anz['RE-Journal']) || $this->anz['RE-Journal'])$toremove['RE-Journal'] = true;
    if(!isset($this->anz) || !isset($this->anz['RG-Storno Journal']) || $this->anz['RG-Storno Journal'])$toremove['RG-Storno Journal'] = true;
    if(!isset($this->anz) || !isset($this->anz['GS-Journal']) || $this->anz['GS-Journal'])$toremove['GS-Journal'] = true;
    if(!isset($this->anz) || !isset($this->anz['GS-Storno Journal']) || $this->anz['GS-Storno Journal'])$toremove['GS-Storno Journall'] = true;
    if(!isset($this->anz) || !isset($this->anz['Restposten']) || $this->anz['Restposten'])$toremove['Restposten'] = true;
    if(!isset($this->anz) || !isset($this->anz['Restposten Storno Journal']) || $this->anz['Restposten Storno Journal'])$toremove['Restposten Storno Journal'] = true;
    if(count($toremove) > 0)
    {
      foreach($toremove as $Sheetname => $val)
      {
        if($key)
        {
          if($this->_oPHPExcel->sheetNameExists($Sheetname))
          {
            $nr = $this->_oPHPExcel->getIndex($this->_oPHPExcel->getSheetByName($Sheetname));
            if($nr)
            {
              $this->_oPHPExcel->removeSheetByIndex($nr);
            }
          }
        }
      }
    }
  }
  
  function AddPage($name)
  {
    $tmp = $this->_oPHPExcel->createSheet();
    $tmp->setTitle($name);
    return $this->_oPHPExcel->getIndex($tmp);
  }
  
  function AddElement($nr, $Zelle, $val)
  {
    if(!$this->_oPHPExcel)return false;
    $n = preg_match_all("/([A-Za-z]+)(\d+)/",$Zelle, $treffer);
    if(!$n)return false;
    if(count($treffer)< 3)return false;
    if(!isset($treffer[0][0])||!isset($treffer[1][0])||!isset($treffer[2][0]))return false;
    if(strlen($treffer[1][0])>2)return false;
    if($treffer[2][0]< 1)return false;
    if($this->_oPHPExcel->getSheetCount() > $nr)
    {$this->_oPHPExcel->setActiveSheetIndex($nr);
      $this->_oPHPExcel->getActiveSheet()->SetCellValue($Zelle,$val);
      return true;
    } else {
      return false;
    }
  }
  
  function save($filename)
  {
    if(strpos($filename, '/') === false){
      if(!is_null(cofaceConfig::$Folder))
      {
        $filename = cofaceConfig::$Folder.$filename;
      }else{
        $filename = dirname(__FILE__).'/'.$filename;
      }
    }
    $this->_oPHPExcel->setActiveSheetIndex(0);
    $this->_oPHPExcel->getActiveSheet()->SetCellValue('G5',$this->KundenNr);
    $this->_oPHPExcel->getActiveSheet()->SetCellValue('A6','z. H. '.$this->Ansprechpartner);
    if(($this->Absender))
    {
      $Zeilen = explode("\n",$this->Absender);
      
      for($i = 0; $i < 6; $i++)
      {
        if(isset($Zeilen[$i]))$this->_oPHPExcel->getActiveSheet()->SetCellValue('E'.(6+$i),trim($Zeilen[$i]));
      }
    
    }
    $this->_oPHPExcel->getActiveSheet()->SetCellValue('G12',$this->Datum);
    $this->_oPHPExcel->getActiveSheet()->SetCellValue('D24',$this->DatumOP);
    if($this->OPSaldoalt)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G21',$this->OPSaldoalt);
    if($this->AnzahlRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A27',$this->AnzahlRechnungen);
    if($this->AnzahlStornoRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A28',$this->AnzahlStornoRechnungen);
    if($this->AnzahlGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A29',$this->AnzahlGutschriften);
    if($this->AnzahlStornoGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A30',$this->AnzahlStornoGutschriften);
    if($this->AnzahlRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A31',$this->AnzahlRestposten);
    if($this->AnzahlStornoRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A32',$this->AnzahlStornoRestposten);
    
    if($this->GemRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D27',$this->GemRechnungen);
    if($this->GemStornoRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D28',$this->GemStornoRechnungen);
    if($this->GemGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D29',$this->GemGutschriften);
    if($this->GemStornoGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D30',$this->GemStornoGutschriften);
    if($this->GemRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D31',$this->GemRestposten);
    if($this->GemStornoRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D32',$this->GemStornoRestposten);

    if($this->SaldoRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G27',$this->SaldoRechnungen);
    if($this->SaldoStornoRechnungen)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G28',$this->SaldoStornoRechnungen);
    if($this->SaldoGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G29',$this->SaldoGutschriften);
    if($this->SaldoStornoGutschriften)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G30',$this->SaldoStornoGutschriften);
    if($this->SaldoRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G31',$this->SaldoRestposten);
    if($this->SaldoStornoRestposten)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G32',$this->SaldoStornoRestposten);    
    
    if($this->AnzahlZahlungseingaenge)$this->_oPHPExcel->getActiveSheet()->SetCellValue('A34',$this->AnzahlZahlungseingaenge);    
    if($this->Netto)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D35',$this->Netto);
    if($this->Abzuege)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D36',$this->Abzuege);
    if($this->Brutto)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G37',$this->Brutto);
    if($this->OPSaldoNeu)$this->_oPHPExcel->getActiveSheet()->SetCellValue('G38',$this->OPSaldoNeu);
    if($this->eigenenHausbankkonto)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D42',$this->eigenenHausbankkonto);
    if($this->CFKonto)$this->_oPHPExcel->getActiveSheet()->SetCellValue('D43',$this->CFKonto);
    
    $this->removeUnusedSheets();
    $objWriter = new PHPExcel_Writer_Excel5($this->_oPHPExcel);
    $objWriter->save($filename);    
  }
  
}
?>