<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
* 
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1. 
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis 
* to obtain the text of the corresponding license version.  
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
?>
<?php

use Xentral\Modules\Api\Auth\PermissionGuard;
use Xentral\Modules\ApiAccount\Exception\ApiAccountNotFoundException;
use Xentral\Modules\SystemConfig\SystemConfigModule;

if (!function_exists('getallheaders')) {
    /**
     * @return array
     */
    function getallheaders() {
      $headers = array();
      foreach ($_SERVER as $name => $value) {
        if (substr($name, 0, 5) == 'HTTP_') {
          $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
        }
      }
      return $headers;
    }
  }


  if(!class_exists('SimpleXMLExtended')) {
    class SimpleXMLExtended extends SimpleXMLElement
    {
      /**
       * @param $cdata_text
       */
      public function addCData($cdata_text)
      {
        $node = dom_import_simplexml($this);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));
      }
    }
  }

  class Api {
    /** @var Application $app */
  var $app;
  var $api_id;
  var $uebertragung_account;
  var $usejson;
  var $usecdata;
  var $datei_id;
  var $lagerzahlenmonitor;
  var $lagerzahlen;

  /** @var \Xentral\Modules\ApiAccount\Service\ApiAccountService */
  protected $apiAccountService;

  /** @var \Xentral\Modules\ApiAccount\Data\ApiAccountData */
  protected $apiAccount;

  /** @var array $bestBeforeBatchArticleStock */
  protected $bestBeforeBatchArticleStock;

    /**
     * Api constructor.
     *
     * @param Application $app
     * @param bool        $intern
     */
  public function __construct($app, $intern = false) {

//    header("Content-Type: text/html; charset=utf-8");

    $this->app=$app;
    $this->usejson = false;
    $this->usecdata = false;
    $this->api_id = 0;
    $this->datei_id = 0;
    $this->apiAccountService = $this->app->Container->get('ApiAccountService');

    if($intern) {
      return;
    }
    $this->app->ActionHandlerInit($this);
    // eine alte Funktion
    $this->app->ActionHandler("shopimages","ApiShopimages");

    //Stechuhr
    $this->app->ActionHandler("ServerTimeGet","ApiServerTimeGet");
    $this->app->ActionHandler("BenutzerGetRFID","ApiBenutzerGetRFID");
    $this->app->ActionHandler("BenutzerList","ApiBenutzerList");
    $this->app->ActionHandler("StechuhrStatusGet","ApiStechuhrStatusGet");
    $this->app->ActionHandler("StechuhrStatusSet","ApiStechuhrStatusSet");
    $this->app->ActionHandler("StechuhrSummary","ApiStechuhrSummary");

    $this->app->ActionHandler("AdresseCreate","ApiAdresseCreate");
    $this->app->ActionHandler("AdresseEdit","ApiAdresseEdit");
    $this->app->ActionHandler("AdresseGet","ApiAdresseGet");

    $this->app->ActionHandler("AnsprechpartnerCreate","ApiAnsprechpartnerCreate");
    $this->app->ActionHandler("AnsprechpartnerEdit","ApiAnsprechpartnerEdit");

    $this->app->ActionHandler("LieferadresseCreate","ApiLieferadresseCreate");
    $this->app->ActionHandler("LieferadresseEdit","ApiLieferadresseEdit");

    $this->app->ActionHandler("AdresseAboGruppeCreate","ApiAdresseAboGruppeCreate");
    $this->app->ActionHandler("AdresseAboGruppeEdit","ApiAdresseAboGruppeEdit");
    $this->app->ActionHandler("AdresseAboGruppeGet","ApiAdresseAboGruppeGet");
    $this->app->ActionHandler("AdresseAboGruppeList","ApiAdresseAboGruppeList");

    $this->app->ActionHandler("AdresseAboArtikelCreate","ApiAdresseAboArtikelCreate");
    $this->app->ActionHandler("AdresseAboArtikelEdit","ApiAdresseAboArtikelEdit");
    $this->app->ActionHandler("AdresseAboArtikelGet","ApiAdresseAboArtikelGet");
    $this->app->ActionHandler("AdresseAboArtikelList","ApiAdresseAboArtikelList");

    $this->app->ActionHandler("BerichteGet", "ApiBerichteGet");

    $this->app->ActionHandler("ArtikelList", "ApiArtikelList");
    $this->app->ActionHandler("ArtikelStueckliste", "ApiArtikelStueckliste");

    $this->app->ActionHandler("AuftragCreate","ApiAuftragCreate");
    $this->app->ActionHandler("AuftragEdit","ApiAuftragEdit");
    $this->app->ActionHandler("AuftragGet","ApiAuftragGet");

    $this->app->ActionHandler("AngebotCreate","ApiAngebotCreate");
    $this->app->ActionHandler("AngebotEdit","ApiAngebotEdit");
    $this->app->ActionHandler("AngebotGet","ApiAngebotGet");

    $this->app->ActionHandler("GutschriftGet","ApiGutschriftGet");
    $this->app->ActionHandler("GutschriftEdit","ApiGutschriftEdit");
    $this->app->ActionHandler("GutschriftCreate","ApiGutschriftCreate");

    $this->app->ActionHandler("LieferscheinGet","ApiLieferscheinGet");
    $this->app->ActionHandler("LieferscheinEdit","ApiLieferscheinEdit");
    $this->app->ActionHandler("LieferscheinCreate","ApiLieferscheinCreate");

    $this->app->ActionHandler("LieferscheinFreigabe", "ApiLieferscheinFreigabe");
    $this->app->ActionHandler("RechnungFreigabe", "ApiRechnungFreigabe");
    $this->app->ActionHandler("AuftragFreigabe", "ApiAuftragFreigabe");
    $this->app->ActionHandler("AngebotFreigabe", "ApiAngebotFreigabe");
    $this->app->ActionHandler("GutschriftFreigabe", "ApiGutschriftFreigabe");
    $this->app->ActionHandler("BestellungFreigabe", "ApiBestellungFreigabe");

    $this->app->ActionHandler("AuftragAbschliessen", "ApiAuftragAbschliessen");
    $this->app->ActionHandler("RechnungVersendetMarkieren", "ApiRechnungVersendetMarkieren");
    $this->app->ActionHandler("RechnungAlsBezahltMarkieren", "ApiRechnungAlsBezahltMarkieren");

    $this->app->ActionHandler("WeiterfuehrenAuftragZuRechnung", "ApiWeiterfuehrenAuftragZuRechnung");
    $this->app->ActionHandler("WeiterfuehrenRechnungZuGutschrift", "ApiWeiterfuehrenRechnungZuGutschrift");

    $this->app->ActionHandler("RechnungVersenden", "ApiRechnungVersenden");
    $this->app->ActionHandler("AngebotVersenden", "ApiAngebotVersenden");
    $this->app->ActionHandler("GutschriftVersenden", "ApiGutschriftVersenden");
    $this->app->ActionHandler("AuftragVersenden", "ApiAuftragVersenden");
    $this->app->ActionHandler("LieferscheinVersenden", "ApiLieferscheinVersenden");
    $this->app->ActionHandler("ReisekostenVersenden", "ApiReisekostenVersenden");

    $this->app->ActionHandler("AuftragArchivieren", "ApiAuftragArchivieren");
    $this->app->ActionHandler("AngebotArchivieren", "ApiAngebotArchivieren");
    $this->app->ActionHandler("LieferscheinArchivieren", "ApiLieferscheinArchivieren");
    $this->app->ActionHandler("RechnungArchivieren", "ApiRechnungArchivieren");
    $this->app->ActionHandler("GutschriftArchivieren", "ApiGutschriftArchivieren");

    $this->app->ActionHandler("RetoureGet","ApiRetoureGet");
    $this->app->ActionHandler("RetoureEdit","ApiRetoureEdit");
    $this->app->ActionHandler("RetoureCreate","ApiRetoureCreate");

    $this->app->ActionHandler("RechnungGet","ApiRechnungGet");
    $this->app->ActionHandler("RechnungEdit","ApiRechnungEdit");
    $this->app->ActionHandler("RechnungCreate","ApiRechnungCreate");

    $this->app->ActionHandler("BestellungGet","ApiBestellungGet");
    $this->app->ActionHandler("BestellungEdit","ApiBestellungEdit");
    $this->app->ActionHandler("BestellungCreate","ApiBestellungCreate");

    $this->app->ActionHandler("ArtikelCreate","ApiArtikelCreate");
    $this->app->ActionHandler("ArtikelEdit","ApiArtikelEdit");
    $this->app->ActionHandler("ArtikelGet","ApiArtikelGet");

    $this->app->ActionHandler("ArtikelStuecklisteCreate", "ApiArtikelStuecklisteCreate");
    $this->app->ActionHandler("ArtikelStuecklisteEdit", "ApiArtikelStuecklisteEdit");
    $this->app->ActionHandler("ArtikelStuecklisteList", "ApiArtikelStuecklisteList");

    $this->app->ActionHandler("BenutzerCreate","ApiBenutzerCreate");
    $this->app->ActionHandler("BenutzerEdit","ApiBenutzerEdit");
    $this->app->ActionHandler("BenutzerGet","ApiBenutzerGet");

    $this->app->ActionHandler("SessionStart","ApiSessionStart");
    $this->app->ActionHandler("SessionClose","ApiSessionClose");

    $this->app->ActionHandler("AdresseKontaktCreate","ApiAdresseKontaktCreate");
    $this->app->ActionHandler("AdresseKontaktEdit","ApiAdresseKontaktEdit");
    $this->app->ActionHandler("AdresseKontaktGet","ApiAdresseKontaktGet");
    $this->app->ActionHandler("AdresseKontaktList","ApiAdresseKontaktList");

    $this->app->ActionHandler("AdresseListeGet","ApiAdresseListeGet");

    $this->app->ActionHandler("GruppeCreate","ApiGruppeCreate");
    $this->app->ActionHandler("GruppeEdit","ApiGruppeEdit");
    $this->app->ActionHandler("GruppeGet","ApiGruppeGet");

    $this->app->ActionHandler("GruppenList","ApiGruppenList");

    $this->app->ActionHandler("PreiseEdit","ApiPreiseEdit");

    $this->app->ActionHandler("ExportVorlageGet","ApiExportVorlageGet");
    $this->app->ActionHandler("AdresseAccountsGet","ApiAdresseAccountsGet");
    $this->app->ActionHandler("ArtikelkontingenteGet","ApiArtikelkontingenteGet");

    $this->app->ActionHandler("MappingGet","ApiMappingGet");
    $this->app->ActionHandler("MappingSet","ApiMappingSet");

    $this->app->ActionHandler("BelegeList","ApiBelegeList");
    $this->app->ActionHandler("ArtikelkategorienList","ApiArtikelkategorienList");

    $this->app->ActionHandler("AccountList", "ApiAccountList");
    $this->app->ActionHandler("AdresseGruppenList", "ApiAdresseGruppenList");
    $this->app->ActionHandler("AccountLogin", "ApiAccountLogin");
    $this->app->ActionHandler("AccountCreate", "ApiAdresseAccountCreate");
    $this->app->ActionHandler("AccountEdit", "ApiAdresseAccountEdit");

    $this->app->ActionHandler("DateiList", "ApiDateiList");
    $this->app->ActionHandler("DateiVorschau", "ApiDateiVorschau");
    $this->app->ActionHandler("DateiDownload", "ApiDateiDownload");
    $this->app->ActionHandler("DateiHeader", "ApiDateiHeader");

    $this->app->ActionHandler("BelegPDF", "ApiBelegPDF");
    $this->app->ActionHandler("BelegPDFHeader", "ApiBelegPDFHeader");

    $this->app->ActionHandler("ZeiterfassungGet", "ApiZeiterfassungGet");
    $this->app->ActionHandler("ZeiterfassungCreate", "ApiZeiterfassungCreate");
    $this->app->ActionHandler("ZeiterfassungEdit", "ApiZeiterfassungEdit");
    $this->app->ActionHandler("ZeiterfassungDelete", "ApiZeiterfassungDelete");

    $this->app->ActionHandler("ProjektListe", "ApiProjektListe");
    $this->app->ActionHandler("ProjektGet", "ApiProjektGet");
    $this->app->ActionHandler("ProjektCreate", "ApiProjektCreate");
    $this->app->ActionHandler("ProjektEdit", "ApiProjektEdit");

    $this->app->ActionHandler("AngebotZuAuftrag", "ApiAngebotZuAuftrag");
    $this->app->ActionHandler("AuftragZuRechnung", "ApiAuftragZuRechnung");
    $this->app->ActionHandler("Etikettendrucker", "ApiEtikettendrucker");
    $this->app->ActionHandler("Custom", "ApiCustom");

    $this->app->ActionHandler("ApiXMLTest", "ApiXMLTest");

    $allHeaders = getallheaders();
    if (isset($allHeaders['Accept']) && strpos($allHeaders['Accept'], 'json') !== false) {
      $this->usejson = true;
    }

    $this->CheckHash();

    $this->app->ActionHandlerListen($app);
  }

    public function Install()
    {
      $this->app->erp->CheckTable('api_permission');
      $this->app->erp->CheckColumn('key', 'varchar(255)', 'api_permission');
      $this->app->erp->CheckIndex('api_permission', 'key', true);
      $this->app->erp->CheckColumn('group', 'varchar(255)', 'api_permission');
      $this->fillApiPermissions();

      $this->app->erp->CheckColumn('permissions', 'text', 'api_account');
      $this->app->erp->CheckColumn('ishtmltransformation','TINYINT(1)','api_account','DEFAULT \'0\' NOT NULL');
      $this->migrateApiAccounts();
      $this->migrateApiAccountFromCompanyData();

      $this->migrateNewActions();
      $this->renamePermissions();

    }

    /**
     * Migrate the old api account from company data
     */
    protected function migrateApiAccountFromCompanyData(): void
    {
      $initKey = $this->app->erp->Firmendaten('api_initkey');
      $remoteDomain = $this->app->erp->Firmendaten('api_remotedomain');
      $eventUrl = $this->app->erp->Firmendaten('api_eventurl');
      $enable = $this->app->erp->Firmendaten('api_enable');
      $cleanUtf8 = $this->app->erp->Firmendaten('api_cleanutf8');
      $importWarteschlange = $this->app->erp->Firmendaten('api_importwarteschlange');
      $importWarteschlangeName = $this->app->erp->Firmendaten('api_importwarteschlange_name');
      $apiOhneHtmlUmwandlung = $this->app->erp->Firmendaten('apiohnehtmlumwandlung');

      if(empty($remoteDomain)){
        return;
      }

      $sql = "SELECT `id` FROM `api_account` WHERE remotedomain = '" . $remoteDomain . "'";
      $isExisting = $this->app->DB->Select($sql) > 0;

      if($isExisting){
        return;
      }

      $availablePermissions = [];
      foreach ($this->getGroupedPermissions() as $group => $permissions) {
        $availablePermissions = array_merge($availablePermissions, $permissions);
      }

      $sql =
        "INSERT INTO `api_account` (
      `bezeichnung`, 
      `initkey`, 
      `importwarteschlange_name`,
      `event_url`,
      `remotedomain`,
      `aktiv`,
      `importwarteschlange`,
      `cleanutf8`,
      `uebertragung_account`,
      `projekt`,
      `is_legacy`,
      `permissions`,                     
      `ishtmltransformation`
      ) VALUES (
      'Migration - " . $remoteDomain . "',
      '" . $initKey . "',
      '" . $importWarteschlangeName . "',
      '" . $eventUrl . "',
      '" . $remoteDomain . "',
      " . $enable . ",
      " . $importWarteschlange . ",
      " . $cleanUtf8 . ",
      0,
      0,
      0,
      '" . json_encode($availablePermissions) ."',
      " . $apiOhneHtmlUmwandlung . "
      )";

      $isInserted = (bool)$this->app->DB->Insert($sql);

      if($isInserted){
        $apiId = $this->app->DB->GetInsertID();

        /** @var SystemConfigModule $systemConfig */
        $systemConfig = $this->app->Container->get('SystemConfigModule');
        $systemConfig->setValue('apiaccount','migratedapiid',$apiId);

        $this->app->erp->FirmendatenSet('api_initkey','');
        $this->app->erp->FirmendatenSet('api_remotedomain','');
        $this->app->erp->FirmendatenSet('api_eventurl','');
        $this->app->erp->FirmendatenSet('api_enable',0);
        $this->app->erp->FirmendatenSet('api_cleanutf8',0);
        $this->app->erp->FirmendatenSet('api_importwarteschlange',0);
        $this->app->erp->FirmendatenSet('api_importwarteschlange_name','');
        $this->app->erp->FirmendatenSet('apiohnehtmlumwandlung',0);


        $emptyValues = [
          'api_initkey' => '',
          'api_remotedomain' => '',
          'api_eventurl' => '',
          'api_enable' => 0,
          'api_cleanutf8' => 0,
          'api_importwarteschlange' => 0,
          'api_importwarteschlange_name' => '',
          'apiohnehtmlumwandlung' => 0
        ];
        foreach ($emptyValues as $name => $emptyValue){
          $sql = "UPDATE `firmendaten_werte` SET `wert` = '".$emptyValue. "' WHERE `name` = '".$name."'";
          $this->app->DB->Update($sql);
        }
      }
    }

    private function migrateNewActions()
    {
      $customActions = $this->getLegacyApiCustomActions();
      if(empty($customActions)) {
        return;
      }
      $group = 'custom';
      $accounts = $this->app->DB->SelectPairs(
        'SELECT `id`, `permissions` FROM `api_account` WHERE `is_legacy` = 1'
      );
      $accountsWithPermissions = [];
      foreach($accounts as $accountId => $jsonEncodedPermissions) {
        $permissionDecoded = json_decode($jsonEncodedPermissions, true)?:[];
        if(!in_array('standard_custom', $permissionDecoded)) {
          continue;
        }

        $accountsWithPermissions[$accountId] = $permissionDecoded;
      }

      $hasAccountPermissionChanged = false;
      foreach($customActions as $customAction) {
        $permissionKey = 'standard_'.$customAction;
        // check if permission exists in table
        $result = $this->app->DB->Count("SELECT * FROM `api_permission` WHERE `key` = '$permissionKey'");
        if($result !== 0){
          continue;
        }
        // if it does not exist, insert it
        $this->app->DB->InsertArr('api_permission', 'id', [
          'key' => $permissionKey,
          'group' => $group
        ]);
        if(empty($accountsWithPermissions)) {
          continue;
        }
        $hasAccountPermissionChanged = true;
        foreach($accountsWithPermissions as $accountId => $permissions) {
          $accountsWithPermissions[$accountId][] = $permissionKey;
        }
      }

      if(!$hasAccountPermissionChanged) {
        return;
      }
      foreach($accountsWithPermissions as $accountId => $permissions) {
        $this->app->DB->Update(
          sprintf(
            "UPDATE `api_account` SET `permissions` = '%s' WHERE `id` = %d",
            $this->app->DB->real_escape_string(json_encode($permissions)), $accountId
          )
        );
      }
    }

    private function migrateApiAccounts()
    {
      $isMigrated = $this->app->DB->Query("SHOW COLUMNS FROM `api_account` LIKE 'is_legacy'")->num_rows > 0;
      if(!$isMigrated){
        $availablePermissions = [];
        foreach ($this->getGroupedPermissions() as $group => $permissions) {
          $availablePermissions = array_merge($availablePermissions, $permissions);
        }
        $this->app->erp->CheckColumn('is_legacy', 'tinyint(1)', 'api_account',"DEFAULT '1' NOT NULL");
        $apiAccounts = $this->app->DB->SelectArr('SELECT * FROM `api_account`');
        foreach ($apiAccounts as $apiAccount){
          $this->app->DB->Update(
            sprintf(
              "UPDATE `api_account` SET `permissions` = '%s' WHERE `id` = %d",
              json_encode($availablePermissions),
              $apiAccount['id']
            )
          );
        }
        $this->app->erp->UpdateColumn('is_legacy', 'tinyint(1)', 'api_account',"DEFAULT '0' NOT NULL");
      }
    }

    private function getGroupedPermissions()
    {
      return [
        'accounts' => [
          'standard_accountlist',
          'standard_accountlogin',
          'standard_accountcreate',
          'standard_accountedit',
          'standard_adresseaccountsget',
        ],
        'addresses' => [
          'standard_adressecreate',
          'standard_adresseedit',
          'standard_adresseget',
          'standard_adresselisteget',
          'standard_adressegruppenget',
          'create_address', // /v1/adressen - POST
          'list_addresses', // /v1/adressen - GET
          'view_address', // /v1/adressen/{id:\d+} - GET
          'edit_address', // /v1/adressen/{id:\d+} - PUT
        ],
        'address_types' => [
          'create_address_type', // /v1/adresstyp - POST
          'list_address_types', // /v1/adresstyp - GET
          'view_address_type', // /v1/adresstyp/{id:\d+} - GET
          'edit_address_type', // /v1/adresstyp/{id:\d+} - PUT
        ],
        'articles' => [
          'standard_artikelcreate',
          'standard_artikeledit',
          'standard_artikelget',
          'standard_artikellist',
          'standard_artikelstueckliste',
          'standard_artikelstuecklistecreate',
          'standard_artikelstuecklisteedit',
          'standard_artikelstuecklistelist',
          'standard_artikelkontingenteget',
          'standard_preiseedit',
          'list_articles', // /v1/artikel - GET
          'view_article', // /v1/artikel/{id:\d+} - GET
        ],
        'article_categories' => [
          'standard_artikelkategorienlist',
          'create_article_category', // /v1/artikelkategorien - POST
          'list_article_categories', // /v1/artikelkategorien - GET
          'view_article_category', // /v1/artikelkategorien/{id:\d+} - GET
          'edit_article_category', // /v1/artikelkategorien/{id:\d+} - PUT
        ],
        'contacts' => [
          'standard_ansprechpartnercreate',
          'standard_ansprechpartneredit',
          'standard_adressekontaktcreate',
          'standard_adressekontaktedit',
          'standard_adressekontaktget',
          'standard_adressekontaktlist',
        ],
        'countries' => [
          'create_country', // /v1/laender - POST
          'list_countries', // /v1/laender - GET
          'view_country', // /v1/laender/{id:\d+} - GET
          'edit_country', // /v1/laender/{id:\d+} - PUT
        ],
        'credit_memos' => [
          'standard_gutschriftget',
          'standard_gutschriftedit',
          'standard_gutschriftcreate',
          'standard_gutschriftfreigabe',
          'standard_gutschriftversenden',
          'standard_gutschriftarchivieren',
          'list_credit_memos', // /v1/belege/gutschriften - GET
          'view_credit_memo', // /v1/belege/gutschriften/{id:\d+} - GET
        ],
        'crm_documents' => [
          'create_crm_document', // /v1/crmdokumente - POST
          'list_crm_documents', // /v1/crmdokumente - GET
          'view_crm_document', // /v1/crmdokumente/{id:\d+} - GET
          'edit_crm_document', //  /v1/crmdokumente/{id:\d+} - PUT
          'delete_crm_document' // /v1/crmdokumente/{id:\d+} - DELETE
        ],
        'delivery_addresses' => [
          'standard_lieferadressecreate',
          'standard_lieferadresseedit',
          'create_delivery_address', // /v1/lieferadressen - POST
          'list_delivery_addresses', // /v1/lieferadressen - GET
          'view_delivery_address', // /v1/lieferadressen/{id:\d+} - GET
          'edit_delivery_address', // /v1/lieferadressen/{id:\d+} - PUT
          'delete_delivery_address', // /v1/lieferadressen/{id:\d+} - DELETE
        ],
        'delivery_note' => [
          'standard_lieferscheinget',
          'standard_lieferscheinedit',
          'standard_lieferscheincreate',
          'standard_lieferscheinfreigabe',
          'standard_lieferscheinversenden',
          'standard_lieferscheinarchivieren',
          'list_delivery_notes', // /v1/belege/lieferscheine - GET
          'view_delivery_note', // /v1/belege/lieferscheine/{id:\d+} - GET
        ],
        'documents' => [
          'standard_belegelist',
          'standard_belegpdf',
          'standard_belegpdfheader',
          'standard_mappingget',
          'standard_mappingset',
          'list_documents', // /v1/belege - GET
        ],
        'document_actions' => [
          'standard_angebotzuauftrag',
          'standard_auftragzurechnung',
          'standard_weiterfuehrenauftragzurechnung',
          'standard_weiterfuehrenrechnungzugutschrift'
        ],
        'files' => [
          'standard_dateilist',
          'standard_dateivorschau',
          'standard_dateidownload',
          'standard_dateiheader',
          'standard_shopimages',
          'create_file', // /v1/dateien - POST
          'list_files', //  /v1/dateien - GET
          'view_file', // /v1/dateien/{id:\d+} - GET
          'handle_assets', // /assets/{assetfile}
        ],
        'gobnav' => [
          'handle_navision' // /v1/gobnavconnect - POST
        ],
        'groups' => [
          'standard_gruppecreate',
          'standard_gruppeedit',
          'standard_gruppeget',
          'standard_gruppenlist',
          'create_group', // /v1/gruppen - POST
          'list_groups', // /v1/gruppen - GET
          'view_group', // /v1/gruppen/{id:\d+} - GET
          'edit_group', //  /v1/gruppen/{id:\d+} - PUT
        ],
        'invoices' => [
          'standard_rechnungget',
          'standard_rechnungedit',
          'standard_rechnungcreate',
          'standard_rechnungversenden',
          'standard_rechnungfreigabe',
          'standard_rechnungarchivieren',
          'standard_rechnungversendetmarkieren',
          'standard_rechnungalsbezahltmarkieren',
          'list_invoices', // /v1/belege/rechnungen
          'view_invoice', // /v1/belege/rechnungen/{id:\d+} - GET
          'delete_invoice' // /v1/belege/rechnungen/{id:\d+} - DELETE
        ],
        'mobile_app' => [
          'mobile_app_communication' // /v1/mobileapi/dashboard
        ],
        'opentrans' => [
          'handle_opentrans', // all /opentrans endpoints
        ],
        'orders' => [
          'standard_auftragcreate',
          'standard_auftragedit',
          'standard_auftragget',
          'standard_auftragfreigabe',
          'standard_auftragabschliessen',
          'standard_auftragversenden',
          'standard_auftragarchivieren',
          'list_orders', // /v1/belege/auftraege - GET
          'view_order' // /v1/belege/auftraege/{id:\d+} - GET
        ],
        'payment_methods' => [
          'create_payment_method', // /v1/zahlungsweisen - POST
          'list_payment_methods', // /v1/zahlungsweisen - GET
          'view_payment_method', // /v1/zahlungsweisen/{id:\d+} - GET
          'edit_payment_method', // /v1/zahlungsweisen/{id:\d+} - PUT
        ],
        'projects' => [
          'standard_projektliste',
          'standard_projektget',
          'standard_projektcreate',
          'standard_projektedit',
        ],
        'properties' => [
          'create_property',
          'list_property',
          'view_property',
          'edit_property',
          'delete_property',
        ],
        'property_values' => [
          'create_property_value',
          'list_property_value',
          'view_property_value',
          'edit_property_value',
          'delete_property_value',
        ],
        'quotes' => [
          'standard_angebotcreate',
          'standard_angebotedit',
          'standard_angebotget',
          'standard_angebotfreigabe',
          'standard_angebotversenden',
          'standard_angebotarchivieren',
          'list_quotes', // /v1/belege/angebote - GET
          'view_quote', // /v1/belege/angebote/{id:\d+} - GET
        ],
        'reports' => [
          'standard_exportvorlageget',
          'standard_berichteget',
          'view_report' // /v1/reports/{id:\d+}/download
        ],
        'resubmissions' => [
          'create_resubmission', // /v1/wiedervorlagen - POST
          'list_resubmissions', // /v1/wiedervorlagen - GET
          'view_resubmission', // /v1/wiedervorlagen/{id:\d+} - GET
          'edit_resubmission', // /v1/wiedervorlagen/{id:\d+} - PUT
        ],
        'returns' => [
          'standard_retoureget',
          'standard_retoureedit',
          'standard_retourecreate',
        ],
        'scanned_documents' => [
          'create_scanned_document', // /v1/docscan - POST
          'list_scanned_documents', // /v1/docscan - GET
          'view_scanned_document', // /v1/docscan/{id:\d+} - GET
        ],
        'shipping_methods' => [
          'create_shipping_method', // /v1/versandarten - POST
          'list_shipping_methods', // /v1/versandarten - GET
          'view_shipping_method', // /v1/versandarten/{id:\d+} - GET
          'edit_shipping_method', // /v1/versandarten/{id:\d+} - PUT
        ],
        'shop_communication' => [
          'communicate_with_shop' // all routes with /shopimport
        ],
        'storage' => [
          'view_storage_batch', // /v1/lagercharge - GET
          'view_storage_best_before', // /v1/lagermhd - GET
        ],
        'subscriptions' => [
          'standard_adresseaboartikelcreate',
          'standard_adresseaboartikeledit',
          'standard_adresseaboartikelget',
          'standard_adresseaboartikellist',
          'create_subscription', // /v1/aboartikel - POST
          'list_subscriptions', // v1/aboartikel - GET
          'view_subscription', // /v1/aboartikel/{id:\d+} - GET
          'edit_subscription', // /v1/aboartikel/{id:\d+} - PUT
          'delete_subscription', //  /v1/aboartikel/{id:\d+} - DELETE
        ],
        'subscription_groups' => [
          'standard_adresseabogruppecreate',
          'standard_adresseabogruppeedit',
          'standard_adresseabogruppeget',
          'standard_adresseabogruppelist',
          'create_subscription_group', // /v1/abogruppen - POST
          'list_subscription_groups', // /v1/abogruppen - GET
          'view_subscription_group', // /v1/abogruppen/{id:\d+} - GET
          'edit_subscription_group', // /v1/abogruppen/{id:\d+} - PUT
        ],
        'supply_orders' => [
          'standard_bestellungget',
          'standard_bestellungedit',
          'standard_bestellungcreate',
          'standard_bestellungfreigabe',
        ],
        'system_settings' => [
          'standard_etikettendrucker',
          'standard_servertimeget'
        ],
        'tax_rates' => [
          'create_tax_rate', // /v1/steuersaetze - POST
          'list_tax_rates', // /v1/steuersaetze - GET
          'view_tax_rate', // /v1/steuersaetze/{id:\d+} - GET
          'edit_tax_rate', // /v1/steuersaetze/{id:\d+} - PUT
        ],
        'employee_interactions' => [
          'standard_stechuhrstatusget',
          'standard_stechuhrstatusset',
          'standard_stechuhrsummary',
          'standard_zeiterfassungget',
          'standard_zeiterfassungcreate',
          'standard_zeiterfassungedit',
          'standard_zeiterfassungdelete',
          'standard_reisekostenversenden',
          'standard_sessionstart',
          'standard_sessionclose',
        ],
        'tracking_numbers' => [
          'create_tracking_number', // /v1/trackingnummern - POST
          'list_tracking_numbers', // /v1/trackingnummern - GET
          'view_tracking_number', // /v1/trackingnummern/{id:\d+} - GET
          'edit_tracking_number', // /v1/trackingnummern/{id:\d+} - PUT
        ],
        'users' => [
          'standard_benutzercreate',
          'standard_benutzeredit',
          'standard_benutzerget',
          'standard_benutzerlist',
          'standard_benutzergetrfid',
        ],
        'custom' => [
          'standard_custom'
        ]
      ];
    }

    private function renamePermissions()
    {
      $hasLegacyPermissions = $this->app->DB->Count("SELECT `id` FROM `api_permission` WHERE `key` LIKE 'legacy_%'") > 0;
      if(!$hasLegacyPermissions) {
        return;
      }
      // rename permissions in api_permission table with extra condition if legacy and standard keys exist
      $this->app->DB->Delete(
        "DELETE `ap1` 
        FROM `api_permission` AS `ap1`
        INNER JOIN `api_permission` AS `ap2` ON ap1.key = replace(ap2.key, 'standard_', 'legacy_')
        WHERE ap1.key LIKE 'legacy_%' AND ap2.key LIKE 'standard_%'"
      );
      $this->app->DB->Update(
        "UPDATE `api_permission`
        SET `key` = REPLACE(`key`, 'legacy_', 'standard_')
        WHERE `key` LIKE 'legacy_%'"
      );
      // rename permissions in api_account
      $this->app->DB->Update(
        "UPDATE `api_account` SET `permissions` = REPLACE(`permissions`, 'legacy_', 'standard_')"
      );
    }

    /**
     * @return array
     */
    private function getLegacyApiCustomActions()
    {
      if(!is_file(__DIR__.'/api_custom.php')) {
        return [];
      }

      /** @var Benutzer $users **/
      $users = $this->app->loadModule('benutzer');
      $permissions = $users->getActionsFromFile(__DIR__.'/api_custom.php');
      if(empty($permissions)) {
        return [];
      }

      return $permissions;
    }

    function fillApiPermissions()
    {
      foreach ($this->getGroupedPermissions() as $group => $permissions){
        foreach ($permissions as $permission){
          // check if permission exists in table
          $result = $this->app->DB->Count("SELECT * FROM `api_permission` WHERE `key` = '$permission'");
          if($result !== 0){
            continue;
          }
          // if it does not exist, insert it
          $this->app->DB->InsertArr('api_permission', 'id', [
            'key' => $permission,
            'group' => $group
          ]);
        }
      }
    }

    /**
     * @param int $apiId
     */
    public function setApiId($apiId)
    {
      $this->api_id = $apiId;
    }

  function ApiXMLTest(){
    $xml_data = new SimpleXMLExtended();
    $test = array('adresse' => array( 'name' => 'mustermann', 'vorname' => 'max'));
    echo $xml_data->asXML();
    echo "stop";
    $this->app->ExitXentral();
  }


  /**
   * returns Projekt ID
   *
   * @param string $value
   *
   * @return bool|int
   */
  private function getProjektId($value)
  {
    if($value != ''){
      if($this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$value."' LIMIT 1")){
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$value."' LIMIT 1");
      }
      else if($this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$value."' LIMIT 1")){
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$value."' LIMIT 1");
      }
      return (int)$projekt;
    }

    return false;
  }

  /**
   * returns Adresse ID
   *
   * @param string $value
   *
   * @return bool|int
   */
  private function getAdressId($value)
  {
    if(!empty($value)){
      if(is_numeric($value))
      {
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE id = '".$value."' LIMIT 1");
      }
      if(empty($adresse))
      {
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer = '".$value."' LIMIT 1");
      }
      return (int)$adresse;
    }
    return false;
  }

  /** loads email settings from firmendaten
   * used in few requests to send documents
   *
   * @return void
   */
  private function getEmailSettings()
  {
      $benutzername = $this->app->erp->Firmendaten('benutzername');
      $passwort = $this->app->erp->Firmendaten('passwort');
      $host = $this->app->erp->Firmendaten('host');
      $port = $this->app->erp->Firmendaten('port');
      $mailssl = $this->app->erp->Firmendaten('mailssl');
      $mailanstellesmtp = $this->app->erp->Firmendaten('mailanstellesmtp');
      $noauth = $this->app->erp->Firmendaten('noauth');

      // mail
      $this->app->mail = new PHPMailer($this->app);
      $this->app->mail->CharSet = 'UTF-8';
      $this->app->mail->PluginDir = 'plugins/phpmailer/';

      if($mailanstellesmtp == '1'){
          $this->app->mail->IsMail();
      }else{
          $this->app->mail->IsSMTP();

          if($noauth == '1') {
              $this->app->mail->SMTPAuth = false;
          } else {
              $this->app->mail->SMTPAuth = true;
          }

          if($mailssl == 1){
              $this->app->mail->SMTPSecure = 'tls';                 // sets the prefix to the servier
          }
          else if($mailssl == 2){
              $this->app->mail->SMTPSecure = 'ssl';                 // sets the prefix to the servier
          }

          $this->app->mail->Host = $host;

          $this->app->mail->Port = $port;                   // set the SMTP port for the GMAIL server

          $this->app->mail->Username = $benutzername;  // GMAIL username
          $this->app->mail->Password = $passwort;            // GMAIL password
      }
  }

  function ApiServerTimeGet(){
    $this->XMLResponse(1,'<servertime>'.time().'</servertime>');
    $this->app->ExitXentral();
  }



  function ApiBenutzerGetRFID()
  {
    $xmldata = $this->XMLPost();
    if ($xmldata['rfid'] == '') {
      $this->XMLResponse(5, "<error>RFID fehlt</error>");
      $this->app->ExitXentral();
    }
    $rfid = $this->app->DB->real_escape_string($xmldata['rfid']);
    $id = $this->app->DB->Select("SELECT id FROM user WHERE activ=1 AND rfidtag='$rfid' AND rfidtag!='' LIMIT 1");
    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLBenutzer($id));
    }
    else{
      $this->XMLResponse(5, '<error>fehlerhafte RFID</error>');
    }
    $this->app->ExitXentral();
  }

  function ApiBenutzerList()
  {
    $user = $this->app->DB->SelectArr("SELECT id,adresse,rfidtag FROM user WHERE activ = 1");
    if($user)
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<user>
</user>
XML;

      $_xmlobj = new SimpleXMLExtended($xmlstr);
      $items = $_xmlobj->AddChild('items');
      foreach($user as $value){
        $item = $items->AddChild('item');
        foreach($value as $key => $data){
          $item->AddChild($key,$data);
        }
      }
      $xml = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<user>",'</user>'),array('','',''),$_xmlobj->asXML());
      $this->XMLResponse(1,$xml);
    }else{
      $this->XMLResponse(8);
    }
    $this->app->ExitXentral();
  }

  function ApiStechuhrSummary()
  {
    $xmldata = $this->XMLPost();
    if ($xmldata['adresse'] == '') {
      $this->XMLResponse(5, '<error>AdresssID fehlt</error>');
      $this->app->ExitXentral();
    }
    $id = $xmldata['adresse'];
    $jahr = date("Y");
    $aktjahr = (int)date('Y');
    $vorjahr = $jahr-1;


    $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<stechuhrsummary>
</stechuhrsummary>
XML;

    $_xmlobj = new SimpleXMLElement($xmlstr);
    $datum = date("Y", time());

    $mitarbeiterzeiterfassung = $this->app->erp->LoadModul('mitarbeiterzeiterfassung');
    if($mitarbeiterzeiterfassung){
      $ueberstundenwerte = $mitarbeiterzeiterfassung->GetUeberstundenRaw($id);
      $urlaub = $mitarbeiterzeiterfassung->GetRestUrlaub($id, date("Y", time()), true);
      $mitarbeiterSollstunden = $mitarbeiterzeiterfassung->getSollstundenByAdresse($id);
    }

    $items = $_xmlobj->AddChild("mitarbeiter_adresse",$id);
    $items->addAttribute('type', 'documentary');
    $_xmlobj->AddChild("ZeitRequest",date("c"));
    $_xmlobj->AddChild("UrlaubSoll",$urlaub['soll']);
    $_xmlobj->AddChild("UrlaubIst",$urlaub['ist']);

    $_xmlobj->AddChild("UeberstundenMonat",$ueberstundenwerte['aktuell']);
    $_xmlobj->AddChild("UeberstundenGesamt",$ueberstundenwerte['gesamt']);


    $_xmlobj->AddChild("KW", date("N"));
    $einzelauflistung = $_xmlobj->AddChild("Einzelauflistung");
    $arbeitswoche = $einzelauflistung->AddChild("Kalenderwoche");
    $kalenderwoche = $arbeitswoche->AddChild("KW",date("W"));
    $wochentageKw = $this->wochentageinKW(date("d.m.Y"));


    foreach($wochentageKw as $wochentag){
      // Hier brauch ich einfach die entsprechende Soll/Ist Arbeitszeit für den übergebenden Tag
      $arbeitszeitensummary['sollaz'] = round($mitarbeiterSollstunden[$this->app->String->Convert($wochentag,'%1.%2.%3','%3-%2-%1')]['soll'] / 60,2);
      $arbeitszeitensummary['istaz'] = round($mitarbeiterSollstunden[$this->app->String->Convert($wochentag,'%1.%2.%3','%3-%2-%1')]['ist'] / 60,2) ;
      $arbeitszeiten = $arbeitswoche->AddChild("Arbeitstag");
      $arbeitszeiten->AddChild("Datum",$wochentag);
      $arbeitszeiten->AddChild("ArbeitszeitSoll",$arbeitszeitensummary['sollaz']);
      $arbeitszeiten->AddChild("ArbeitszeitIst",$arbeitszeitensummary['istaz']);
      $arbeitsevents = $arbeitszeiten->AddChild("ArbeitsEvents");
      $status = $this->app->DB->SelectArr("Select status, TIME_FORMAT(datum,'%H:%i') as zeit from stechuhr where DATE_FORMAT(datum,'%d.%m.%Y')= '$wochentag' AND adresse = '$id' order by datum asc");
      foreach($status as $item){
        $arbeitsevent = $arbeitsevents->AddChild("Event");
        $arbeitseventtyp = $arbeitsevent->AddChild("typ", $item['status']);
        $arbeitseventzeit = $arbeitsevent->AddChild("zeit", $item['zeit']);

      }
    }
    $xml = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<stechuhrsummary>",'</stechuhrsummary>'),array('','',''),$_xmlobj->asXML());
    $this->XMLResponse(1,$xml);
    $this->app->ExitXentral();
  }


    /**
     * @param string $datumvalue
     *
     * @return mixed
     */
    public function wochentageinKW($datumvalue){
    //aktueller Wochentag im Format d.m.Y in der KW
    $basis = 7; // wochentage
    $datum = new DateTime($datumvalue);
    $wochentag = $datum->format("N");
    $datumBefore = new DateTime($datumvalue);
    $datumAfter = new DateTime($datumvalue);
    $tage[$wochentag] = $datum->format("d.m.Y");
    if($wochentag > 1) {
      $counter = $wochentag - 1;
      while ($counter > 0 ) {
        $datumBefore->modify('-1 days');
        $tage[$counter] = $datumBefore->format("d.m.Y");
        $counter--;
      }
    }
    $counter = $wochentag + 1;
    while($counter <= $basis){
      $datumAfter->modify('+1 days');
      $tage[$counter] = $datumAfter->format("d.m.Y");
      $counter++;
    }
    ksort($tage);

    return $tage;
  }


  public function ApiStechuhrStatusGet()
  {

    $xmldata = $this->XMLPost();
    if ($xmldata['adresse'] == '') {
      $this->XMLResponse(5, "<error>AdresssID fehlt</error>");
      $this->app->ExitXentral();
    }
    $adresse = $xmldata['adresse'];
    $user = $xmldata['user'];
    $status = $this->app->DB->SelectRow("Select status, REPLACE(REPLACE(ROUND(TIMESTAMPDIFF(MINUTE,datum,now()) / 60, 2),'-',''),'.','.') as seit,TIMESTAMPDIFF(HOUR,datum,now()) as dd, kommen  from stechuhr where adresse = ".$adresse." order by datum desc limit 1");

    $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<stechuhrstatus>
</stechuhrstatus>
XML;

    $_xmlobj = new SimpleXMLElement($xmlstr);
    $_xmlobj->AddChild("status",$status['status']);
    $_xmlobj->AddChild("seit",$status['seit']);
    $_xmlobj->AddChild("dd",$status['dd']);
    $_xmlobj->AddChild("kommen",$status['kommen']);
    $xml = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<stechuhrstatus>",'</stechuhrstatus>'),array('','',''),$_xmlobj->asXML());
    $this->XMLResponse(1,$xml);

    $this->app->ExitXentral();
  }

  function ApiStechuhrStatusSet()
  {

    $xmldata = $this->XMLPost();
    if ($xmldata['cmd'] == '') {
      $this->XMLResponse(5, "<error>CMD fehlt</error>");
      $this->app->ExitXentral();
    }
    $cmd = $xmldata['cmd'];
    $user = (int)$xmldata['user'];
    if($user){
      $user = $this->app->DB->Select("SELECT id FROM user WHERE id='$user' and activ = '1' LIMIT 0,1");
    }

    if(!$user){
      $adresse = (int)$xmldata['adresse'];
      if($adresse) {
        $user = $this->app->DB->Select("SELECT id FROM user WHERE adresse='$adresse' and activ = '1' LIMIT 0,1");
      }
      if(!$user){
        $this->XMLResponse(5, "<error>Userid oder Adressid fehlerhaft</error>");
        $this->app->ExitXentral();
      }
    }else{
      $adresse = $this->app->DB->Select("SELECT adresse FROM user where id='$user' LIMIT 0,1");
    }

//    if($user == ''){
//      $user = $this->app->DB->Select("SELECT id FROM user WHERE adresese='$adresse' AND ")
//    }
    // wir schauen uns denn aktuellen status an um zu prüfen welche Set Meldungen möglich sind
    $currentstatus = $this->app->DB->Select("Select status from stechuhr where adresse = ".$adresse." order by datum desc limit 1");

    if($currentstatus === 'gehen'){
      // es darf nur der Status 'kommen' funktionieren
      if($cmd !== 'kommen'){
        $this->XMLResponse(5, "<error>Fehlerhafter Status wird uebergeben. Es darf aktuell nur der Status \"kommen\" übergeben werden.</error>");
      }
    }

    if($currentstatus === 'kommen'){
        // es darf nur der Status 'gehen' und 'pausestart' funktionieren
      if( ($cmd !== 'gehen') && ($cmd !== 'pausestart') ){
        $this->XMLResponse(5, "<error>Fehlerhafter Status wird uebergeben. Es darf aktuell nur der Status \"gehen\" und \"pausestart\" übergeben werden.</error>");
      }

    }

    if($currentstatus === 'pausestart'){
      // es darf nur der Status 'gehen' und 'pausestart' funktionieren
      if($cmd !== 'pausestop'){
        $this->XMLResponse(5, "<error>Fehlerhafter Status wird uebergeben. Es darf aktuell nur der Status \"pausestop\" übergeben werden.</error>");
      }
    }


    $kommen = 1;
    if($cmd==='pause' || $cmd==='pausestart' || $cmd==='gehen') {
      $kommen=0;
    }
    $status = '';
    switch($cmd)
    {
      case 'pausestart':
      case 'pausestop':
      case 'kommen':
      case 'gehen':
        $status = $cmd;
        break;

    }
    if($status || $cmd === 'arbeit' || $cmd === 'pause')
    {
      $alterstatus = $this->app->DB->SelectArr("Select status, datum as seit, kommen from stechuhr where adresse = ".$adresse." order by datum desc limit 1");
      if($alterstatus)
      {
        $seit = $alterstatus[0]['seit'];
        $altkommen = $alterstatus[0]['kommen'];
        $alterstatus = $alterstatus[0]['status'];
      }
      if((!$alterstatus && $status === 'kommen') ||
          (!$alterstatus && $status === 'gehen') ||
          ($alterstatus === 'kommen' && $status !== 'kommen') ||
          ($alterstatus === 'gehen' && $status === 'kommen') ||
          ($alterstatus === 'pausestart' && $status === 'pausestop') ||
          ($alterstatus === 'pausestop' && $status === 'pausestart') ||
          ($alterstatus === 'pausestop' && $status === 'gehen') ||
          ($alterstatus === 'pausestart' && $status === 'gehen') ||
          ($cmd === 'arbeit') ||
          ($cmd === 'pause')
      )
      {
        if(!(!$status && $alterstatus && $altkommen == 1 && $kommen == 0 ) ||  $cmd === 'arbeit' || $cmd === 'pause')
        {
          if($status == '' && $kommen == 1 && $alterstatus === 'pausestart') {
            $status = 'pausestop';
          }
          if(($alterstatus === false || $alterstatus === 'gehen')&& $kommen == 1 && $status == '') {
            $status = 'kommen';
          }

          $this->app->DB->Insert("INSERT INTO stechuhr (adresse,user,datum,kommen, status) 
            VALUES ('".$adresse."','".$user."',NOW(),'".$kommen."','".($status)."')");
          $insid = $this->app->DB->GetInsertID();
        }
      }
    }
    $this->XMLResponse(1);
  }

  function ApiProjektCreate() {
    $xmldata = $this->XMLPost();
    if (($xmldata['name'] == '') || ($xmldata['abkuerzung'] == '')) {
      $this->XMLResponse(5, "<error>Name und/oder Abkürzung fehlt</error>");
      $this->app->ExitXentral();
    }

    $name       = $this->app->DB->real_escape_string($xmldata['name']);
    $abkuerzung = $this->app->DB->real_escape_string($xmldata['abkuerzung']);

    //prüfen ob es die abkuerzung schon gibt
    $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($xmldata['abkuerzung'])."' LIMIT 1");
    if($projekt){
      $this->XMLResponse(5, "<error>Abkürzung schon vorhanden. Bitte eine andere wählen.</error>");
      $this->app->ExitXentral();
    }
    $this->app->DB->Insert("INSERT INTO projekt (id,name,abkuerzung) VALUES ('','".$name."','".$abkuerzung."')");

    $xmldata['id'] = $this->app->DB->GetInsertID();

    $this->ApiProjektEdit(true,$xmldata);
    $this->XMLResponse(1, "<id>".$xmldata['id']."</id>");
    $this->app->ExitXentral();
  }

  public function ApiProjektEdit($internal=false,$data='') {
    $xmldata = $this->XMLPost();
    if ($internal){
      $xmldata = $data;
      $id = $this->app->DB->real_escape_string($xmldata['id']);
    }else{
      if( $this->app->DB->real_escape_string($xmldata['id'] =='') && $this->app->DB->real_escape_string($xmldata['projekt'] == '') ){
        $this->XMLResponse(5,'<error>ID oder Projekt muss gesetzt sein</error>');
      }
      if($xmldata['id'] != ''){
        $id = $this->app->DB->real_escape_string($xmldata['id']);
      }else {
        $id = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '" . $this->app->DB->real_escape_string($xmldata['projekt']) . "' LIMIT 1");
      }
    }
    if($id == ''){
      $this->XMLResponse(5,'<error>falsche ID oder Projektkennung</error>');
    }


    unset($xmldata['id']);
    unset($xmldata['projekt']);

    foreach ($xmldata as $key => $value) {
      $insertKey = $this->app->DB->real_escape_string($key);
      $insertValue = $this->app->DB->real_escape_string($value);
      $this->app->DB->Update("UPDATE projekt SET $insertKey='".$insertValue."' WHERE id='$id' LIMIT 1");
    }
    if($internal){
      return;
    }
    $this->XMLResponse(1);

    $this->app->ExitXentral();
  }
  function ApiProjektListe()
  {
    $xml = $this->XMLPost();

    $where = "geloescht <> 1";
    $offset = 0;
    $limit = 1000000;
    if(!empty($xml['offset'])) {
      $offset = (int)$xml['offset'];
    }
    if($offset < 0) {
      $offset = 0;
    }
    if(!empty($xml['limit'])) {
      $limit = (int)$xml['limit'];
    }
    if($limit <= 0) {
      $limit = 1;
    }

    $xml_obj = $this->CreateXmlObj();
    $projekte = $this->app->DB->SelectArr("SELECT * FROM projekt WHERE $where ORDER by abkuerzung LIMIT $offset, $limit");
    if($projekte)
    {
      $this->AddToXMLObj($xml_obj, 'projekt', 'projekte',$projekte);
    }
    $this->XMLResponse(1,$xml_obj, true, false);
    $this->app->ExitXentral();
  }

  function ApiProjektGet()
  {
    $xml = $this->XMLPost();
    $where = "geloescht <> 1";
    $offset = 0;
    $limit = 1000000;
    if(!empty($xml['offset']))$offset = (int)$xml['offset'];
    if($offset < 0)$offset = 0;
    if(!empty($xml['limit']))$limit = (int)$xml['limit'];
    if($limit <= 0)$limit = 1;
    if(!empty($xml['projekt']))
    {
      if($this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$xml['projekt']."' LIMIT 1")){
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$xml['projekt']."' LIMIT 1");
      }
      if($this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$xml['projekt']."' LIMIT 1")){
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$xml['projekt']."' LIMIT 1");
      }
      $where .= " AND projekt = '".((int)$xml['projekt'])."' ";
    }elseif(!empty($xml['abkuerzung']))
    {
      $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($xml['abkuerzung'])."' LIMIT 1");
      $where .= " AND projekt = '".(int)$projekt."' ";
    }
    $xml_obj = $this->CreateXmlObj();
    $projekte = $this->app->DB->SelectArr("SELECT p.* , '' as arbeitspakete FROM projekt p WHERE id = '$projekt' LIMIT 1");
    $this->AddToXMLObj($xml_obj, 'projekt', '',$projekte);
    $arbeitspakete = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE $where LIMIT $offset, $limit");
    if($arbeitspakete)
    {
      $this->AddToXMLObj($xml_obj, 'arbeitspaket', '',$arbeitspakete, $xml_obj->xml->projekt->arbeitspakete);
    }
    $this->XMLResponse(1,$xml_obj, true, false);
    $this->app->ExitXentral();
  }


  function ApiAnsprechpartnerCreate(){
    $xmldata = $this->XMLPost();

    if (($xmldata['name'] == '') || ($xmldata['adresse'] == '')) {
      $this->XMLResponse(5, "<error>AdresseId oder Name fehlt</error>");
      $this->app->ExitXentral();
    }
    $newId = $this->app->erp->CreateAnsprechpartner($xmldata['adresse'],$xmldata);
    $this->XMLResponse(1,"<id>$newId</id>");
    $this->app->ExitXentral();
  }

  function ApiAnsprechpartnerEdit(){
    $xmldata = $this->XMLPost();
    if ($xmldata['id'] == '') {
      $this->XMLResponse(5, "<error>AnsprechpartnerId fehlt</error>");
      $this->app->ExitXentral();
    }

    $id = $xmldata['id'];
    unset($xmldata['id']);

    foreach ($xmldata as $key => $value) {
      $insertKey = $this->app->DB->real_escape_string($key);
      $insertValue = $this->app->DB->real_escape_string($value);

      $this->app->DB->Update("UPDATE ansprechpartner SET $insertKey='".$insertValue."' WHERE id='$id' LIMIT 1");
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiLieferadresseCreate(){
    $xmldata = $this->XMLPost();

    if (($xmldata['name'] == '') || ($xmldata['adresse'] == '')) {
      $this->XMLResponse(5, "<error>AdresseId oder Name fehlt</error>");
      $this->app->ExitXentral();
    }
    $newId = $this->app->erp->CreateLieferadresse($xmldata['adresse'],$xmldata);
    $this->XMLResponse(1,"<id>$newId</id>");
    $this->app->ExitXentral();
  }

  function ApiLieferadresseEdit(){
    $xmldata = $this->XMLPost();
    if ($xmldata['id'] == '') {
      $this->XMLResponse(5, "<error>LieferadresseId fehlt</error>");
      $this->app->ExitXentral();
    }

    $id = $xmldata['id'];
    unset($xmldata['id']);

    foreach ($xmldata as $key => $value) {
      $insertKey = $this->app->DB->real_escape_string($key);
      $insertValue = $this->app->DB->real_escape_string($value);

      $this->app->DB->Update("UPDATE lieferadressen SET $insertKey='".$insertValue."' WHERE id='$id' LIMIT 1");
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }


  function ApiAdresseAboArtikelCreate(){
    $xmldata = $this->XMLPost();


    $this->app->DB->Insert("INSERT INTO abrechnungsartikel (id,bezeichnung)
          VALUES ('','NEUANLAGE')");

    $xmldata['id'] = $this->app->DB->GetInsertID();
    $xmldata['neu'] = "true";
    $this->ApiAdresseAboArtikelEdit($xmldata);
    $this->app->ExitXentral();
  }

  function ApiAdresseAboArtikelEdit($xmldata = false){


    // prüfen auf Mindestfelder
    if($xmldata['neu'] != '') {
      if (($xmldata['artikel'] == '') || ($xmldata['adresse'] == '')) {
        $this->XMLResponse(5, "<error>ArtikelId oder AdresseId fehlt</error>");
        $this->app->ExitXentral();
      }
      if (($xmldata['menge'] == '') || ($xmldata['menge'] == '0')) {
        $this->XMLResponse(5, "<error>Menge fehlt oder ist 0</error>");
        $this->app->ExitXentral();
      }
      $id = $xmldata['id'];
      $adresse = $this->app->DB->real_escape_string($xmldata['adresse']);
    }else{
      $xmldata = $this->XMLPost();
      if($xmldata['id'] == ''){
        $this->XMLResponse(5, "<error>ID fehlt oder ist 0</error>");
        $this->app->ExitXentral();
      }
      $id = $xmldata['id'];
      $adresse = $this->app->DB->Select("SELECT adresse FROM abrechnungsartikel WHERE id = '" . $id . "' LIMIT 1");
    }

    $artikel = $this->app->DB->real_escape_string($xmldata['artikel']);
    $bezeichnung = $this->app->DB->real_escape_string($xmldata['bezeichnung']);
    $nummer = $this->app->DB->real_escape_string($xmldata['nummer']);


    if($xmldata['neu'] != '') {
      if ($xmldata['angelegtamdatum'] == "") $angelegtamdatum = $this->app->String->Convert(date("d.m.Y"), '%1.%2.%3', '%3-%2-%1');
      // Feldvalidierung
      if (!preg_match("(^abo$|^monat$|^monatx$|^jahr$|^wochen$|^einmalig$|^30tage$)", $xmldata['preisart'])) {
        $this->XMLResponse(5, "<error>fehlerhaftes Feld preisart => (abo|monat|monatx|jahr|wochen|einmalig)</error>");
        $this->app->ExitXentral();
      }
      if (!preg_match("(^rechnung$|^auftrag$)", $xmldata['dokument'])) {
        $this->XMLResponse(5, "<error>fehlerhaftes Feld dokument => (rechnung|auftrag)</error>");
        $this->app->ExitXentral();
      }
    }
    if($xmldata['neu'] != '') {
      //prüfen ob die ArtikelId auch ein Artikel ist
      if ($this->app->DB->Select("SELECT id FROM artikel WHERE id = '" . $artikel . "' LIMIT 1")) {
        $artikeldata = $this->app->DB->SelectArr("SELECT id,name_de,nummer FROM artikel WHERE id = '" . $artikel . "' LIMIT 1");
      } elseif ($this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '" . $artikel . "' LIMIT 1")) {
        $artikeldata = $this->app->DB->SelectArr("SELECT id,name_de,nummer FROM artikel WHERE nummer = '" . $artikel . "' LIMIT 1");
      } else {
        $this->XMLResponse(5, "<error>fehlerhafte ArtikelId</error>");
        $this->app->ExitXentral();
      }
      $sql['artikel'] = $artikeldata[0]['id'];
      $sql['nummer'] = $artikeldata[0]['nummer'];
      if ($xmldata['bezeichnung'] == "") {
        // wir nehmen die Bezeichnung des Stammartikel
        $sql['bezeichnung'] = $artikeldata[0]['name_de'];
      } else {
        $sql['bezeichnung'] = $xmldata['bezeichnung'];
      }
    }else{
      if($xmldata['bezeichnung'] != '') {
        $sql['bezeichnung'] = $this->app->DB->real_escape_string($xmldata['bezeichnung']);
      }
    }

    if($xmldata['menge'] != '') { $sql['menge'] = $this->app->DB->real_escape_string($xmldata['menge']); }
    if($xmldata['preis'] != '') { $sql['preis'] = str_replace(',','.',$this->app->DB->real_escape_string($xmldata['preis'])); }
    if($xmldata['preisart'] != '') { $sql['preisart'] = $this->app->DB->real_escape_string($xmldata['preisart']); }
    if($xmldata['sort'] != '') { $sql['sort'] = $this->app->DB->real_escape_string($xmldata['sort']); }
    if($xmldata['lieferdatum'] != '') { $sql['lieferdatum'] = $this->app->DB->real_escape_string($xmldata['lieferdatum']); }
    if($xmldata['neu'] != '') {
      if ($angelegtamdatum != '') { $sql['angelegtam'] = $angelegtamdatum; }
    }
    if($xmldata['angelegtvon'] != '') { $sql['angelegtvon'] = $this->app->DB->real_escape_string($xmldata['angelegtvon']); }
    if($xmldata['status'] != '') { $sql['status'] = $this->app->DB->real_escape_string($xmldata['status']); }
    if($xmldata['projekt'] != '') { $sql['projekt'] = $this->app->DB->real_escape_string($xmldata['projekt']); }
    if($xmldata['wiederholend'] != '') { $sql['wiederholend'] = $this->app->DB->real_escape_string($xmldata['wiederholend']); }
    if($xmldata['zahlzyklus'] != '') { $sql['zahlzyklus'] = $this->app->DB->real_escape_string($xmldata['zahlzyklus']); }
    if($xmldata['adresse'] != '') { $sql['adresse'] = $this->app->DB->real_escape_string($xmldata['adresse']); }

    if($xmldata['gruppe'] != '') {
      $sql['gruppe'] = $this->app->DB->real_escape_string($xmldata['gruppe']);
    } else {
      // wir holen die erste Gruppe sofern es eine gibt
      $sql['gruppe'] = $this->app->DB->Select("SELECT id FROM abrechnungsartikel_gruppe WHERE adresse = '" . $adresse . "' ORDER BY id LIMIT 1");

    }
    if($xmldata['dokument'] != '') { $sql['dokument'] = $this->app->DB->real_escape_string($xmldata['dokument']); }
    if($xmldata['neu'] != '') {
      if ($xmldata['waehrung'] != '') {
        $sql['waehrung'] = $this->app->DB->real_escape_string($xmldata['waehrung']);
      }else{
        $sql['waehrung'] = "EUR";
      }
    }

    if($xmldata['startdatum'] != '') { $sql['startdatum'] = $this->app->String->Convert($xmldata['startdatum'],'%1.%2.%3','%3-%2-%1'); }
    if($xmldata['enddatum'] != '') { $sql['enddatum'] = $this->app->String->Convert($xmldata['enddatum'],'%1.%2.%3','%3-%2-%1'); }
    if($xmldata['abgerechnetbis'] != '') { $sql['abgerechnetbis'] = $this->app->String->Convert($xmldata['abgerechnetbis'],'%1.%2.%3','%3-%2-%1'); }

    // wir aktualisieren
    foreach($sql as $key => $value) {
      if(is_array($value)) {
        $value = '';
      }
      $this->app->DB->Update("UPDATE abrechnungsartikel SET $key='$value' WHERE id='$id' LIMIT 1");
    }

    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAdresseAboArtikelGet($intern = false){
    $id = $this->app->Secure->GetGET("id");
    $adresse = $this->app->Secure->GetGET("adresse");
    $projekt = $this->app->Secure->GetGET("projekt");
    $xmldata = $this->XMLPost();

    if($id=="")$id = $xmldata['id'];
    if($adresse=="")$adresse = $xmldata['adresse'];
    if($projekt=="")$projekt = $xmldata['projekt'];


    if( ($id!="") && ($adresse!="") )
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$this->app->DB->real_escape_string($projekt)."' LIMIT 1");
        $ArtikelDaten = $this->app->DB->SelectArr("SELECT id, bezeichnung, nummer, angelegtam, abgerechnetbis, enddatum, preis, rabatt, waehrung, menge, preisart, gruppe FROM abrechnungsartikel WHERE id='".$this->app->DB->real_escape_string($id)."' AND adresse='".$this->app->DB->real_escape_string($adresse)."' AND projekt='".$this->app->DB->real_escape_string($projekt)."' LIMIT 1");
      } else {
        $ArtikelDaten = $this->app->DB->SelectArr("SELECT id, bezeichnung, nummer, angelegtam, abgerechnetbis, enddatum, preis, rabatt, waehrung, menge, preisart, gruppe FROM abrechnungsartikel WHERE id='".$this->app->DB->real_escape_string($id)."' AND adresse='".$this->app->DB->real_escape_string($adresse)."' LIMIT 1");
      }
    }
    //check
    $id = $this->app->DB->Select("SELECT id FROM abrechnungsartikel WHERE id='".$this->app->DB->real_escape_string($id)."'AND adresse='".$this->app->DB->real_escape_string($adresse)."' LIMIT 1");

    if($id > 0)
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<gruppe>
</gruppe>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
//      $xmlobj = $_xmlobj->AddChild("xml");
      foreach($ArtikelDaten[0] as $key => $value){
        $_xmlobj->AddChild($key,$value);
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<gruppe>",'</gruppe>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
    }
    else
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  function ApiAdresseAboArtikelList($intern = false){
    $adresse = $this->app->Secure->GetGET("adresse");
    $projekt = $this->app->Secure->GetGET("projekt");
    $xmldata = $this->XMLPost();

    if($adresse=="")$adresse = $xmldata['adresse'];
    if($projekt=="")$projekt = $xmldata['projekt'];


    if($adresse!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$this->app->DB->real_escape_string($projekt)."' LIMIT 1");
        $gruppeArtikelDaten = $this->app->DB->SelectArr("SELECT id, bezeichnung, nummer, angelegtam, abgerechnetbis, enddatum, preis, rabatt, waehrung, menge, preisart, gruppe FROM abrechnungsartikel WHERE adresse='".$this->app->DB->real_escape_string($adresse)."' AND projekt='".$this->app->DB->real_escape_string($projekt)."'");
      } else {
        $gruppeArtikelDaten = $this->app->DB->SelectArr("SELECT id, bezeichnung, nummer, angelegtam, abgerechnetbis, enddatum, preis, rabatt, waehrung, menge, preisart, gruppe FROM abrechnungsartikel WHERE adresse='".$this->app->DB->real_escape_string($adresse)."'");
      }
    }

    //check
    $id = $this->app->DB->Select("SELECT id FROM abrechnungsartikel WHERE adresse='".$this->app->DB->real_escape_string($adresse)."' LIMIT 1");

    if($id > 0)
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<gruppeList>
</gruppeList>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
      $items = $_xmlobj->AddChild("items");
      foreach($gruppeArtikelDaten as $value){
        $item = $items->AddChild("item");
        foreach($value as $key => $data){
          $item->AddChild($key,$data);
        }
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<gruppeList>",'</gruppeList>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
    }
    else
    {
      if($intern)return false;
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  function ApiAdresseAboGruppeCreate(){
    $xmldata = $this->XMLPost();
    // prüfen auf Mindestfelder
    if( (!$xmldata['adresse']) || (!$xmldata['beschreibung']) ){
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    $id               = $this->app->DB->real_escape_string($xmldata['adresse']);
    $beschreibung     = $this->app->DB->real_escape_string($xmldata['beschreibung']);
    $beschreibung2    = $this->app->DB->real_escape_string($xmldata['beschreibung2']);
    $ansprechpartner  = $this->app->DB->real_escape_string($xmldata['ansprechpartner']);
    $extrarechnung    = $this->app->DB->real_escape_string($xmldata['extrarechnung']);
    $projekt          = $this->app->DB->real_escape_string($xmldata['projekt']);


    //prüfen wenn Projekt als Id übergeben wird ob es diese gibt
    if($this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$projekt."' LIMIT 1")){
      $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$projekt."' LIMIT 1");
    }elseif($this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$projekt."' LIMIT 1")){
      $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$projekt."' LIMIT 1");
    } else{
      $projekt = '';
    }

    $sort             = $this->app->DB->real_escape_string($xmldata['sort']);
    $gruppensumme     = $this->app->DB->real_escape_string($xmldata['gruppensumme']);
    $rechnungadresse  = $this->app->DB->real_escape_string($xmldata['rechnungadresse']);


    $this->app->DB->Insert("INSERT INTO abrechnungsartikel_gruppe (id,beschreibung,beschreibung2,ansprechpartner,extrarechnung,projekt,adresse,sort,gruppensumme,rechnungadresse) 
          VALUES (
          '',
          '$beschreibung',
          '$beschreibung2',
          '$ansprechpartner',
          '$extrarechnung',
          '$projekt',
          '$id',
          '$sort',
          '$gruppensumme',
          '$rechnungadresse'
          ) ");
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAdresseAboGruppeEdit(){

    $xmldata = $this->XMLPost();
    // prüfen auf Mindestfelder
    if(!$xmldata['id']){
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    $projekt          = $xmldata['projekt'];

    if($projectId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$projekt."' LIMIT 1")){
      $xmldata['projekt'] = $projectId;
    }elseif($projectId = $this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$projekt."' LIMIT 1")){
      $xmldata['projekt'] = $projectId;
    } else{
      $xmldata['projekt'] = '';
    }

    $id = $xmldata['id'];
    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)) {
        $value='';
      }
      if($key!=="id"){
        $insertKey = $this->app->DB->real_escape_string($key);
        $insertValue = $this->app->DB->real_escape_string($value);
        $this->app->DB->Update("UPDATE abrechnungsartikel_gruppe SET $insertKey='$insertValue' WHERE id='$id' LIMIT 1");
      }
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAdresseAboGruppeGet($intern = false){
    $id = $this->app->Secure->GetGET("id");
    $xmldata = $this->XMLPost();
    if($id=="")$id = $xmldata['id'];

    //check
    $id = $this->app->DB->Select("SELECT id FROM abrechnungsartikel_gruppe WHERE id='".$this->app->DB->real_escape_string($id)."' LIMIT 1");
    if($id > 0)
    {
      $gruppeDaten = $this->app->DB->SelectArr("SELECT id, beschreibung, ansprechpartner, extrarechnung, gruppensumme, adresse, projekt, sort, rechnungadresse FROM abrechnungsartikel_gruppe WHERE id='".$this->app->DB->real_escape_string($id)."' LIMIT 1");

      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<gruppe>
</gruppe>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
//      $xmlobj = $_xmlobj->AddChild("xml");
      foreach($gruppeDaten[0] as $key => $value){
        $_xmlobj->AddChild($key,$value);
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<gruppe>",'</gruppe>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
    }
    else
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  function ApiAdresseAboGruppeList($intern = false){
    $adresse = $this->app->Secure->GetGET("adresse");
    $projekt = $this->app->Secure->GetGET("projekt");
    $xmldata = $this->XMLPost();

    if($adresse=="")$adresse = $xmldata['adresse'];
    if($projekt=="")$projekt = $xmldata['projekt'];


    if($adresse!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$this->app->DB->real_escape_string($projekt)."' LIMIT 1");
        $gruppeListDaten = $this->app->DB->SelectArr("SELECT id, beschreibung, ansprechpartner, extrarechnung, gruppensumme, adresse, projekt, sort, rechnungadresse FROM abrechnungsartikel_gruppe WHERE adresse='".$this->app->DB->real_escape_string($adresse)."' AND projekt='".$this->app->DB->real_escape_string($projekt)."'");
      } else {
        $gruppeListDaten = $this->app->DB->SelectArr("SELECT id, beschreibung, ansprechpartner, extrarechnung, gruppensumme, adresse, projekt, sort, rechnungadresse FROM abrechnungsartikel_gruppe WHERE adresse='".$this->app->DB->real_escape_string($adresse)."'");
      }
    }

    //check
    $id = $this->app->DB->Select("SELECT id FROM abrechnungsartikel_gruppe WHERE adresse='".$this->app->DB->real_escape_string($adresse)."' LIMIT 1");

    if($id > 0)
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<gruppeList>
</gruppeList>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
      $items = $_xmlobj->AddChild("items");
      foreach($gruppeListDaten as $value){
        $item = $items->AddChild("item");
        foreach($value as $key => $data){
          $item->AddChild($key,$data);
        }
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<gruppeList>",'</gruppeList>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
    }
    else
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  function ApiArtikelStuecklisteCreate()
  {

    $xml = $this->XMLPost();
    if(isset($xml['stuecklistevonartikel']) && (isset($xml['items']) || isset($xml['item'])))
    {
      $projekt = isset($xml['projekt'])?$xml['projekt']:'';
      if($projekt)
      {
        if(!(is_numeric($projekt) && $this->app->DB->Select("SELECT id FROM projekt WHERE id = '".$projekt."' LIMIT 1")))
        {
          $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($projekt)."' LIMIT 1");
        }
      }
      $stuecklistevonartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht = 0 AND nummer = '".$this->app->DB->real_escape_string($xml['stuecklistevonartikel'])."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
      if($stuecklistevonartikel)
      {
        if(!isset($xml['items']))$xml['items'][0] = $xml['item'];
        if(is_array($xml['items']))
        {
          //alle bisherigen stuecklistenelemente des artikels loeschen
          $this->app->DB->Update("UPDATE artikel SET stueckliste = 0 WHERE id = '$stuecklistevonartikel'");
          $this->app->DB->Delete("DELETE FROM stueckliste WHERE stuecklistevonartikel = '$stuecklistevonartikel'");

          //baut gleiche arraystruktur wenn nur 1 artikel uebergeben wird
          if(isset($xml['items']['item']['art'])){
            $arrayfuer1artikel = $xml['items']['item'];
            $xml['items']['item'] = array();
            $xml['items']['item'][] = $arrayfuer1artikel;
          }

          foreach($xml['items'] as $items => $item)
          {
            foreach($item as $key => $itemwerte)
            {
              $stuecklistenartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht = 0 AND nummer = '".$itemwerte['nummer']."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
              $stuecklisteitem = $this->app->DB->Select("SELECT id FROM stueckliste WHERE stuecklistevonartikel = '$stuecklistevonartikel' AND artikel = '$stuecklistenartikel' LIMIT 1");

              if($stuecklisteitem){
                // update, id ist in $stuecklisteitem
              } else {
                // insert danach update
                $this->app->DB->Insert("INSERT INTO stueckliste (id,artikel,stuecklistevonartikel) VALUES('','$stuecklistenartikel','$stuecklistevonartikel')");
                $stuecklisteitem = $this->app->DB->GetInsertID();
              }

              if($itemwerte['alternative'] != ''){
                $itemwerte['alternative'] = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht = 0 AND nummer = '".$itemwerte['alternative']."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
              }

              if(is_array($itemwerte)){
                foreach($itemwerte as $itemindex=>$itemwert){
                  $this->app->DB->Update("UPDATE stueckliste SET $itemindex = '$itemwert' where id = '$stuecklisteitem'");
                }
              }
            }
          }
          $this->app->DB->Update("UPDATE artikel SET stueckliste = 1 WHERE id = '$stuecklistevonartikel' LIMIT 1");
          $this->ApiArtikelStuecklisteList($stuecklistevonartikel);
          $this->app->ExitXentral();
        }
      }else{
        $this->XMLResponse(5);
        $this->app->ExitXentral();
      }
    }else{
      $this->XMLResponse(4);
      $this->app->ExitXentral();
    }
  }

  function ApiArtikelStuecklisteEdit($id = null, $intern = false)
  {
    if(!$id)$id = $this->app->Secure->GetGET("id");
    $this->ApiArtikelStuecklisteCreate();

  }

  function ApiArtikelStuecklisteList($id = null, $intern = false)
  {
    if(!$id)$id = $this->app->Secure->GetGET("id");
    $xml = $this->XMLPost();
    if(!$id){
      $id= $xml['id'];
    }
    if($id == ''){
      $this->XMLResponse(5,"<error>Fehlerhafte Artikelnummer</error>");
    }
     if(($id && $sl = $this->app->DB->SelectArr("SELECT s.id, s.stuecklistevonartikel, art.nummer as stuecklistevonartikelnummer, trim(s.menge)+0 as menge, s.art, 
     art2.nummer as artikelnummer, art3.nummer as alternativenummer,s.alternative
    FROM stueckliste s 
    INNER JOIN artikel art ON art.id = s.stuecklistevonartikel 
    INNER JOIN artikel art2 ON art2.id = s.artikel 
    LEFT JOIN artikel art3 ON art3.id = s.alternative
    WHERE s.stuecklistevonartikel = '$id'"))
      || (isset($xml['stuecklistevonartikel']) && $sl = $this->app->DB->SelectArr("SELECT s.id, s.stuecklistevonartikel, art.nummer as stuecklistevonartikelnummer, trim(s.menge)+0 as menge, s.art, 
     art2.nummer as artikelnummer, art3.nummer as alternativenummer,s.alternative
    FROM stueckliste s 
    INNER JOIN artikel art ON art.id = s.stuecklistevonartikel 
    INNER JOIN artikel art2 ON art2.id = s.artikel 
    LEFT JOIN artikel art3 ON art3.id = s.alternative WHERE s.stuecklistevonartikel = '".(int)$xml['stuecklistevonartikel']."'"))
      || (isset($xml['stuecklistevonartikel']) && $sl = $this->app->DB->SelectArr("SELECT s.id, s.stuecklistevonartikel, art.nummer as stuecklistevonartikelnummer, trim(s.menge)+0 as menge, s.art, 
     art2.nummer as artikelnummer, art3.nummer as alternativenummer,s.alternative
    FROM stueckliste s 
    INNER JOIN artikel art ON art.id = s.stuecklistevonartikel 
    INNER JOIN artikel art2 ON art2.id = s.artikel 
    LEFT JOIN artikel art3 ON art3.id = s.alternative 
    WHERE art.geloescht = 0 AND art.nummer = '".$xml['stuecklistevonartikel']."'"))
    )
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<stueckliste1>
</stueckliste1>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);

      $xmlobj = $_xmlobj->AddChild('stueckliste','');
      if(isset($sl[0]))
      {
        $stuecklistevonartikelnummer = $xmlobj->AddChild('stuecklistevonartikelnummer');
        $stuecklistevonartikelnummer->value = $sl[0]['stuecklistevonartikelnummer'];
      }
      //$out = '<beleg_list>';
      $i = 0;
      $j = 0;
      if($sl)
      {
        foreach($sl as $row)
        {
          $j++;
          $artikelobj = $xmlobj->AddChild('item');
          foreach($row as $k2 => $v2)
          {
            if(!is_numeric($k2) && $k2 != 'stuecklistevonartikelnummer')
            {
              $_name = '_'.$k2;
              $$_name = $artikelobj->AddChild($k2);
              $$_name->value = $v2;
            }
          }
        }
      }

      $xmlobj->AddChild('anz_result',$j);
      //$xmlobj->AddChild('anz_result',$sql);
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<stueckliste1>",'</stueckliste1>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(5,"<error>Artikelhat keine Stückliste</error>");
    $this->app->ExitXentral();
  }

  function ApiArtikelkategorienList($intern = false)
  {
    $xml = $this->XMLPost();
    $api_id = isset($this->api_id)?$this->api_id:0;
    $exakt = 0;
    if(isset($xml['ID']))$xml['id'] = $xml['ID'];
    if(isset($xml['ID_EXT']))$xml['id_ext'] = $xml['ID_EXT'];
    if(isset($xml['BEZEICHNUNG']))$xml['bezeichnung'] = $xml['BEZEICHNUNG'];
    if(isset($xml['EXAKT']))$xml['exakt'] = $xml['EXAKT'];

    $where = '';
    if($xml['id'])$where .= " AND ak.id = '".(int)$xml['id']."' ";
    if($xml['id_ext'])$where .= " AND am.id_ext = '".$this->app->DB->real_escape_string($xml['id_ext'])."' ";
    if($xml['bezeichnung'])
    {
      if($xml['exakt'] && $xml['exakt'] == 1)
      {
        $where .= " AND ak.bezeichnung like '".$this->app->DB->real_escape_string(base64_decode($xml['bezeichnung']))."' ";
      }else{
        $where .= " AND ak.bezeichnung like '%".$this->app->DB->real_escape_string(base64_decode($xml['bezeichnung']))."%' ";
      }
    }

    $kategorien = $this->app->DB->SelectArr("SELECT ak.*, am.id_ext FROM artikelkategorien ak LEFT JOIN api_mapping am ON am.id_int = ak.id AND am.tabelle = 'artikelkategorien' WHERE geloescht <> 1 $where ORDER BY parent, bezeichnung");
    if($kategorien)
    {
      $out = '<artikelkategorien>';
      foreach($kategorien as $kategorie)
      {
        $out .= '<kategorie>';
        foreach($kategorie as $k => $v)
        {
          $out .= '<'.$k.'>'.htmlspecialchars($v).'</'.$k.'>';
        }
        $out .= '</kategorie>';
      }
      $out .= '</artikelkategorien>';
      if ($intern == true) {
        return $out;
      }
      $this->XMLResponse(1, $out);
      $this->app->ExitXentral();
    }
    if ($intern == true) {
      return false;
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }

  public function ApiDateiHeader()
  {
    $id = (int)$this->app->Secure->GetGET('id');
    if($id)
    {
      $datei = $this->app->DB->SelectArr("SELECT dv.id, ds.parameter FROM datei_version dv INNER JOIN datei_stichwoerter ds ON ds.datei = dv.datei WHERE dv.datei = '$id' ORDER BY  dv.datei DESC, dv.version DESC LIMIT 1");
      if($datei)
      {
        $version = $this->app->DB->Select("SELECT MAX(version) FROM datei_version WHERE datei='$id'");
        $newid = $this->app->DB->Select("SELECT id FROM datei_version WHERE datei='$id' AND version='$version' LIMIT 1");

        /*if($versionid>0)
          $newid = $versionid;*/

        $name = $this->app->DB->Select("SELECT dateiname FROM datei_version WHERE id='$newid' LIMIT 1");
        if(isset($this->app->Conf->WFuserdata))
        {
          $path = $this->app->Conf->WFuserdata.'/dms/'.$this->app->Conf->WFdbname."/".$newid;
        }else
        $path = dirname(dirname(__DIR__)).'/userdata/dms/'.$this->app->Conf->WFdbname."/".$newid;
        //$name=basename($path);

        //filenames in IE containing dots will screw up the
        //filename unless we add this

        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
          $name = preg_replace('/\./', '%2e', $name, substr_count($name, '.') - 1);

        $contenttype= $this->app->erp->content_type($name);
        //required, or it might try to send the serving     //document instead of the file
        $res = "Content-Type: $contenttype\n";
        $res .= "Content-Length: " .(string)(filesize($path))."\n" ;
        $name = $this->app->erp->Dateinamen($name);
        $res .= 'Content-Disposition: attachment; filename="'.$name.'"';
        echo $res;
        $this->app->ExitXentral();
      }
    }
    $this->app->ExitXentral();
  }

  function ApiBelegPDFHeader()
  {
    $id = (int)$this->app->Secure->GetGET('id');
    $beleg = (string)$this->app->Secure->GetGET('beleg');
    if(in_array($beleg, array('auftrag','angebot','rechnung','lieferschein','gutschrift','produktion','retoure')))
    {
      if(!$this->app->DB->Select("SELECT id FROM $beleg WHERE id = '$id' LIMIT 1")) {
        $this->app->ExitXentral();
      }
      $this->app->erp->checkPDFClass($beleg);
      $classcustom = ucfirst($beleg).'PDFCustom';
      $class = ucfirst($beleg).'PDF';
      if(class_exists($classcustom))
      {
        $pdf = new $classcustom($this->app);
      }elseif(class_exists($class))
      {
        $pdf = new $class($this->app);
      }else{
        $this->app->ExitXentral();
      }
      $function = 'Get'.ucfirst($beleg);
      if(method_exists($pdf, $function))
      {
        $pdf->$function($id);
        $res = "Content-type: application/pdf\n";
        $res .= 'Content-Disposition: attachment; filename="'.$pdf->filename.'"';
        echo $res;
        $this->app->ExitXentral();
      }
    }
    $this->app->ExitXentral();
  }

  function ApiBelegPDF()
  {
    $id = (int)$this->app->Secure->GetGET('id');
    $beleg = (string)$this->app->Secure->GetGET('beleg');
    if(in_array($beleg, array('auftrag','angebot','rechnung','lieferschein','gutschrift','produktion','retoure')))
    {
      if(!$this->app->DB->Select("SELECT id FROM $beleg WHERE id = '$id' LIMIT 1"))die('Beleg '.$id.' nicht gefunden');
      $this->app->erp->checkPDFClass($beleg);
      $classcustom = ucfirst($beleg).'PDFCustom';
      $class = ucfirst($beleg).'PDF';
      if(class_exists($classcustom))
      {
        $pdf = new $classcustom($this->app);
      }elseif(class_exists($class))
      {
        $pdf = new $class($this->app);
      }else{
        echo "PDF-Klasse nicht gefunden";
        $this->app->ExitXentral();
      }
      $function = 'Get'.ucfirst($beleg);
      if(method_exists($pdf, $function))
      {
        $pdf->$function($id);
        $pdf->displayDocument($this->app->DB->Select("SELECT schreibschutz FROM $beleg WHERE id = '$id' LIMIT 1"));
      }
    }elseif($beleg != ''){
      echo "Belegart nicht erlaubt";
    }else{
      echo "Belegart nicht angegeben";
    }
    $this->app->ExitXentral();
  }

  function ApiDateiDownload()
  {
    $id = (int)$this->app->Secure->GetGET('id');
    if($id)
    {
      $datei = $this->app->DB->SelectArr("SELECT dv.id, ds.parameter FROM datei_version dv INNER JOIN datei_stichwoerter ds ON ds.datei = dv.datei WHERE dv.datei = '$id' ORDER BY  dv.datei DESC, dv.version DESC LIMIT 1");
      if($datei) {
        $this->app->erp->SendDatei($id);
      }
    }
    $this->app->ExitXentral();
  }

  function ApiDateiVorschau()
  {
    //$xml = $this->XMLPost();
    $datei = $this->app->Secure->GetGET('id');
    $cmd = $this->app->Secure->GetGet('cmd');
    $id = (int)$datei;
    if($id)
    {
      $datei = $this->app->DB->SelectArr("SELECT dv.id, ds.parameter FROM datei_version dv INNER JOIN datei_stichwoerter ds ON ds.datei = dv.datei WHERE dv.datei = '$id'  ORDER BY  dv.datei DESC, dv.version DESC LIMIT 1");
      if(!$datei)
      {
        if ($this->app->erp->Firmendaten('iconset_dunkel')) {
          $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_dunkel.png');
        } else {
          $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_hell.png');
        }
        header('Content-type: image/png');
        echo $str;
        $this->app->ExitXentral();
      }
      if($datei[0]['parameter'])
      {
        if($cmd === 'projekt')
        {
          if(!$this->app->erp->UserProjektRecht($datei[0]['parameter']))
          {
            if ($this->app->erp->Firmendaten('iconset_dunkel')) {
              $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_dunkel.png');
            } else {
              $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_hell.png');
            }
            header('Content-type: image/png');
            echo $str;
            $this->app->ExitXentral();
          }
        }else{
          $projekt = $this->app->DB->Select("SELECT projekt FROM $cmd WHERE id = '".$datei[0]['parameter']."' LIMIT 1");
          if(!$this->app->erp->UserProjektRecht($projekt))
          {
            if ($this->app->erp->Firmendaten('iconset_dunkel')) {
              $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_dunkel.png');
            } else {
              $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_hell.png');
            }
            header('Content-type: image/png');
            echo $str;
            $this->app->ExitXentral();
          }
        }
      }
      //Rechte prüfen

      $userdata = isset($this->app->Conf->WFuserdata)?$this->app->Conf->WFuserdata:str_replace("index.php", "", $_SERVER['SCRIPT_FILENAME'])."../userdata";
      $path = $userdata."/dms/".$this->app->Conf->WFdbname;
      $cachefolder = $path.'/cache';
      if(!file_exists($cachefolder.'/'.$datei[0]['id'].'_100_100'))
      {
        if(file_exists($path.'/'.$datei[0]['id']))
        {
          $type = mime_content_type($path.'/'.$datei[0]['id']);
          switch($type)
          {
            case 'image/jpg':
            case 'image/jpeg':
              $img = new image($this->app);
              $str = $img->scaledPicByFileId($datei[0]['id'], 100, 100);
              header('Content-type: image/jpg');
              echo $str;
              $this->app->ExitXentral();
            break;
            case 'image/png':
              $img = new image($this->app);
              $str = $img->scaledPicByFileId($datei[0]['id'], 100, 100);
              header('Content-type: image/png');
              echo $str;
              $this->app->ExitXentral();
            break;
            case 'image/gif':
              $img = new image($this->app);
              $str = $img->scaledPicByFileId($datei[0]['id'], 100, 100);
              header('Content-type: image/gif');
              echo $str;
              $this->app->ExitXentral();
            break;
            case 'application/pdf':
              $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/pdf.svg');
              header('Content-type: image/png');
              echo $str;
              $this->app->ExitXentral();
            break;
          }
        }
      }

      if(file_exists($cachefolder.'/'.$datei[0]['id'].'_100_100'))
      {
        $type = mime_content_type($path.'/'.$datei[0]['id']);
        if(strpos($type,'image') !== false)
        {
          header('Content-type: '.$type);
          $str = file_get_contents($cachefolder.'/'.$datei[0]['id'].'_100_100');
          echo $str;
          $this->app->ExitXentral();
        }
      }else{
        if ($this->app->erp->Firmendaten('iconset_dunkel')) {
          $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_dunkel.png');
        } else {
          $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_hell.png');
        }
        header('Content-type: image/png');
        echo $str;
        $this->app->ExitXentral();
      }
    }else{
      if ($this->app->erp->Firmendaten('iconset_dunkel')) {
        $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_dunkel.png');
      } else {
        $str = file_get_contents(dirname(__DIR__) . '/themes/new/images/keinbild_hell.png');
      }
      header('Content-type: image/png');
      echo $str;
    }
    $this->app->ExitXentral();
  }

  function ApiCustom()
  {
    $out = null;
    $responsecode = 0;
    $xml = $this->XMLPost();
    $apiid = $this->api_id;
    $this->app->erp->RunHook('apicustom', 4, $apiid, $xml, $responsecode, $out);
    $this->XMLResponse($responsecode, $out);
    $this->app->ExitXentral();
  }

  public function ApiDateiList()
  {
    $xml = $this->XMLPost();
    $parameter = $xml['parameter'];
    $objekt = $xml['objekt'];
    $dateiliste = $this->app->DB->SelectArr( "SELECT d.titel, s.subjekt, v.version, v.ersteller, v.bemerkung, v.datum, d.id FROM 
    datei d LEFT JOIN datei_stichwoerter s ON d.id=s.datei LEFT JOIN datei_version v ON v.datei=d.id WHERE s.objekt LIKE '$objekt' AND s.parameter='$parameter' AND d.geloescht=0");

    if($dateiliste)
    {
      $xml = $this->CreateXmlObj();
      foreach($dateiliste as $k => $datei)
      {
        $_datei = $xml->AddChild('Datei','');
        foreach($datei as $k2 => $row)
        {
          $_datei->AddChild($k2 ,$row);
        }
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>','<?xml version="1.0" encoding="UTF-8"?>',"<response>",'</response>'),array('','','',''),$xml->asXML());
      $this->XMLResponse(1, $out);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }

  function ApiAccountLogin()
  {
    $xml = $this->XMLPost();
    $user = $xml['user'];
    $md5passwort = !empty($xml['md5passwort'])?$xml['md5passwort']:md5($xml['passwort']);

    $art = $xml['art'];
    if(!empty($user) && !empty($md5passwort) && !empty($art))
    {
      $acc = $this->app->DB->SelectArr("SELECT adr.*, aa.benutzername FROM adresse_accounts aa INNER JOIN adresse adr ON aa.adresse = adr.id WHERE adr.geloescht <> 1 AND aa.art = '".$this->app->DB->real_escape_string($art)."' AND aa.aktiv = 1 AND (aa.gueltig_bis = '0000-00-00' OR aa.gueltig_bis >= curdate() or isnull(aa.gueltig_bis)) AND (aa.gueltig_ab = '0000-00-00' OR isnull(gueltig_ab) OR gueltig_ab <= curdate()) AND aa.benutzername = '".$this->app->DB->real_escape_string($user)."' AND md5(aa.passwort) = '".$this->app->DB->real_escape_string($md5passwort)."' AND aa.art = '".$this->app->DB->real_escape_string($art)."' LIMIT 1");
      if($acc)
      {
        $xml = $this->CreateXmlObj();
        $xml->AddChild('name', $acc[0]['name']);
        $xml->AddChild('adresse', $acc[0]['id']);
        $xml->AddChild('benutzername', $acc[0]['benutzername']);
        $out = str_replace(array('<?xml version="1.0" standalone="yes"?>','<?xml version="1.0" encoding="UTF-8"?>',"<response>",'</response>'),array('','','',''),$xml->asXML());
        $this->XMLResponse(1, $out);
        $this->app->ExitXentral();
      }
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }


  function ApiBelegOhnePositionenList(){
    $xml = $this->XMLPost();
    $belegtypen = array('auftrag','rechnung','angebot','lieferschein','gutschrift','retoure');

    //wir holen alle Projektdaten
    $projekteData = $this->app->DB->SelectArr("SELECT id,abkuerzung FROM projekt");
    $projekte = array();
    foreach($projekteData as $value){
      $projekte[$value['id']] = $value['abkuerzung'];
    }

    if(!in_array($xml['beleg'], $belegtypen)){
      $this->XMLResponse(5,"falsscher oder kein Belegtype im Feld beleg angegeben(auftrag,rechnung,angebot,lieferschein,gutschrift)");
      $this->app->ExitXentral();
    }

    $belegtype = $xml['beleg'];

    $sql = "SELECT 
      $belegtype.id AS id,
      $belegtype.projekt AS projekt,
      $belegtype.adresse AS adresse,
      $belegtype.datum AS datum,
      $belegtype.belegnr AS belegnr,
      $belegtype.status AS status,
      $belegtype.land AS land,
      $belegtype.typ AS typ";

    if($belegtype !== 'lieferschein' && $belegtype !== 'retoure'){
      $sql .= ",
      $belegtype.umsatz_netto AS umsatz_netto,
      $belegtype.erloes_netto AS erloes_netto,
      $belegtype.deckungsbeitrag AS deckungsbeitrag,
      $belegtype.provision_summe AS provision_summe,
      $belegtype.gruppe AS gruppe      
      ";
    }
    $sql .= " FROM $belegtype";

    if($xml['status'] != ''){
      $subwhere[] = "status = '" . $xml['status'] . "'";
    }

    if($xml['projekt'] != ''){
        if(!is_numeric($xml['projekt'])){
          $projektId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xml['projekt']."' LIMIT 1");
        }else{
          $projektId = $xml['projekt'];
        }
      $subwhere[] = "projekt = '" . $projektId . "'";
    }

    if($xml['datum_von'] != ''){
      if(!strpos($xml['datum_von'],"-")) {
        $datum_von = $this->app->String->Convert($xml['datum_von'], '%1.%2.%3', '%3-%2-%1');
      }else{
        $datum_von = $xml['datum_von'];
      }
      $subwhere[] = "datum >= '" . $datum_von . "'";
    }

    if($xml['datum_bis'] != ''){
      if(!strpos($xml['datum_bis'],"-")) {
        $datum_bis = $this->app->String->Convert($xml['datum_bis'], '%1.%2.%3', '%3-%2-%1');
      }else{
        $datum_bis = $xml['datum_bis'];
      }
      $subwhere[] = "datum <= '" . $datum_bis . "'";
    }

    if($subwhere)$sql .= " WHERE ".implode(" AND ", $subwhere);

    if($xml['order'] != ''){
      $sql .= " ORDER BY " . $xml['order']['field'];
      if($xml['order']['desc'] == '1'){
        $sql .= " DESC";
      }
      if($xml['order']['asc'] == '1'){
        $sql .= " ASC";
      }
    }

    if($xml['limit'] != '' && $xml['offset'] != ''){
      $sql .= " Limit " . $xml['offset'] . ", " . $xml['limit'];
    }
    $belege = $this->app->DB->SelectArr($sql);

    $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<belege_list1>
</belege_list1>
XML;
    $_xmlobj = new SimpleXMLExtended($xmlstr);

    $xmlobj = $_xmlobj->AddChild('beleg_list','');

    foreach($belege as $beleg) {
      $belegobj = $xmlobj->AddChild('beleg');
      $_belegobj = $belegobj->AddChild('id', $beleg['id']);
      $_belegnr = $belegobj->AddChild('belegnr', $beleg['belegnr']);
      $_projektid = $belegobj->AddChild('projektid',$beleg['projekt']);
      $_projekt = $belegobj->AddChild('projekt',$projekte[$beleg['projekt']]);
      $_adresse = $belegobj->AddChild('adresse',$beleg['adresse']);
      $_datum = $belegobj->AddChild('datum',$beleg['datum']);
      $_status = $belegobj->AddChild('status',$beleg['status']);
      $_land = $belegobj->AddChild('land',$beleg['land']);
      $_typ = $belegobj->AddChild('typ',$beleg['typ']);

      if($belegtype !== 'lieferschein' && $belegtype !== 'retoure'){
        $_umsatz_netto = $belegobj->AddChild('umsatz_netto',$beleg['umsatz_netto']);
        $_erloes_netto = $belegobj->AddChild('erloes_netto',$beleg['erloes_netto']);
        $_deckungsbeitrag = $belegobj->AddChild('deckungsbeitrag',$beleg['deckungsbeitrag']);
        $_provision_summe = $belegobj->AddChild('provision_summe',$beleg['provision_summe']);
        $_gruppe = $belegobj->AddChild('gruppe',$beleg['gruppe']);
      }
    }

    $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<belege_list1>",'</belege_list1>'),array('','',''),$_xmlobj->asXML());
    unset($_xmlobj);
    $this->XMLResponse(1, $out);
    $this->app->ExitXentral();
  }


  function ApiBelegeList()
  {
    $xml = $this->XMLPost();
    if($xml['ausgabe'] === 'belege'){
      $this->ApiBelegOhnePositionenList();
      $this->app->ExitXentral();
    }
    $api_id = isset($this->api_id)?$this->api_id:0;
    $adresse = false;
    $belega = null;
    $belegtypen = array('auftrag','rechnung','angebot','lieferschein','gutschrift','retoure');
    $join = '';
    $extraselect = '';
    $groupbyartikel = false;
    if(isset($xml['groupbyartikel']) && $xml['groupbyartikel'])$groupbyartikel = true;
    $groupbyposition = false;
    if(isset($xml['groupbyposition']) && $xml['groupbyposition'])$groupbyposition = true;
    $groupbyadresse = false;
    if(isset($xml['groupbyadresse']) && $xml['groupbyadresse'])$groupbyadresse = true;
    $groupbybeleg = false;
    if(isset($xml['groupbybeleg']) && $xml['groupbybeleg'])$groupbybeleg = true;
    $groupbybeleg2 = $groupbybeleg;
    $groupbybeleg = false;
    if(isset($xml['beleg']))
    {
      if(is_array($xml['beleg']))
      {
        foreach($xml['beleg'] as $_beleg)
        {
          if(in_array($_beleg, $belegtypen))$belega[] = $_beleg;
        }
      }
      if(in_array($xml['beleg'], $belegtypen))$belega[] = $xml['beleg'];
    }

    if(!$belega)
    {
      $this->XMLResponse(8);
      $this->app->ExitXentral();
    }

    $order = '';
    if(isset($xml['order'])){
      if(!isset($xml['order'][0]))
      {
        $xml['order'][0] = $xml['order'];
      }
      foreach($xml['order'] as $key => $sort)
      {
        $field = '';
        if(isset($sort['field']))
        {
          switch(strtolower($sort['field']))
          {
            case 'artikelkategorie':
              $field = 'ak.bezeichnung';
              if($groupbyartikel)$field = 't.artikelkategoriebezeichnung';
              $join = " INNER JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ ";
              $extraselect = ' ,ak.bezeichnung as artikelkategoriebezeichnung ';
            break;
            case 'status':
            case 'belegnr':
            case 'datum':
              if(!$groupbyartikel)$field = 'r.'.strtolower($sort['field']);
            break;
            case 'nummer':
              if(!$groupbyartikel)$field = 'rp.'.strtolower($sort['field']);
              if($groupbyartikel)$field = 't.'.strtolower($sort['field']);
            break;
            case 'menge':
              if(!$groupbyartikel)$field = 'rp.'.strtolower($sort['field']);
              if($groupbyartikel)$field = 'menge';
            break;
            case 'preis':
            case 'bezeichnung':
              if(!$groupbyartikel)$field = 'rp.'.strtolower($sort['field']);
            break;
            case 'name':
            case 'plz':
            case 'ort':
            case 'telefon':
            case 'land':
            case 'telefax':
            case 'strasse':
              if($groupbyadresse && $groupbyartikel)$field = 't.'.strtolower($sort['field']);
              if(!$groupbyartikel)$field = 'r.'.strtolower($sort['field']);
            break;
            case 'name_de':
            case 'name_en':
            case 'anabregs_text':
            case 'anabregs_text_en':
              if($groupbyartikel)$field = 't.'.strtolower($sort['field']);
            break;
            case 'betrag':
            case 'letztes_datum':
              if($groupbyartikel)$field = strtolower($sort['field']);
            break;
          }
          if(!empty($field))
          {
            if(isset($sort['desc']) && $sort['desc'] == 1)
            {
              $field .= " DESC";
            }
            if($order != '')$order .= ',';
            $order .= $field;
          }
        }
      }
    }
    if($order != '')$order = $order.',';
    if(isset($xml['adresse']))
    {
      $adresse = (int)$xml['adresse'];
    }elseif(isset($xml['id_ext']))
    {
      $adresse = $this->app->DB->Select("SELECT id_int FROM api_mapping WHERE api = '".$api_id."' AND tabelle = 'adresse' AND id_ext = '".$this->app->DB->real_escape_string($xml['id_ext'])."' LIMIT 1");
    }
    if(true)
    {
      $filterkategoriename = false;
      if(isset($xml['status']))
      {
        $subwhere[] = " r.status like '".$this->app->DB->real_escape_string($xml['status'])."' ";
      }
      if(isset($xml['kategorie']))
      {
        $subwhere[] = " a.typ = '".((int)$xml['kategorie'])."_kat' ";
      }
      if(isset($xml['kategoriename']))
      {
        $field = 'ak.bezeichnung';
        $join = " INNER JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ ";
        $extraselect = ' ,ak.bezeichnung as artikelkategoriebezeichnung ';
        $subwhere[] = " ak.bezeichnung like '".$this->app->DB->real_escape_string(base64_decode((string)$xml['kategoriename']))."' ";
        $filterkategoriename = true;
      }
      if(isset($xml['datum_von']))
      {
        $subwhere[] = "r.datum >= '".$this->app->DB->real_escape_string($xml['datum_von'])."' ";
      }
      if(isset($xml['datum_bis']))
      {
        $subwhere[] = "r.datum <= '".$this->app->DB->real_escape_string($xml['datum_bis'])."' ";
      }

      if(isset($xml['vertrieb']))
      {
        $subwhere[] = " r.vertriebid = '".(int)$xml['vertrieb']."' ";
      }
      $limit = '';
      $offset = 0;
      $_limit = 999999999;
      if(isset($xml['limit']))
      {
        if((int)$xml['limit'] > 0)$_limit = (int)$xml['limit'];
        if(isset($xml['offset']) && (int)$xml['offset'] > 0)
        {
          $offset = (int)$xml['offset'];
          //$limit = ' LIMIT '.(int)$xml['offset'].', '.(int)$xml['limit'];
        }else{
          //$limit = ' LIMIT '.(int)$xml['limit'];
        }
      }

      $searchmode = ' OR ';
      foreach($xml as $key => $filter)
      {
        $filterescaped = '';
        if(!is_array($filter))$filterescaped = $this->app->DB->real_escape_string($filter);

        switch(strtoupper($key))
        {
          case 'SEARCHMODE':
            if(strtoupper($filter) === 'AND') {
              $searchmode = ' AND ';
            }
            if(strtoupper($filter) === 'OR') {
              $searchmode = ' OR ';
            }
          break;
          case 'EXAKT':
            $exakt = true;
          break;
          case 'SEARCH':

            if(is_array($filter))
            {

              if(!isset($filter[0]))$filter[0] = $filter;

              foreach($filter as $_filter)
              {
                if(isset($_filter['SUCHE']))$_filter['suche'] = $_filter['SUCHE'];
                if(isset($_filter['FIELD']))$_filter['field'] = $_filter['FIELD'];
                if(isset($_filter['EXAKT']))$_filter['exakt'] = $_filter['EXAKT'];
                if(isset($_filter['suche']) && isset($_filter['field']))
                {
                  if(isset($_filter['exakt']) && $_filter['exakt'] == 1)
                  {
                    $like = " LIKE '".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."' ";
                  }else{
                    $like = " LIKE '%".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."%' ";
                  }
                  switch(strtolower($_filter['field']))
                  {
                    case 'datum':
                      if(strpos('.',$like) !== false)
                      {
                        if(isset($_filter['exakt']) && $_filter['exakt'] == 1)
                        {
                          $like = " LIKE '".$this->app->DB->real_escape_string($this->app->String->Convert(base64_decode($_filter['suche']),"%1.%2.%3","%3-%2-%1"))."' ";
                        }else{
                          $like = " LIKE '%".$this->app->DB->real_escape_string($this->app->String->Convert(base64_decode($_filter['suche']),"%1.%2.%3","%3-%2-%1"))."%' ";
                        }
                        $swhere[] = ' r.datum '.$like;
                      }
                    break;
                    case 'belegnr':
                      $swhere[] = ' r.belegnr '.$like;
                    break;
                    case 'nummer':
                      $swhere[] = ' a.'.strtolower($_filter['field']).' '.$like;
                    break;
                    case 'bezeichnung':
                      if($groupbyartikel)
                      {
                        if(strtolower($_filter['field']) == 'nummer')
                        {

                        }else{
                          $swhere[] = ' a.name_de '.$like;
                        }
                      }else{
                        $swhere[] = ' rp.'.strtolower($_filter['field']).' '.$like;
                      }
                    break;
                    case 'name_de':
                      $swhere[] = ' a.name_de '.$like;
                    break;
                    case 'kategorieid':
                      if(isset($_filter['exakt']) && $_filter['exakt'] == 1)
                      {
                        $like = " LIKE '".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."_kat' ";
                      }else{
                        $like = " LIKE '%".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."%_kat' ";
                      }
                      $swhere[] = ' a.typ '.$like;
                    break;
                    case 'kategoriename':
                      if(!isset($_filterkategoriename) || !$_filterkategoriename)
                      {
                        $join = " INNER JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ ";
                        $extraselect = ' ,ak.bezeichnung as artikelkategoriebezeichnung ';
                        $swhere[] = ' ak.bezeichnung '.$like;
                        $_filterkategoriename = true;
                      }
                    break;
                    case 'name':
                    case 'plz':
                    case 'ort':
                    case 'strasse':
                    case 'kundennummer':

                      if($groupbyadresse)$swhere[] = ' adr.'.strtolower($_filter['field']).' '.$like;
                      if(!$groupbyadresse)$swhere[] = ' r.'.strtolower($_filter['field']).' '.$like;
                    break;
                    break;
                  }
                }
              }
            }
          break;
        }
      }

      if(!empty($swhere))$subwhere[] = " (".implode( ' '.$searchmode.' ', $swhere).') ';

      $where = "";
      if($subwhere)$where = " AND ".implode(" AND ", $subwhere);
      unset($belege);
      $torder = trim($order,',');
      if(!$torder)$torder = ' 1 ';
      $groupbybelegsql = "";
      if($groupbybeleg)$groupbybelegsql = " ,t.id ";
      if($groupbybeleg)$groupbybelegsql2 = " ,r.id ";
      if($groupbyartikel)
      {
        if($groupbyadresse)
        {
          $sql = "SELECT t.adresse, t.name,t.strasse, t.plz, t.land, t.ort, t.kundennummer , t.aid, t.nummer, t.name_de, t.name_en, 
          t.anabregs_text, t.anabregs_text_en, t.artikelkategorie  ,t.artikelkategoriebezeichnung , sum(t.menge) as menge, 
          sum(t.betrag) as betrag, max(t.letztes_datum) as letztes_datum FROM( ";

          foreach($belega as $beleg)
          {

            $sqlb[] = " (SELECT  adr.id as adresse, adr.name,adr.strasse, adr.plz, adr.land, adr.ort, adr.kundennummer , a.id as aid, a.nummer, a.name_de, a.name_en, a.anabregs_text, a.anabregs_text_en, a.typ as artikelkategorie  ,ak.bezeichnung as artikelkategoriebezeichnung , sum(rp.menge) as menge, ".($beleg == 'gutschrift'?'-':'')."sum(rp.menge * (rp.preis*((100-rp.rabatt)/100) )) as betrag, max(r.datum) as letztes_datum  FROM $beleg r INNER JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." INNER JOIN artikel a ON rp.artikel = a.id INNER JOIN adresse adr ON r.adresse = adr.id  LEFT JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where GROUP BY adr.id, a.id $groupbybelegsql2) ";

          }

          $sql .= implode(" UNION ALL ",$sqlb).") t WHERE t.aid > 0 AND t.adresse > 0 GROUP BY t.aid, t.adresse ORDER BY $torder  $limit";
          $_belege = $this->app->DB->SelectArr($sql);

        }else{

          $sql = "SELECT   t.aid, t.nummer, t.name_de, t.name_en, t.anabregs_text, t.anabregs_text_en, t.artikelkategorie  ,t.artikelkategoriebezeichnung  , t.menge,sum(t.betrag) as betrag,  max(t.letztes_datum) as letztes_datum FROM( ";

          foreach($belega as $beleg)
          {

            $sqlb[] = " (SELECT  r.id as bid,r.datum,rp.sort, a.id as aid, a.nummer, a.name_de, a.name_en, a.anabregs_text, a.anabregs_text_en, a.typ  as artikelkategorie ,ak.bezeichnung as artikelkategoriebezeichnung , sum(rp.menge) as menge, ".($beleg == 'gutschrift'?'-':'')."sum(rp.menge * (rp.preis*((100-rp.rabatt)/100) )) as betrag, max(r.datum) as letztes_datum  FROM $beleg r INNER JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." INNER JOIN adresse adr ON r.adresse = adr.id INNER JOIN artikel a ON rp.artikel = a.id  LEFT JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ  WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where GROUP BY a.id, adr.id $groupbybelegsql2) ";

          }

          $sql .= implode(" UNION ALL ",$sqlb).") t WHERE t.aid > 0 GROUP BY t.aid ORDER BY $torder  $limit";

          $_belege = $this->app->DB->SelectArr($sql);
        }
        if($_belege)
        {
          foreach($_belege as $k => $position)
          {
            //$position['preis'] = $position['menge'] * $position['preis'] * (1-$position['rabatt']/100);
            $belege[] = $position;
            unset($_belege[$k]);
          }
        }
      }else{
        foreach($belega as $beleg)
        {
          if($groupbybeleg)
          {
            $sql = "SELECT '$beleg' as beleg ,r.adresse, r.name,r.plz,r.ort,r.strasse,r.land,r.ansprechpartner,r.datum,r.status as rstatus,r.belegnr,r.id as belegid, a.typ as artikelkategorie $extraselect FROM $beleg r LEFT JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." LEFT JOIN artikel a ON rp.artikel = a.id $join WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where GROUP BY r.id ORDER BY $order r.datum, rp.sort  $limit ";
          }else{
            $sql = "SELECT '$beleg' as beleg ,r.adresse, r.name,r.plz,r.ort,r.strasse,r.land,r.ansprechpartner,r.datum,r.status as rstatus,r.belegnr,r.id as belegid, rp.*, a.typ as artikelkategorie $extraselect FROM $beleg r LEFT JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." LEFT JOIN artikel a ON rp.artikel = a.id $join WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where ORDER BY $order r.datum, rp.sort  $limit ";
          }
          $_belege = $this->app->DB->SelectArr($sql);
          //$this->app->erp->LogFile(addslashes($this->app->DB->error()));
          //$this->app->erp->LogFile(addslashes($sql));
          if($_belege)
          {
            foreach($_belege as $k => $position)
            {
              $position['status'] = $position['rstatus'];
              unset($position['rstatus']);
              $position['preis'] = $position['menge'] * $position['preis'] * (1-$position['rabatt']/100);
              $belege[] = $position;
              unset($_belege[$k]);
            }
          }
        }
      }


      /*
      foreach($belega as $beleg)
      {
        if($groupbyartikel)
        {
          if($groupbyadresse)
          {
            $_belege = $this->app->DB->SelectArr("SELECT '$beleg' as beleg, adr.id as adresse, adr.name,adr.strasse, adr.plz, adr.land, adr.ort, adr.kundennummer , a.id, a.nummer, a.name_de, a.name_en, a.anabregs_text, a.anabregs_text_en, a.typ as artikelkategorie  ,ak.bezeichnung as artikelkategoriebezeichnung , sum(rp.menge) as menge, sum(rp.menge * (rp.preis*((100-rp.rabatt)/100) )) as betrag, max(r.datum) as letztes_datum  FROM $beleg r INNER JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." INNER JOIN artikel a ON rp.artikel = a.id INNER JOIN adresse adr ON r.adresse = adr.id  INNER JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ  WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where GROUP BY a.id, adr.id ORDER BY $order r.datum, rp.sort  $limit ");

          }else{
            $_belege = $this->app->DB->SelectArr("SELECT '$beleg' as beleg ,  a.id, a.nummer, a.name_de, a.name_en, a.anabregs_text, a.anabregs_text_en, a.typ as artikelkategorie  ,ak.bezeichnung as artikelkategoriebezeichnung , sum(rp.menge) as menge, sum(rp.menge * (rp.preis*((100-rp.rabatt)/100) )) as betrag, max(r.datum) as letztes_datum  FROM $beleg r INNER JOIN ".$beleg."_position rp ON r.id = rp.".$beleg." INNER JOIN artikel a ON rp.artikel = a.id  INNER JOIN artikelkategorien ak ON concat(ak.id,'_kat') = a.typ  WHERE ".($adresse?("r.adresse = '".$adresse."'"):"1")." $where GROUP BY a.id ORDER BY $order r.datum, rp.sort  $limit ");
          }
          if($_belege)
          {
            foreach($_belege as $k => $position)
            {
              //$position['preis'] = $position['menge'] * $position['preis'] * (1-$position['rabatt']/100);
              $belege[] = $position;
              unset($_belege[$k]);
            }
          }
        }
      }*/

$xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<belege_list1>
</belege_list1>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
      if($groupbyartikel)
      {
        $xmlobj = $_xmlobj->AddChild('artikel_list','');
      }else{
        $xmlobj = $_xmlobj->AddChild('beleg_list','');
      }
      //$out = '<beleg_list>';
      $i = 0;
      $j = 0;
      $anz_belegegesamt = -1;
      $anz_belegeresult = 0;
      $old_beleg = 0;
      $old_beleggesamt = 0;
      if($belege)
      {
        if($groupbyartikel)
        {
          foreach($belege as $position)
          {
            if($i >= $offset && $i < $_limit + $offset)
            {
              $j++;
              $belegobj = $xmlobj->AddChild('artikel');
              $_belegobj = $belegobj->AddChild('id','');
              $_belegobj->value = $position['aid'];
              $_nummer = $belegobj->AddChild('nummer','');
              $_nummer->value = $position['nummer'];
              $_name_de = $belegobj->AddChild('name_de','');
              $_name_de->value = $position['name_de'];
              $_menge = $belegobj->AddChild('menge','');
              $_menge->value = round($position['menge'],4);
              $_betrag = $belegobj->AddChild('betrag','');
              $_betrag->value = $position['betrag'];
              $_artikelkategorie = $belegobj->AddChild('artikelkategorie','');
              $_artikelkategorie->value = $position['artikelkategorie'];
              $_letztes_datum = $belegobj->AddChild('letztes_datum','');
              $_letztes_datum->value = $position['letztes_datum'];
              $_artikelkategoriebezeichnung = $belegobj->AddChild('artikelkategoriebezeichnung','');
              $_artikelkategoriebezeichnung->value = $position['artikelkategoriebezeichnung'];
              if($groupbyadresse)
              {
                $_adresse = $belegobj->AddChild('adresse','');
                $_adresse->value = $position['adresse'];
                $_kundennummer = $belegobj->AddChild('kundennummer','');
                $_kundennummer->value = $position['kundennummer'];
                $_name = $belegobj->AddChild('name','');
                $_name->value = $position['name'];
                $_ort = $belegobj->AddChild('ort','');
                $_ort->value = $position['ort'];
                $_plz = $belegobj->AddChild('plz','');
                $_plz->value = $position['plz'];
                $_strasse = $belegobj->AddChild('strasse','');
                $_strasse->value = $position['strasse'];
                $_land = $belegobj->AddChild('land','');
                $_land->value = $position['land'];
              }
            }
            $i++;
          }

        }else{
          $old = 0;
          foreach($belege as $position)
          {
            if($old_beleggesamt != $position['belegid'].$position['beleg'])
            {
              $anz_belegegesamt++;
              $old_beleggesamt = $position['belegid'].$position['beleg'];
            }
            if(($groupbybeleg2?$anz_belegegesamt:$i) >= $offset && ($groupbybeleg2?$anz_belegegesamt:$i) < $_limit + $offset)
            {
              $j++;
              if($groupbyposition || $old != $position['belegid'].$position['beleg'])
              {
                $anz_belegeresult++;
                $belegobj = $xmlobj->AddChild($position['beleg']);
                //if($old != 0)$out .= '</'.$position['beleg'].'>';
                $old = $position['belegid'].$position['beleg'];

                //$out .= '<'.$position['beleg'].'>';

                $_belegobj = $belegobj->AddChild('belegid','');
                $_belegobj->value = $position['belegid'];
                $_plz = $belegobj->AddChild('plz','');
                $_plz->value = $position['plz'];
                $_ort = $belegobj->AddChild('ort','');
                $_ort->value = $position['ort'];
                $_strasse = $belegobj->AddChild('strasse','');
                $_strasse->value = $position['strasse'];
                $_land = $belegobj->AddChild('land','');
                $_land->value = $position['land'];
                $_ansprechpartner = $belegobj->AddChild('ansprechpartner','');
                $_ansprechpartner->value = $position['ansprechpartner'];
                $_datum = $belegobj->AddChild('datum','');
                $_datum->value = $position['datum'];
                $_belegnr = $belegobj->AddChild('belegnr','');
                $_belegnr->value = $position['belegnr'];
                $_status = $belegobj->AddChild('status','');
                $_status->value = $position['status'];
                $_adresse = $belegobj->AddChild('adresse','');
                $_adresse->value = $position['adresse'];
                $_name = $belegobj->AddChild('name','');
                $_name->value = $position['name'];
                //$out .= '<belegid>'.$position['belegid'].'</belegid>';
                //$out .= '<datum>'.$position['datum'].'</datum>';
                //$out .= '<belegnr>'.$position['belegnr'].'</belegnr>';
                //$out .= '<status>'.$position['status'].'</status>';
                //$out .= '<adresse>'.$position['adresse'].'</adresse>';
              }
              $_positionobj = $belegobj->AddChild('position','');
              //$out .= '<position>';
              foreach($position as $k => $v)
              {
                $objn = $k.'_obj';
                $$objn = $_positionobj->AddChild($k,'');
                $$objn->value = $v;
                //$out .= '<'.$k.'>'.htmlspecialchars($v).'</'.$k.'>';
              }
              //$out .= '</position>';
            }
            $i++;
          }
        }
        //$out .= '</'.$position['beleg'].'>';
      }
      $anz_belegegesamt++;
      //$out .= '</beleg_list><anz_gesamt>'.(!empty($belege)?count($belege):0).'</anz_gesamt><anz_result>'.$j.'</anz_result>';
      $xmlobj->AddChild('anz_gesamt',(!empty($belege)?count($belege):0));
      $xmlobj->AddChild('anz_result',$j);
      if(!$groupbyartikel)
      {
        $xmlobj->AddChild('anz_belegegesamt',$anz_belegegesamt);
        $xmlobj->AddChild('anz_belegeresult',$anz_belegeresult);
      }
      $out = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<belege_list1>",'</belege_list1>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);
      $this->XMLResponse(1, $out);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }

  function ApiGruppenList()
  {
    $gruppen = $this->app->DB->SelectArr("SELECT * FROM gruppen WHERE art like 'gruppe' ");
    if($gruppen)
    {
      $out = '<gruppen>';
      foreach($gruppen as $gruppe)
      {
        $out .= '<gruppe>';
        foreach($gruppe as $k => $v )
        {
          $out .= '<'.$k.'>'.$v.'</'.$k.'>';
        }
        $out .= '</gruppe>';
      }
      $out .= '</gruppen>';
      $this->XMLResponse(1, $out);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }

  function ApiAdresseGruppenList()
  {
    $xml = $this->XMLPost();
    $api_id = isset($this->api_id)?$this->api_id:0;
    if(isset($xml['adresse']))
    {
      $adresse = (int)$xml['adresse'];

    }elseif(isset($xml['id_ext']))
    {
      $adresse = $this->app->DB->Select("SELECT id_int FROM api_mapping WHERE api = '".$api_id."' AND tabelle = 'adresse' AND id_ext = '".$this->app->DB->real_escape_string($xml['id_ext'])."' LIMIT 1");
    }
    if($adresse)
    {
      $gruppen = $this->app->DB->SelectArr("SELECT gr.id as gruppe, gr.name, am.id_int FROM adresse_rolle ar LEFT JOIN gruppen gr ON gr.id = ar.parameter LEFT JOIN api_mapping am ON am.id_int = gr.id AND am.tabelle = 'gruppen' WHERE  ar.adresse = '$adresse' AND ar.subjekt like 'Mitglied' AND objekt like 'Gruppe'");
      if($gruppen)
      {
        $out = '<gruppen>';
        foreach($gruppen as $gruppe)
        {
          $out .= '<gruppe>';
          foreach($gruppe as $k => $v )
          {
            $out .= '<'.$k.'>'.$v.'</'.$k.'>';
          }
          $out .= '</gruppe>';
        }
        $out .= '</gruppen>';
        $this->XMLResponse(1, $out);
        $this->app->ExitXentral();
      }
      $this->XMLResponse(8);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }


  public function ApiAccountList()
  {
    $this->XMLPost();
    $api_id = isset($this->api_id)?$this->api_id:0;
    if($api_id)
    {
      $url = $this->app->DB->Select("SELECT remotedomain FROM api_account WHERE id = '$api_id' LIMIT 1");
      $adresse = $this->app->Secure->GetGET('adresse');
      if(!empty($adresse)){
        $accounts = $this->app->DB->SelectArr("SELECT ac.adresse, ac.art, ac.benutzername,ac.passwort, ac.webid, am.id_ext, a.name, a.email FROM adresse_accounts ac INNER JOIN adresse a ON ac.adresse = a.id LEFT JOIN api_mapping am ON am.id_int = ac.adresse AND am.api = '$api_id' AND am.tabelle = 'adresse' WHERE ac.aktiv = 1 AND ac.url = '".$this->app->DB->real_escape_string($url)."' AND (ac.gueltig_bis <= now() or isnull(ac.gueltig_bis)) AND ac.adresse={$adresse}");
      }else{
        $accounts = $this->app->DB->SelectArr("SELECT ac.adresse, ac.art, ac.benutzername,ac.passwort, ac.webid, am.id_ext, a.name, a.email FROM adresse_accounts ac INNER JOIN adresse a ON ac.adresse = a.id LEFT JOIN api_mapping am ON am.id_int = ac.adresse AND am.api = '$api_id' AND am.tabelle = 'adresse' WHERE ac.aktiv = 1 AND ac.url = '".$this->app->DB->real_escape_string($url)."' AND (ac.gueltig_bis <= now() or isnull(ac.gueltig_bis))");
      }
      if($error = $this->app->DB->error())
      {
        $this->XMLResponse(1,'<sqlerror>'.$error.'</sqlerror>');
      }
      if($accounts)
      {
        $out = '<list>';
        foreach($accounts as $account)
        {
          $out .= '<account>';
          foreach($account as $key => $value)
          {
            $out .= '<'.$key.'>'.(is_null($value)?'':$value).'</'.$key.'>';
          }
          $out .= '</account>';
        }
        $out .= '</list>';
        $this->XMLResponse(1,$out);
        $this->app->ExitXentral();
      }
      $this->XMLResponse(8);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(3);
    $this->app->ExitXentral();
  }

  function ApiMappingGet()
  {
    $xml = $this->XMLPost();
    $api_id = isset($this->api_id)?$this->api_id:0;
    if(is_array($xml))
    {
      $list = false;
      if(isset($xml['list']))
      {
        $list = $xml['list'];
      }elseif($xml['LIST'])
      {
        $list = $xml['LIST'];
      }
      if(!$list)
      {
        $table = isset($xml['table'])?$xml['table']:(isset($xml['TABLE'])?$xml['TABLE']:'');
        $id_int = isset($xml['id_int'])?$xml['id_int']:(isset($xml['ID_INT'])?$xml['ID_INT']:'');
        $id_ext = isset($xml['id_ext'])?$xml['id_ext']:(isset($xml['ID_EXT'])?$xml['ID_EXT']:'');
        if($table && (!empty($id_int) || !empty($id_ext)))
        {
          if(!empty($id_int))
          {
            $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE tabelle = '".$this->app->DB->real_escape_string($xml['table'])."' AND id_int = '".$this->app->DB->real_escape_string($id_int)."' AND api = '".$api_id."' LIMIT 1");
          }else{
            $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE tabelle = '".$this->app->DB->real_escape_string($xml['table'])."' AND id_ext = '".$this->app->DB->real_escape_string($id_ext)."' AND api = '".$api_id."' LIMIT 1");
          }
          if(empty($ergebnis))
          {
            $this->XMLResponse(8);
            $this->app->ExitXentral();
          }
          $this->XMLResponse(1,'<id_int>'.$ergebnis[0]['id_int'].'</id_int><id_ext>'.$ergebnis[0]['id_ext'].'</id_ext><table>'.$ergebnis[0]['tabelle'].'</table>');
          $this->app->ExitXentral();
        }
        $this->XMLResponse(4);
        $this->app->ExitXentral();
      }
      $out = '<list>';
      foreach($list as $k => $v)
      {
        $table = isset($v['table'])?$v['table']:(isset($v['TABLE'])?$v['TABLE']:'');
        $id_int = isset($v['id_int'])?$v['id_int']:(isset($v['ID_INT'])?$v['ID_INT']:'');
        $id_ext = isset($v['id_ext'])?$v['id_ext']:(isset($v['ID_EXT'])?$v['ID_EXT']:'');
        if($table && (!empty($id_int) || !empty($id_ext)))
        {
          if(!empty($id_int))
          {
            $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE table = '".$this->app->DB->real_escape_string($xml['table'])."' AND id_int = '".$this->app->DB->real_escape_string($id_int)."' AND api = '".$api_id."' LIMIT 1");
          }else{
            $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE table = '".$this->app->DB->real_escape_string($xml['table'])."' AND id_ext = '".$this->app->DB->real_escape_string($id_ext)."' AND api = '".$api_id."' LIMIT 1");
          }
          if(!empty($ergebnis))
          {
            $out .= '<id_int>'.$ergebnis[0]['id_int'].'</id_int><id_ext>'.$ergebnis[0]['id_ext'].'</id_ext><table>'.$ergebnis[0]['tabelle'].'</table>';
          }
        }
      }
      $out = '</list>';
      $this->XMLResponse(1,$out);
      $this->app->ExitXentral();
    }
  }

  function ApiMappingSet()
  {
    $xml = $this->XMLPost();
    $api_id = isset($this->api_id)?$this->api_id:0;
    if(is_array($xml))
    {
      $list = false;
      if(isset($xml['list']))
      {
        $list = $xml['list'];
      }elseif($xml['LIST'])
      {
        $list = $xml['LIST'];
      }
      if(!$list)
      {
        $table = isset($xml['table'])?$xml['table']:(isset($xml['TABLE'])?$xml['TABLE']:'');
        $id_int = isset($xml['id_int'])?$xml['id_int']:(isset($xml['ID_INT'])?$xml['ID_INT']:'');
        $id_ext = isset($xml['id_ext'])?$xml['id_ext']:(isset($xml['ID_EXT'])?$xml['ID_EXT']:'');
        if($table && (!empty($id_int) && !empty($id_ext)))
        {
          $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE tabelle = '".$this->app->DB->real_escape_string($table)."' AND id_int = '".$this->app->DB->real_escape_string($id_int)."' AND api = '".$api_id."' LIMIT 1");
          if(empty($ergebnis))
          {
            $this->app->DB->Insert("INSERT INTO api_mapping (tabelle, id_int, id_ext, api) VALUES ('".$this->app->DB->real_escape_string($table)."','".$this->app->DB->real_escape_string($id_int)."','".$this->app->DB->real_escape_string($id_ext)."','".$api_id."')");
            if($insertid = $this->app->DB->GetInsertID())
            {
              $this->XMLResponse(1,'<id_int>'.$id_int.'</id_int><id_ext>'.$id_ext.'</id_ext><table>'.$table.'</table><id>'.$insertid.'</id><sql>'."INSERT INTO api_mapping (table, id_int, id_ext, api) VALUES ('".$this->app->DB->real_escape_string($table)."','".$this->app->DB->real_escape_string($id_int)."','".$this->app->DB->real_escape_string($id_ext)."','".$api_id."')".'</sql>');
              $this->app->ExitXentral();
            }
            $this->XMLResponse(0);
            $this->app->ExitXentral();
          }
          $this->app->DB->Update("UPDATE api_mapping SET id_ext = '".$this->app->DB->real_escape_string($id_ext)."' WHERE id = '".$ergebnis[0]['id']."' LIMIT 1");
          $this->XMLResponse(1,'<id_int>'.$id_int.'</id_int><id_ext>'.$id_ext.'</id_ext><table>'.$table.'</table>');
          $this->app->ExitXentral();
        }
        $this->XMLResponse(4);
        $this->app->ExitXentral();
      }
      $out = '<list>';
      foreach($list as $k => $v)
      {
        $table = isset($v['table'])?$v['table']:(isset($v['TABLE'])?$v['TABLE']:'');
        $id_int = isset($v['id_int'])?$v['id_int']:(isset($v['ID_INT'])?$v['ID_INT']:'');
        $id_ext = isset($v['id_ext'])?$v['id_ext']:(isset($v['ID_EXT'])?$v['ID_EXT']:'');
        if($table && (!empty($id_int) && !empty($id_ext)))
        {
          if(!empty($id_int))
          {
            $ergebnis = $this->app->DB->SelectArr("SELECT * FROM api_mapping WHERE tabelle = '".$this->app->DB->real_escape_string($xml['table'])."' AND id_int = '".$this->app->DB->real_escape_string($id_int)."' AND api = '".$api_id."' LIMIT 1");
          }
          if(!empty($ergebnis))
          {
            $this->app->DB->Update("UPDATE api_mapping SET id_ext = '".$this->app->DB->real_escape_string($id_ext)."' WHERE id = '".$ergebnis[0]['id']."' LIMIT 1");
            $out .= '<id_int>'.$id_int.'</id_int><id_ext>'.$id_ext.'</id_ext><table>'.$table.'</table>';
          }else{
            $this->app->DB->Insert("INSERT INTO api_mapping (table, id_int, id_ext, api) VALUES ('".$this->app->DB->real_escape_string($table)."','".$this->app->DB->real_escape_string($id_int)."','".$this->app->DB->real_escape_string($id_ext)."','".$api_id."')");
            $out .= '<id_int>'.$id_int.'</id_int><id_ext>'.$id_ext.'</id_ext><table>'.$table.'</table>';
          }
        }
      }
      $out = '</list>';
      $this->XMLResponse(1,$out);
      $this->app->ExitXentral();
    }
  }

  // allgemeine funktionen
  function CheckHash()
  {
    $hash = $this->app->Secure->GetGET("hash");
    $api_id = (int)$this->app->Secure->GetGET("api_id");

    try{
        $apiAccount = $this->apiAccountService->getApiAccountById($api_id);
        $this->api_id = $apiAccount->getId();
    }catch (ApiAccountNotFoundException $e){
        $this->XMLResponse(9);
        $this->app->ExitXentral();
    }

    if($hash !== $this->generateHash($apiAccount->getRemoteDomain(),$apiAccount->getInitKey())){
        if($api_id === 0){
            $this->XMLResponse(9);
        }else{
            $this->XMLResponse(2);
        }
        $this->app->ExitXentral();
    }

    $guard = new PermissionGuard($this->app->Container->get('Database'), (int)$this->api_id);
    $guard->checkStandardApiAction($this->app->Secure->GetGET("action"));
  }

  function generateHash($domain,$key)
  {
    $date = gmdate('dmY');
    $hash = "";

    for($i = 0; $i <= 200; $i++)
      $hash = sha1($hash . $key . $domain . $date);

    return $hash;
  }

  function getBelege()
  {
    return array(
      'auftrag','rechnung','gutschrift','angebot','lieferschein','bestellung','produktion','retoure','verbindlichkeit'
    );
  }

  function getTabellen()
  {
    return array('adresse','adresse_rolle','gruppen','adresse_kontakte','artikel','verkaufspreise','einkaufspreise','stueckliste');
  }

    /**
     * @param string $typ
     * @param int    $id
     *
     * @return null|string
     */
  public function GetPDF($typ, $id)
  {
    $id = (int)$id;
    if(!$id) {
      return null;
    }
    if(!in_array($typ, $this->getBelege())) {
      return null;
    }
    $elemente = $this->app->DB->SelectRow(
      sprintf(
        'SELECT * FROM `%s` WHERE `id` = %d LIMIT 1',
        $typ, $id
      )
    );
    if(!$elemente) {
      return null;
    }

    if(!defined('FPDF_FONTPATH')){
      define('FPDF_FONTPATH','lib/pdf/font/');
    }

    if(!class_exists('FPDFWAWISION')){
      if(file_exists(dirname(dirname(__DIR__)).'/conf/user_defined.php')){
        include_once dirname(dirname(__DIR__)).'/conf/user_defined.php';
      }
      /*if(!defined('USEFPDF3'))
      {
        define('USEFPDF3',true);
      }*/
      if(defined('USEFPDF3') && USEFPDF3 && file_exists(dirname(__DIR__) . '/lib/pdf/fpdf_3.php')){
        require_once(dirname(__DIR__) . '/lib/pdf/fpdf_3.php');
      }elseif(defined('USEFPDF2') && USEFPDF2){
        if(file_exists(dirname(__DIR__) . '/lib/pdf/fpdf_2.php')){
          require_once(dirname(__DIR__) . '/lib/pdf/fpdf_2.php');
        }else{
          require_once(dirname(__DIR__) . '/lib/pdf/fpdf.php');
        }
      }else{
        require_once(dirname(__DIR__) . '/lib/pdf/fpdf.php');
      }
    }
    require_once(dirname(__DIR__).'/lib/pdf/fpdf_final.php');

    require_once(dirname(__DIR__)."/lib/dokumente/class.superfpdf.php");
    require_once(dirname(__DIR__)."/lib/dokumente/class.etikett.php");
    if(file_exists(dirname(__DIR__)."/lib/dokumente/class.briefpapier_custom.php"))
    {
      require_once(dirname(__DIR__)."/lib/dokumente/class.briefpapier_custom.php");
    }else{
      require_once(dirname(__DIR__)."/lib/dokumente/class.briefpapier.php");
    }

    if(file_exists(dirname(__DIR__)."/lib/class.image.php"))
    {
      require_once(dirname(__DIR__)."/lib/class.image.php");
    }

    require_once(dirname(__DIR__)."/lib/dokumente/class.dokumentenvorlage.php");
    if(file_exists("lib/dokumente/class.layoutvorlagen.php"))require_once("lib/dokumente/class.layoutvorlagen.php");
    require_once(dirname(__DIR__)."/lib/dokumente/class.sepamandat.php");
    require_once(dirname(__DIR__)."/lib/dokumente/class.dokuarbeitszeit.php");
    require_once(dirname(__DIR__)."/../phpwf/plugins/class.string.php");
    if(!isset($this->app->String))$this->app->String = new WawiString();
    $classname = ucfirst($typ).'PDF';
    $classnamecustom = $classname.'Custom';
    if(!class_exists($classname) && !class_exists($classnamecustom))
    {
      if(file_exists(dirname(__DIR__).'/lib/dokumente/class.'.$typ.'_custom.php'))
      {
        include_once(dirname(__DIR__).'/lib/dokumente/class.'.$typ.'_custom.php');
      }elseif(file_exists(dirname(__DIR__).'/lib/dokumente/class.'.$typ.'.php'))
      {
        include_once(dirname(__DIR__).'/lib/dokumente/class.'.$typ.'.php');
      }
    }
    if(class_exists($classnamecustom))
    {
      $Brief = new $classnamecustom($this->app,$elemente['projekt']);
    }
    elseif(class_exists($classname)){
      $Brief = new $classname($this->app,$elemente['projekt']);
    }
    else {
      return null;
    }
    $funktionsname = 'Get'.ucfirst($typ);
    if(method_exists($Brief, $funktionsname)) {
      $Brief->$funktionsname($elemente['id']);
      $Brief->renderDocument();
      return $Brief->output('','S');
    }
    return null;
  }

    /**
     * @param string     $file
     * @param int        $receiptdocumentId
     * @param bool       $append
     * @param null|array $options
     *
     * @return bool
     */
  public function createReceiptdocumentQsCsv($file, $receiptdocumentId, $append = false, $options = null)
  {
    if(empty($file) || empty($receiptdocumentId)) {
      return false;
    }
    $file_ex = @is_file($file);
    if(!$file_ex) {
      $append = false;
    }
    $handle = @fopen($file, $append?'a':'w');
    if(empty($handle)) {
      return false;
    }
    $noWrap = !empty($options['nowrap']);
    foreach($this->generateQsCsvArr($receiptdocumentId) as $row) {
      if($noWrap) {
        foreach($row as $key => $col) {
          if(!is_string($col)) {
            continue;
          }
          $row[$key] = str_replace(["\r\n","\r","\n"],' ', $col);
        }
      }
      @fputcsv($handle, $row, ';','"');
    }
    @fclose($handle);

    return @file_exists($file);
  }

    /**
     * @param int $receiptdocumentId
     *
     * @return array
     */
  public function generateQsCsvArr($receiptdocumentId)
  {
    $elemente_positionen = $this->app->DB->Query(
      sprintf(
        "SELECT r.document_number, b.belegnr AS bestellung, m2.id_ext AS receiptdocument_id_ext,
       m.id_ext AS receiptdocument_position_id_ext,art.ean, art.gewicht, art.herstellernummer, art.altersfreigabe,
       art.lagerartikel,r.status, r.status_qs, t.amount, t.amount_good, t.amount_bad, bp.menge, bp.geliefert
          FROM receiptdocument_position t 
          INNER JOIN receiptdocument AS r ON t.receiptdocument_id = r.id 
          INNER JOIN `paketannahme` AS parc ON r.parcel_receipt_id = parc.id
          INNER JOIN `paketdistribution` AS pd ON parc.id = pd.paketannahme    
          INNER JOIN bestellung_position AS bp ON pd.bestellung_position = bp.id
          INNER JOIN bestellung AS b ON bp.bestellung = b.id
          LEFT JOIN artikel art ON t.article_id = art.id 
          LEFT JOIN api_mapping m ON m.tabelle = 'receiptdocument_position' AND m.id_int = t.id
          LEFT JOIN api_mapping m2 ON m2.tabelle = 'receiptdocument' AND m2.id_int = r.id 
          WHERE t.receiptdocument_id = %d ",
        $receiptdocumentId
      )
    );

    $rows = [
      ['r.document_number', 'bestellung', 'receiptdocument_id_ext',
        'receiptdocument_position_id_ext','ean', 'gewicht', 'herstellernummer', 'altersfreigabe',
        'lagerartikel','status', 'status_qs', 'amount', 'amount_good', 'amount_bad', 'bp.menge', 'geliefert']
    ];
    if(!empty($elemente_positionen)) {
      while($row = $this->app->DB->fetch_row($elemente_positionen)) {
        $rows[] = $row;
      }
      $this->app->DB->free($elemente_positionen);
    }

    return $rows;
  }

  function ApiDataToXML($typ, $id, &$xml = null, $parameter = null)
  {
    $n = null;
    $typ = strtolower($typ);
    if($xml === null) {
      $xml = $this->CreateXmlObj();
    }

    if(isset($parameter['briefpapier']) && $parameter['briefpapier'] == 1) {
      $briefpapier = '';
      $briefpapier2 = '';
      $logo = '';
      $briefpapier_typ = $this->app->erp->Firmendaten('hintergrund');

      if($briefpapier_typ==='logo')
      {
        $logo = $this->app->erp->Firmendaten('logo');
      }
      else if($briefpapier_typ==='briefpapier')
      {
        $briefpapier = $this->app->erp->Firmendaten('briefpapier');

        $briefpapier2vorhanden = $this->app->erp->Firmendaten('briefpapier2vorhanden');
        if($briefpapier2vorhanden > 0)
        {
          $briefpapier2 = $this->app->erp->Firmendaten('briefpapier2');
        }
      }
      if($briefpapier && !isset($xml->xml->briefpapier)){
        $this->AddToXMLObj($xml, 'briefpapier','', $briefpapier, $n, $erg);
      }
      if($briefpapier2 && !isset($xml->xml->briefpapier2)){
        $this->AddToXMLObj($xml, 'briefpapier2','', $briefpapier2, $n, $erg);
      }
      if($logo && !isset($xml->xml->logo)){
        $this->AddToXMLObj($xml, 'logo','', $logo, $n, $erg);
      }
      if($briefpapier_typ && !isset($xml->xml->briefpapier_typ)){
        $this->AddToXMLObj($xml, 'briefpapier_typ','', $briefpapier_typ, $n, $erg);
      }
    }
    $typen = $this->getTabellen();
    $belege = $this->getBelege();
    if(in_array($typ, $typen)) {
      $elemente = $this->app->DB->SelectArr(
        "SELECT t.*, m.id_ext ".($typ==='bestellung'?",adr.kundennummerlieferant":'')." 
        FROM `$typ` AS `t` ".($typ=='bestellung'?" 
        LEFT JOIN `adresse` AS `adr` ON t.adresse = adr.id ":"")." 
        LEFT JOIN `api_mapping` AS `m` ON m.api = '".$this->api_id."' AND m.tabelle = '$typ' AND m.id_int = t.id 
        WHERE t.id = '".($id)."' 
        LIMIT 1"
      );
      if($elemente) {
        $this->AddToXMLObj($xml, $typ,$typ.'_list', $elemente, $n, $erg);
      }
    }
    elseif(in_array($typ, $belege)) {
      $typposition = $typ.'_position';
      $elemente = $this->app->DB->SelectArr("SELECT t.*, m.id_ext FROM $typ t LEFT JOIN api_mapping m ON m.api = '".$this->api_id."' AND m.tabelle = '$typ' AND m.id_int = t.id WHERE t.id = '".($id)."' LIMIT 1");

      if($elemente) {
        $elemente[0]['anzahluebertragungen'] = 1+(int)$this->app->DB->Select("SELECT anzahl_uebertragen FROM api_request WHERE uebertragung_account = '".$this->uebertragung_account."' and typ = '$typ' AND parameter1 = '$id' LIMIT 1");
        if(isset($parameter['pdf']) && $parameter['pdf'] == 1) {
          $file = $this->GetPDF($typ, $id);
          if(!empty($file)) {
            $elemente[0]['pdf'] = base64_encode($file);
          }
        }
        if(isset($parameter['gln_freifeld'])) {
          $elemente[0]['gln_empfaenger'] = $this->app->DB->Select("SELECT freifeld".(int)$parameter['gln_freifeld']." FROM adresse WHERE id = '".$elemente[0]['adresse']."' LIMIT 1");
        }
        if($typ === 'lieferschein' || $typ === 'retoure') {
          $auftragsdaten = $elemente[0]['auftragid'] <= 0 ? null : $this->app->DB->SelectArr("SELECT * FROM auftrag WHERE id = '".$elemente[0]['auftragid']."' LIMIT 1");
          if($auftragsdaten) {
            $elemente[0]['tatsaechlicheslieferdatum'] = $auftragsdaten[0]['tatsaechlicheslieferdatum'];
            $elemente[0]['lieferdatum'] = $auftragsdaten[0]['lieferdatum'];
            $elemente[0]['lieferdatumkw'] = $auftragsdaten[0]['lieferdatumkw'];
            $elemente[0]['rechnung_name'] = $auftragsdaten[0]['name'];
            $elemente[0]['auftrag_name'] = $auftragsdaten[0]['name'];
            $elemente[0]['rechnung_anrede'] = $auftragsdaten[0]['anrede'];
            $elemente[0]['auftrag_anrede'] = $auftragsdaten[0]['anrede'];
            $elemente[0]['rechnung_strasse'] = $auftragsdaten[0]['strasse'];
            $elemente[0]['auftrag_strasse'] = $auftragsdaten[0]['strasse'];
            $elemente[0]['rechnung_adresszusatz'] = $auftragsdaten[0]['adresszusatz'];
            $elemente[0]['auftrag_adresszusatz'] = $auftragsdaten[0]['adresszusatz'];
            $elemente[0]['rechnung_ansprechpartner'] = $auftragsdaten[0]['ansprechpartner'];
            $elemente[0]['auftrag_ansprechpartner'] = $auftragsdaten[0]['ansprechpartner'];
            $elemente[0]['rechnung_abteilung'] = $auftragsdaten[0]['abteilung'];
            $elemente[0]['auftrag_abteilung'] = $auftragsdaten[0]['abteilung'];
            $elemente[0]['rechnung_unterabteilung'] = $auftragsdaten[0]['unterabteilung'];
            $elemente[0]['auftrag_unterabteilung'] = $auftragsdaten[0]['unterabteilung'];
            $elemente[0]['rechnung_bundesstaat'] = $auftragsdaten[0]['bundesstaat'];
            $elemente[0]['auftrag_bundesstaat'] = $auftragsdaten[0]['bundesstaat'];
            $elemente[0]['rechnung_plz'] = $auftragsdaten[0]['plz'];
            $elemente[0]['auftrag_plz'] = $auftragsdaten[0]['plz'];
            $elemente[0]['rechnung_ort'] = $auftragsdaten[0]['ort'];
            $elemente[0]['auftrag_ort'] = $auftragsdaten[0]['ort'];
            $elemente[0]['rechnung_land'] = $auftragsdaten[0]['land'];
            $elemente[0]['auftrag_land'] = $auftragsdaten[0]['land'];
            $elemente[0]['rechnung_gln'] = $auftragsdaten[0]['gln'];
            $elemente[0]['auftrag_gln'] = $auftragsdaten[0]['gln'];
            $elemente[0]['internet'] = $auftragsdaten[0]['internet'];
            $elemente[0]['shopextid'] = $auftragsdaten[0]['shopextid'];
            $elemente[0]['auftragextid'] = $this->GetExtIDFromIntID('auftrag',$elemente[0]['auftragid']);
          }

          // wenn es eine eigene Rechnung bibt dann fuer die rechnunsdaten die infos da nehmen
          $rechnungsdaten = $elemente[0]['auftragid'] <= 0 ? null : $this->app->DB->SelectArr("SELECT * FROM rechnung WHERE auftragid = '".$elemente[0]['auftragid']."' LIMIT 1");
          if($rechnungsdaten)
          {
            $elemente[0]['rechnung_name'] = $rechnungsdaten[0]['name'];
            $elemente[0]['rechnung_anrede'] = $rechnungsdaten[0]['anrede'];
            $elemente[0]['rechnung_strasse'] = $rechnungsdaten[0]['strasse'];
            $elemente[0]['rechnung_adresszusatz'] = $rechnungsdaten[0]['adresszusatz'];
            $elemente[0]['rechnung_ansprechpartner'] = $rechnungsdaten[0]['ansprechpartner'];
            $elemente[0]['rechnung_abteilung'] = $rechnungsdaten[0]['abteilung'];
            $elemente[0]['rechnung_unterabteilung'] = $rechnungsdaten[0]['unterabteilung'];
            $elemente[0]['rechnung_plz'] = $rechnungsdaten[0]['plz'];
            $elemente[0]['rechnung_ort'] = $rechnungsdaten[0]['ort'];
            $elemente[0]['rechnung_bundesstaat'] = $rechnungsdaten[0]['bundesstaat'];
            $elemente[0]['rechnung_land'] = $rechnungsdaten[0]['land'];
            $elemente[0]['rechnung_gln'] = $rechnungsdaten[0]['gln'];
          }


          if($typ === 'lieferschein'){
            $tracking = (string)$this->app->DB->Select("SELECT tracking FROM versand WHERE lieferschein = '" . $elemente[0]['id'] . "' AND tracking <> '' AND lieferschein <> 0 ORDER by id DESC LIMIT 1");
            if($tracking !== '') {
              $elemente[0]['tracking'] = $tracking;
            }
          }
        }
        if($typ === 'rechnung') {
          $auftragsdaten = $this->app->DB->SelectArr("SELECT * FROM auftrag WHERE id = '".$elemente[0]['auftragid']."' LIMIT 1");
          if($auftragsdaten)
          {
            $elemente[0]['tatsaechlicheslieferdatum'] = $auftragsdaten[0]['tatsaechlicheslieferdatum'];
            $elemente[0]['lieferdatum'] = $auftragsdaten[0]['lieferdatum'];
            $elemente[0]['lieferdatumkw'] = $auftragsdaten[0]['lieferdatumkw'];
            $elemente[0]['liefername'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['liefername']:$auftragsdaten[0]['name'];
            $elemente[0]['lieferstrasse'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['liefername']:$auftragsdaten[0]['strasse'];
            $elemente[0]['lieferadresszusatz'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferadresszusatz']:$auftragsdaten[0]['adresszusatz'];
            $elemente[0]['lieferansprechpartner'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferansprechpartner']:$auftragsdaten[0]['ansprechpartner'];
            $elemente[0]['lieferabteilung'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferabteilung']:$auftragsdaten[0]['abteilung'];
            $elemente[0]['lieferunterabteilung'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferunterabteilung']:$auftragsdaten[0]['unterabteilung'];
            $elemente[0]['lieferplz'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferplz']:$auftragsdaten[0]['plz'];
            $elemente[0]['lieferort'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferort']:$auftragsdaten[0]['ort'];
            $elemente[0]['lieferland'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferland']:$auftragsdaten[0]['land'];
            $elemente[0]['lieferbundesstaat'] = $auftragsdaten[0]['abweichendelieferadresse'] == 1? $auftragsdaten[0]['lieferbundesstaat']:$auftragsdaten[0]['bundesstaat'];
          }
          $tracking = (string)$this->app->DB->Select("SELECT tracking FROM versand WHERE rechnung = '".$elemente[0]['id']."' AND tracking <> '' AND rechnung <> 0 ORDER by id DESC LIMIT 1");
          if($tracking !== '')$elemente[0]['tracking'] = $tracking;

            if($elemente[0]['lieferschein'] > 0){
              $lieferscheindaten = $this->app->DB->SelectArr("SELECT * FROM lieferschein WHERE id = '".$elemente[0]['lieferschein']."' LIMIT 1");
              if($lieferscheindaten)
              {
                $elemente[0]['liefername'] = $lieferscheindaten[0]['name'];
                $elemente[0]['lieferstrasse'] = $lieferscheindaten[0]['strasse'];
                $elemente[0]['lieferadresszusatz'] = $lieferscheindaten[0]['adresszusatz'];
                $elemente[0]['lieferansprechpartner'] = $lieferscheindaten[0]['ansprechpartner'];
                $elemente[0]['lieferabteilung'] = $lieferscheindaten[0]['abteilung'];
                $elemente[0]['lieferunterabteilung'] = $lieferscheindaten[0]['unterabteilung'];
                $elemente[0]['lieferplz'] = $lieferscheindaten[0]['plz'];
                $elemente[0]['lieferort'] = $lieferscheindaten[0]['ort'];
                $elemente[0]['lieferland'] = $lieferscheindaten[0]['land'];
                $elemente[0]['lieferbundesstaat'] = $lieferscheindaten[0]['bundesstaat'];
                $elemente[0]['lieferdatum'] = $lieferscheindaten[0]['datum'];
                $elemente[0]['lieferschein'] = $lieferscheindaten[0]['belegnr'];
                $elemente[0]['gln_lieferadresse'] = $lieferscheindaten[0]['gln'];
              }
            }
        }
        $lieferid = 0;
        if($typ !== 'auftrag')
        {
          $lieferid = $this->app->DB->Select("SELECT lieferid FROM auftrag WHERE id = '".$elemente[0]['auftragid']."' LIMIT 1");
        }else{
          $lieferid = $auftragsdaten[0]['lieferid'];
        }
        if($lieferid && $elemente[0]['gln_lieferadresse']=="")
        {
          $gln_lieferadresse = $this->app->DB->Select("SELECT gln FROM lieferadressen WHERE id = '$lieferid' LIMIT 1");
          if($gln_lieferadresse)$elemente[0]['gln_lieferadresse'] = $gln_lieferadresse;
        }

        $rabatt = 0;
        $gebuehr = 0;
        $summe = 0;
        $summeR = 0;
        $summeV = 0;
        $totalR = 0;
        $totalV = 0;
        $elemente_positionen = $typ === 'verbindlichkeit'
          ?null:
          $this->app->DB->SelectArr(
            "SELECT t.*, m.id_ext, art.ean, art.gewicht,art.herstellernummer, art.altersfreigabe, art.lagerartikel "
            .($typ === 'bestellung'?(" ,art.nummer "):'')." 
            FROM `$typposition` AS `t` 
            LEFT JOIN `artikel` AS `art` ON t.artikel = art.id 
            LEFT JOIN `api_mapping` AS `m` ON m.tabelle = '$typposition' AND m.id_int = t.id 
            WHERE t.$typ = '".($elemente[0]['id'])."' "
          );
        if($elemente_positionen)
        {
          if(isset($elemente_positionen[0]['preis']))
          {
            foreach($elemente_positionen as $key => $value)
            {
              if($typ === 'bestellung' && $value['bestellnummer'] == '')$elemente_positionen[$key]['bestellnummer'] = $value['nummer'];
              if($value['umsatzsteuer'] !== "ermaessigt") $value['umsatzsteuer'] = "normal";
              $netto_gesamt = $value['menge']*($value['preis']-($value['preis']/100*$value['rabatt']));
              $summe = $summe + $netto_gesamt;

              if(is_null($value['steuersatz']) || $value['steuersatz'] < 0) {
                if ($value['umsatzsteuer'] == "" || $value['umsatzsteuer'] === "normal") {
                  $summeV = $summeV + (($netto_gesamt / 100) * $this->app->erp->GetSteuersatzNormal(false, $id, "rechnung"));
                  $totalV = $totalV + $netto_gesamt;
                } elseif ($value['umsatzsteuer'] === 'befreit') {

                } else {
                  $summeR = $summeR + (($netto_gesamt / 100) * $this->app->erp->GetSteuersatzErmaessigt(false, $id, "rechnung"));
                  $totalR = $totalR + $netto_gesamt;
                }
              }

              if($value['preis'] < -0.0001)
              {
                $rabatt -= $netto_gesamt;
              }else{
                $gebuehr_artikel = $this->app->DB->Select("SELECT gebuehr FROM artikel WHERE id = '".$value['artikel']."' LIMIT 1");
                if($gebuehr_artikel){
                  $gebuehr += $netto_gesamt;
                }
              }
            }
            if($rabatt)
            {
              $elemente[0]['rabatt'] = round($rabatt,2);
            }else $elemente[0]['rabatt'] = 0;
            if($gebuehr)
            {
              $elemente[0]['gebuehr'] = round($gebuehr,2);
            }else $elemente[0]['gebuehr'] = 0;
            if($this->app->erp->RechnungMitUmsatzeuer($id))
            {
              $elemente[0]['ust'] = round($summeR+$summeV,2);
              $elemente[0]['ust_ermaessigt'] = round($summeR,2);
              $elemente[0]['ust_normal'] = round($summeV,2);

            }else {
              $elemente[0]['ust'] = 0;
            }
          }
        }
        if(isset($parameter['anhang_base64']) && $parameter['anhang_base64'] == 1)
        {
          $anhaenge = $this->app->DB->SelectArr("SELECT DISTINCT s.datei FROM 
            datei d INNER JOIN datei_stichwoerter s ON d.id=s.datei INNER JOIN datei_version v ON v.datei=d.id WHERE s.objekt LIKE '$typ' AND s.parameter = '$id'");
          if($anhaenge)
          {
            $elemente[0]['anhaenge'] = array();
            foreach($anhaenge as $v)
            {
              $datei = $this->app->erp->GetDatei($v['datei']);
              if($datei != '')
              {
                $elemente[0]['anhaenge']['anhang'][] = array('datei'=>base64_encode($datei), 'name'=>$this->app->erp->GetDateiName($v['datei']));
              }
              unset($datei);
            }
          }
        }elseif(isset($parameter['anhaenge']))
        {
          if(is_array($parameter['anhaenge']) && count($parameter['anhaenge']) > 0)
          {
            foreach($parameter['anhaenge'] as $v)
            {
              $elemente[0]['anhaenge']['anhang'][] = $v;
            }
          }
        }
        $this->AddToXMLObj($xml, $typ,$typ.'_list', $elemente, $n, $erg);
        if($elemente_positionen)
        {
          $this->AddToXMLObj($xml, $typposition,$typposition.'_list', $elemente_positionen, $erg, $erg2);
        }
      }
    }
    elseif($typ === 'versand') {
      $elemente = $this->app->DB->SelectArr("SELECT t.*, m.id_ext FROM $typ t LEFT JOIN api_mapping m ON m.api = '".$this->api_id."' AND m.tabelle = '$typ' AND m.id_int = t.id WHERE t.id = '".($id)."' LIMIT 1");
      if($elemente) {
        $auftragid = $this->app->DB->Select("SELECT auftragid FROM lieferschein WHERE id = '".$elemente[0]['lieferschein']."' LIMIT 1");
        if($auftragid) {
          $sprache = $this->app->DB->Select("SELECT sprache FROM auftrag WHERE id = '$auftragid'");
          if($sprache != ''){
            $elemente[0]['tracking_sprache'] = $sprache;
          }
          $auftragextid = $this->app->DB->Select("SELECT id_ext FROM api_mapping m WHERE m.tabelle = 'auftrag' AND m.id_int = '".$auftragid."' AND api = '".$this->api_id."'");
          if($auftragextid){
            $elemente[0]['auftragextid'] = $auftragextid;
          }
        }

        $this->AddToXMLObj($xml, 'lieferschein','lieferschein_list', $elemente, $n, $erg);
      }
    }
    elseif($typ === 'receiptdocumentqs') {
      $typ = 'receiptdocument';
      $typposition = 'receiptdocument_position';
      $elemente = $this->app->DB->SelectArr(
        "SELECT t.*, m.id_ext 
        FROM receiptdocument t 
            INNER JOIN `paketannahme` AS parc ON t.parcel_receipt_id = parc.id
            LEFT JOIN api_mapping m ON m.api = '".$this->api_id."' AND m.tabelle = 'receiptdocument' AND m.id_int = t.id 
            WHERE t.id = '".($id)."' LIMIT 1");

      if($elemente) {
        $this->AddToXMLObj($xml, $typ,$typ.'_list', $elemente, $n, $erg);
        $elemente_positionen = $this->app->DB->SelectArr(
          "SELECT t.*, m.id_ext, art.ean, art.gewicht,art.herstellernummer, art.altersfreigabe, 
          art.lagerartikel, b.belegnr
          FROM receiptdocument_position t 
          INNER JOIN receiptdocument AS r ON t.receiptdocument_id = r.id 
          INNER JOIN `paketannahme` AS parc ON r.parcel_receipt_id = parc.id
          INNER JOIN `paketdistribution` AS pd ON parc.id = pd.paketannahme    
          INNER JOIN bestellung_position AS bp ON pd.bestellung_position = bp.id
          INNER JOIN bestellung AS b ON bp.bestellung = b.id
          LEFT JOIN artikel art ON t.article_id = art.id 
          LEFT JOIN api_mapping m ON m.tabelle = 'receiptdocument_position' AND m.id_int = t.id 
          WHERE t.receiptdocument_id = '".($elemente[0]['id'])."' ");
        if($elemente_positionen) {
          $this->AddToXMLObj($xml, $typposition,$typposition.'_list', $elemente_positionen, $erg, $erg2);
        }
      }
    }
  }

  function ParseXML($dateiname, $api = 0, $uebertragung = 0, $isfile = true)
  {
    $this->lagerzahlen = null;
    $this->bestBeforeBatchArticleStock = [];
    $api = (int)$api;
    $uebertragung = (int)$uebertragung;
    if(!$api && !$uebertragung){
      return false;
    }
    if(!$api){
      $api = $this->app->DB->Select("SELECT api FROM uebertragungen_account WHERE id = '$uebertragung' LIMIT 1");
    }
    //if(!$api || !$this->app->DB->Select("SELECT id FROM uebertragungen_account WHERE id = '$uebertragung' AND aktiv = 1 AND typ = 'lokal' LIMIT 1"))return false;
    //if(!$api)return false;
    $this->api_id = $api;
    $xml = $this->LoadFromXML($dateiname, $isfile);
    if(!$xml)
    {
      if($uebertragung)
      {
        $obj = $this->app->erp->LoadModul('uebertragungen');
        if($obj)
        {
          $obj->datei_id = $this->datei_id;
          if(!is_file($dateiname))
          {
            $obj->AddUbertragungMonitorLog($uebertragung, $this->datei_id, 0, 'download_error','Datei konnte nicht heruntergeladen werden');
          }elseif('' === (string)file_get_contents($dateiname))
          {
            $obj->AddUbertragungMonitorLog($uebertragung, $this->datei_id, 0, 'file_empty','Datei ist leer');
          }else{
            $obj->AddUbertragungMonitorLog($uebertragung, $this->datei_id, 0, 'xml_parseerror','XML konnte nicht geparsed werden');
          }
        }
      }

      $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragung','datei','".$this->app->DB->real_escape_string($dateiname)."','xml_fehler','XML konnte nicht gelesen werden')");
      return false;
    }

    if(!isset($xml->xml) && get_class($xml) !== 'stdClass') {
      return false;
    }

      if((get_class($xml) === 'stdClass' && (!empty($xml)?count($xml):0) >  0) || (isset($xml->xml) && (!empty($xml->xml)?count($xml->xml):0) > 0)) {
        foreach($xml as $key0 => $value0) {
          if($key0 === 'status') {
            $status = &$value0;
            break;
          }
        }
        $ok = true;
        if(isset($status)){
          if(isset($status->messageCode) && $status->messageCode != 1) {
            $ok = false;
          }
        }

        foreach($xml as $key0 => $value0) {
          if($key0 === 'xml'){
            $xml_inhalt = &$value0;
            break;
          }
        }

        $typen = $this->getTabellen();
        foreach($typen as $v){
          $typen_list[] = $v.'_list';
        }
        $belege = $this->getBelege();
        foreach($belege as $v){
          $belege_list[] = $v.'_list';
        }
        if(isset($xml_inhalt)){
          foreach($xml_inhalt as $key => $value) {
            if(in_array($key,$belege) || in_array($key,$typen)) {
              $this->ParseTeilXML($key, $value, $uebertragung);
            }
            if(in_array($key,$belege_list) || in_array($key,$typen_list)){
              foreach($value as $key2 => $value2) {
                if(!in_array($key2,$belege) && !in_array($key2,$typen)) {
                  continue;
                }
                $this->ParseTeilXML($key2, $value2, $uebertragung);
                if(empty($this->app->User) || !method_exists($this->app->User,'GetID') || !$this->app->User->GetID()) {
                  $this->app->DB->Update(
                    "UPDATE `prozessstarter` 
                    SET `letzteausfuerhung`=DATE_ADD(NOW(), INTERVAL 2 MINUTE), `mutex` = 1,`mutexcounter`=0 
                    WHERE `parameter` = 'api_uebertragungen'"
                  );
                }
              }
            }
            if(empty($this->app->User) || !method_exists($this->app->User,'GetID') || !$this->app->User->GetID()) {
              $this->app->DB->Update(
                "UPDATE `prozessstarter` 
                SET `letzteausfuerhung`=DATE_ADD(NOW(), INTERVAL 2 MINUTE), `mutex` = 1,`mutexcounter`=0 
                WHERE `parameter` = 'api_uebertragungen'"
              );
            }
          }
        }
      }
      $this->lagerzahlen = null;
      if((int)$uebertragung <= 0 || empty($this->bestBeforeBatchArticleStock)) {
        $this->bestBeforeBatchArticleStock = [];

        return true;
      }
      $storageMethod = (string)$this->app->DB->Select(
        "SELECT `storage_import_method` FROM `uebertragungen_account` WHERE `id` = {$uebertragung}"
      );
      if($storageMethod === 'overwrite'){
        $this->updateStockByBestBeforeBatch(true);
      }
      if($storageMethod === 'overwritewithoutdelete'){
        $this->updateStockByBestBeforeBatch(false);
      }
      $this->bestBeforeBatchArticleStock = [];

      return true;
  }

    /**
     * @param int  $articleId
     * @param int  $storageLocationId
     * @param bool $isBestBefore
     * @param bool $isBatch
     */
  public function removeBestBeforeBatchesNotExistsInXML(
    int $articleId,
    int $storageLocationId,
    bool $isBestBefore,
    bool $isBatch
  ): void
  {
    if(!$isBatch && !$isBestBefore) {
      return;
    }
    if($articleId <= 0 || $storageLocationId <= 0) {
      return;
    }
    if(empty($this->bestBeforeBatchArticleStock[$articleId])) {
      return;
    }
    if(!isset($this->bestBeforeBatchArticleStock[$articleId][$storageLocationId])) {
      return;
    }
    if($isBestBefore) {
      $bestBefores = [];
      foreach($this->bestBeforeBatchArticleStock[$articleId][$storageLocationId]['entries'] as $entry) {
        if(!empty($entry['bestbefore'])) {
          $bestBefore = $entry['bestbefore'];
          if(strpos($bestBefore, '.') !== false) {
            $bestBefore = $this->app->String->Convert(substr($bestBefore,0,10), '%1.%2.%3', '%3-%2-%1');
          }
          if($isBatch) {
            if(!isset($bestBefores[$bestBefore][(string)$entry['batch']])) {
              $bestBefores[$bestBefore][(string)$entry['batch']] = 0;
            }
            $bestBefores[$bestBefore][(string)$entry['batch']] += $entry['quantity'];
          }
          else {
            if(!isset($bestBefores[$bestBefore])) {
              $bestBefores[$bestBefore] = 0;
            }
            $bestBefores[$bestBefore] += (float)$entry['quantity'];
          }
        }
      }

      if($isBatch) {
        $bestBeforeStocks = $this->app->DB->SelectArr(
          "SELECT `mhddatum`, `charge`, `menge`, `id` 
          FROM `lager_mindesthaltbarkeitsdatum` 
          WHERE `artikel` = {$articleId} AND `lager_platz` = {$storageLocationId}
          ORDER BY `mhddatum`, `charge`, `menge`"
        );
      }
      else {
        $bestBeforeStocks = $this->app->DB->SelectArr(
          "SELECT `mhddatum`, `menge`, `id`
          FROM `lager_mindesthaltbarkeitsdatum` 
          WHERE `artikel` = {$articleId} AND `lager_platz` = {$storageLocationId}
          ORDER BY `mhddatum`, `charge`, `menge`"
        );
      }
      if(empty($bestBeforeStocks)) {
        return;
      }

      foreach($bestBeforeStocks as $bestBeforeStock) {
        if($bestBeforeStock['menge'] <= 0) {
          $this->app->DB->Delete("DELETE FROM `lager_mindesthaltbarkeitsdatum` WHERE `id` = {$bestBeforeStock['id']}");
          continue;
        }
        if(!isset($bestBefores[$bestBeforeStock['mhddatum']])) {
          $this->app->DB->Delete("DELETE FROM `lager_mindesthaltbarkeitsdatum` WHERE `id` = {$bestBeforeStock['id']}");
          $this->app->erp->MHDLog(
            $articleId, $storageLocationId, 0, $bestBeforeStock['mhd'], $bestBeforeStock['menge'], 'API Korrektur'
          );
          if($isBatch) {
            $this->app->erp->ChargeAuslagernLog(
              $articleId, $storageLocationId, $bestBeforeStock['charge'], $bestBeforeStock['menge'], 'API Korrektur'
            );
          }
          continue;
        }
        if($isBatch && !isset($bestBefores[$bestBeforeStock['mhddatum']][$bestBeforeStock['charge']])) {
          $this->app->DB->Delete("DELETE FROM `lager_mindesthaltbarkeitsdatum` WHERE `id` = {$bestBeforeStock['id']}");
          $this->app->erp->MHDLog(
            $articleId, $storageLocationId, 0, $bestBeforeStock['mhd'], $bestBeforeStock['menge'], 'API Korrektur'
          );
          $this->app->erp->ChargeAuslagernLog(
            $articleId, $storageLocationId, $bestBeforeStock['charge'], $bestBeforeStock['menge'], 'API Korrektur'
          );
          continue;
        }
      }
    }
    elseif($isBatch) {
      $batches = [];
      foreach($this->bestBeforeBatchArticleStock[$articleId][$storageLocationId]['entries'] as $entry) {
        $batch = $entry['batch'];
        if(!isset($batches[$batch])) {
          $batches[$batch] = 0;
        }
        $batches[$batch] += (float)$entry['quantity'];
      }
      $batchStocks = $this->app->DB->SelectArr(
        "SELECT `charge`, `menge`, `id` 
        FROM `lager_charge` 
        WHERE `artikel` = {$articleId} AND `lager_platz` = {$storageLocationId}
        ORDER BY `charge`, `menge`"
      );
      if(empty($batchStocks)) {
        return;
      }
      foreach($batchStocks as $batchStock) {
        if($batchStock['menge'] <= 0) {
          $this->app->DB->Delete("DELETE FROM `lager_charge` WHERE `id` = {$batchStock['id']}");
          continue;
        }
        if(!isset($batches[$batchStock['charge']])) {
          $this->app->DB->Delete("DELETE FROM `lager_charge` WHERE `id` = {$batchStock['id']}");
          $this->app->erp->Chargenlog(
            $articleId, $storageLocationId, 0, $batchStock['charge'], $batchStock['menge'], 'API Korrektur'
          );
        }
      }
    }
  }

    /**
     * @param bool $deleteOtherStock
     */
    public function updateStockByBestBeforeBatch(bool $deleteOtherStock = true): void
    {
      if(empty($this->bestBeforeBatchArticleStock)){
        return;
      }
      foreach ($this->bestBeforeBatchArticleStock as $articleId => $stocks) {
        if(empty($articleId) || empty($stocks)){
          continue;
        }
        $article = $this->app->DB->SelectRow(
          "SELECT `projekt`, `chargenverwaltung`, `mindesthaltbarkeitsdatum`, `seriennummern` 
          FROM `artikel` WHERE `id` = {$articleId} LIMIT 1"
        );
        if(empty($article)){
          continue;
        }
        $projectId = $article['projekt'];
        foreach ($stocks as $storageLocationIndex => $stockEntry) {
          if(empty($storageLocationIndex)){
            continue;
          }
          if($deleteOtherStock){
            $this->removeBestBeforeBatchesNotExistsInXML(
              (int)$articleId,
              (int)$storageLocationIndex,
              $article['mindesthaltbarkeitsdatum'] > 0,
              $article['chargenverwaltung'] > 0
            );
          }

          if(!empty($article['mindesthaltbarkeitsdatum'])){
            $stock = (float)$this->app->DB->Select(
              "SELECT SUM(`menge`) 
              FROM `lager_mindesthaltbarkeitsdatum` 
              WHERE `artikel` = {$articleId} AND `lager_platz` = {$storageLocationIndex} AND `menge` > 0"
            );
          }elseif(!empty($article['chargenverwaltung'])){
            $stock = (float)$this->app->DB->Select(
              "SELECT SUM(`menge`) 
              FROM `lager_charge` 
              WHERE `artikel` = {$articleId} AND `lager_platz` = {$storageLocationIndex} AND `menge` > 0"
            );
          }else{
            continue;
          }
          $inStock = (float)$this->app->erp->ArtikelImLagerPlatz($articleId, $storageLocationIndex);
          if(round($inStock, 4) === round($stock, 4)){
            continue;
          }
          if($inStock < $stock){
            $this->app->erp->LagerEinlagern(
              $articleId,
              $stock - $inStock,
              $storageLocationIndex,
              $projectId,
              'API Korrektur'
            );
            continue;
          }
          $this->app->erp->LagerAuslagernRegal(
            $articleId, $storageLocationIndex, $inStock - $stock, $projectId, 'API Korrektur'
          );
        }
      }
    }

    /**
     * @param string $tabelle
     * @param int    $id_int
     * @param string $id_ext
     * @param int    $api
     *
     * @return bool
     */
  public function AddMapping($tabelle, $id_int, $id_ext, $api = 0)
  {
    if(!$api){
      $api = $this->api_id;
    }
    $api = (int)$api;
    if(!$api){
      return false;
    }
    $checkmapping = $this->app->DB->SelectArr("SELECT id, id_ext FROM api_mapping WHERE api = '$api' AND tabelle = '$tabelle' AND id_int = '$id_int' LIMIT 1");
    if($checkmapping) {
      if($checkmapping[0]['id_ext'] == '') {
        $this->app->DB->Update("UPDATE api_mapping SET id_ext = '".$this->app->DB->real_escape_string($id_ext)."' WHERE id = '".$checkmapping[0]['id']."' LIMIT 1");
        return true;
      }
    }
    else{
      $this->app->DB->Insert("INSERT INTO api_mapping (id_int, tabelle, id_ext, api) VALUES ('$id_int','$tabelle','".$this->app->DB->real_escape_string($id_ext)."','$api')");
      return true;
    }

    return false;
  }

  function UpdateMappingXML($typ, &$xml)
  {
    $typen = $this->getTabellen();
    $belege = $this->getBelege();
    $is_beleg = in_array($typ, $belege);
    $is_typ = false;
    if(!$is_beleg){
      $is_typ = in_array($typ, $typen);
    }
    if(!$is_typ && !$is_beleg) {
      return false;
    }

    if(isset($xml->id_ext)) {
      $id_ext = (string)$xml->id_ext;
      if($id_ext != '') {
        $id = 0;
        if(isset($xml->id)){
          $id = (int)$xml->id;
        }
        if($id > 0) {
          $this->AddMapping($typ, $id, $id_ext);
        }
      }
    }
    if(!$is_beleg) {
      return true;
    }

    if(!is_array($xml) && !is_object($xml)) {
      return true;
    }
    if((!empty($xml)?count($xml):0) === 0) {
      return true;
    }

    foreach($xml as $key => $value) {
      if($key == $typ.'_position_list'){
        if((is_array($value) || is_object($value)) && (!empty($value)?count($value):0) > 0) {
          foreach($value as $key2 => $value2)  {
            if($key2 === $typ.'_position' && isset($value2->id_ext)) {
              $id_ext2 = (string)$value2->id_ext;
              if($id_ext2 != '') {
                $id2 = 0;
                if(isset($value2->id)){
                  $id2 = (int)$value2->id;
                }
                if($id2 > 0) {
                  $this->AddMapping($typ.'_position', $id2, $id_ext2);
                }
              }
            }
          }
        }
      }
      elseif($key === $typ.'_position' && isset($value->id_ext)) {
        $id_ext2 = (string)$value->id_ext;
        if($id_ext2 != '') {
          $id2 = 0;
          if(isset($value->id)) {
            $id2 = (int)$value->id;
          }
          if($id2 > 0) {
            $this->AddMapping($typ.'_position', $id2, $id_ext2);
          }
        }
      }
    }

    return true;
  }

  public function GetIDFromFeld($typ, &$xml)
  {
    if(empty($typ)){
      return false;
    }

    if(!is_object($xml) && !is_array($xml)) {
      return false;
    }

    if((!empty($xml)?count($xml):0) === 0) {
      return false;
    }
    $id = 0;

    $id_ext = '';
    if(isset($xml->id_ext)){
      $id_ext = (string)$xml->id_ext;
    }
    if($id_ext != '') {
      $id = (int)$this->app->DB->Select(
        sprintf(
          "SELECT id_int 
          FROM api_mapping 
          WHERE api = %d AND api != 0 AND tabelle = '%s' AND id_ext = '%s' AND id_int > 0 
          LIMIT 1",
          $this->api_id, $typ, $this->app->DB->real_escape_string($id_ext)
        )
      );
      if($id) {
        return $id;
      }
    }
    if(isset($xml->id) && $typ !== 'artikel' && $typ !== 'auftrag' && $typ !== 'bestellung' && $typ !== 'versand'){
      if(in_array($typ, ['lieferschein', 'retoure','rechnung','gutschrift'])) {
        $id = (int)$this->app->DB->Select(sprintf('SELECT `id` FROM `%s` WHERE `id` = %d LIMIT 1', $typ, (int)$xml->id));
      }
      else{
        $id = (int)$xml->id;
      }
    }
    if($id){
      return $id;
    }
    $projekt = $this->app->DB->Select(
      sprintf(
        'SELECT projekt FROM api_account WHERE id = %d AND id != 0 LIMIT 1',
        $this->api_id
      )
    );
    $eigenernummernkreis = false;
    if($projekt) {
      $eigenernummernkreis = $this->app->DB->Select(
        sprintf(
          'SELECT eigenernummernkreis FROM projekt WHERE id = %d LIMIT 1',
          $projekt
        )
      );
    }
    switch($typ) {
      case 'artikel':
        //nummer
        if(!empty($xml->nummer) && $xml->nummer != '') {
          $nummer = trim((string)$xml->nummer);
          if($nummer != '') {
            if($eigenernummernkreis) {
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND nummer = '%s' AND nummer <> '' AND projekt = %d AND geloescht <> 1 
                  LIMIT 1",
                  $this->app->DB->real_escape_string($nummer), $projekt
                )
              );
            }
            else {
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND nummer = '%s' AND nummer <> '' AND geloescht <> 1 
                  LIMIT 1",
                  $this->app->DB->real_escape_string($nummer)
                )
              );
            }
            if($id) {
              return $id;
            }
          }
        }

        //ean
        if(!empty($xml->ean) && $xml->ean != '') {
          $ean = trim((string)$xml->ean);
          if($ean != '') {
            if($eigenernummernkreis) {
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND ean = '%s' AND projekt = %d AND geloescht <> 1 AND ean <> ''
                  ORDER BY intern_gesperrt
                  LIMIT 1",
                  $this->app->DB->real_escape_string($ean), $projekt
                )
              );
            }
            else {
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND ean = '%s' AND geloescht <> 1 AND ean <> ''
                  ORDER BY intern_gesperrt
                  LIMIT 1",
                  $this->app->DB->real_escape_string($ean)
                )
              );
            }
            if($id) {
              return $id;
            }
          }
        }
        //herstellernummer
        if(isset($xml->herstellernummer) && $xml->herstellernummer != '') {
          $herstellernummer = trim((string)$xml->herstellernummer);
          if($herstellernummer != '') {
            if($eigenernummernkreis) {
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND herstellernummer = '%s' AND herstellernummer <> '' 
                    AND projekt = %d AND geloescht <> 1
                  ORDER BY intern_gesperrt
                  LIMIT 1",
                  $this->app->DB->real_escape_string($herstellernummer), $projekt
                )
              );
            }
            else{
              $id = $this->app->DB->Select(
                sprintf(
                  "SELECT id 
                  FROM artikel 
                  WHERE nummer <> 'DEL' AND herstellernummer = '%s' AND herstellernummer <> '' 
                    AND geloescht <> 1
                  ORDER BY intern_gesperrt
                  LIMIT 1",
                  $this->app->DB->real_escape_string($herstellernummer)
                )
              );
            }
            if($id) {
              return $id;
            }
          }
        }

        if(!empty($this->uebertragung_account) && (!empty($xml->bestellnummer) || !empty($xml->nummer))) {
          if(
            $lieferant = $this->app->DB->Select(
              'SELECT adresselieferant FROM uebertragungen_account 
              WHERE  lieferantenbestellnummer = 1 AND 
              id = '.$this->uebertragung_account
            )
          ) {
            $bestellnummer = trim(!empty($xml->bestellnummer)?(string)$xml->bestellnummer:(string)$xml->nummer);
            $id = $this->app->DB->Select(
              sprintf(
                'SELECT art.id 
                FROM einkaufspreise AS ek 
                INNER JOIN artikel AS art ON ek.artikel = art.id
                WHERE ek.bestellnummer = \'%s\' AND ek.bestellnummer <> \'\' AND ek.adresse = %d AND 
                (
                  IFNULL(ek.gueltig_bis,\'0000-00-00\') = \'0000-00-00\' OR
                  ek.gueltig_bis >= CURDATE()
                )
                LIMIT 1',
                $this->app->DB->real_escape_string($bestellnummer),$lieferant
              )
            );
            if($id > 0) {
              return $id;
            }
          }
        }
      break;
      case 'lieferschein':
      case 'retoure':
      case 'rechnung':
      case 'auftrag':
      case 'gutschrift':
      case 'angebot':
        if(isset($xml->belegnr) && (string)$xml->belegnr != ''){
          $id = $this->app->DB->Select("SELECT id FROM $typ WHERE belegnr = '".$this->app->DB->real_escape_string((string)$xml->belegnr)."' LIMIT 1");
        }
        if(!$id && ($typ === 'lieferschein' || $typ === 'retoure'))
        {
          if(!empty($xml->auftrag) && (string)$xml->auftrag != '') {
            $auftragid = $this->app->DB->Select("SELECT id FROM auftrag WHERE belegnr = '".$this->app->DB->real_escape_string((string)$xml->auftrag)."' LIMIT 1");
            if($auftragid) {
              if($typ === 'lieferschein'){
                $id = $this->app->DB->Select("SELECT `id` FROM `lieferschein` WHERE `auftragid` = '$auftragid' AND `status` <> 'storniert' LIMIT 1");
              }
              else {
                $id = $this->app->DB->Select("SELECT `id` FROM `retoure` WHERE `auftragid` = '$auftragid' AND `status` <> 'storniert' LIMIT 1");
              }
            }
          }
        }
        if($id) {
          return $id;
        }
      break;
      case 'lieferschein_position':
      case 'retoure_position':
      case 'rechnung_position':
      case 'auftrag_position':
      case 'gutschrift_position':
      case 'angebot_position':
        $_ptyp = str_replace('_position','',$typ);
        if(isset($xml->$_ptyp) && isset($xml->sort)) {
          $id = $this->app->DB->Select("SELECT id FROM $typ WHERE $_ptyp = '".(int)$xml->$_ptyp."' AND sort = '".(int)$xml->sort."' AND $_ptyp != '0' AND sort != '0' LIMIT 1");
          if($id){
            return $id;
          }
        }
      break;
      case 'adresse':
        if(isset($xml->kundennummer)) {
          $kundennummer = (string)$xml->kundennummer;
          if($kundennummer != '') {
            if($eigenernummernkreis) {
              $id = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> '1' AND kundennummer = '".$this->app->DB->real_escape_string($kundennummer)."' AND projekt = '$projekt' LIMIT 1");
            }
            else{
              $id = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> '1' AND kundennummer = '".$this->app->DB->real_escape_string($kundennummer)."' LIMIT 1");
            }
            if($id){
              return $id;
            }
          }
        }
        if(isset($xml->lieferantennummer)) {
          $lieferantennummer = (string)$xml->lieferantennummer;
          if($lieferantennummer != '') {
            if($eigenernummernkreis) {
              $id = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> '1' AND lieferantennummer = '".$this->app->DB->real_escape_string($lieferantennummer)."' AND projekt = '$projekt' LIMIT 1");
            }
            else{
              $id = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> '1' AND lieferantennummer = '".$this->app->DB->real_escape_string($lieferantennummer)."' LIMIT 1");
            }
            if($id){
              return $id;
            }
          }
        }
      break;
    }

    return false;
  }

    /**
     * @param string $tabelle
     * @param string $extid
     * @param mixed  $xml
     *
     * @return null|int
     */
  public function GetFromExtID($tabelle, $extid, $xml = null)
  {
    if(!$this->uebertragung_account && !$this->api_id){
      return null;
    }
    if($xml && isset($xml->id) && isset($xml->belegnr) && isset($xml->name))
    {
      $id = $this->app->DB->Select("SELECT id FROM $tabelle WHERE id = '".((int)$xml->id)."' AND belegnr = '".$this->app->DB->real_escape_string($xml->belegnr)."' AND name = '".$this->app->DB->real_escape_string($xml->name)."' LIMIT 1");      if($id){
        return $id;
      }
    }
    return $this->app->DB->Select(
      sprintf(
        "SELECT id_int 
        FROM api_mapping 
        WHERE id_ext = '%s' AND tabelle = '%s' AND 
        (
          (uebertragung_account = %d AND uebertragung_account <> 0) OR
          (api = %d AND uebertragung_account <> 0)
        ) 
        ORDER BY %s DESC 
        LIMIT 1",
        $this->app->DB->real_escape_string($extid), $tabelle,(int)$this->uebertragung_account, (int)$this->api_id,
        ($this->uebertragung_account?' uebertragung_account ':' api ')
      )
    );
  }

    /**
     * @param string $tabelle
     * @param int    $id
     *
     * @return null|string
     */
  public function GetExtIDFromIntID($tabelle, $id)
  {
    if(!$this->uebertragung_account && !$this->api_id){
      return null;
    }

    return $this->app->DB->Select(
      sprintf(
        "SELECT id_ext 
        FROM api_mapping 
        WHERE id_int = %d AND tabelle = '%s' AND 
        (
          (uebertragung_account = %d AND uebertragung_account <> 0) AND 
          (api = %d AND uebertragung_account <> 0)
        ) 
        ORDER BY %s DESC 
        LIMIT 1",
        $id,$tabelle, $this->uebertragung_account, $this->api_id,
        $this->uebertragung_account?' uebertragung_account ':' api '
      )
    );
  }

    /**
     * @param string $tabelle
     * @param int    $intid
     * @param string $extid
     *
     * @return bool
     */
  public function SetExtIDMapping($tabelle, $intid, $extid)
  {
    if(!$this->uebertragung_account && !$this->api_id){
      return false;
    }
    $check = $this->GetFromExtID($tabelle, $extid);
    if($check) {
      return $check == $intid;
    }
    $this->app->DB->Insert(
      sprintf(
        "INSERT INTO `api_mapping` (`tabelle`, `id_ext`, `id_int`, `api`, `uebertragung_account`) 
        VALUES ('%s','%s',%d,%d,%d)",
        $tabelle,$this->app->DB->real_escape_string($extid), $intid, $this->api_id, $this->uebertragung_account
      )
    );
    return true;
  }

    /**
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param string         $typ
     *
     * @return bool
     */
  public function isAllowedToImport($uebertragungen_account, $obj, $typ) {
    switch($typ) {
      case 'auftrag':
      case 'angebot':
        if(!$this->app->DB->Select("SELECT auftrageingang FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1"))
        {
          if(!$this->app->DB->Select("SELECT id FROM `uebertragungen_monitor` WHERE uebertragungen_account = '$uebertragungen_account' AND datei = '".$this->datei_id."' AND status = 'notallowed' AND doctype = '$typ' AND zeitstempel > DATE_SUB(now(), INTERVAL 1 HOUR)  LIMIT 1")){
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', ucfirst($typ).'-Eingang ist nicht aktiviert', '', '', '', $typ);
          }
          return false;
        }
        break;
      case 'bestellung':
      case 'produktion':
        if(!$this->app->DB->Select("SELECT bestellungeingang FROM uebertragungen_account WHERE id = '".$uebertragungen_account."'  LIMIT 1"))
        {
          if(!$this->app->DB->Select("SELECT id FROM `uebertragungen_monitor` WHERE uebertragungen_account = '$uebertragungen_account' AND datei = '".$this->datei_id."' AND status = 'notallowed' AND doctype = '$typ' AND zeitstempel > DATE_SUB(now(), INTERVAL 1 HOUR)  LIMIT 1")){
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', ucfirst($typ).'-Eingang ist nicht aktiviert', '', '', '', $typ);
          }
          return false;
        }
        break;
      case 'lieferschein':
        if(!$this->app->DB->Select("SELECT trackingeingang FROM uebertragungen_account WHERE id = '".$uebertragungen_account."'  LIMIT 1"))
        {
          if(!$this->app->DB->Select("SELECT id FROM `uebertragungen_monitor` WHERE uebertragungen_account = '$uebertragungen_account' AND datei = '".$this->datei_id."' AND status = 'notallowed' AND doctype = '$typ' AND zeitstempel > DATE_SUB(now(), INTERVAL 1 HOUR)  LIMIT 1")){
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', 'Tracking-Eingang ist nicht aktiviert', '', '', '', $typ);
          }
          return false;
        }
        break;
      case 'retoure':
        if(
          !$this->app->DB->Select(
            sprintf(
              'SELECT `alldoctypes` FROM `uebertragungen_account` WHERE `id` = %d LIMIT 1',
              $uebertragungen_account
            )
          )
        ){
          if(
            !$this->app->DB->Select(
              sprintf(
                "SELECT `id` 
                FROM `uebertragungen_monitor` 
                WHERE `uebertragungen_account` = %d 
                  AND `datei` = %d AND `status` = 'notallowed' 
                  AND `doctype` = '%s' 
                  AND `zeitstempel` > DATE_SUB(now(), INTERVAL 1 HOUR)  
                LIMIT 1",
                $uebertragungen_account, $this->datei_id, $typ
              )
            )
          ){
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', ucfirst($typ).'-Eingang ist nicht aktiviert', '', '', '', $typ);
          }
          return false;
        }
        break;
    }

    return true;
  }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
  public function ParsePartXmlAricleWithId(&$xml, $uebertragungen_account, $obj, $id)
  {
    $artikelarr = ['id' => $id];
    $account = $this->app->DB->SelectRow(
      sprintf(
        'SELECT updatearticles FROM uebertragungen_account WHERE id = %d  LIMIT 1',
        $uebertragungen_account
      )
    );
    $updatearticles = !empty($account['updatearticles']);
    if(!empty($xml->anlegen) && $updatearticles && !empty($xml->nummer) && !empty($xml->name_de)) {
      if(!empty($this->app->stringcleaner)) {
        $this->app->stringcleaner->XMLArray_clean($xml);
      }
      foreach($xml as $k => $v) {
        if(empty($k) || $k === 'id' || $k === 'nummer' || is_numeric($k)) {
          continue;
        }
        $vr = @reset($v);
        if(is_numeric($vr) || is_string($vr)) {
          $artikelarr[$k] = (string)$vr;
        }
      }

      //if(isset($xml->nummer))$artikelarr['nummer'] = (string)$xml->nummer;
      if(isset($xml->ean))$artikelarr['ean'] = (string)$xml->ean;
      if(isset($xml->herstellernummer))$artikelarr['herstellernummer'] = (string)$xml->herstellernummer;
      if(isset($xml->name_de))$artikelarr['name_de'] = (string)$xml->name_de;
      if(isset($xml->name_en))$artikelarr['name_en'] = (string)$xml->name_en;
      if(isset($xml->anabregstext))$artikelarr['anabregstext'] = (string)$xml->anabregstext;
      if(isset($xml->anabregstext_en))$artikelarr['anabregstext_en'] = (string)$xml->anabregstext_en;
      if(isset($xml->uebersicht_de))$artikelarr['uebersicht_de'] = (string)$xml->uebersicht_de;
      if(isset($xml->uebersicht_en))$artikelarr['uebersicht_en'] = (string)$xml->uebersicht_en;
      if(isset($xml->kurztext_de))$artikelarr['kurztext_de'] = (string)$xml->kurztext_de;
      if(isset($xml->kurztext_en))$artikelarr['kurztext_en'] = (string)$xml->kurztext_en;
      if(isset($xml->lagerartikel))$artikelarr['lagerartikel'] = (string)$xml->lagerartikel;

      if(isset($xml->gewicht))$artikelarr['gewicht'] = (string)$xml->gewicht;
      if(isset($xml->breite))$artikelarr['breite'] = (string)$xml->breite;
      if(isset($xml->laenge))$artikelarr['laenge'] = (string)$xml->laenge;
      if(isset($xml->hoehe))$artikelarr['hoehe'] = (string)$xml->hoehe;

      for($i = 1; $i <= 20; $i++) {
        $name = 'freifeld'.$i;
        if(isset($xml->$name)){
          $xml->$name = $this->app->Secure->CleanString($xml->$name, 'nohtml');
          $artikelarr[$name] = (string)$xml->$name;
        }
      }
      $artikelid = $this->app->erp->InsertUpdateArtikel($artikelarr, true);
      if($artikelid) {
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'artikel_ok', 'Artikel ' . (string)$xml->nummer . ' updated', '', '', '', 'artikel', $artikelid);
      }
      unset($artikelarr);
    }

    if((isset($xml->lagerzahl) || isset($xml->mhdanzahl) || !empty($xml->mhd) || !empty($xml->charge)) && $this->app->DB->Select("SELECT lagerzahleneingang FROM uebertragungen_account WHERE id = '".$uebertragungen_account."'  LIMIT 1")) {

      $artArr = $this->app->DB->SelectRow(
        sprintf(
          'SELECT chargenverwaltung,seriennummern,mindesthaltbarkeitsdatum, lagerartikel FROM artikel WHERE id = %d',
          $id
        )
      );
      if(empty($artArr['lagerartikel'])) {
        if($uebertragungen_account) {
          $obj->AddUbertragungMonitorLog(
            $uebertragungen_account,
            $this->datei_id,
            0,
            'artikel_error',
            'Artikel ' . (string)$xml->nummer . ' ist kein Lagerartikel',
            '',
            '',
            '',
            'artikel',
            $id
          );
        }
        return;
      }
      if(!in_array((string)$artArr['seriennummern'], ['', 'keine', 'vomprodukt'])) {
        if($uebertragungen_account) {
          $obj->AddUbertragungMonitorLog(
            $uebertragungen_account,
            $this->datei_id,
            0,
            'artikel_error',
            'Artikel ' . (string)$xml->nummer . ' ist ein Seriennummern-Artikel',
            '',
            '',
            '',
            'artikel',
            $id
          );
        }
        return;
      }

      $lagerzahl = isset($xml->lagerzahl)?str_replace(',','.',(string)$xml->lagerzahl):null;
      $mhdanzahl = isset($xml->mhdanzahl)?str_replace(',','.',(string)$xml->mhdanzahl):null;
      if(!empty($artArr['mindesthaltbarkeitsdatum']) && empty($xml->mhd) && ((float)$lagerzahl != 0 || (float)$mhdanzahl != 0)) {
        if($uebertragungen_account) {
          $obj->AddUbertragungMonitorLog(
            $uebertragungen_account,
            $this->datei_id,
            0,
            'artikel_error',
            'Artikel ' . (string)$xml->nummer . ': kein MHD angegeben',
            '',
            '',
            '',
            'artikel',
            $id
          );
        }
        return;
      }

      if(empty($artArr['mindesthaltbarkeitsdatum']) && !empty($artArr['chargenverwaltung']) && empty($xml->charge) && (float)$lagerzahl != 0) {
        if($uebertragungen_account) {
          $obj->AddUbertragungMonitorLog(
            $uebertragungen_account,
            $this->datei_id,
            0,
            'artikel_error',
            'Artikel ' . (string)$xml->nummer . ': keine Charge angegeben',
            '',
            '',
            '',
            'artikel',
            $id
          );
        }
        return;
      }

      //$lagerzahl = str_replace(',','.',isset($xml->lagerzahl)?(string)$xml->lagerzahl:$xml->mhdanzahl);

      $lager_platz_id = false;
      $lagerplatz = false;
      $lagerplatzignorieren = $this->app->DB->Select("SELECT lagerplatzignorieren FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");

      if(isset($xml->lager_platz) && !$lagerplatzignorieren) {
        $lagerplatz = (string)$xml->lager_platz;

        $lagerplatz = $this->app->DB->Select("SELECT id FROM lager_platz WHERE kurzbezeichnung = '".$this->app->DB->real_escape_string($lagerplatz)."' LIMIT 1");

        $lager_platz_id = $lagerplatz;
        if(!$lager_platz_id) {
          $lagerplatz = $this->app->DB->Select("SELECT lager FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");
          $lager_platz_id = $lagerplatz;
        }
      }
      else {
        if(!isset($xml->lager_platz)) {
          $this->lagerzahlen[$uebertragungen_account][$id][isset($xml->lager_platz) && (string)$xml->lager_platz != ''?(string)$xml->lager_platz:'0'] = 0;
        }
        $lagerplatz = $this->app->DB->Select("SELECT lager FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");
        $lager_platz_id = $lagerplatz;
      }
      $storageLocationIndex = (!$lagerplatzignorieren && isset($xml->lager_platz) && (string)$xml->lager_platz != '')?(string)$xml->lager_platz:'0';
      $storageLocationId = empty($lager_platz_id) ? 0 : (int)$lager_platz_id;
      if(empty($this->lagerzahlen)
        || empty($this->lagerzahlen[$uebertragungen_account])
        || empty($this->lagerzahlen[$uebertragungen_account][$id])
        || !isset($this->lagerzahlen[$uebertragungen_account][$id][(!$lagerplatzignorieren && isset($xml->lager_platz) && $xml->lager_platz != '')?(string)$xml->lager_platz:'0'])) {
        $this->lagerzahlen[$uebertragungen_account][$id][(!$lagerplatzignorieren && isset($xml->lager_platz) && (string)$xml->lager_platz != '')?(string)$xml->lager_platz:'0'] = 0;
      }

      if($lagerzahl !== null && round((float)str_replace(',','.',$lagerzahl),8) < 0) {
        if($uebertragungen_account) {
          $obj->AddUbertragungMonitorLog(
            $uebertragungen_account,
            $this->datei_id,
            0,
            'artikel_error',
            'Artikel ' . (string)$xml->nummer . ' Lagerzahl '.$lagerzahl.' kleiner als 0',
            '',
            '',
            '',
            'artikel',
            $id
          );
        }
        return;
      }
      if($lagerzahl !== null && $lagerzahl != ''
        && (empty($artArr['chargenverwaltung']) || !isset($xml->charge))
        && (empty($artArr['mindesthaltbarkeitsdatum']) || !isset($xml->mhd))
      ) {
        $lagerzahl = round((float)str_replace(',','.',$lagerzahl),8);
        $this->lagerzahlen[$uebertragungen_account][$id][(!$lagerplatzignorieren && isset($xml->lager_platz) && (string)$xml->lager_platz != '')?(string)$xml->lager_platz:'0'] += $lagerzahl;
        $lagerzahl = $this->lagerzahlen[$uebertragungen_account][$id][(!$lagerplatzignorieren && isset($xml->lager_platz) && (string)$xml->lager_platz != '')?(string)$xml->lager_platz:'0'];
        if($lager_platz_id) {
          $vorhanden = round((float)$this->app->DB->Select("SELECT IFNULL(sum(menge),0) FROM lager_platz_inhalt WHERE lager_platz = '$lager_platz_id' AND artikel = '$id'"),8);
        }
        else{
          $vorhanden = round((float)$this->app->erp->ArtikelAnzahlLager($id),8);
        }
        $projekt = (int)$this->app->DB->Select("SELECT projekt FROM artikel WHERE id = '$id' LIMIT 1");
        if(round($lagerzahl,8) > round($vorhanden,8)) {

          if(!$lagerplatz) {
            $lagerplatz = $this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$id' LIMIT 1");
          }
          if(!$lagerplatz) {
            $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id WHERE lpi.artikel = '$id' AND lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lpi.menge DESC LIMIT 1");
          }
          if(!$lagerplatz) {
            $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz lp WHERE lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lp.id ASC LIMIT 1");
          }
          if($lagerplatz) {
            $this->app->erp->LagerEinlagern($id,$lagerzahl - $vorhanden,$lagerplatz,$projekt,'API Korrektur',true);
            $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','artikel','$id','lagerzahl','$lagerzahl')");
            $this->lagerzahlenmonitor[$uebertragungen_account][$id] = $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok', '', $lagerzahl, '', '', 'artikel', $id,(isset($this->lagerzahlenmonitor) && isset($this->lagerzahlenmonitor[$uebertragungen_account]) && isset($this->lagerzahlenmonitor[$uebertragungen_account][$id]))?$this->lagerzahlenmonitor[$uebertragungen_account][$id]:0);
          }
        }
        elseif(round($lagerzahl,8) < round($vorhanden,8)) {
          $auslagern = $vorhanden - $lagerzahl;
          if(!$lagerplatz) {
            $lagerplatz = $this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$id' LIMIT 1");
          }
          if($lagerplatz) {
            $bestand = round((float)$this->app->erp->ArtikelImLagerPlatz($id, $lagerplatz),8);
            if($bestand >= $auslagern) {
              $this->app->erp->LagerAuslagernRegal($id, $lagerplatz, $auslagern, $projekt,'API Korrektur',true );
              $auslagern = 0;
            }
            elseif($bestand > 0) {
              $this->app->erp->LagerAuslagernRegal($id, $lagerplatz, $bestand, $projekt,'API Korrektur',true );
              $auslagern -= $bestand;
            }
          }
          if($auslagern > 0 && !$lager_platz_id) {
            $lagerplaetze = $this->app->DB->SelectArr("SELECT lp.id FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id WHERE lpi.artikel = '$id' AND lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lpi.menge DESC");
            if($lagerplaetze) {
              foreach($lagerplaetze as $lagerplatz) {
                $bestand = round((float)$this->app->erp->ArtikelImLagerPlatz($id, $lagerplatz['id']),8);
                if($bestand >= $auslagern) {
                  $this->app->erp->LagerAuslagernRegal($id, $lagerplatz['id'], $auslagern, $projekt,'API Korrektur',true );
                  $auslagern = 0;
                }
                elseif($bestand > 0) {
                  $this->app->erp->LagerAuslagernRegal($id, $lagerplatz['id'], $bestand, $projekt,'API Korrektur',true );
                  $auslagern -= $bestand;
                }
                if($auslagern <= 0) {
                  break;
                }
              }
            }
          }
          if($auslagern != $vorhanden - $lagerzahl) {
            $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','artikel','$id','lagerzahl','$lagerzahl')");
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok', '', $lagerzahl, '', '', 'artikel', $id);
          }
        }
      }
      $storageChanged = 0;
      //MHD
      if(!empty($artArr['mindesthaltbarkeitsdatum']) && isset($xml->mhd)) {
        if(empty($this->bestBeforeBatchArticleStock[$id])
          || !isset($this->bestBeforeBatchArticleStock[$id][$storageLocationId])
        ) {
          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['stock'] = 0;
          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['entries'] = [];
        }

        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$id' LIMIT 1");
        }
        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id WHERE lpi.artikel = '$id' AND lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lpi.menge DESC LIMIT 1");
        }
        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz lp WHERE lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lp.id ASC LIMIT 1");
        }

        if($lager_platz_id) {
          $wawimhd = $this->app->DB->SelectArr(
            "SELECT * FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' AND lager_platz = '$lager_platz_id' order by mhddatum, menge desc"
          );
          $chargenmhd = $this->app->DB->SelectArr(
            "SELECT * FROM lager_charge WHERE artikel = '$id' AND lager_platz = '$lager_platz_id' order by charge, menge desc"
          );
        }
        else {
          $wawimhd = null;//$this->app->DB->SelectArr("SELECT * FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' order by mhddatum");
          $chargenmhd = null;//$this->app->DB->SelectArr("SELECT * FROM lager_charge WHERE artikel = '$id' order by charge, menge desc");
          if($wawimhd) {
            $mhdohnelager = null;//$this->app->DB->SelectArr("SELECT mhddatum, sum(menge) as smenge FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' group by mhddatum order by mhddatum ");
          }
          if($chargenmhd) {
            $chargenohnelager = null;//$this->app->DB->SelectArr("SELECT charge, sum(menge) as smenge FROM lager_charge WHERE artikel = '$id' group by charge order by charge ");
          }
        }

        $mhd = $xml->mhd;
        if(!empty($mhd) && !is_string($mhd) && !is_numeric($mhd) &&  (!empty($mhd)?count($mhd):0) === 1 && empty($mhd->datum)
          && empty($mhd->mhddatum) && empty($mhd->anzahl)) {
          $mhd = reset($mhd);
        }
        if(isset($mhd->datum)) {
          $mhddatum = json_decode(json_encode($mhd->datum), true);
        }
        elseif(isset($xml->mhddatum)) {
          $mhddatum = json_decode(json_encode($xml->mhddatum), true);
          if(is_string($mhddatum)) {
            $mhddatum = [$mhddatum];
          }
        }
        elseif(is_string($mhd)) {
          $mhddatum = [$mhd];
        }
        $mhdanzahl = null;
        $mhdcharge = null;
        if(isset($mhd->anzahl)) {
          $mhdanzahl = json_decode(json_encode($mhd->anzahl),true);
        }
        elseif(isset($xml->mhdanzahl) && is_string(json_decode(json_encode($xml->mhdanzahl),true))) {
          $mhdanzahl = [json_decode(json_encode($xml->mhdanzahl),true)];
        }
        elseif(isset($xml->mhdanzahl) && is_numeric((string)$xml->mhdanzahl)) {
          $mhdanzahl = [(float)(string)$xml->mhdanzahl];
        }
        elseif(isset($xml->lagerzahl) && is_numeric((string)$xml->lagerzahl)) {
          $mhdanzahl = [(float)(string)$xml->lagerzahl];
        }
        if(isset($mhd->charge)) {
          $mhdcharge = json_decode(json_encode($mhd->charge),true);
        }
        elseif(isset($xml->charge)
          && (is_string($xml->charge) || (!is_numeric($xml->charge) && (!empty($xml->charge)?count($xml->charge):0) === 1))) {
          $mhdcharge = [(string)$xml->charge];
        }

        foreach($mhddatum as $kmhd => $m) {
          $charge = '';
          $anzahl = 1;
          if(isset($mhd->charge)) {
            $charge = (string)$mhdcharge[$kmhd];
          }
          elseif(isset($mhdcharge[$kmhd])) {
            $charge = (string)$mhdcharge[$kmhd];
          }
          if(isset($mhd->anzahl)) {
            $anzahl = (int)$mhdanzahl[$kmhd];
          }
          elseif(isset($mhdanzahl[$kmhd])) {
            $anzahl = (int)$mhdanzahl[$kmhd];
          }
          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['stock'] += (float)$anzahl;
          $datum = date('Y-m-d',strtotime( (string)$m));

          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['entries'][] =
            [
              'bestbefore' => $datum, 'batch' => $artArr['chargenverwaltung'] > 0 ? $charge : null, 'quantity' => $anzahl
            ];

          $chargenlager = null;
          $found = false;
          $foundcharge = false;
          $lagerzahl = null;
          if($wawimhd) {
            if($lager_platz_id) {
              $inBestBeforeStorage = 0.0;
              $countBestBeforeEntries = 0;
              foreach($wawimhd as $k => $v) {
                if($v['mhddatum'] != $datum) {
                  continue;
                }
                if($artArr['chargenverwaltung'] > 0 && !empty($charge)){
                  if((string)$charge !== (string)$v['charge']){
                    continue;
                  }
                }
                $inBestBeforeStorage += (float)$v['menge'];
                $countBestBeforeEntries++;
              }
              $toChange = round($anzahl - $inBestBeforeStorage,4);
              if($inBestBeforeStorage > 0 && $toChange == 0) {
                $found = true;
                $foundcharge = true;
                $anzahl = 0;
                $inBestBeforeStorage = 0;
              }
              elseif($inBestBeforeStorage > 0 && round($inBestBeforeStorage, 4) != round($anzahl,4)){
                $toChange = round($anzahl - $inBestBeforeStorage,4);
                foreach ($wawimhd as $k => $v) {
                  if($v['mhddatum'] == $datum){
                    if($artArr['chargenverwaltung'] > 0 && !empty($charge)){
                      if((string)$charge !== (string)$v['charge']){
                        if((!empty($mhddatum)?count($mhddatum):0) === 1){
                          unset($wawimhd[$k]);
                        }
                        continue;
                      }
                    }
                    $found = true;
                    $wawimhd[$k]['gefunden'] = true;
                    if($toChange < 0) {
                      if($v['menge'] <= -$toChange) {
                        $this->app->DB->Delete(
                          sprintf(
                            'DELETE FROM `lager_mindesthaltbarkeitsdatum` WHERE `id` = %d',
                            $v['id']
                          )
                        );
                        $this->app->erp->MHDLog(
                          $v['artikel'], $v['lager_platz'],  0,
                          $v['mhddatum'], $v['menge'], 'API Korrektur', '', 0, $v['charge']
                        );
                        $toChange += $v['menge'];
                        if(!empty($v['charge'])) {
                          if($this->app->erp->ChargeAuslagernLog(
                            $v['artikel'], $v['lager_platz'], $v['charge'], $v['menge'], 'API Korrektur'
                          )){
                            $foundcharge = true;
                          }
                        }
                        $storageChanged -= $v['menge'];
                        continue;
                      }
                      if($v['menge'] > -$toChange) {
                        $this->app->DB->Update(
                          sprintf(
                            'UPDATE `lager_mindesthaltbarkeitsdatum` SET `menge` = `menge` - %f WHERE `id` = %d',
                            -$toChange, $v['id']
                          )
                        );
                        if(!empty($v['charge'])) {
                          if($this->app->erp->ChargeAuslagernLog(
                            $v['artikel'], $v['lager_platz'], $v['charge'], -$toChange, 'API Korrektur'
                          )) {
                            $foundcharge = true;
                          }
                        }
                        $storageChanged += $toChange;
                        $toChange = 0;
                        break;
                      }
                    }

                    if($toChange > 0) {
                      $this->app->DB->Update(
                        sprintf(
                          'UPDATE `lager_mindesthaltbarkeitsdatum` SET `menge` = `menge` + %f WHERE `id` = %d',
                          $toChange, $v['id']
                        )
                      );
                      $this->app->erp->MHDLog(
                        $v['artikel'], $v['lager_platz'], 1,
                        $v['mhddatum'], $toChange, 'API Korrektur', '', 0, $v['charge']
                      );
                      if(!empty($v['charge'])){
                        $this->app->erp->AddChargeLagerOhneBewegung(
                          $v['artikel'], $toChange, $v['lager_platz'], date('Y-m-d'), $v['charge'], 'API Korrektur'
                        );
                        $foundcharge = true;
                      }
                      $storageChanged += $toChange;
                      $anzahl = 0;
                      $toChange = 0;
                      break;
                    }
                  }
                }
              }
              /*if($chargenmhd && $charge) {
                foreach($chargenmhd as $k => $v) {
                  if($v['charge'] == $charge) {
                    $foundcharge = true;
                    $chargenmhd[$k]['gefunden'] = true;
                    if($v['menge'] != $anzahl) {
                      $storageChanged += $v['menge'] - $anzahl;
                      $this->app->DB->Update(
                        "UPDATE lager_charge SET menge = '$anzahl' WHERE id = '".$v['id']."' LIMIT 1"
                      );

                      break;
                    }
                  }
                }
              }*/
              if(!$found && $anzahl > 0) {
                $storageChanged += $anzahl;
                $this->app->DB->Insert(
                  "INSERT INTO lager_mindesthaltbarkeitsdatum (artikel, datum, mhddatum, menge, lager_platz, charge) 
                              values ('$id',now(),'$datum','$anzahl','$lager_platz_id','".$this->app->DB->real_escape_string($charge)."')"
                );
                $this->app->erp->MHDLog($id, $lager_platz_id,1,$datum,$anzahl,'API Korrektur','',0,$charge);
              }
              if(!$foundcharge && $charge && $anzahl > 0) {
                $this->app->DB->Insert(
                  "INSERT INTO lager_charge (artikel, datum, menge, lager_platz, charge) 
                            values ('$id',now(),'$anzahl','$lager_platz_id','".$this->app->DB->real_escape_string($charge)."')"
                );
                $this->app->erp->Chargenlog($id, $lager_platz_id,1,$charge,$anzahl,'API Korrektur','',0,$charge);
              }
            }
            else {
              if($mhdohnelager) {
                foreach($mhdohnelager as $k => $v) {
                  if($v['mhddatum'] == $datum) {
                    $mhdohnelager[$k]['gefunden'] = true;
                    $found = true;
                    if($v['smenge'] < $anzahl) {
                      foreach($wawimhd as $k2 => $v2) {
                        if($v2['mhddatum'] == $datum)
                        {
                          $storageChanged += $anzahl - $v2['menge'];
                          $this->app->DB->Update(
                            "UPDATE lager_mindesthaltbarkeitsdatum 
                                        SET menge = $anzahl WHERE id = '".$v2['id']."' LIMIT 1"
                          );
                          if($v2['menge'] < $anzahl) {
                            $this->app->erp->MHDLog(
                              $id, $v2['lager_platz'],1,$v2['mdhdatum'],abs($v2['menge'] < $anzahl),'API Korrektur','',0,$v2['charge']
                            );
                          }
                          elseif($anzahl < $v2['menge']) {
                            $this->app->erp->MHDLog(
                              $id, $v2['lager_platz'],0,$v2['mdhdatum'],abs($v2['menge'] < $anzahl),'API Korrektur','',0,$v2['charge']
                            );
                          }
                          if($charge) {
                            $hinzuf = $anzahl - $v['smenge'];
                            if(!isset($chargenlager[$v2['lager_platz'].'-'.$charge])) {
                              $chargenlager[$v2['lager_platz'].'-'.$charge] = 0;
                            }
                            $chargenlager[$v2['lager_platz'].'-'.$charge] += $hinzuf;
                          }
                          break;
                        }
                      }
                    }
                    elseif($v['smenge'] > $anzahl) {
                      $abzuziehen = $v['smenge'] - $anzahl;
                      foreach($wawimhd as $k2 => $v2) {
                        if($v2['menge'] > 0) {
                          if($abzuziehen > 0) {
                            if($abzuziehen >= $v2['menge']) {
                              $abzuziehen -= $v2['menge'];
                              $storageChanged -= $v2['menge'];
                              $this->app->DB->Delete(
                                "DELETE FROM lager_mindesthaltbarkeitsdatum WHERE id = '".$v2['id']."' LIMIT 1"
                              );
                              $this->app->erp->MHDLog(
                                $id, $v2['lager_platz'],0,$v2['mdhdatum'],$v2['menge'],'API Korrektur','',0,$v2['charge']
                              );
                              if(!isset($chargenlager[$v2['lager_platz'].'-'.$charge])) {
                                $chargenlager[$v2['lager_platz'].'-'.$charge] = 0;
                              }
                              $chargenlager[$v2['lager_platz'].'-'.$charge] -= $v2['menge'];
                            }
                            else {
                              $storageChanged -= $abzuziehen;
                              $this->app->DB->Update(
                                "UPDATE lager_mindesthaltbarkeitsdatum 
                                          SET menge = menge - $abzuziehen WHERE id = '".$v2['id']."' LIMIT 1"
                              );
                              $this->app->erp->MHDLog($id, $v2['lager_platz'],0,$v2['mdhdatum'],$abzuziehen,'API Korrektur','',0,$v2['charge']);
                              if(!isset($chargenlager[$v2['lager_platz'].'-'.$charge])) {
                                $chargenlager[$v2['lager_platz'].'-'.$charge] = 0;
                              }
                              $chargenlager[$v2['lager_platz'].'-'.$charge] -= $abzuziehen;
                              $abzuziehen = 0;
                              break;
                            }
                          }
                        }
                      }
                    }
                  }
                }
                if(!$found && $anzahl > 0) {
                  $this->app->DB->Insert(
                    "INSERT INTO lager_mindesthaltbarkeitsdatum (artikel, datum, mhddatum, menge, lager_platz, charge) 
                            values ('$id',now(),'$datum','$anzahl','$lager_platz_id','".$this->app->DB->real_escape_string($charge)."')");
                  $this->app->erp->MHDLog($id, $lager_platz_id,1,$datum,$anzahl,'API Korrektur','',0,$charge);
                  if(!isset($chargenlager[$lager_platz_id.'-'.$charge])) {
                    $chargenlager[$lager_platz_id.'-'.$charge] = 0;
                  }
                  $chargenlager[$lager_platz_id.'-'.$charge] += $anzahl;
                  $storageChanged += $anzahl;
                }
              }
            }
          }
          elseif($anzahl > 0) {
            $this->app->DB->Insert(
              "INSERT INTO lager_mindesthaltbarkeitsdatum (artikel, datum, mhddatum, menge, lager_platz, charge) 
                        values ('$id',now(),'$datum','$anzahl','$lagerplatz','".$this->app->DB->real_escape_string($charge)."')"
            );
            $this->app->erp->MHDLog($id, $lagerplatz,1,$datum,$anzahl,'API Korrektur','',0,$charge);
            $storageChanged += $anzahl;
            if(!isset($chargenlager[$lagerplatz.'-'.$charge])) {
              $chargenlager[$lagerplatz.'-'.$charge] = 0;
            }
            $chargenlager[$lagerplatz.'-'.$charge] += $anzahl;
          }
          if(isset($chargenlager)) {
            foreach($chargenlager as $kl => $vls)  {
              $vla = explode('-', $vls, 2);
              $vl = $vla[0];
              $charge = '';
              if(isset($vla[1])) {
                $charge = $vla[1];
              }
              if($charge) {
                if($vl < 0) {
                  if($chargenmhd)
                  {
                    $abzuziehen = -$vl;
                    foreach($chargenmhd as $vch) {
                      if($vch['lager_platz'] == $kl && $charge == $vch['charge']) {
                        if($vch['menge'] > $abzuziehen) {
                          $this->app->DB->Update("UPDATE lager_charge SET menge = menge - $abzuziehen WHERE id = '".$vch['id']."' LIMIT 1");
                          $this->app->erp->Chargenlog($id, $vch['lager_platz'],0,$vch['charge'], $abzuziehen,'API Korrektur');
                          $abzuziehen = 0;
                          break;
                        }
                        if($vch['menge'] == $abzuziehen) {
                          $this->app->DB->Delete("DELETE FROM lager_charge id = '".$vch['id']."' LIMIT 1");
                          $this->app->erp->Chargenlog($id, $vch['lager_platz'],0,$vch['charge'], $vch['menge'],'API Korrektur');
                          break;
                        }
                        if($abzuziehen > 0) {
                          $this->app->DB->Delete("DELETE FROM lager_charge id = '".$vch['id']."' LIMIT 1");
                          $this->app->erp->Chargenlog($id, $vch['lager_platz'],0,$vch['charge'], $vch['menge'],'API Korrektur');
                          $abzuziehen -= $vch['menge'];
                        }
                      }
                    }
                  }
                }
                elseif($vl > 0) {
                  $hinzuf = $vl;
                  if($chargenmhd) {
                    foreach($chargenmhd as $vch) {
                      if($vch['lager_platz'] == $kl && $charge == $vch['charge']) {
                        $this->app->DB->Update(
                          "UPDATE lager_charge SET menge = menge + $vl WHERE id = '".$vch['id']."' LIMIT 1"
                        );
                        $this->app->erp->Chargenlog($id, $vch['lager_platz'],1,$vch['charge'], $vl,'API Korrektur');
                        $hinzuf = 0;
                        break;
                      }
                    }
                  }
                  if($hinzuf) {
                    $this->app->DB->Insert("INSERT INTO lager_charge (artikel, lager_platz, menge, charge) values ('$id','$kl','$hinzuf','$charge')");
                    $this->app->erp->Chargenlog($id, $kl,1,$charge, $hinzuf,'API Korrektur');
                  }
                }
              }
            }
          }
        }
        if(isset($wawimhd) && $lagerzahl !== null) {
          if($lager_platz_id) {
            foreach($wawimhd as $k => $v) {
              if(!isset($v['gefunden'])) {
                $storageChanged -= $v['menge'];
                $this->app->DB->Delete(
                  "DELETE FROM lager_mindesthaltbarkeitsdatum WHERE id = '".$v['id']."' LIMIT 1"
                );
                $this->app->erp->MHDLog(
                  $v['artikel'],$v['lager_platz'],0, $v['mhddatum'], $v['menge'],'API Korrektur','',0,$v['charge']
                );
                if(!empty($v['charge'])){
                  $this->app->erp->ChargeAuslagernLog(
                    $v['artikel'],
                    $v['lager_platz'],
                    $v['charge'],
                    $v['menge'],
                    'API Korrektur'
                  );
                }
              }
            }
          }
          else{
            if($mhdohnelager) {
              foreach($mhdohnelager as $k => $v) {
                if(!isset($v['gefunden'])) {
                  $storageChanged -= $v['menge'];
                  $this->app->DB->Delete(
                    "DELETE FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' AND mhddatum = '".$v['mhddatum']."'"
                  );
                  $this->app->erp->MHDLog(
                    $v['artikel'],$v['lager_platz'],0, $v['mhddatum'], $v['menge'],'API Korrektur','',0,$v['charge']
                  );
                  if(!empty($v['charge'])){
                    $this->app->erp->ChargeAuslagernLog(
                      $v['artikel'],$v['lager_platz'],$v['charge'],$v['menge'],'API Korrektur'
                    );
                  }
                }
              }
            }
          }
        }
      }
      elseif(!empty($artArr['chargenverwaltung']) && isset($xml->charge)) {
        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$id' LIMIT 1");
        }
        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id WHERE lpi.artikel = '$id' AND lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lpi.menge DESC LIMIT 1");
        }
        if(!$lagerplatz) {
          $lagerplatz = $this->app->DB->Select("SELECT lp.id FROM lager_platz lp WHERE lp.sperrlager = 0 AND lp.poslager = 0 ORDER by lp.id ASC LIMIT 1");
        }

        if($lager_platz_id) {
          $wawicharge = $this->app->DB->SelectArr(
            "SELECT * FROM lager_charge WHERE artikel = '$id' AND lager_platz = '$lager_platz_id' order by charge, menge desc"
          );
        }
        else {
          $wawimhd = null;//$this->app->DB->SelectArr("SELECT * FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' order by mhddatum");
          $chargenlager = null;//$this->app->DB->SelectArr("SELECT * FROM lager_charge WHERE artikel = '$id' order by charge, menge desc");
          if($wawimhd) {
            $mhdohnelager = null;//$this->app->DB->SelectArr("SELECT mhddatum, sum(menge) as smenge FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$id' group by mhddatum order by mhddatum ");
          }
          if($chargenlager) {
            $chargenohnelager = null;//$this->app->DB->SelectArr("SELECT charge, sum(menge) as smenge FROM lager_charge WHERE artikel = '$id' group by charge order by charge ");
          }
        }
        $charge = $xml->charge;
        if(!empty($charge) && !is_string($charge) && !is_numeric($charge) &&  (!empty($charge)?count($charge):0) === 1 && empty($charge->charge)
          && empty($charge->anzahl)) {
          $charge = reset($charge);
        }
        if(isset($charge->charge)) {
          $charge = json_decode(json_encode($charge->charge), true);
        }
        elseif(is_string($charge)) {
          $charge = [$charge];
        }
        $chargeanzahl = null;
        if(isset($charge->anzahl)) {
          $chargeanzahl = json_decode(json_encode($charge->anzahl),true);
        }
        elseif(isset($xml->chargeanzahl) && is_string(json_decode(json_encode($xml->chargeanzahl),true))) {
          $chargeanzahl = [json_decode(json_encode($xml->chargeanzahl),true)];
        }
        elseif(isset($xml->chargeanzahl) && is_numeric((string)$xml->chargeanzahl)) {
          $chargeanzahl = [(float)(string)$xml->chargeanzahl];
        }
        elseif(isset($xml->lagerzahl)) {
          $chargeanzahl = [(float)(string)$xml->lagerzahl];
        }
        $chargen = $charge;
        foreach($chargen as $kcharge => $c) {
          $charge = '';
          $anzahl = 1;
          if(isset($c->charge)){
            $charge = (string)$c->charge;
          }
          elseif(is_string($c)){
            $charge = (string)$c;
          }
          if(isset($c->anzahl)){
            $anzahl = (int)$c->anzahl;
          }elseif(is_array($charge[$kcharge]) && isset($charge[$kcharge])){
            $anzahl = (int)$charge[$kcharge];
          }
          elseif($chargeanzahl !== null) {
            $anzahl = $chargeanzahl;
            if(is_array($anzahl)) {
              $anzahl = $anzahl[$kcharge];
            }
          }
          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['stock'] += (float)$anzahl;
          $this->bestBeforeBatchArticleStock[$id][$storageLocationId]['entries'][] =
            [
              'batch' => $charge, 'quantity' => $anzahl
            ];
          $chargenlager = null;
          $found = false;
          $foundcharge = false;
          if($wawicharge){
            if($lager_platz_id){
              foreach ($wawicharge as $k => $v) {
                if($v['charge'] == $charge) {
                  $found = true;
                  $wawicharge[$k]['gefunden'] = true;
                  if($v['menge'] != $anzahl) {
                    $storageChanged += (float)$anzahl - $v['menge'];
                    $this->app->DB->Update(
                      "UPDATE lager_charge SET menge = '$anzahl' WHERE id = '".$v['id']."' LIMIT 1"
                    );
                    $this->app->erp->Chargenlog(
                      $v['artikel'], $v['lager_platz'],$anzahl > $v['menge']?1:0,
                      $v['charge'], abs($v['menge'] - $anzahl),'API Korrektur','',0
                    );
                    break;
                  }
                }
              }
            }
          }
          if(!$found) {
            $this->app->erp->AddChargeLagerOhneBewegung(
              $id, $anzahl,$lager_platz_id,date('Y-m-d'),$charge,'API Korrektur'
            );
            $storageChanged += (float)$anzahl;
          }
          $lagerzahl = null;
        }
      }
      if($lagerzahl === null) {
        if($storageChanged > 0) {
          $this->app->erp->LagerEinlagern(
            $id, $storageChanged, $lagerplatz, $projekt, 'API Korrektur', true
          );
          $this->app->DB->Insert(
            "INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) 
                                VALUES ('$uebertragungen_account','artikel','$id','lagerzahl','$anzahl')"
          );
          $this->lagerzahlenmonitor[$uebertragungen_account][$id] =
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok',
              '', $anzahl, '', '', 'artikel', $id, (isset($this->lagerzahlenmonitor) &&
                isset($this->lagerzahlenmonitor[$uebertragungen_account])
                && isset($this->lagerzahlenmonitor[$uebertragungen_account][$id])) ?
                $this->lagerzahlenmonitor[$uebertragungen_account][$id] : 0
            );
        }
        elseif($storageChanged < 0) {
          $this->app->erp->LagerAuslagernRegal($id,$lagerplatz, -$storageChanged, $projekt, 'API Korrektur', true);
          $this->app->DB->Insert(
            "INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) 
                                VALUES ('$uebertragungen_account','artikel','$id','lagerzahl','$anzahl')"
          );
          $this->lagerzahlenmonitor[$uebertragungen_account][$id] =
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok',
              '', $anzahl, '', '', 'artikel', $id, (isset($this->lagerzahlenmonitor) &&
                isset($this->lagerzahlenmonitor[$uebertragungen_account])
                && isset($this->lagerzahlenmonitor[$uebertragungen_account][$id])) ?
                $this->lagerzahlenmonitor[$uebertragungen_account][$id] : 0
            );
        }
      }
      elseif($storageChanged && (isset($xml->charge) || isset($xml->mhd))) {
        if($storageChanged > 0) {
          $this->app->erp->LagerEinlagern($id, $storageChanged,$lagerplatz,$projekt,'API Korrektur');
          $anzahl = $this->app->DB->Select(
            sprintf(
              'SELECT trim(SUM(menge))+0 FROM lager_platz_inhalt WHERE artikel = %d AND lager_platz = %d ',
              $id, $lagerplatz
            )
          );
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok',
            '', $anzahl, '', '', 'artikel', $id, (isset($this->lagerzahlenmonitor) &&
              isset($this->lagerzahlenmonitor[$uebertragungen_account])
              && isset($this->lagerzahlenmonitor[$uebertragungen_account][$id])) ?
              $this->lagerzahlenmonitor[$uebertragungen_account][$id] : 0
          );
        }
        elseif($storageChanged < 0) {
          $this->app->erp->LagerAuslagernRegal($id,$lagerplatz,abs($storageChanged),$projekt,'API Korrektur');
          $anzahl = $this->app->DB->Select(
            sprintf(
              'SELECT trim(SUM(menge))+0 FROM lager_platz_inhalt WHERE artikel = %d AND lager_platz = %d ',
              $id, $lagerplatz
            )
          );
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_ok',
            '', $anzahl, '', '', 'artikel', $id, (isset($this->lagerzahlenmonitor) &&
              isset($this->lagerzahlenmonitor[$uebertragungen_account])
              && isset($this->lagerzahlenmonitor[$uebertragungen_account][$id])) ?
              $this->lagerzahlenmonitor[$uebertragungen_account][$id] : 0
          );
        }
      }
    }
  }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
  public function ParsePartXmlAricleWithOutId(&$xml, $uebertragungen_account, $obj) {
    $parameter1 = '';
    $meldung = 'Artikel ';

    $account = $this->app->DB->SelectRow(
      sprintf(
        'SELECT * FROM uebertragungen_account WHERE id = %d  LIMIT 1',
        $uebertragungen_account
      )
    );
    $artikeleingang = !empty($account['artikeleingang']);
    $lagerzahleneingang = !empty($account['lagerzahleneingang']);
    $updatearticles = !empty($account['updatearticles']);
    $logarticlenotfound = !empty($account['logarticlenotfound']);
    if(!empty($xml->anlegen) && !empty($xml->nummer) && !empty($xml->name_de) && $artikeleingang) {
      $artikelarr = array('projekt'=> $account['projekt']);

      if(!empty($this->app->stringcleaner)) {
        $this->app->stringcleaner->XMLArray_clean($xml);
      }
      foreach($xml as $k => $v) {
        if(empty($k) || $k === 'id' || $k === 'nummer' || is_numeric($k)) {
          continue;
        }
        $vr = @reset($v);
        if(is_numeric($vr) || is_string($vr)) {
          $artikelarr[$k] = (string)$vr;
        }
      }

      if(isset($xml->nummer))$artikelarr['nummer'] = (string)$xml->nummer;
      if(isset($xml->ean))$artikelarr['ean'] = (string)$xml->ean;
      if(isset($xml->herstellernummer))$artikelarr['herstellernummer'] = (string)$xml->herstellernummer;
      if(isset($xml->name_de))$artikelarr['name_de'] = (string)$xml->name_de;
      if(isset($xml->name_en))$artikelarr['name_en'] = (string)$xml->name_en;
      if(isset($xml->anabregstext))$artikelarr['anabregstext'] = (string)$xml->anabregstext;
      if(isset($xml->anabregstext_en))$artikelarr['anabregstext_en'] = (string)$xml->anabregstext_en;
      if(isset($xml->uebersicht_de))$artikelarr['uebersicht_de'] = (string)$xml->uebersicht_de;
      if(isset($xml->uebersicht_en))$artikelarr['uebersicht_en'] = (string)$xml->uebersicht_en;
      if(isset($xml->kurztext_de))$artikelarr['kurztext_de'] = (string)$xml->kurztext_de;
      if(isset($xml->kurztext_en))$artikelarr['kurztext_en'] = (string)$xml->kurztext_en;
      if(isset($xml->lagerartikel))$artikelarr['lagerartikel'] = (string)$xml->lagerartikel;

      if(isset($xml->gewicht))$artikelarr['gewicht'] = (string)$xml->gewicht;
      if(isset($xml->breite))$artikelarr['breite'] = (string)$xml->breite;
      if(isset($xml->laenge))$artikelarr['laenge'] = (string)$xml->laenge;
      if(isset($xml->hoehe))$artikelarr['hoehe'] = (string)$xml->hoehe;

      for($i = 1; $i <= 20; $i++) {
        $name = 'freifeld'.$i;
        if(isset($xml->$name)){
          $xml->$name = $this->app->Secure->CleanString($xml->$name, 'nohtml');
          $artikelarr[$name] = (string)$xml->$name;
        }
      }
      $artikelid = $this->app->erp->InsertUpdateArtikel($artikelarr, $updatearticles);
      if($artikelid) {
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'artikel_ok', "Artikel " . (string)$xml->nummer . " angelegt", '', '', '', 'artikel', $artikelid);
      }
      elseif($updatearticles && $logarticlenotfound) {
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'artikel_error', 'Artikel ' . (string)$xml->nummer . ' nicht gefunden', '', '', '', 'artikel', 0);
      }
      unset($artikelarr);
    }
    elseif((isset($xml->lagerzahl) || isset($xml->mhdanzahl)) && $lagerzahleneingang) {
      if(isset($xml->nummer)) {
        if($parameter1 == '') {
          $parameter1 = (string)$xml->nummer;
          $meldung .= "mit Artikelnummer ".$parameter1." nicht gefunden";
        }
      }

      if(isset($xml->ean)) {
        if($parameter1 == '') {
          $parameter1 = (string)$xml->ean;
          $meldung .= "mit EAN ".$parameter1." nicht gefunden";
        }
      }
      if(isset($xml->herstellernummer)) {
        if($parameter1 == '') {
          $parameter1 = (string)$xml->herstellernummer;
          $meldung .= "mit Herstellernumemr ".$parameter1." nicht gefunden";
        }
      }
      if($parameter1) {
        $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','artikel','".$this->app->DB->real_escape_string($parameter1)."','lagerzahl_fehler','".$this->app->DB->real_escape_string($meldung)."')");
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'lagerzahlen_error', $meldung, $this->app->DB->real_escape_string($parameter1), '', '', 'artikel');
      }
    }
    elseif(isset($xml->anlegen) && $xml->anlegen && isset($xml->nummer) && $xml->nummer != '' && isset($xml->name_de) && $xml->name_de != '' && !$artikeleingang) {
      if(!$this->app->DB->Select("SELECT id FROM `uebertragungen_monitor` WHERE uebertragungen_account = '$uebertragungen_account' AND datei = '".$this->datei_id."' AND status = 'not_allowed' AND zeitstempel > DATE_SUB(now(), INTERVAL 1 HOUR) AND nachricht like 'Artikel-Eingang%'  LIMIT 1")) {
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', 'Artikel-Eingang ist nicht aktiviert', '', '', '', 'artikel');
      }
    }
    elseif((isset($xml->lagerzahl) || isset($xml->mhdanzahl)) && !$lagerzahleneingang) {
      if(!$this->app->DB->Select("SELECT id FROM `uebertragungen_monitor` WHERE uebertragungen_account = '$uebertragungen_account' AND datei = '".$this->datei_id."' AND status = 'not_allowed' AND zeitstempel > DATE_SUB(now(), INTERVAL 1 HOUR) AND nachricht like 'Lagerzahlen-Eingang%'  LIMIT 1")) {
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'not_allowed', 'Lagerzahlen-Eingang ist nicht aktiviert', '', '', '', 'artikel');
      }
    }
  }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
    public function ParsePartXmlType($typ, &$xml, $uebertragungen_account, $obj)
    {
      $id = $this->GetIDFromFeld($typ, $xml);
      if($id) {
        switch($typ)  {
          case 'artikel':
            $this->ParsePartXmlAricleWithId($xml, $uebertragungen_account, $obj, $id);
            break;
        }
      }
      else {
        switch($typ) {
          case 'artikel':
            $this->ParsePartXmlAricleWithOutId($xml, $uebertragungen_account, $obj);
            break;
        }
      }
    }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
    public function ParsePartXmlSupplierorderProductionWithoutId($typ, &$xml, $uebertragungen_account, $obj)
    {
      $isProduction = $typ === 'produktion';
      $lieferantok = false;
      $neuerlieferant = false;
      $adresselieferant = $this->app->DB->Select("SELECT adresselieferant FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");
      if($adresselieferant && $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer <> '' AND geloescht = 0 AND id = '$adresselieferant' LIMIT 1"))
      {
        $adresse = $adresselieferant;
        $lieferantok = true;
      }else{
        if((empty($xml->lieferantennummer) && empty($xml->gln) ) || strtoupper((string)$xml->lieferantennummer) === 'NEW' || strtoupper((string)$xml->lieferantennummer) === 'NEU') {
          if(isset($xml->name))
          {
            $lieferantok = true;
            $neuerlieferant = true;
          }else{
            $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','betellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','Kein Lieferantenname angegeben')");
          }
        }else{
          $adresse = null;
          if(!empty($xml->adresse)){
            $adresse = $this->GetFromExtID('adresse', $xml->adresse);
          }
          if(!empty($adresse)){
            $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE id = '$adresse' AND geloescht <> 1 AND lieferantennummer <> '' LIMIT 1");
          }
          if(empty($adresse) && !empty($xml->gln)){
            $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> 1 AND gln <> '' AND gln = '".$this->app->DB->real_escape_string((string)$xml->gln)."' LIMIT 1");
          }
          //if(!$adresse && !empty($xml->lieferantennummer))$adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> 1 AND lieferantennummer <> '' AND lieferantennummer = '".$this->app->DB->real_escape_string((string)$xml->lieferantennummer)."' LIMIT 1");
          if(empty($adresse) && !empty($xml->kundennummerlieferant))
          {
            $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> 1 AND lieferantennummer <> '' AND lieferantennummer = '".$this->app->DB->real_escape_string((string)$xml->kundennummerlieferant)."' LIMIT 1");
          }
          if(empty($adresse) && !empty($xml->adresse))
          {
            $lieferantok = true;
            $neuerlieferant = true;
          }
          if(!empty($adresse)){
            $lieferantok = true;
          }
        }
      }
      if($lieferantok)
      {
        $bestellung_positionen = null;
        if(isset($xml->bestellung_position_list))
        {
          if(isset($xml->bestellung_position_list->bestellung_position))
          {
            $bestellung_positionen = &$xml->bestellung_position_list->bestellung_position;
          }

        }elseif(isset($xml->bestellung_position)){
          $bestellung_positionen = &$xml->bestellung_position;
        }

        if($bestellung_positionen) {
          $artikelgefunden = true;
          $artikelids = null;
          $key = -1;
          foreach($bestellung_positionen as $position)  {
            $key++;
            if($artikelgefunden)
            {
              $_element1 = '';
              $_element2 = '';
              $_element3 = '';
            }
            $_artikel = null;
            if(!empty($position->artikel))
            {
              $_artikel = $this->GetFromExtID('artikel', $xml->artikel);
              if($_artikel)
              {
                $artikelids[$key] = $_artikel;
                //$xml->artikelextid = $_artikel;
              }
            }
            if(!$_artikel && !empty($position->ean))
            {
              $_artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
              if(!$_artikel)
              {
                $_element1 = 'EAN: '.$position->ean;
              }else {
                $artikelids[$key] = $_artikel;
              }
            }
            if(!$_artikel && !empty($position->herstellernummer))
            {
              $_artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND herstellernummer <> '' AND herstellernummer = '".$this->app->DB->real_escape_string((string)$position->herstellernummer)."' ORDER BY projekt = '$projekt' DESC  LIMIT 1");
              if(!$_artikel)
              {
                if($_element1 == '')
                {
                  $_element1 = 'Herstellernummer: '.$position->herstellernummer;
                }else{
                  $_element2 = 'Herstellernummer: '.$position->herstellernummer;
                }
              }else {
                $artikelids[$key] = $_artikel;
              }
            }
            if(!$_artikel && !empty($position->bestellnummer))
            {
              $_artikel = $this->app->DB->Select("SELECT e.artikel FROM `einkaufspreise` e INNER JOIN artikel a ON e.artikel = a.id WHERE e.bestellnummer <> '' AND e.bestellnummer = '".$this->app->DB->real_escape_string((string)$position->bestellnummer)."' ORDER BY a.projekt = '$projekt' DESC  LIMIT 1");
              if(!$_artikel){
                $_artikel = $this->app->DB->Select("SELECT id FROM `artikel` WHERE geloescht <> 1 AND nummer <> '' AND nummer = '".$this->app->DB->real_escape_string((string)$position->bestellnummer)."' ORDER BY projekt = '$projekt' DESC  LIMIT 1");
              }
              if(!$_artikel)
              {
                if($_element1 == '')
                {
                  $_element1 = 'Bestellernummer: '.$position->bestellnummer;
                }elseif($_element2 == ''){
                  $_element2 = 'Bestellernummer: '.$position->bestellnummer;
                }else{
                  $_element3 = 'Bestellernummer: '.$position->bestellnummer;
                }
              }else {
                $artikelids[$key] = $_artikel;
              }
            }
            if(!$_artikel && !$this->app->DB->Select("SELECT artikelanlegen FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1")){
              $artikelgefunden = false;
            }
            if(!$_artikel) {
              if(!empty($position->bestellnummer))
              {
                if(!$this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND nummer <> '' AND nummer = '".$this->app->DB->real_escape_string((string)$position->bestellnummer)."' LIMIT 1"))
                {
                  $artikelgefunden = false;
                  $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','bestellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','Artikelnummer ".$this->app->DB->real_escape_string((string)$position->nummer)." nicht gefunden')");
                  break;
                }
              }elseif(!empty($position->ean)){
                if(!$this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' LIMIT 1"))
                {
                  $artikelgefunden = false;
                  $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','bestellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','EAN ".$this->app->DB->real_escape_string((string)$position->ean)." nicht gefunden')");
                  break;
                }
              }else{
                $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','bestellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','Keine Artikelnummer gefunden')");
                break;
              }
            }
          }
          if($artikelgefunden)
          {
            $_typ ='';
            $name = '';
            $abteilung = '';
            $unterabteilung = '';
            $ansprechpartner = '';
            $adresszusatz = '';
            $strasse = '';
            $land = $this->app->erp->Firmendaten('land');
            $plz = '';
            $ort = '';
            $email = '';
            $telefon = '';
            $telefax = '';
            $ustid = '';
            $partner = '';
            $bundesstaat = '';
            $projekt = $this->app->DB->Select("SELECT projekt FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");
            if(!empty($this->app->stringcleaner)) {
              $this->app->stringcleaner->XMLArray_clean($xml);
            }

            if(isset($xml->name))$name = (string)$xml->name;
            if(isset($xml->anrede))$_typ = (string)$xml->anrede;
            if(isset($xml->abteilung))$abteilung = (string)$xml->abteilung;
            if(isset($xml->unterabteilung))$unterabteilung = (string)$xml->unterabteilung;
            if(isset($xml->ansprechpartner))$ansprechpartner = (string)$xml->ansprechpartner;
            if(isset($xml->adresszusatz))$adresszusatz = (string)$xml->adresszusatz;
            if(isset($xml->strasse))$strasse = (string)$xml->strasse;
            if(isset($xml->land))$land = (string)$xml->land;
            if(isset($xml->bundesstaat))$bundesstaat = (string)$xml->bundesstaat;
            if(isset($xml->plz))$plz = (string)$xml->plz;
            if(isset($xml->ort))$ort = (string)$xml->ort;
            if(isset($xml->email))$email = (string)$xml->email;
            if(isset($xml->telefon))$telefon = (string)$xml->telefon;
            if(isset($xml->telefax))$telefax = (string)$xml->telefax;
            if(isset($xml->ustid))$ustid = (string)$xml->ustid;
            if(isset($xml->partner))$partner = (string)$xml->partner;
            if(isset($xml->projekt) && (!isset($xml->belegnr) || $xml->belegnr == '' || strtoupper($xml->belegnr) === 'NEW' || strtoupper($xml->belegnr) === 'NEU')) {
              if((string)$xml->projekt != '')
              {
                $_projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE geloescht = 0 AND abkuerzung = '".$this->app->DB->real_escape_string((string)$xml->projekt)."' LIMIT 1");
                if($_projekt)$projekt = $_projekt;
              }
              if($land == '')$land = $this->app->erp->Projektdaten($projekt ,'land');
            }
            if($land == '')$land = $this->app->erp->Firmendaten('land');
            if($neuerlieferant)
            {
              $adressearr = array('lieferantennummer'=>$this->app->erp->GetNextNummer('lieferantennummer',$projekt));
              $adressearr['typ'] = $_typ;
              $adressearr['name'] = $name;
              $adressearr['abteilung'] = $abteilung;
              $adressearr['unterabteilung'] = $unterabteilung;
              $adressearr['ansprechpartner'] = $ansprechpartner;
              $adressearr['adresszusatz'] = $adresszusatz;
              $adressearr['land'] = $land;
              $adressearr['plz'] = $plz;
              $adressearr['ort'] = $ort;
              $adressearr['email'] = $email;
              $adressearr['telefon'] = $telefon;
              $adressearr['telefax'] = $telefax;
              $adressearr['ustid'] = $ustid;
              $adressearr['projekt'] = $projekt;
              $adressearr['bundesstaat'] = $bundesstaat;
              $adresse = $this->app->erp->InsertUpdateAdresse($adressearr);
              if(isset($xml->adresse) && $xml->adresse != '') {
                $this->SetExtIDMapping('adresse', $adresse, $xml->adresse);
              }
              unset($adressearr);
            }
            if($adresse)
            {
              if($isProduction) {
                $bestellung = $this->app->erp->CreateProduktion();
                $belegnr = (string)$this->app->DB->Select("SELECT belegnr FROM produktion WHERE id = '$bestellung' LIMIT 1");
                if($belegnr === '' || $belegnr === '0'){
                  $belegnr = $this->app->erp->GetNextNummer('produktion',$projekt,$bestellung);
                }
              }
              else{
                $bestellung = $this->app->erp->CreateBestellung();
                $belegnr = (string)$this->app->DB->Select("SELECT belegnr FROM bestellung WHERE id = '$bestellung' LIMIT 1");
                if($belegnr === '' || $belegnr === '0'){
                  $belegnr = $this->app->erp->GetNextNummer('bestellung',$projekt,$bestellung);
                }
              }


              if(isset($xml->belegnr) && $xml->belegnr != '' && strtoupper($xml->belegnr) !== 'NEW' && strtoupper($xml->belegnr) !== 'NEU'){
                $this->SetExtIDMapping($isProduction?'produktion':'bestellung', $bestellung, $xml->belegnr);
              }
              $this->app->erp->LoadBestellungStandardwerte($bestellung,$adresse);

              $auftragarr = null;
              $auftragarr['belegnr'] = $belegnr;
              $auftragarr['projekt'] = $projekt;
              if($_typ)$auftragarr['typ'] = $_typ;
              $auftragarr['name'] = $name;
              $auftragarr['abteilung'] = $abteilung;
              $auftragarr['unterabteilung'] = $unterabteilung;
              $auftragarr['ansprechpartner'] = $ansprechpartner;
              $auftragarr['strasse'] = $strasse;
              $auftragarr['bundesstaat'] = $bundesstaat;
              $auftragarr['land'] = $land;
              $auftragarr['plz'] = $plz;
              $auftragarr['ort'] = $ort;
              $auftragarr['email'] = $email;
              $auftragarr['telefon'] = $telefon;
              $auftragarr['telefax'] = $telefax;
              $auftragarr['ustid'] = $ustid;
              if($isProduction && isset($xml->unterlistenexplodieren)) {
                $auftragarr['unterlistenexplodieren'] = (string)$xml->unterlistenexplodieren;
              }
              if(isset($xml->abweichendelieferadresse))$auftragarr['abweichendelieferadresse'] = (string)$xml->abweichendelieferadresse;
              if(isset($xml->bestellungsart))$auftragarr['bestellungsart'] = (string)$xml->bestellungsart;
              if(isset($xml->bearbeiter))$auftragarr['bearbeiter'] = (string)$xml->bearbeiter;
              if(isset($xml->datum))$auftragarr['datum'] = (string)$xml->datum;
              if(isset($xml->lieferdatum))$auftragarr['lieferdatum'] = (string)$xml->lieferdatum;
              foreach(['datum', 'lieferdatum'] as $dateField) {
                if(!empty($auftragarr[$dateField]) && strpos($auftragarr[$dateField], '.') !== false) {
                  $auftragarr[$dateField] = $this->app->String->Convert($auftragarr[$dateField], '%1.%2.%3', '%3-%2-%1');
                }
              }
              if(isset($xml->ustid))$auftragarr['ustid'] = (string)$xml->ustid;
              if(isset($xml->ust_befreit))$auftragarr['ust_befreit'] = (string)$xml->ust_befreit;
              if(isset($xml->internet))$auftragarr['internet'] = (string)$xml->internet;
              if(isset($xml->transaktionsnummer))$auftragarr['transaktionsnummer'] = (string)$xml->transaktionsnummer;
              if(isset($xml->versandart))$auftragarr['versandart'] = (string)$xml->versandart;
              if(isset($xml->vertrieb))$auftragarr['vertrieb'] = (string)$xml->vertrieb;
              if(isset($xml->zahlungsweise))$auftragarr['zahlungsweise'] = (string)$xml->zahlungsweise;
              if(isset($xml->freitext))$auftragarr['freitext'] = (string)$xml->freitext;
              if(isset($xml->bank_inhaber))$auftragarr['bank_inhaber'] = (string)$xml->bank_inhaber;
              if(isset($xml->bank_institut))$auftragarr['bank_institut'] = (string)$xml->bank_institut;
              if(isset($xml->bank_blz))$auftragarr['bank_blz'] = (string)$xml->bank_blz;
              if(isset($xml->bank_konto))$auftragarr['bank_konto'] = (string)$xml->bank_konto;
              if(isset($xml->ansprechpartner))$auftragarr['ansprechpartner'] = (string)$xml->ansprechpartner;
              if(isset($xml->liefername))$auftragarr['liefername'] = (string)$xml->liefername;
              if(isset($xml->lieferland))$auftragarr['lieferland'] = (string)$xml->lieferland;
              if(isset($xml->lieferstrasse))$auftragarr['lieferstrasse'] = (string)$xml->lieferstrasse;
              if(isset($xml->lieferabteilung))$auftragarr['lieferabteilung'] = (string)$xml->lieferabteilung;
              if(isset($xml->lieferunterabteilung))$auftragarr['lieferunterabteilung'] = (string)$xml->lieferunterabteilung;
              if(isset($xml->lieferansprechpartner))$auftragarr['lieferansprechpartner'] = (string)$xml->lieferansprechpartner;
              if(isset($xml->lieferort))$auftragarr['lieferort'] = (string)$xml->lieferort;
              if(isset($xml->lieferbundesstaat))$auftragarr['lieferbundesstaat'] = (string)$xml->lieferbundesstaat;
              if(isset($xml->lieferplz))$auftragarr['lieferplz'] = (string)$xml->lieferplz;
              if(isset($xml->lieferadresszusatz))$auftragarr['lieferadresszusatz'] = (string)$xml->lieferadresszusatz;

              if(isset($xml->internebemerkung))$auftragarr['internebemerkung'] = (string)$xml->internebemerkung;
              if(isset($xml->internebezeichnung))$auftragarr['internebezeichnung'] = (string)$xml->internebezeichnung;

              $auftragarr['status']='freigegeben';
              $auftragarr['projekt']=$projekt;
              $auftragarr['zahlungszielskonto']=0;
              if(isset($xml->gesamtsumme))$auftragarr['gesamtsumme'] = (float)str_replace(',','.',$xml->gesamtsumme);
              $auftragarr = $this->formatDateFieldsToMysqlFormat($auftragarr);
              $this->app->DB->UpdateArr($isProduction ? 'produktion' : 'bestellung', $bestellung, 'id', $auftragarr, true);
              $key = -1;
              foreach($bestellung_positionen as $position)
              {
                $key++;
                $artikel = null;
                if(!empty($artikelids) && isset($artikelids[$key])) {
                  $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '".$artikelids[$key]."' LIMIT 1");
                  if($artikel)
                  {
                    if($isProduction) {
                      $newposid = $this->app->erp->AddArtikelProduktion($artikel, isset($position->menge) ? $position->menge : 1, $bestellung);
                      if(isset($position->preis) && $position->preis != 0) {
                        $this->app->DB->Update("UPDATE produktion_position SET preis = '".(float)$position->preis."' WHERE id = '$newposid'");
                      }
                      if(isset($position->vpe) && $position->vpe != '') {
                        $this->app->DB->Update("UPDATE produktion_position SET vpe = '".(string)$position->vpe."' WHERE id = '$newposid'");
                      }
                    }
                    else{
                      $newposid = $this->app->erp->AddBestellungPosition($bestellung, 0, (isset($position->menge) ? $position->menge : 1), isset($auftragarr['datum']) ? $auftragarr['datum'] : date('Y-m-d'),
                        ((isset($position->beschreibung) && $position->beschreibung != '') ? (string)$position->beschreibung : ''), $artikel,
                        ((isset($position->einheit) && $position->einheit != '') ? (string)$position->einheit : ''),
                        ((isset($position->waehrung) && $position->waehrung != '') ? (string)$position->waehrung : '')
                      );
                      if(isset($position->preis) && $position->preis != 0) {
                        $this->app->DB->Update("UPDATE bestellung_position SET preis = '".(float)$position->preis."' WHERE id = '$newposid'");
                      }
                      if(isset($position->bestellnummer) && $position->bestellnummer != '') {
                        $this->app->DB->Update("UPDATE bestellung_position SET bestellnummer = '".(string)$position->bestellnummer."' WHERE id = '$newposid'");
                      }
                      if(isset($position->vpe) && $position->vpe != '') {
                        $this->app->DB->Update("UPDATE bestellung_position SET vpe = '".(string)$position->vpe."' WHERE id = '$newposid'");
                      }
                    }
                    /*$newposid = $this->app->erp->AddPositionManuellPreisNummer('bestellung',$bestellung, $projekt, $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                    (isset($position->menge)?$position->menge:1) ,
                    (isset($position->name)? $position->name:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                       isset($position->preis)? str_replace(',','.',$position->preis):$this->app->erp->GetEinkaufspreis($artikel,(isset($position->menge)?$position->menge:1),$adresse) ,
                       $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1") ,
                       0,0,
                       isset($xml->waehrung)?$xml->waehrung:'EUR');              */
                  }
                }
                if(isset($position->bestellnummer) && !$artikel)
                {
                  //$artikel = $this->app->DB->Select("SELECT e.artikel FROM `einkaufspreise` e INNER JOIN artikel a ON e.artikel = a.id WHERE e.bestellnummer <> '' AND e.bestellnummer = '".$this->app->DB->real_escape_string((string)$position->bestellnummer)."' ORDER BY a.projekt = '$projekt' DESC  LIMIT 1");
                  $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND nummer <> '' AND nummer = '".$this->app->DB->real_escape_string((string)$position->bestellnummer)."' LIMIT 1");
                  if($isProduction) {
                    if($artikel) {
                      $newposid = $this->app->erp->AddArtikelProduktion($artikel, isset($position->menge) ? $position->menge : 1, $bestellung);
                    }
                  } else{
                    $newposid = $this->app->erp->AddPositionManuellPreisNummer('bestellung', $bestellung, $projekt, $position->nummer,
                      (isset($position->menge) ? $position->menge : 1),
                      (isset($position->name) ? $position->name : $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                      isset($position->preis) ? str_replace(',', '.', $position->preis) : $this->app->erp->GetEinkaufspreis($artikel, (isset($position->menge) ? $position->menge : 1), $adresse),
                      $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                      0, 0,
                      isset($xml->waehrung) ? $xml->waehrung : 'EUR');
                  }
                }
                if(!empty($position->ean) && !$artikel)
                {
                  $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' LIMIT 1");
                  if($artikel)
                  {
                    if($isProduction) {
                      $newposid = $this->app->erp->AddArtikelProduktion($artikel, isset($position->menge) ? $position->menge : 1, $bestellung);
                    }
                    else{
                      $newposid = $this->app->erp->AddPositionManuellPreisNummer('bestellung', $bestellung, $projekt, $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        (isset($position->menge) ? $position->menge : 1),
                        (isset($position->name) ? $position->name : $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                        isset($position->preis) ? str_replace(',', '.', $position->preis) : $this->app->erp->GetEinkaufspreis($artikel, (isset($position->menge) ? $position->menge : 1), $adresse),
                        $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        0, 0,
                        isset($xml->waehrung) ? $xml->waehrung : 'EUR');
                    }
                  }

                }
                if(!empty($position->herstellernummer) && !$artikel)
                {
                  $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND herstellernummer <> '' AND herstellernummer = '".$this->app->DB->real_escape_string((string)$position->herstellernummer)."' LIMIT 1");
                  if($artikel) {
                    if($isProduction) {
                      $newposid = $this->app->erp->AddArtikelProduktion($artikel, isset($position->menge) ? $position->menge : 1, $bestellung);
                    } else{
                      $newposid = $this->app->erp->AddPositionManuellPreisNummer('bestellung', $bestellung, $projekt, $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        (isset($position->menge) ? $position->menge : 1),
                        (isset($position->name) ? $position->name : $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                        isset($position->preis) ? str_replace(',', '.', $position->preis) : $this->app->erp->GetEinkaufspreis($artikel, (isset($position->menge) ? $position->menge : 1), $adresse),
                        $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        0, 0,
                        isset($xml->waehrung) ? $xml->waehrung : 'EUR');
                    }
                  }

                }

                /*if($newposid > 0)
                {
                  $this->app->erp->RunHook("beleg_afterinsertposition", 5, "auftrag",$auftrag,$artikel,(isset($position->menge)?$position->menge:1),$newposid);
                }*/
              }
              if($isProduction) {
                $this->app->erp->AuftragExplodieren($bestellung, 'produktion');
                $this->app->erp->ProduktionEinzelnBerechnen($bestellung);
                $this->app->erp->ProduktionNeuberechnen($bestellung);
              }
              else{
                $this->app->erp->BestellungNeuberechnen($bestellung);
              }

              if(isset($xml->dateien)) {
                foreach($xml->dateien as $datei) {
                  foreach($datei as $singledatei) {
                    $isfile = false;
                    $data = null;
                    if(is_file($singledatei->dateiname)){
                      $type = mime_content_type(basename($singledatei->dateiname));
                      if($type !== 'text/x-php' && $type !== 'text/php' && $type !== 'application/php' && $type !== 'application/x-php' && $type !== 'application/x-httpd-php' && $type !== 'application/x-httpd-php-source'){

                        if($singledatei->dateiinhalt == ''){
                          $data = file_get_contents($singledatei->dateiname);
                          $isfile = true;
                        }
                      }else{
                        $singledatei->dateiinhalt = '';
                      }
                    }
                    if(empty($data)){
                      if(!empty($singledatei->dateiinhalt)){
                        $data = base64_decode($singledatei->dateiinhalt);
                      }else{
                        $data = '';
                      }
                    }
                    if($isfile){
                      $name = $this->app->erp->GetTmp().basename($singledatei->dateiname);
                    }else{
                      $name = $this->app->erp->GetTmp().$singledatei->dateiname;
                    }

                    file_put_contents($name, $data);

                    $pfad = $this->app->Conf->WFuserdata;
                    $pfad = rtrim($pfad);
                    $pfad .= '/dms/';

                    if(!file_exists($pfad)){
                      if(!mkdir($pfad, 0777, true) && !is_dir($pfad))
                      {
                        $this->app->erp->LogFile($pfad.' konnte nicht erstellt werden');
                      }
                    }

                    $speicherpfad = $pfad.$this->app->Conf->WFdbname;

                    if(!file_exists($speicherpfad)) {
                      if(!mkdir($speicherpfad, 0777, true) && !is_dir($speicherpfad))
                      {
                        $this->app->erp->LogFile($speicherpfad.' konnte nicht erstellt werden');
                      }
                    }

                    $fileid = $this->app->erp->CreateDatei(
                      $singledatei->dateiname,
                      !empty($singledatei->titel)?$singledatei->titel:$singledatei->dateiname,
                      !empty($singledatei->beschreibung)?(string)$singledatei->beschreibung:'', '',
                      $name, '',true,$speicherpfad
                    );
                    $subjekt = !empty($singledatei->subjekt)?(string)$singledatei->subjekt:'Sonstige';
                    $this->app->erp->AddDateiStichwort($fileid, $subjekt, $isProduction?'Produktion': 'Bestellung', $bestellung);

                    if($isfile){
                      rename($singledatei->dateiname, $singledatei->dateiname.'.del');
                    }
                  }
                }
              }
              $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $isProduction?'produktion':'bestellung_ok', '', '', '', '', $isProduction?'produktion': 'bestellung', $bestellung);
              $doctype = $isProduction?'produktion': 'bestellung';
              $this->app->erp->RunHook('transfer_document_incoming', 3, $uebertragungen_account, $doctype, $bestellung);
            }
          }
          else {
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'bestellung_error', 'Artikel nicht gefunden', $this->app->DB->real_escape_string((string)$_element1), $this->app->DB->real_escape_string((string)$_element2), $this->app->DB->real_escape_string((string)$_element3), 'bestellung');
          }
        }
        else{
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'bestellung_error', 'Keine Artikel gefunden', $this->app->DB->real_escape_string(!empty($xml->belegnr)?(string)$xml->belegnr:''), '', '', 'bestellung');
          $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','bestellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','Keine Positionen gefunden')");
        }
      }
      else{
        $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'bestellung_error', 'Lieferant gefunden', $this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid), '', '', 'bestellung');
        $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','bestellung','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','bestellung_fehler','Lieferantennummer ".$this->app->DB->real_escape_string((string)$xml->kundennummer)." nicht gefunden')");
      }
    }

    /**
     * @param array $documentArray
     *
     * @return array
     */
    public function formatDateFieldsToMysqlFormat($documentArray)
    {
      if(!is_array($documentArray)) {
        return $documentArray;
      }
      $dateCols = ['datum', 'lieferdatum', 'tatsaechlicheslieferdatum', ];
      foreach($documentArray as $key => $documentValue) {
        if(!is_string($documentValue)) {
          continue;
        }
        if(!in_array($key, $dateCols)) {
          continue;
        }
        $documentValue = substr($documentValue, 0, 10);
        if(strpos($documentValue, '.') === false) {
          continue;
        }
        $documentArray[$key] = $this->app->String->Convert($documentValue, '%1.%2.%3', '%3-%2-%1');
      }

      return $documentArray;
    }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
    public function ParsePartXmlOrderOfferWithoutId($typ, &$xml, $uebertragungen_account, $obj)
    {
      $transferAccount = $this->app->DB->SelectRow(
        sprintf(
          'SELECT `projekt`, `createarticleifnotexists`, `createarticleasstoragearticle` 
          FROM `uebertragungen_account` WHERE `id` = %d LIMIT 1',
          $uebertragungen_account
        )
      );
      $projekt = $transferAccount['projekt'];
      $createArticleIfNotEmpty = !empty($transferAccount['createarticleifnotexists']);
      $markAsStorageArticle = !empty($transferAccount['createarticleasstoragearticle']);
      if(!$this->app->DB->Select("SELECT id FROM $typ WHERE shopextid = '".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."' AND projekt = '$projekt' AND shopextid <> ''")
        && (!isset($xml->belegnr) || strtoupper($xml->belegnr) == 'NEW' || strtoupper($xml->belegnr) == 'NEU' || !$this->GetFromExtID($typ, $xml->belegnr)))
      {
        $auftragarr = [];
        $order = null;
        $addressFromDocument = null;
        if($typ === 'retoure') {
          if(isset($xml->auftragid)) {
            $orderId = (string)$xml->auftragid;
            if(!empty($orderId)) {
              $order = $this->app->DB->SelectRow(
                sprintf(
                  'SELECT `id`, `belegnr`, `adresse` FROM `auftrag` WHERE `id` = %d',
                  $orderId
                )
              );
              if(!empty($order)) {
                $auftragarr['auftragid'] = $order['id'];
                $auftragarr['auftrag'] = $order['belegnr'];
                $addressFromDocument = $order['adresse'];
              }
            }
          }
          if(isset($xml->auftrag) && empty($auftragarr['auftragid'])) {
            $orderNumber = (string)$xml->auftrag;
            if(!empty($orderNumber)) {
              $order = $this->app->DB->SelectRow(
                sprintf(
                  "SELECT `belegnr`, `id`, `adresse` 
                  FROM `auftrag` WHERE `belegnr` = '%s' 
                  ORDER BY `projekt` = %d DESC
                  LIMIT 1",
                  $orderNumber, $projekt
                )
              );
              if(!empty($order['belegnr'])) {
                $auftragarr['auftrag'] = $order['belegnr'];
                $auftragarr['auftragid'] = $order['id'];
                $addressFromDocument = $order['adresse'];
              }
            }
          }
          if(isset($xml->lieferscheinid)) {
            $deliveryNoteId = (string)$xml->lieferscheinid;
            if(!empty($deliveryNoteId)) {
              $deliveryNote = $this->app->DB->SelectRow(
                sprintf(
                  'SELECT `id`, `belegnr`, `adresse` FROM `lieferschein` WHERE `id` = %d',
                  $deliveryNoteId
                )
              );
              if(!empty($deliveryNote)) {
                $auftragarr['lieferscheinid'] = $deliveryNote['id'];
                $auftragarr['lieferschein'] = $deliveryNote['belegnr'];
                if(empty($addressFromDocument)) {
                  $addressFromDocument = $deliveryNote['adresse'];
                }
              }
            }
          }
          if(isset($xml->lieferschein)) {
            $deliveryNoteNumber = (string)$xml->lieferschein;
            if(!empty($deliveryNoteNumber)) {
              $deliveryNote = $this->app->DB->SelectRow(
                sprintf(
                  "SELECT `belegnr`, `id`, `adresse` 
                  FROM `lieferschein` WHERE `belegnr` = '%s' 
                  ORDER BY `projekt` = %d DESC
                  LIMIT 1",
                  $deliveryNoteNumber, $projekt
                )
              );
              if(!empty($deliveryNote['belegnr'])) {
                $auftragarr['lieferschein'] = $deliveryNote['belegnr'];
                $auftragarr['lieferscheinid'] = $deliveryNote['id'];
                if(empty($addressFromDocument)) {
                  $addressFromDocument = $deliveryNote['adresse'];
                }
              }
            }
          }
        }
        if((int)$addressFromDocument > 0) {
          $addressFromDocument = $this->app->DB->Select(
            sprintf(
              'SELECT `id` FROM `adresse` WHERE `id` = %d AND `geloescht` = 0',
              $addressFromDocument
            )
          );
        }
        //if(true)
        //{
        $kundeok = false;
        $neuerkunde = false;
        if(isset($xml->kundennummer) && ( strtoupper((string)$xml->kundennummer) == 'NEW' || strtoupper((string)$xml->kundennummer) == 'NEU') && isset($xml->name))
        {
          $neuerkunde = true;
          $kundeok = true;
        }
        elseif(isset($xml->kundennummer) && ( strtoupper((string)$xml->kundennummer) == 'NEW' || strtoupper((string)$xml->kundennummer) == 'NEU')){
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ.'_error', "Auftrag enth&auml;lt keinen Namen", $this->app->DB->real_escape_string((string)$xml->extid), '', '', $typ);
        }
        elseif((empty($xml->gln) )){
          if(isset($xml->name))
          {
            if($this->app->DB->Select("SELECT kundennummernuebernehmen FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1") && isset($xml->kundennummer) && $xml->kundennummer != '')
            {
              $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer <> '' AND kundennummer = '".$this->app->DB->real_escape_string((string)$xml->kundennummer)."' AND ifnull(geloescht,0) = 0 ORDER BY projekt = '$projekt' DESC LIMIT 1");
            }else {
              $adresse = null;
            }
            if(empty($adresse))
            {
              if(isset($xml->plz) && isset($xml->strasse) && isset($xml->ort) && isset($xml->email))
              {
                $adresseprojekt = $this->app->DB->Select("SELECT projekt FROM uebertragungen_account WHERE id = '$uebertragungen_account' LIMIT 1");
                if($adresseprojekt)
                {
                  $adresseprojekt = " and projekt = '$adresseprojekt' ";
                }else{
                  $adresseprojekt = '';
                }
                $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE name='".$this->app->DB->real_escape_string((string)$xml->name)."' AND email='".$this->app->DB->real_escape_string((string)$xml->email)."' 
                          AND strasse='".$this->app->DB->real_escape_string((string)$xml->strasse)."' AND plz='".$this->app->DB->real_escape_string((string)$xml->plz)."' AND ort='".$this->app->DB->real_escape_string((string)$xml->ort)."' AND kundennummer <> '' AND geloescht!=1 $adresseprojekt LIMIT 1");
                $neuerkunde = true;
                if($adresse)
                {
                  $neuerkunde = false;
                }
              }else{
                $neuerkunde = true;
              }
              $kundeok = true;
            }else{
              $neuerkunde = false;
              $kundeok = true;
            }
          }
          else{
            $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','Kein Kundenname angegeben')");
          }
          if(empty($adresse) && (int)$addressFromDocument > 0) {
            $neuerkunde = false;
            $kundeok = true;
            $adresse = $addressFromDocument;
          }
        }
        else{
          if($this->app->DB->Select("SELECT kundennummernuebernehmen FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1") && isset($xml->kundennummer) && $xml->kundennummer != '')
          {
            $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer <> '' AND kundennummer = '".$this->app->DB->real_escape_string((string)$xml->kundennummer)."' AND ifnull(geloescht,0) = 0 ORDER BY projekt = '$projekt' DESC LIMIT 1");
          }else {
            $adresse = null;
          }
          if(!$adresse && !empty($xml->gln) && $xml->gln != ''){
            $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> 1 AND gln <> '' AND gln = '".$this->app->DB->real_escape_string((string)$xml->gln)."' LIMIT 1");
          }
          if(!empty($xml->adresse)){
            $adresse = $this->GetFromExtID('adresse', $xml->adresse);
          }
          if(!$adresse && !empty($xml->adresse))
          {
            $kundeok = true;
            $neuerkunde = true;
          }
          //if(!empty($xml->kundennummer))$adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE geloescht <> 1 AND kundennummer <> '' AND kundennummer = '".$this->app->DB->real_escape_string((string)$xml->kundennummer)."' LIMIT 1");

          if($adresse)$kundeok = true;

          if(empty($adresse) && (int)$addressFromDocument > 0) {
            $neuerkunde = false;
            $kundeok = true;
          }
        }
        if($kundeok)
        {
          $auftrag_positionen = null;
          $listname = $typ.'_position_list';
          $positionname = $typ.'_position';
          if(isset($xml->$listname))
          {
            if(isset($xml->$listname->$positionname))
            {
              $auftrag_positionen = &$xml->$listname->$positionname;
            }

          }elseif(isset($xml->$positionname)){
            $auftrag_positionen = &$xml->$positionname;
          }

          if($auftrag_positionen)
          {
            $artikelgefunden = true;
            foreach($auftrag_positionen as $position)
            {
              $_artikel = null;
              $ean = null;
              $extArticleId = null;
              $number = null;
              if(isset($position->artikel) && $position->artikel != '')
              {
                $extArticleId = (string)$position->artikel;
                $_artikel = $this->GetFromExtID('artikel', $xml->artikel);
                if($_artikel) {
                  $xml->artikelextid = $_artikel;
                }
              }
              if(!$_artikel && isset($position->ean) && $position->ean != '')
              {
                $ean = (string)$position->ean;
                $_artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
              }

              if(!$_artikel && isset($position->nummer) && $position->nummer != '')
              {
                $number = (string)$position->nummer;
                $_artikel = $this->app->DB->Select(
                  "SELECT id FROM artikel WHERE geloescht <> 1 AND nummer <> '' AND nummer = '"
                  . $this->app->DB->real_escape_string((string)$position->nummer).
                  "' ORDER BY projekt = '$projekt' DESC LIMIT 1"
                );
                $element1 = $position->nummer;
              }

              if(!$_artikel && $createArticleIfNotEmpty) {
                if(!empty($number) || !empty($extArticleId)) {
                  $newArticleArr = [
                    'projekt' => $projekt,
                  ];
                  if(!empty($markAsStorageArticle)) {
                    $newArticleArr = [
                      'lagerartikel' => 1,
                    ];
                  }
                  if(!empty($position->name)) {
                    $newArticleArr['name_de'] = (string)$position->name;
                  }
                  if($ean !== null) {
                    $newArticleArr['ean'] = $ean;
                  }
                  if($extArticleId === null) {
                    $newArticleArr['nummer'] = $number;
                  }
                  else {
                    $newArticleArr['nummer'] = $this->app->erp->GetNextNummer('artikel', $projekt);
                  }

                  $_artikel = $this->app->erp->InsertUpdateArtikel($newArticleArr);
                  if($extArticleId !== null) {
                    $this->SetExtIDMapping('artikel', $_artikel, $extArticleId);
                  }
                }
              }

              if(!$_artikel)
              {
                $artikelgefunden = false;
                if(!empty($position->nummer))
                {
                  if(!$this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND nummer <> '' AND nummer = '".$this->app->DB->real_escape_string((string)$position->nummer)."' ORDER BY projekt = '$projekt' DESC  LIMIT 1"))
                  {
                    $artikelgefunden = false;
                    $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','Artikelnummer ".$this->app->DB->real_escape_string((string)$position->nummer)." nicht gefunden')");
                    break;
                  }
                }elseif(!empty($position->ean)){
                  if(!$this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' LIMIT 1"))
                  {
                    $artikelgefunden = false;
                    $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','EAN ".$this->app->DB->real_escape_string((string)$position->ean)." nicht gefunden')");
                    break;
                  }
                }else{
                  $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','Keine Artikelnummer gefunden')");
                  break;
                }
              }
            }
            if($artikelgefunden)
            {
              $_typ ='';
              $name = '';
              $abteilung = '';
              $unterabteilung = '';
              $ansprechpartner = '';
              $adresszusatz = '';
              $strasse = '';
              $land = $this->app->erp->Firmendaten('land');
              $plz = '';
              $ort = '';
              $email = '';
              $telefon = '';
              $telefax = '';
              $ustid = '';
              $partner = '';
              $bundesstaat = '';
              $projekt = $this->app->DB->Select("SELECT projekt FROM uebertragungen_account WHERE id = '".$uebertragungen_account."' LIMIT 1");

              if(!empty($this->app->stringcleaner))
              {
                $this->app->stringcleaner->XMLArray_clean($xml);
              }

              if(isset($xml->name))$name = (string)$xml->name;
              if(isset($xml->anrede))$_typ = (string)$xml->anrede;
              if(isset($xml->abteilung))$abteilung = (string)$xml->abteilung;
              if(isset($xml->unterabteilung))$unterabteilung = (string)$xml->unterabteilung;
              if(isset($xml->ansprechpartner))$ansprechpartner = (string)$xml->ansprechpartner;
              if(isset($xml->adresszusatz))$adresszusatz = (string)$xml->adresszusatz;
              if(isset($xml->strasse))$strasse = (string)$xml->strasse;
              if(isset($xml->land))$land = (string)$xml->land;
              if(isset($xml->bundesstaat))$bundesstaat = (string)$xml->bundesstaat;
              if(isset($xml->plz))$plz = (string)$xml->plz;
              if(isset($xml->ort))$ort = (string)$xml->ort;
              if(isset($xml->email))$email = (string)$xml->email;
              if(isset($xml->telefon))$telefon = (string)$xml->telefon;
              if(isset($xml->telefax))$telefax = (string)$xml->telefax;
              if(isset($xml->ustid))$ustid = (string)$xml->ustid;
              if(isset($xml->partner))$partner = (string)$xml->partner;
              if(isset($xml->projekt) && (!isset($xml->belegnr) || $xml->belegnr == '' || strtoupper($xml->belegnr) == 'NEW' || strtoupper($xml->belegnr) == 'NEU'))
              {
                if(is_numeric($this->projekt)){
                  $projekt = (string)$xml->projekt;
                }
                if($land == ''){
                  $land = $this->app->erp->Projektdaten($projekt ,'land');
                }
              }
              if($land == '')
              {
                $land = $this->app->erp->Firmendaten('land');
              }
              if($neuerkunde)
              {
                $adresse = $this->app->erp->KundeAnlegen($_typ,$name,$abteilung,
                  $unterabteilung,$ansprechpartner,$adresszusatz,$strasse,$land,$plz,$ort,$email,$telefon,$telefax,$ustid,$partner,$projekt);
                if($bundesstaat != ''){
                  $this->app->DB->Update("UPDATE adresse SET bundesstaat = '".$this->app->DB->real_escape_string($bundesstaat)."' WHERE id = '$adresse' LIMIT 1");
                }
                if(isset($xml->adresse) && $xml->adresse != '')
                {
                  $this->SetExtIDMapping('adresse', $adresse, $xml->adresse);
                }
              }
              if($adresse) {
                $createname = 'Create'.ucfirst($typ);
                $auftrag = $this->app->erp->$createname();
                $belegnr = (string)$this->app->DB->Select("SELECT `belegnr` FROM `$typ` WHERE `id` = '$auftrag' LIMIT 1");
                if($belegnr === '' || $belegnr === '0'){
                  $belegnr = $this->app->erp->GetNextNummer($typ,$projekt,$auftrag);
                }
                if(isset($xml->belegnr) && $xml->belegnr != '' && strtoupper($xml->belegnr) != 'NEW' && strtoupper($xml->belegnr) != 'NEU'){
                  $this->SetExtIDMapping($typ, $auftrag, $xml->belegnr);
                }
                $standardwertename = 'Load'.ucfirst($typ).'Standardwerte';
                $this->app->erp->$standardwertename($auftrag, $adresse);
                if($typ === 'angebot' || $typ === 'auftrag'){
                  $this->app->DB->Update(
                    "UPDATE `$typ` 
                    SET `shopextid` = '" . $this->app->DB->real_escape_string(empty($xml->extid) ? '' : $xml->extid) . "'
                    WHERE `id` = '$auftrag' 
                    LIMIT 1"
                  );
                }
                $auftragarr['belegnr'] = $belegnr;
                if($_typ)
                {
                  $auftragarr['typ'] = $_typ;
                }
                if(!empty($name)) {
                  $auftragarr['name'] = $name;
                  $auftragarr['abteilung'] = $abteilung;
                  $auftragarr['unterabteilung'] = $unterabteilung;
                  $auftragarr['ansprechpartner'] = $ansprechpartner;
                  $auftragarr['strasse'] = $strasse;
                  $auftragarr['bundesstaat'] = $bundesstaat;
                  $auftragarr['land'] = $land;
                  $auftragarr['plz'] = $plz;
                  $auftragarr['ort'] = $ort;
                }
                if(!empty($email)){
                  $auftragarr['email'] = $email;
                }
                if(!empty($telefon)){
                  $auftragarr['telefon'] = $telefon;
                }
                if(!empty($telefax)){
                  $auftragarr['telefax'] = $telefax;
                }
                if(isset($xml->abweichendelieferadresse))$auftragarr['abweichendelieferadresse'] = (string)$xml->abweichendelieferadresse;
                if(isset($xml->art))$auftragarr['art'] = (string)$xml->art;
                if(isset($xml->bearbeiter))$auftragarr['bearbeiter'] = (string)$xml->bearbeiter;
                if(isset($xml->datum))$auftragarr['datum'] = (string)$xml->datum;
                if(isset($xml->lieferdatum))$auftragarr['lieferdatum'] = (string)$xml->lieferdatum;
                if(!empty($xml->tatsaechlicheslieferdatum))$auftragarr['tatsaechlicheslieferdatum'] = (string)$xml->tatsaechlicheslieferdatum;
                if(!empty($xml->lieferdatumkw))$auftragarr['lieferdatumkw'] = (string)$xml->lieferdatumkw;
                if(isset($xml->ustid))$auftragarr['ustid'] = (string)$xml->ustid;
                if(isset($xml->ust_befreit))$auftragarr['ust_befreit'] = (string)$xml->ust_befreit;
                if(isset($xml->internet))$auftragarr['internet'] = (string)$xml->internet;
                if(isset($xml->transaktionsnummer))$auftragarr['transaktionsnummer'] = (string)$xml->transaktionsnummer;
                if(isset($xml->versandart))$auftragarr['versandart'] = (string)$xml->versandart;
                if(isset($xml->vertrieb))$auftragarr['vertrieb'] = (string)$xml->vertrieb;
                if(isset($xml->zahlungsweise))$auftragarr['zahlungsweise'] = (string)$xml->zahlungsweise;
                if(isset($xml->freitext))$auftragarr['freitext'] = (string)$xml->freitext;
                if(isset($xml->bank_inhaber))$auftragarr['bank_inhaber'] = (string)$xml->bank_inhaber;
                if(isset($xml->bank_institut))$auftragarr['bank_institut'] = (string)$xml->bank_institut;
                if(isset($xml->bank_blz))$auftragarr['bank_blz'] = (string)$xml->bank_blz;
                if(isset($xml->bank_konto))$auftragarr['bank_konto'] = (string)$xml->bank_konto;
                if(isset($xml->vorabbezahltmarkieren))$auftragarr['vorabbezahltmarkieren'] = (string)$xml->vorabbezahltmarkieren;
                $auftragarr['autoversand'] ='1';
                if(isset($xml->abweichendelieferadresse))$auftragarr['abweichendelieferadresse'] = (string)$xml->abweichendelieferadresse;
                if(isset($xml->ansprechpartner))$auftragarr['ansprechpartner'] = (string)$xml->ansprechpartner;
                if(isset($xml->liefername))$auftragarr['liefername'] = (string)$xml->liefername;
                if(isset($xml->lieferbundesstaat))$auftragarr['lieferbundesstaat'] = (string)$xml->lieferbundesstaat;
                if(isset($xml->lieferland))$auftragarr['lieferland'] = (string)$xml->lieferland;
                if(isset($xml->lieferstrasse))$auftragarr['lieferstrasse'] = (string)$xml->lieferstrasse;
                if(isset($xml->lieferabteilung))$auftragarr['lieferabteilung'] = (string)$xml->lieferabteilung;
                if(isset($xml->lieferunterabteilung))$auftragarr['lieferunterabteilung'] = (string)$xml->lieferunterabteilung;
                if(isset($xml->lieferansprechpartner))$auftragarr['lieferansprechpartner'] = (string)$xml->lieferansprechpartner;
                if(isset($xml->lieferort))$auftragarr['lieferort'] = (string)$xml->lieferort;
                if(isset($xml->lieferplz))$auftragarr['lieferplz'] = (string)$xml->lieferplz;
                if(isset($xml->lieferadresszusatz))$auftragarr['lieferadresszusatz'] = (string)$xml->lieferadresszusatz;
                if(isset($xml->packstation_inhaber))$auftragarr['packstation_inhaber'] = (string)$xml->packstation_inhaber;
                if(isset($xml->packstation_station))$auftragarr['packstation_station'] = (string)$xml->packstation_station;
                if(isset($xml->packstation_ident))$auftragarr['packstation_ident'] = (string)$xml->packstation_ident;
                if(isset($xml->packstation_plz))$auftragarr['packstation_plz'] = (string)$xml->packstation_plz;
                if(isset($xml->packstation_ort))$auftragarr['packstation_ort'] = (string)$xml->packstation_ort;
                if(isset($xml->partnerid))$auftragarr['partnerid'] = (string)$xml->partnerid;
                if(isset($xml->kennen))$auftragarr['kennen'] = (string)$xml->kennen;

                if(isset($xml->ihrebestellnummer))$auftragarr['ihrebestellnummer'] = (string)$xml->ihrebestellnummer;
                if(isset($xml->internebemerkung))$auftragarr['internebemerkung'] = (string)$xml->internebemerkung;
                if(isset($xml->internebezeichnung))$auftragarr['internebezeichnung'] = (string)$xml->internebezeichnung;

                $auftragarr['status']='freigegeben';
                $auftragarr['projekt']=$projekt;
                $auftragarr['zahlungszielskonto']=0;
                if(isset($xml->gesamtsumme)){
                  $auftragarr['gesamtsumme'] = (float)str_replace(',','.',$xml->gesamtsumme);
                }
                $auftragarr = $this->formatDateFieldsToMysqlFormat($auftragarr);
                $this->app->DB->UpdateArr($typ, $auftrag, 'id', $auftragarr, true);
                $this->app->erp->Standardprojekt($typ, $auftrag);

                foreach($auftrag_positionen as $position)
                {
                  $artikel = null;
                  $newposid = null;
                  if(isset($position->artikelextid))
                  {
                    $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '".$this->app->DB->real_escape_string((string)$position->artikelextid)."' LIMIT 1");
                    if($artikel)
                    {
                      $newposid = $this->app->erp->AddPositionManuellPreisNummer($typ,$auftrag, $projekt, $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        (isset($position->menge)?$position->menge:1) ,
                        (isset($position->name)? $position->name:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                        isset($position->preis)? str_replace(',','.',$position->preis):$this->app->erp->GetVerkaufspreis($artikel,(isset($position->menge)?$position->menge:1),$adresse) ,
                        $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1") ,
                        0,0,
                        isset($xml->waehrung)?$xml->waehrung:'EUR');
                    }
                  }
                  if(!empty($position->ean) && !$artikel)
                  {
                    $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND ean <> '' AND ean = '".$this->app->DB->real_escape_string((string)$position->ean)."' LIMIT 1");
                    if($artikel)
                    {
                      $newposid = $this->app->erp->AddPositionManuellPreisNummer($typ,$auftrag, $projekt, $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"),
                        (isset($position->menge)?$position->menge:1) ,
                        (isset($position->name)? $position->name:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                        isset($position->preis)? str_replace(',','.',$position->preis):$this->app->erp->GetVerkaufspreis($artikel,(isset($position->menge)?$position->menge:1),$adresse) ,
                        $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1") ,
                        0,0,
                        isset($xml->waehrung)?$xml->waehrung:'EUR');
                    }
                  }
                  if(isset($position->nummer) && !$artikel)
                  {
                    $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND nummer <> '' AND nummer = '".$this->app->DB->real_escape_string((string)$position->nummer)."'  LIMIT 1");
                    $newposid = $this->app->erp->AddPositionManuellPreisNummer($typ,$auftrag, $projekt, $position->nummer,
                      (isset($position->menge)?$position->menge:1) ,
                      (isset($position->name)? $position->name:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1")),
                      isset($position->preis)? str_replace(',','.',$position->preis):$this->app->erp->GetVerkaufspreis($artikel,(isset($position->menge)?$position->menge:1),$adresse) ,
                      $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1") ,
                      0,0,
                      isset($xml->waehrung)?$xml->waehrung:'EUR');

                  }
                  if(!empty($newposid))
                  {
                    if($typ === 'auftrag'){
                      if(!empty($position->lieferdatum)){
                        $deliveryDate = (string)$position->lieferdatum;

                        if(strpos($deliveryDate, '.') !== false) {
                          $deliveryDate = $this->app->String->Convert($deliveryDate, '%1.%2.%3', '%3-%2-%1');
                        }

                        $this->app->DB->Update("UPDATE auftrag_position SET lieferdatum = '" . $deliveryDate . "' WHERE id = $newposid LIMIT 1");
                      }
                      if(!empty($position->lieferdatumkw)){
                        $this->app->DB->Update("UPDATE auftrag_position SET lieferdatumkw = '" . $position->lieferdatumkw . "' WHERE id = $newposid LIMIT 1");
                      }
                    }

                    $artikelnummerkunde = !empty($position->kundenartikelnummer)?(string)$position->kundenartikelnummer:$this->app->DB->real_escape_string(
                      $this->app->DB->Select(
                        "SELECT kundenartikelnummer 
                                FROM verkaufspreise 
                                WHERE adresse='$adresse' AND artikel='$artikel' AND kundenartikelnummer!='' AND ab_menge <=".
                        (float)(isset($position->menge)?$position->menge:1)." 
                                AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') 
                                ORDER by ab_menge DESC 
                                LIMIT 1"
                      ));

                    if($artikelnummerkunde == ''){
                      // Anzeige Artikel Nummer von Gruppe aus Verkaufspreis
                      $returnwaehrung = null;
                      $gruppevkresult = $this->app->erp->GetVerkaufspreis(
                        $artikel,
                        (isset($position->menge)?$position->menge:1),
                        $adresse,
                        isset($xml->waehrung)?$xml->waehrung:'EUR',
                        $returnwaehrung,
                        true
                      );
                      if($gruppevkresult['kundenartikelnummer'] != ''){
                        $artikelnummerkunde = $gruppevkresult['kundenartikelnummer'];
                      }
                    }

                    if(!empty($artikelnummerkunde)) {
                      $this->app->DB->Update(
                        sprintf(
                          "UPDATE `%s` SET `artikelnummerkunde` = '%s' WHERE `id` = %d ",
                          $typ.'_position',
                          $this->app->DB->real_escape_string($artikelnummerkunde),
                          $newposid
                        )
                      );
                    }
                    $positionFieldsToUpdate = [];
                    if($typ === 'retoure') {
                      foreach(
                        [
                          'grund',
                          'grundbeschreibung',
                          'beschreibung',
                          'seriennummer',
                          'internerkommentar',
                          'bemerkung',
                          'lieferdatum',
                        ] as $positionField
                      ) {
                        if(isset($position->$positionField)) {
                          $positionFieldValue = (string)$position->$positionField;
                          if(!empty($positionFieldValue)) {
                            if($positionField === 'lieferdatum' && strpos($positionFieldValue, '.') !== false) {
                              $positionFieldValue = $this->app->String->Convert($positionFieldValue, '%1.%2.%3', '%3-%2-%1');
                            }
                            $positionFieldsToUpdate[$positionField] = $positionFieldValue;
                          }
                        }
                      }
                    }
                    for($indexFreeField = 1; $indexFreeField <= 40; $indexFreeField++) {
                      $positionField = 'freifeld'.$indexFreeField;
                      if(isset($position->$positionField)) {
                        $positionFieldValue = (string)$position->$positionField;
                        if(!empty($positionFieldValue)) {
                          $positionFieldsToUpdate[$positionField] = $positionFieldValue;
                        }
                      }
                    }
                    if(!empty($positionFieldsToUpdate)) {
                      $this->app->DB->UpdateArr($typ .'_position', $newposid, 'id', $positionFieldsToUpdate, true);
                    }
                  }
                  /*if($newposid > 0)
                  {
                    $this->app->erp->RunHook("beleg_afterinsertposition", 5, "auftrag",$auftrag,$artikel,(isset($position->menge)?$position->menge:1),$newposid);
                  }*/
                }

                $this->app->erp->LoadSteuersaetzeWaehrung($auftrag,$typ);

                $this->app->DB->Update("
                        UPDATE $typ a 
                        INNER JOIN adresse adr ON a.lieferant = adr.id 
                        SET a.lieferantkdrnummer = if(a.lieferantennummer <> '',a.lieferantennummer,adr.lieferantennummer)
                        WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 1 AND a.id = '$auftrag'
                        ");
                $this->app->DB->Update("
                        UPDATE $typ a 
                        INNER JOIN adresse adr ON a.adresse = adr.id 
                        SET a.lieferantkdrnummer = if(a.kundennummer <> '',a.kundennummer, adr.kundennummer)
                        WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 0 AND a.id = '$auftrag'
                        ");

                if($typ == 'auftrag')
                {
                  $reservierung = $this->app->DB->Select("SELECT reservierung FROM projekt WHERE id='$projekt' LIMIT 1");
                  if($reservierung>=1){
                    $this->app->erp->AuftragReservieren($auftrag);
                  }
                  $this->app->erp->AuftragNeuberechnen($auftrag);
                  $this->app->erp->AuftragEinzelnBerechnen($auftrag);
                }elseif($typ == 'angebot')
                {
                  $this->app->erp->AngebotNeuberechnen($auftrag);
                }

                if(isset($xml->dateien)) {
                  foreach($xml->dateien as $datei)
                  {
                    foreach($datei as $singledatei)
                    {
                      $isfile = false;
                      $data = null;
                      if(is_file($singledatei->dateiname)){
                        $type = mime_content_type(basename($singledatei->dateiname));
                        if($type != 'text/x-php' && $type != 'text/php' && $type != 'application/php' && $type != 'application/x-php' && $type != 'application/x-httpd-php' && $type != 'application/x-httpd-php-source'){

                          if($singledatei->dateiinhalt == ''){
                            $data = file_get_contents($singledatei->dateiname);
                            //$singledatei->dateiinhalt = base64_encode($dateiinhalt);
                            $isfile = true;
                          }
                        }else{
                          $singledatei->dateiinhalt = '';
                        }
                      }
                      if(empty($data))
                      {
                        if($singledatei->dateiinhalt == '')
                        {
                          $data = '';
                        }else{
                          $data = base64_decode($singledatei->dateiinhalt);
                        }
                      }
                      if($isfile){
                        $name = $this->app->erp->GetTmp().basename($singledatei->dateiname);
                      }else{
                        $name = $this->app->erp->GetTmp().$singledatei->dateiname;
                      }

                      file_put_contents($name, $data);

                      $pfad = $this->app->Conf->WFuserdata;
                      $pfad = rtrim($pfad);
                      $pfad .= '/dms/';

                      if(!file_exists($pfad) && !mkdir($pfad, 0777, true) && !is_dir($pfad))
                      {
                        $this->app->erp->LogFile($pfad.' konnte nicht erstellt werden');
                      }

                      $speicherpfad = $pfad.$this->app->Conf->WFdbname;

                      if(!file_exists($speicherpfad) && !mkdir($speicherpfad, 0777, true) &&
                        !is_dir($speicherpfad))
                      {
                        $this->app->erp->LogFile($speicherpfad.' konnte nicht erstellt werden');
                      }

                      $fileid = $this->app->erp->CreateDatei($singledatei->dateiname, !empty($singledatei->titel)?$singledatei->titel:$singledatei->dateiname, !empty($singledatei->beschreibung)?(string)$singledatei->beschreibung:'', '', $name, '',true,$speicherpfad);
                      $subjekt = !empty($singledatei->subjekt)?(string)$singledatei->subjekt:'Sonstige';
                      $this->app->erp->AddDateiStichwort($fileid, $subjekt, ucfirst($typ), $auftrag);

                      if($isfile){
                        @rename($singledatei->dateiname, $singledatei->dateiname.'.del');
                      }
                    }
                  }
                }
                if(!empty($obj)){
                  $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ . '_ok', ucfirst($typ) . ' angelegt', '', '', '', $typ, $auftrag);
                  $this->app->erp->RunHook('transfer_document_incoming', 3, $uebertragungen_account, $typ, $auftrag);
                }
              }
            }else
            {
              if(!empty($obj)){
                $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ . '_error', 'Artikel nicht gefunden', $this->app->DB->real_escape_string((string)$element1), '', '', $typ);
              }
            }
          }else{
            $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','Keine Positionen gefunden')");
            if(!empty($obj)){
              $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ . '_error', ucfirst($typ) . ' enth&auml;lt keine Positinen', $this->app->DB->real_escape_string((string)$xml->extid), '', '', $typ);
            }
          }
        }else{
          $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account',$typ,'".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."',$typ.'_fehler','Kundennummer ".$this->app->DB->real_escape_string((string)$xml->kundennummer)." nicht gefunden')");
        }
        //}else{
        //$this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','auftrag','".$this->app->DB->real_escape_string(empty($xml->extid)?'':$xml->extid)."','auftrag_fehler','Keine Kundennummer angegeben')");
        //}
      }else
      {
        if($this->app->DB->Select("SELECT id FROM $typ WHERE shopextid = '".$this->app->DB->real_escape_string((empty($xml->extid))?'':$xml->extid)."' AND projekt = '$projekt' AND shopextid <> ''"))
        {
          $element1 = 'Shopextid: '.$xml->extid;
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ.'_error', ucfirst($typ).' existiert bereits', $this->app->DB->real_escape_string((string)$element1), '', '', $typ, $id);
        }elseif($this->GetFromExtID($typ, $xml->belegnr)){
          if(!empty($obj)){
            $__id = $this->GetFromExtID($typ, $xml->belegnr);
            $__auftrag = $this->app->DB->Select("SELECT belegnr FROM $typ WHERE id = '$__id' LIMIT 1");
            $element1 = "Belegnr: " . $__auftrag;
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ . '_error', ucfirst($typ) . ' existiert bereits', $this->app->DB->real_escape_string((string)$element1), '', '', $typ, $id);
          }
        }else{
          if(!empty($obj)){
            $element1 = 'Belegnr: ' . $xml->belegnr;
            $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ . '_error', ucfirst($typ) . ' existiert bereits', $this->app->DB->real_escape_string((string)$element1), '', '', $typ, $id);
          }
        }
      }

    }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
    public function ParsePartXmlDeliverynoteWithoutId(&$xml, $uebertragungen_account, $obj)
    {
      if(isset($xml->tracking)) {
        if(!empty($xml->belegnr)) {
          $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','lieferschein','".(string)$xml->belegnr."','tracking_fehler','Lieferschein ".(string)$xml->belegnr." nicht gefunden')");
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'tracking_error', 'Lieferschein '.(string)$xml->belegnr." nicht gefunden", $this->app->DB->real_escape_string((string)$xml->belegnr), '', '', 'lieferschein');
        }
      }
    }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
    public function ParsePartXmlDocumentWithoutId($typ, &$xml, $uebertragungen_account, $obj)
    {
      switch($typ) {
        case 'bestellung':
        case 'produktion':
          $this->ParsePartXmlSupplierorderProductionWithoutId($typ, $xml, $uebertragungen_account, $obj);
          break;
        case 'auftrag':
        case 'angebot':
        case 'retoure':
          $this->ParsePartXmlOrderOfferWithoutId($typ, $xml, $uebertragungen_account, $obj);
          break;

        case 'lieferschein':
          $this->ParsePartXmlDeliverynoteWithoutId($xml, $uebertragungen_account, $obj);
          if(isset($xml->tracking)) {
            if(!empty($xml->belegnr)) {
              $this->app->DB->Insert("INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) VALUES ('$uebertragungen_account','lieferschein','".(string)$xml->belegnr."','tracking_fehler','Lieferschein ".(string)$xml->belegnr." nicht gefunden')");
              $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, 'tracking_error', 'Lieferschein '.(string)$xml->belegnr." nicht gefunden", $this->app->DB->real_escape_string((string)$xml->belegnr), '', '', 'lieferschein');
            }
          }
          break;
      }
    }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
    public function ParsePartXmlDeliveryNoteTracking(&$xml, $uebertragungen_account, $obj, $id)
    {
      if(!isset($xml->tracking)){
        return;
      }
      $tracking = (string)$xml->tracking;
      if($tracking == '') {
        return;
      }
      $versand = '';
      if(isset($xml->versandart)) {
        $versand = (string)$xml->versandart;
      }
      $tracking_link = null;
      $sprache = null;
      if(!empty($xml->tracking_sprache) && (string)$xml->tracking_sprache){
        $sprache = (string)$xml->tracking_sprache;
      }
      if(!empty($xml->tracking_link) && (string)$xml->tracking_link){
        $tracking_link = (string)$xml->tracking_link;
      }
      $this->addTrackingToDeliveryNote(
        $obj,
        $id,
        $tracking,
        $versand,
        $sprache,
        $tracking_link
      );

      unset($kg);
      unset($adresse);
      unset($projekt);
      unset($tracking);
      unset($versand);
      $lieferschein_positionen = null;
      if(isset($xml->lieferschein_position_list)) {
        if(isset($xml->lieferschein_position_list->lieferschein_position)) {
          $lieferschein_positionen = &$xml->lieferschein_position_list->lieferschein_position;
        }
      }
      elseif(isset($xml->lieferschein_position)){
        $lieferschein_positionen = &$xml->lieferschein_position;
      }
      if($lieferschein_positionen) {
        foreach($lieferschein_positionen as $position) {
          if(isset($position->sort) &&  !isset($position->lieferschein)){
            $position->lieferschein = $id;
          }
          $id_pos = $this->GetIDFromFeld('lieferschein_position', $position);
          if($id_pos && isset($position->geliefert)) {
            $check = $this->app->DB->SelectRow(
              "SELECT * FROM lieferschein_position WHERE id = '$id_pos' AND lieferschein = '$id' LIMIT 1"
            );
            if($check) {
              $geliefert = round((float)$position->geliefert,4);
              if($check['menge'] >= $geliefert){
                $this->app->DB->Update("UPDATE lieferschein_position SET geliefert = '$geliefert' WHERE id = '$id_pos' LIMIT 1");
              }
            }
          }
        }
      }
      else {
        $this->app->DB->Update("UPDATE lieferschein_position SET geliefert = menge WHERE lieferschein = '$id'");
      }
      $this->app->DB->Update("UPDATE lieferschein SET status = 'versendet' WHERE id = '$id' LIMIT 1");
    }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
    public function ParsePartXmlDeliveryNoteBestBefore(&$xml, $uebertragungen_account, $obj, $id)
    {
      $lieferschein_positionen = null;
      if(isset($xml->lieferschein_position_list)) {
        if(isset($xml->lieferschein_position_list->lieferschein_position)) {
          $lieferschein_positionen = &$xml->lieferschein_position_list->lieferschein_position;
        }
      }
      elseif(isset($xml->lieferschein_position)){
        $lieferschein_positionen = &$xml->lieferschein_position;
      }
      if(empty($lieferschein_positionen)) {
        return;
      }
      $lastPosId = 0;
      foreach($lieferschein_positionen as $position) {
        if(isset($position->sort) &&  !isset($position->lieferschein)){
          $position->lieferschein = $id;
        }
        $id_pos = $this->GetIDFromFeld('lieferschein_position', $position);
        if($lastPosId === $id_pos) {
          continue;
        }
        $lastPosId = $id_pos;
        if(!isset($position->mhd_charge_block)) {
          continue;
        }
        $sCount = (!empty($position->mhd_charge_block)?count($position->mhd_charge_block):0);
        if($sCount > 0) {
          $bestBefores = [];
          foreach($position->mhd_charge_block as $mhd) {
            $bestBefore = ['bestbefore' => '', 'batch' => '', 'amount' => 0];
            if(isset($mhd->mhd)) {
              $bestBefore['bestbefore'] = (string)$mhd->mhd;
            }
            if(isset($mhd->charge)) {
              $bestBefore['batch'] = (string)$mhd->charge;
            }
            if(isset($mhd->anzahl)) {
              $bestBefore['amount'] = (string)$mhd->anzahl;
            }
            elseif(isset($mhd->menge)) {
              $bestBefore['amount'] = (string)$mhd->menge;
            }
            if(empty($bestBefore['bestbefore']) && empty($bestBefore['batch'])) {
              continue;
            }
            $bestBefores[] = $bestBefore;
          }
          if(empty($bestBefores)) {
            continue;
          }
          $posDb = $this->app->DB->SelectRow(
            sprintf(
              'SELECT dnp.id, dnp.`artikel`, art.mindesthaltbarkeitsdatum, art.chargenverwaltung,
                dnp.menge, dnp.explodiert_parent, dnp.menge
              FROM `lieferschein_position` AS `dnp`
              INNER JOIN `artikel` AS `art` ON dnp.artikel = art.id
              WHERE `dnp`.id = %d',
              $id_pos
            )
          );
          if(empty($posDb)) {
            continue;
          }
          if((!empty($bestBefores)?count($bestBefores):0) === 1 && empty($bestBefores[0]['amount'])) {
            $bestBefores[0]['amount'] = $posDb['menge'];
          }
          $posDb['menge'] = $this->app->erp->ReplaceMenge(1, $posDb['menge'], 1);
          if($posDb['menge'] <= 0) {
            continue;
          }
          $isBestBeforeArticle = !empty($posDb['mindesthaltbarkeitsdatum']);
          $isBatchArticle = $posDb['chargenverwaltung'] > 0;
          if(!$isBestBeforeArticle && !$isBatchArticle) {
            if(empty($posDb['explodiert_parent'])) {
              continue;
            }
            if(!empty($posDb['explodiert_parent'])) {
              $posDb = $this->app->DB->SelectRow(
                sprintf(
                  'SELECT dnp.id, dnp.`artikel`, art.mindesthaltbarkeitsdatum,art.`chargenverwaltung`, 
                        dnp.menge, dnp.explodiert_parent, dnp.menge
                  FROM `lieferschein_position` AS `dnp`
                  INNER JOIN `artikel` AS `art` ON dnp.artikel = art.id
                  WHERE `dnp`.id = %d',
                  $posDb['explodiert_parent']
                )
              );
              $isBestBeforeArticle = !empty($posDb['mindesthaltbarkeitsdatum']);
              $isBatchArticle = $posDb['chargenverwaltung'] > 0;
              if(!$isBestBeforeArticle && !$isBatchArticle) {
                continue;
              }
            }
          }
          if($isBestBeforeArticle && $isBatchArticle){
            $dbBestbefores = $this->app->DB->SelectFirstCols(
              sprintf(
                "SELECT CONCAT(`wert`,'|', `wert2`)
              FROM `beleg_chargesnmhd` 
              WHERE `wert` != '' AND `type` = 'mhd' AND `doctype` = 'lieferschein' 
                AND `doctypeid` = %d AND `pos` = %d
              GROUP BY `wert`",
                $id, $posDb['id']
              )
            );
          }
          elseif($isBestBeforeArticle) {
            $dbBestbefores = $this->app->DB->SelectFirstCols(
              sprintf(
                "SELECT `wert`
              FROM `beleg_chargesnmhd` 
              WHERE `wert` != '' AND `type` = 'mhd' AND `doctype` = 'lieferschein' 
                AND `doctypeid` = %d AND `pos` = %d
              GROUP BY `wert`",
                $id, $posDb['id']
              )
            );
          }
          elseif($isBatchArticle) {
            $dbBestbefores = $this->app->DB->SelectFirstCols(
              sprintf(
                "SELECT `wert`
                FROM `beleg_chargesnmhd` 
                WHERE `wert` != '' AND `type` = 'charge' AND `doctype` = 'lieferschein' 
                  AND `doctypeid` = %d AND `pos` = %d
                GROUP BY `wert`",
                $id, $posDb['id']
              )
            );
          }
          if(empty($dbBestbefores)){
            $dbBestbefores = [];
          }
          foreach ($bestBefores as $bestBefore) {
            if($isBestBeforeArticle && $isBatchArticle){
              $bestBeforeConcat = $bestBefore['bestbefore'] . '|' . $bestBefore['batch'];
            }
            elseif($isBestBeforeArticle){
              $bestBeforeConcat = $bestBefore['bestbefore'];
            }
            elseif($isBatchArticle){
              $bestBeforeConcat = $bestBefore['batch'];
            }

            if(!in_array($bestBeforeConcat, $dbBestbefores)){
              if($isBestBeforeArticle && $isBatchArticle){
                $this->app->erp->CreateBelegPositionMHDCHARGESRN(
                  'lieferschein', $id, $posDb['id'], 'mhd', $bestBefore['bestbefore'], $bestBefore['amount'],
                  'charge', $bestBefore['batch'], 0, 'API Eingang'
                );

                $this->app->erp->CreateBelegPositionMHDCHARGESRN(
                  'lieferschein', $id, $posDb['id'], 'charge', $bestBefore['batch'], $bestBefore['amount'],
                  '', '', 0, 'API Eingang'
                );
              }
              elseif($isBestBeforeArticle) {
                $this->app->erp->CreateBelegPositionMHDCHARGESRN(
                  'lieferschein', $id, $posDb['id'], 'mhd', $bestBefore['bestbefore'], $bestBefore['amount'],
                  '','', 0, 'API Eingang'
                );
              }
              elseif($isBatchArticle) {
                $this->app->erp->CreateBelegPositionMHDCHARGESRN(
                  'lieferschein', $id, $posDb['id'], 'charge', $bestBefore['batch'], $bestBefore['amount'],
                  '', '', 0, 'API Eingang'
                );
              }
            }
          }
        }
      }
    }


    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
    public function ParsePartXmlDeliveryNoteSerials(&$xml, $uebertragungen_account, $obj, $id)
    {
      $lieferschein_positionen = null;
      if(isset($xml->lieferschein_position_list)) {
        if(isset($xml->lieferschein_position_list->lieferschein_position)) {
          $lieferschein_positionen = &$xml->lieferschein_position_list->lieferschein_position;
        }
      }
      elseif(isset($xml->lieferschein_position)){
        $lieferschein_positionen = &$xml->lieferschein_position;
      }
      if(empty($lieferschein_positionen)) {
        return;
      }
      $lastPosId = 0;
      foreach($lieferschein_positionen as $position) {
        if(isset($position->sort) &&  !isset($position->lieferschein)){
          $position->lieferschein = $id;
        }
        $id_pos = $this->GetIDFromFeld('lieferschein_position', $position);
        if($lastPosId === $id_pos) {
          continue;
        }
        $lastPosId = $id_pos;
        if(!isset($position->serial)) {
          continue;
        }
        $sCount = (!empty($position->serial)?count($position->serial):0);
        if($sCount > 0) {
          $serials = [];
          foreach($position->serial as $serial) {
            $serials[] = (string)$serial;
          }
          $posDb = $this->app->DB->SelectRow(
            sprintf(
              'SELECT dnp.id, dnp.`artikel`, art.seriennummern, dnp.menge, dnp.explodiert_parent
              FROM `lieferschein_position` AS `dnp`
              INNER JOIN `artikel` AS `art` ON dnp.artikel = art.id
              WHERE `dnp`.id = %d',
              $id_pos
            )
          );
          if(empty($posDb)) {
            continue;
          }
          if((string)$posDb['seriennummern'] === ''
            || (string)$posDb['seriennummern'] === 'keine') {
            if(empty($posDb['explodiert_parent'])) {
              continue;
            }
            if(!empty($posDb['explodiert_parent'])) {
              $posDb = $this->app->DB->SelectRow(
                sprintf(
                  'SELECT dnp.id, dnp.`artikel`, art.seriennummern, dnp.menge, dnp.explodiert_parent
                  FROM `lieferschein_position` AS `dnp`
                  INNER JOIN `artikel` AS `art` ON dnp.artikel = art.id
                  WHERE `dnp`.id = %d',
                  $id_pos
                )
              );
              if((string)$posDb['seriennummern'] === ''
                || (string)$posDb['seriennummern'] === 'keine') {
                continue;
              }
            }
          }
          $dbSerials = $this->app->DB->SelectFirstCols(
            sprintf(
              "SELECT `wert` 
              FROM `beleg_chargesnmhd` 
              WHERE `wert` != '' AND `type` = 'sn' AND `doctype` = 'lieferschein' 
                AND `doctypeid` = %d AND `pos` = %d
              GROUP BY `wert`",
              $id, $posDb['id']
            )
          );
          foreach($serials as $serial) {
            if(!in_array($serial, $dbSerials)) {
              $this->app->erp->CreateBelegPositionMHDCHARGESRN(
                'lieferschein',$id,$posDb['id'],'sn',$serial,1,'','',0,'API Eingang'
              );
              $dbSerials[] = $serial;
            }
          }
        }
      }
    }

    /**
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
    public function ParsePartXmlDeliveryNoteWithId(&$xml, $uebertragungen_account, $obj, $id)
    {
      if(isset($xml->tracking)){
        $this->ParsePartXmlDeliveryNoteTracking($xml, $uebertragungen_account, $obj, $id);
      }
      $this->ParsePartXmlDeliveryNoteBestBefore($xml, $uebertragungen_account, $obj, $id);
      $this->ParsePartXmlDeliveryNoteSerials($xml, $uebertragungen_account, $obj, $id);
    }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     * @param int            $id
     */
    public function ParsePartXmlDocumentWithId($typ, &$xml, $uebertragungen_account, $obj, $id)
    {
      switch($typ) {
        case 'auftrag':
        case 'angebot':
        case 'bestellung':
        case 'produktion':
          $obj->AddUbertragungMonitorLog($uebertragungen_account, $this->datei_id, 0, $typ.'_error', ucfirst($typ).' existiert bereits', $this->app->DB->real_escape_string(!empty($xml->belegnr)?(string)$xml->belegnr:$id), '', '', $typ, $id);
          break;
        case 'lieferschein':
          $this->ParsePartXmlDeliveryNoteWithId($xml, $uebertragungen_account, $obj, $id);
          break;
      }
    }

    /**
     * @param string         $typ
     * @param                $xml
     * @param int            $uebertragungen_account
     * @param Uebertragungen $obj
     */
  public function ParsePartXmlDocument($typ, &$xml, $uebertragungen_account, $obj)
  {
    if($typ !== 'auftrag' && $typ !== 'angebot' && $typ !== 'bestellung' && $typ !== 'produktion') {
      $id = $this->GetIDFromFeld($typ, $xml);
    }
    elseif(isset($xml->belegnr) && strtoupper((string)$xml->belegnr) !== 'NEW' && strtoupper((string)$xml->belegnr) !== 'NEU'){
      $id = $this->GetFromExtID($typ, $xml->belegnr, $xml);
    }
    else {
      $id = null;
    }
    if(!$id && $typ === 'lieferschein' && isset($xml->auftragextid) && $xml->auftragextid != "") {
      $projekt = $this->app->DB->Select("SELECT projekt FROM uebertragungen_account WHERE id = '$uebertragungen_account' LIMIT 1");
      $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1");
      if($eigenernummernkreis) {
        $auftrag = $this->app->DB->Select("SELECT id FROM auftrag WHERE belegnr = '".$this->app->DB->real_escape_string($xml->auftragextid)."' AND projekt = '$projekt' LIMIT 1");
      }
      else{
        $auftrag = $this->app->DB->Select("SELECT id FROM auftrag WHERE belegnr = '".$this->app->DB->real_escape_string($xml->auftragextid)."' ORDER BY projekt = '$projekt' DESC LIMIT 1");
      }
      if($auftrag) {
        $id = $this->app->DB->Select("SELECT id FROM lieferschein WHERE auftragid = '$auftrag' AND status <> 'stoniert' AND belegnr != '' LIMIT 1");
        if(!$id && !$this->app->DB->Select("SELECT id FROM lieferschein WHERE auftragid = '$auftrag' LIMIT 1")) {
          $id = $this->app->erp->WeiterfuehrenAuftragZuLieferschein($auftrag);
          if($id) {
            $this->app->erp->BelegFreigabe('lieferschein', $id);
            $this->app->DB->Update("UPDATE lieferschein SET status = 'versendet' AND schreibschutz = 1 WHERE id = '$id' LIMIT 1");
          }
        }
      }
    }
    if($id) {
      $this->ParsePartXmlDocumentWithId($typ, $xml, $uebertragungen_account, $obj, $id);
    }
    else{
      //Beleg nicht gefunden
      $this->ParsePartXmlDocumentWithoutId($typ, $xml, $uebertragungen_account, $obj);
    }
  }

    /**
     * @param $typ
     * @param $xml
     * @param $uebertragungen_account
     */
  public function ParseTeilXML($typ, &$xml, $uebertragungen_account)
  {
    $typen = $this->getTabellen();
    $belege = $this->getBelege();
    $is_beleg = in_array($typ, $belege);
    $is_typ = false;

    if($uebertragungen_account) {
      /** @var Uebertragungen $obj */
      $obj = $this->app->erp->LoadModul('uebertragungen');
      if($obj) {
        $obj->datei_id = $this->datei_id;
      }
    }
    if($uebertragungen_account) {
      if(!$this->isAllowedToImport($uebertragungen_account, $obj, $typ)){
        return;
      }
    }

    if(!$is_beleg){
      $is_typ = in_array($typ, $typen);
    }
    if(!$is_typ && !$is_beleg) {
      return;
    }

    $this->UpdateMappingXML($typ, $xml);

    if($is_beleg) {
      $this->ParsePartXmlDocument($typ, $xml, $uebertragungen_account, $obj);
    }
    elseif($is_typ) {
      $this->ParsePartXmlType($typ, $xml, $uebertragungen_account, $obj);
    }
  }

    /**
     * @param int    $deliveryNoteId
     * @param string $tracking
     * @param string $deliveryType
     * @param string $language
     * @param string $trackingLink
     *
     * @return bool|int
     */
  public function createShipmentByDeliveryNote($deliveryNoteId, $tracking, $deliveryType = '', $language = '', $trackingLink = '')
  {
    $deliveryNote = $this->app->DB->SelectRow(
      sprintf(
        'SELECT adresse,projekt,auftragid, versandart FROM lieferschein WHERE id = %d LIMIT 1',
        $deliveryNoteId
      )
    );
    if(empty($deliveryNote)) {
      return false;
    }
    $addressId = $deliveryNote['adresse'];
    $projectId = $deliveryNote['projekt'];
    $orderId = $deliveryNote['auftragid'];

    if($deliveryType == '') {
      $deliveryType = $deliveryNote['versandart'];
    }
    $kg = $this->app->erp->VersandartMindestgewicht($deliveryNoteId);

    //$tracking = $this->app->erp->TrackingNummerAnpassen($projekt,$tracking);
    $tracking = $this->app->DB->real_escape_string($tracking);

    if($deliveryType === 'versandunternehmen'){
      $deliveryType = (string)$this->app->erp->Firmendaten('versandart');
    }
    $versandid = false;
    if(
      !$this->app->DB->Select(
        sprintf(
          "SELECT id FROM versand WHERE tracking = '%s' AND lieferschein = %d LIMIT 1",
          $tracking, $deliveryNoteId
        )
      )
    ) {
      $keinetrackingmail = 0;
      if($orderId) {
        $keinetrackingmail = (int)$this->app->DB->Select(
          sprintf(
            "SELECT keinetrackingmail FROM auftrag WHERE id = %d LIMIT 1", $orderId
          )
        );
      }
      $versandid = $this->app->DB->Select(
        sprintf(
          "SELECT id 
          FROM versand 
          WHERE lieferschein = %d AND tracking = ''
          ORDER BY weitererlieferschein, improzessuser
          LIMIT 1",
          $deliveryNoteId
        )
      );
      if($versandid) {
        $this->app->DB->Update(
          sprintf(
            "UPDATE versand 
            SET versandunternehmen = '%s', versandart = '%s', tracking = '%s', tracking_link = '%s',
                versendet_am = NOW(), abgeschlossen = 1, lieferschein = %d, freigegeben = 1, firma = 1, adresse = %d,
                projekt = %d, gewicht = %f, paketmarkegedruckt = 1, anzahlpakete = 1, keinetrackingmail = %d,
                improzessuser = 0, improzess = 0
            WHERE id = %d",
            $deliveryType, $deliveryType, $tracking, $trackingLink ,
            (int)$deliveryNoteId, (int)$addressId,
            (int)$projectId, (float)$kg, $keinetrackingmail,
            $versandid
          )
        );
        if($this->app->DB->affected_rows() > 0) {
          return $versandid;
        }
      }

      $this->app->DB->Insert(
        sprintf(
          "INSERT INTO versand (versandunternehmen,versandart, tracking, tracking_link,
                      versendet_am,abgeschlossen,lieferschein, freigegeben,firma,
                     adresse,projekt,gewicht,paketmarkegedruckt,anzahlpakete,keinetrackingmail,
                     logdatei,versender,bearbeiter,download,rechnung)
          VALUES ('%s','%s','%s','%s',
                                NOW(),1,%d, 1,1,
                                %d,%d,%f,1,1,%d,NOW(),'','',0,0) ",
          $deliveryType, $deliveryType, $tracking, $trackingLink ,
          (int)$deliveryNoteId,
          (int)$addressId, (int)$projectId, (float)$kg, $keinetrackingmail
        )
      );
      $versandid = $this->app->DB->GetInsertID();
    }

    return $versandid;
  }

    /**
     * @param Uebertragungen $transferobject
     * @param int            $deliveryNoteId
     * @param string         $tracking
     * @param string         $deliveryType
     * @param string         $language
     * @param string         $trackingLink
     */
  public function addTrackingToDeliveryNote(
    $transferobject,
    $deliveryNoteId,
    $tracking,
    $deliveryType = '',
    $language = '',
    $trackingLink = ''
  ) {
    $versandid = $this->createShipmentByDeliveryNote(
      $deliveryNoteId,
      $tracking,
      $deliveryType,
      $language,
      $trackingLink
    );
    if(empty($versandid)) {
      return;
    }

    $deliveryNote = $this->app->DB->SelectRow(
      sprintf(
        'SELECT adresse, projekt, auftragid, versandart FROM lieferschein WHERE id = %d LIMIT 1',
        $deliveryNoteId
      )
    );

    if(empty($deliveryNote)) {
      return;
    }
    if(!empty($this->uebertragung_account) && !empty($deliveryType) && $deliveryType !== $deliveryNote['versandart']) {
      if(!empty(
        $this->app->DB->Select(
          "SELECT `update_shipping_method` 
          FROM `uebertragungen_account` 
          WHERE `id` = {$this->uebertragung_account}"
        )
        )
      ) {
        $shippingMethodEscaped = $this->app->DB->real_escape_string($deliveryType);
        $isShippingMethodExists = !empty(
        $this->app->DB->Select(
          "SELECT `id` FROM `versandarten` WHERE `aktiv` = 1 AND `type` = '{$shippingMethodEscaped}' LIMIT 1"
        ));
        if($isShippingMethodExists) {
          $this->app->DB->Update(
            "UPDATE `lieferschein` SET `versandart` = '$shippingMethodEscaped' WHERE `id` = {$deliveryNoteId}"
          );
          $deliveryNote['versandart'] = $deliveryType;
        }
      }
    }

    $orderId = $deliveryNote['auftragid'];

    if($transferobject) {
      if($orderId) {
        $this->app->erp->AuftragProtokoll($orderId, 'R&uuml;ckmeldung durch &Uuml;bertragenmodul');
      }
      $this->app->erp->LieferscheinProtokoll($deliveryNoteId,'R&uuml;ckmeldung durch &Uuml;bertragenmodul');
    }

    $tranferRow = $this->app->DB->SelectRow(
      sprintf(
        'SELECT trackingmail, autoshopexport FROM uebertragungen_account WHERE id = %d LIMIT 1',
        $this->uebertragung_account
      )
    );

    if(!empty($this->app->remote) && (empty($transferobject) || !empty($tracking) || empty($tranferRow['autoshopexport']))) {
      $this->app->erp->VersandAbschluss($versandid);
    }
    $tracking_link = null;
    $sprache = null;
    if(!empty($language)){
      $sprache = $language;
    }
    if(!empty($trackingLink)){
      $tracking_link = $trackingLink;
    }
    if(!empty($sprache)){
      $sprache = strtolower(trim($sprache));
    }
    if($sprache === 'english'){
      $sprache = 'englisch';
    }
    if(empty($sprache)) {
      $sprache = $this->app->DB->Select(
        sprintf('SELECT sprache FROM lieferschein WHERE id = %d LIMIT 1',$deliveryNoteId)
      );
      if(empty($sprache) && $orderId){
        $sprache = $this->app->DB->Select(
          sprintf('SELECT sprache FROM auftrag WHERE id = %d LIMIT 1', $orderId)
        );
      }
    }
    if($tranferRow['trackingmail']) {
      $this->app->erp->Versandmail($versandid, $tracking_link, $sprache, $tracking, true);
    }
    /** @var Versanderzeugen $objVersanderzeugen */
    $objVersanderzeugen = $this->app->erp->LoadModul('versanderzeugen');
    if($objVersanderzeugen && method_exists($objVersanderzeugen,'CheckKommissionierungByLieferschein')) {
      $objVersanderzeugen->CheckKommissionierungByLieferschein($deliveryNoteId);
    }
    //Rechnungsmail
    $invoceId= $this->app->DB->Select(
      sprintf(
        "SELECT id FROM rechnung where auftragid = %d and status <> 'storniert' LIMIT 1",
        $orderId
      )
    );
    if(!$invoceId && $this->app->DB->Select(
      sprintf(
      'SELECT rechnunganlegen FROM uebertragungen_account WHERE id = %d LIMIT 1',
        (int)$this->uebertragung_account
      )
      ))
    {
      $invoceId = $this->app->erp->WeiterfuehrenAuftragZuRechnung($orderId);
      $this->app->erp->BelegFreigabe('rechnung', $invoceId);
      $invoiceDocument = 'rechnung';
      $transferAccountId = (int)$this->uebertragung_account;
      $this->app->erp->RunHook(
        'transfer_document_incoming', 3, $transferAccountId, $invoiceDocument, $invoceId
      );
    }
    if($this->app->DB->Select(
      sprintf(
      "SELECT rechnungmail FROM uebertragungen_account WHERE id = %d LIMIT 1",
        (int)$this->uebertragung_account
      )
    ))
    {
      if($invoceId && (int)$this->app->DB->Select(
        sprintf(
        "SELECT count(id) FROM versand WHERE tracking <> '' AND lieferschein = %d",
            $deliveryNoteId
          )
        ) < 2)
      {
        if($this->app->DB->Select(sprintf("SELECT soll FROM rechnung WHERE id = %d LIMIT 1", $invoceId)) > 0){
          $this->app->erp->Rechnungsmail($invoceId);
        }
      }
    }
    $element1 = $tracking;
    if($transferobject) {
      $transferobject->AddUbertragungMonitorLog(
        $this->uebertragung_account,
        $this->datei_id,
        0,
        'tracking_ok',
        '',
        $element1,
        '',
        '',
        'versand',
        $versandid
      );
    }
    $this->app->DB->Insert(
      sprintf(
        "INSERT INTO uebertragungen_log (uebertragungen_account, typ, parameter1,parameter2, wert) 
        VALUES (%d,'lieferschein',%d,'tracking','%s')",
        (int)$this->uebertragung_account,(int)$deliveryNoteId,$tracking
      )
    );
  }

  function LoadFromXML($dateiname, $isfile = true)
  {
    if(!$isfile || is_file($dateiname))
    {
      if($isfile)
      {
        $content = file_get_contents($dateiname);
      }else{
        $content = $dateiname;
      }
      $xml = @simplexml_load_string($content,null, LIBXML_NOCDATA);// true, true, $action);
      if($xml === false || is_null($xml))
      {
        $xml = json_decode($content);
      }
      return $xml;
    }
    return false;
  }

    /**
     * @param string $string
     *
     * @return string
     */
  public function EntferneSteuerzeichen($string)
  {
    $len = strlen($string);
    $out = '';
    for($i = 0; $i < $len; $i++) {
      $ord = ord($string[$i]);
      if($ord != 127 && ($ord > 31 || $ord == 13 || $ord == 10 || $ord == 9)) {
        $out .= $string[$i];
      }
    }

    return $out;
  }

  public function SaveXML(&$xml, $dateiname, $action = '', $tag = '')
  {
    if(!$dateiname) {
      return false;
    }
    if(!$xml) {
      return false;
    }

    $content = $this->XMLResponse(1,$xml, true, true, $action);
    if(empty($content)) {
      return false;
    }

    if(strpos($dateiname,'/') === false) {
      $dateiname = rtrim($this->app->Config->WFuserdata,'/').'/'.$dateiname;
    }
    $folder = dirname($dateiname);
    if($folder !== '.' && !is_dir($folder) && !mkdir($folder,0700,true) && !is_dir($folder)) {
      $this->app->erp->LogFile($folder.' konnte nicht erstellt werden');
    }
    $content = $this->EntferneSteuerzeichen($content);
    if(!empty($tag)) {
      $content = str_replace($tag,$tag."\n",$content);
    }

    $erg = file_put_contents($dateiname, $content);
    return $erg !== false;
  }

  function CreateXmlObj()
  {
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<response>
</response>
XML;
    return new SimpleXMLExtended($xmlstr);
  }

  public function ApiZeiterfassungEdit($id = null)
  {
    $xml = $this->XMLPost();
    if(!$id)
    {
      $id = (int)$this->app->Secure->GetGET('id');
    }
    if(!empty($xml['id']))
    {
      $id = (int)$xml['id'];
    }
    if(!$id)
    {
      $this->XMLResponse(5);
    }
    if($id && $zeiterfassungen =  $this->app->DB->SelectArr("SELECT * FROM zeiterfassung WHERE id = '$id' LIMIT 1"))
    {
      foreach($xml as $k => $v)
      {
        if($k != 'id' && array_key_exists($k,$zeiterfassungen[0]))
        {
          if(($k != 'von' || $v != '') && ($k != 'bis' || $v != ''))
          {
            $arr[] = " $k = '".$this->app->DB->real_escape_string($v)."' ";
          }else{
            $arr[] = " $k = '0000-00-00' ";
          }
        }
        if($k !== 'id' && $k === 'mitarbeiternummer'){
          $mitarbeiterid = $this->app->DB->Select("SELECT id FROM adresse where mitarbeiternummer = '".$this->app->DB->real_escape_string($v)."' AND mitarbeiternummer <> '' AND geloescht=0 LIMIT 1");
          if($mitarbeiterid){
            $arr[] = " adresse = '$mitarbeiterid' ";
          }
        }
      }
      if(isset($arr))
      {
        $this->app->DB->Update("UPDATE zeiterfassung SET ".implode(', ',$arr)." WHERE id = '$id' LIMIT 1");
      }
      $this->XMLResponse(1);
    }else{
      $this->XMLResponse(8);
    }
    $this->app->ExitXentral();
  }

  public function ApiZeiterfassungDelete()
  {
    $xml = $this->XMLPost();
    $id = (int)$this->app->Secure->GetGET('id');
    if(!empty($xml['id']))
    {
      $id = (int)$xml['id'];
    }
    if($id && $this->app->DB->Select("SELECT id FROM zeiterfassung WHERE id = '$id' LIMIT 1"))
    {
      $this->app->DB->Delete("DELETE FROM zeiterfassung WHERE id = '$id' LIMIT 1");
      $this->XMLResponse(1);
    }else{
      $this->XMLResponse(8);
    }
    $this->app->ExitXentral();
  }

  public function ApiZeiterfassungCreate()
  {
    $xml = $this->XMLPost();
    if((!empty($xml['mitarbeiternummer']) || !empty($xml['adresse'])) && !empty($xml['aufgabe']) && !empty($xml['von']) && !empty($xml['bis']))
    {
      $this->app->DB->Insert("INSERT INTO zeiterfassung (id) values ('')");
      $id = $this->app->DB->GetInsertID();
      if($id)
      {
        $this->ApiZeiterfassungEdit($id);
      }else{
        $this->XMLResponse(5);
      }
    }else{
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  public function ApiZeiterfassungGet()
  {
    $xml = $this->XMLPost();
    $where = "1";
    $offset = 0;
    $limit = 1000000;
    if(!empty($xml['offset']))$offset = (int)$xml['offset'];
    if($offset < 0)$offset = 0;
    if(!empty($xml['limit']))$limit = (int)$xml['limit'];
    if($limit <= 0)$limit = 1;
    if(!empty($xml['adresse']))
    {
      $where .= " AND adresse = '".((int)$xml['adresse'])."' ";
    }elseif(!empty($xml['kundennummer']))
    {
      $projekt = 0;
      if(!empty($xml['projekt']))
      {
        if(is_numeric($xml['projekt']))
        {
          $projekt = (int)$xml['projekt'];
        }else{
          $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($xml['projekt'])."' LIMIT 1");
        }
      }
      $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer <> '' AND geloescht <> 1 AND kundennummer = '".$this->app->DB->real_escape_string($xml['kundennummer'])."' ".(!empty($xml['projekt'])?" AND projekt = '$projekt' ":'')." LIMIT 1 ");
      $where .= " AND adresse = '$adresse' ";
    }
    if(!empty($xml['von']))
    {
      if(strlen($xml['von'] > 11))
      {
        $where .= "AND ((von != '0000-00-00' AND von >= '".$this->app->DB->real_escape_string($xml['von'])."') OR (bis != '0000-00-00' AND bis >= '".$this->app->DB->real_escape_string($xml['von'])."') ) ";
      }else{
        $where .= "AND ((von != '0000-00-00' AND date(von) >= '".$this->app->DB->real_escape_string($xml['von'])."') OR (bis != '0000-00-00' AND date(bis) >= '".$this->app->DB->real_escape_string($xml['von'])."') ) ";
      }
    }
    if(!empty($xml['bis']))
    {
      if(strlen($xml['bis'] > 11))
      {
        $where .= "AND ((von != '0000-00-00' AND von <= '".$this->app->DB->real_escape_string($xml['bis'])."') OR (bis != '0000-00-00' AND bis <= '".$this->app->DB->real_escape_string($xml['bis'])."') ) ";
      }else{
        $where .= "AND ((von != '0000-00-00' AND date(von) <= '".$this->app->DB->real_escape_string($xml['bis'])."') OR (bis != '0000-00-00' AND date(bis) <= '".$this->app->DB->real_escape_string($xml['bis'])."') ) ";
      }
    }
    $xml_obj = $this->CreateXmlObj();
    $zeiterfassungen = $this->app->DB->SelectArr("SELECT * FROM zeiterfassung WHERE $where LIMIT $offset, $limit");
    if($zeiterfassungen)
    {
      $this->AddToXMLObj($xml_obj, 'zeiterfassung', 'zeiterfassungen',$zeiterfassungen);
    }

    $this->XMLResponse(1,$xml_obj, true, false);
    $this->app->ExitXentral();
  }

  function ReplaceUmlauteArray(&$arr, $lvl = 0)
  {
    if($lvl > 10) {
      return;
    }
    if(is_array($arr)) {
      foreach($arr as $elk => $elv) {
        $this->ReplaceUmlauteArray($arr[$elk], $lvl + 1);
      }
    }
    elseif(is_string($arr)) {
      $arr = str_replace(
        array('&uuml;','&ouml;','&auml;','&Uuml;','&Ouml;','&Auml;','&szlig;'),
        array('ü','ö','ä','Ü','Ö','Ä','ß'),
        $arr
      );
    }
  }

  function AddElements(&$xml, $array,$name, $lvl = 0)
  {
    if($lvl > 10) {
      return;
    }
    if(!is_array($array)){
      return;
    }
    $first = true;
    foreach($array as $k => $v) {
      if(is_numeric($k)) {
        if(is_array($v)) {
          if($first) {
            if(isset($xml->$name)) {
              $this->AddElements($xml->$name, $v, $name, $lvl+1);
            }
            else{
              $child = $xml->AddChild($name,'');
              $this->AddElements($child, $v, $name, $lvl+1);
            }
          }
          else{
            $child = $xml->AddChild($name,'');
            $this->AddElements($child, $v, $name, $lvl+1);
          }
        }
        else{
          $xml->AddChild($name, $v);
        }
      }
      else{
        if(is_array($v)) {
          if($k != $name)
          {
            $parent = $xml->AddChild($name, '');
            $name = $k;
            $this->AddElements($parent, $v, $k, $lvl+1);
            //$child = $parent->AddChild($k, '');
          }
          else{
            $child = $xml->AddChild($k, '');
            $this->AddElements($child, $v, $k, $lvl+1);
          }
        }
        else{
          if(isset($xml->$k)) {
            $xml->$k = $v;
          }
          else{
            $child = $xml->AddChild($k, $v);
          }
        }
      }
      $first = false;
    }
  }

  function AddToXMLObj(&$xml_obj, $elementname, $parentelementname, $data, &$toelment = null, &$erg = null)
  {
    $this->ReplaceUmlauteArray($data);

    if($toelment === null) {
      if($xml_obj === null) {
        $xml_obj = $this->CreateXmlObj();
      }
      if(!isset($xml_obj->xml))
      {
        $xml_obj->AddChild('xml','');
      }
      if(is_array($data))
      {
        if($parentelementname)
        {
          if(isset($xml_obj->xml->$parentelementname))
          {
            $parent = $xml_obj->xml->$parentelementname;
          }else{
            $parent = $xml_obj->xml->AddChild($parentelementname,'');
          }
          foreach($data as $k => $c)
          {
            $child = $parent->AddChild($elementname, '');
            if(is_array($c))
            {
              foreach($c as $key => $value)
              {
                if(is_array($value))
                {
                  $this->AddElements($child, $value, is_numeric($key)?$elementname:$key);
                }else{
                  $child->$key = $value;
                }
              }
            }
          }
          $erg = $child;
        }
        else{
          if(isset($data[0])) {
            foreach($data as $k => $c) {
              $child = $xml_obj->xml->AddChild($elementname, '');
              if(is_array($c)) {
                foreach($c as $key => $value) {
                  $child->$key = $value;
                }
              }
            }
            $erg = $child;
          }
          else{
            $child = $xml_obj->xml->AddChild($elementname, '');
            foreach($data as $key => $value) {
              $child->$key = $value;
            }
            $erg = $child;
          }
        }
      }
      else{
        $child = $xml_obj->xml->AddChild($elementname, $data);
        $erg = $child;
      }
    }
    else{
      if(is_array($data))
      {
        if($parentelementname)
        {
          if(isset($toelment->$parentelementname))
          {
            $parent = $toelment->$parentelementname;
          }else{
            $parent = $toelment->AddChild($parentelementname,'');
          }
          foreach($data as $k => $c)
          {
            $child = $parent->AddChild($elementname, '');
            if(is_array($c))
            {
              foreach($c as $key => $value)
              {
                $child->$key = $value;
              }
            }
            $erg = $child;
          }
        }
        else{
          if(isset($data[0]))
          {
            foreach($data as $k => $c)
            {
              $child = $toelment->AddChild($elementname, '');
              if(is_array($c))
              {
                foreach($c as $key => $value)
                {
                  $child->$key = $value;
                }
              }
              $erg = $child;
            }
          }else{
            $toelment->$elementname = $data;
            $erg = $toelment->$elementname;
          }
        }
      }else{
        $child = $toelment->AddChild($elementname, $data);
        $erg = $child;
      }
    }
  }

  function XmlToJSON($xml)
  {
    $simplexml = simplexml_load_string($xml, null, LIBXML_NOCDATA);
    $array = $this->ObjectToArray($simplexml);

    return json_encode($array);
  }

  function ObjectToArray($object)
  {
    $array = (array)$object;
    if (empty($array)) {
      return '';
    }

    foreach ($array as $key => $value) {
      if (is_object($value) || is_array($value)) {
        $array[$key] = $this->ObjectToArray($value);
      }
    }

    return $array;
  }

  function XMLResponse($messagecode,$xml_inside="", $xml_obj = false, $return = false, $action = '')
  {

    if(!$action)
    {
      if(isset($this->app->Secure)) {
        $action = $this->app->Secure->GetGET("action");
      }
    }
    if($xml_obj)
    {
      if(!isset($xml_inside->status))$status = $xml_inside->AddChild('status','');
      if(!isset($xml_inside->status->action))$xml_inside->status->AddChild('action',$action);
      if(!isset($xml_inside->status->message))$xml_inside->status->AddChild('message',utf8_encode($this->MessageCode($messagecode)));
      if(!isset($xml_inside->status->messageCode))$xml_inside->status->AddChild('messageCode',$messagecode);
      if($return)
      {
        if($this->usejson)
        {
          return $this->XmlToJSON($xml_inside->asXML());
        }else
          return $xml_inside->asXML();
      }
      if($this->usejson)
      {
        header('Content-Type: application/json; charset=utf-8');
        echo $this->XmlToJSON($xml_inside->asXML());
      }else {
        header('Content-Type: application/xml; charset=utf-8');
        echo $xml_inside->asXML();
      }
      $this->app->ExitXentral();
    }

    // if further xml is given
    $append = "";
    if($xml_inside!="")
    {
      //$md5sum = md5($xml_inside);

      //$append = '<md5sum>'.$md5sum.'</md5sum>';
      if($this->usejson) {
        $append .='<data>'.$xml_inside.'</data>';
      }else
        $append .='<xml>'.$xml_inside.'</xml>';
    }

    if($this->usejson) {
      header('Content-Type: application/json; charset=utf-8');
      echo $this->XmlToJSON("<?xml version=\"1.0\" encoding=\"UTF-8\"?>
      <response>
      <status>
      <action>$action</action>
      <message>" . utf8_encode($this->MessageCode($messagecode)) . "</message>
      <messageCode>" . $messagecode . "</messageCode>
      </status>
      " . $append . "
      </response>");

    }
    else{
      header('Content-Type: application/xml; charset=utf-8');

      echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
      <response>
      <status>
      <action>$action</action>
      <message>" . utf8_encode($this->MessageCode($messagecode)) . "</message>
      <messageCode>" . $messagecode . "</messageCode>
      </status>
      " . $append . "
      </response>";
    }
    $this->app->ExitXentral();
  }

  /**
   * @param mixed $arr
   * @param bool  $escape
   *
   * @return void
   */
  public function XMLCleanUTF8( &$arr, $escape = false, $isHtmlTransformation = false ): void
  {
    if(empty($arr) || !is_array($arr)) {
      return;
    }

    foreach ($arr as $idx => $value) {
      if (is_array($value)) {
        $this->XMLCleanUTF8($arr[$idx], $escape, $isHtmlTransformation);
        continue;
      }
      if (!is_string($value)) {
        continue;
      }
      if($escape) {
        $arr[$idx] = $this->app->DB->real_escape_string($value);
        continue;
      }

      $arr[$idx] = $this->app->erp->ConvertForDBUTF8($value, true, $isHtmlTransformation);
    }
  }


  function XMLClean( &$arr, $isHtmlTransformation = false ) {
    if($arr && is_array($arr)) {
      foreach ($arr as $idx => $value) {
        if (is_array($value)) $this->XMLClean($arr[$idx], $isHtmlTransformation);
        else {
          if (is_string($value)) {
            if (mb_detect_encoding($value, 'UTF-8, ISO-8859-1') === 'UTF-8')
              $arr[$idx] = $this->app->erp->ConvertForDB($value, true, $isHtmlTransformation);
            else
              $arr[$idx] = $this->app->erp->ConvertForDBUTF8($value, true, $isHtmlTransformation);
          }
        }
      }
    }
  }

  function XMLPostPlain()
  {
    $xml = $this->app->Secure->POST["xml"];

    if($this->app->Secure->GetGET('cdata'))
    {
      $this->usecdata = true;
    }
    if($this->app->Secure->GetGET('json'))
    {
      $this->usejson = true;
    }
    /*
    //$xml = $this->app->Secure->GetPOST("xml");
    $xml = mysqli_real_escape_string($this->app->DB->connection,$this->app->Secure->POST["xml"]);
    $xml = str_replace('<?xml version=\"1.0\" encoding=\"UTF-8\"?>','<?xml version="1.0" encoding="UTF-8"?>',$xml);
    $xml = str_replace('>\n','>',$xml);
    $xml = str_replace('\"','"',$xml);
    $xml = str_replace('&#13;','',$xml);
    //$xml = str_replace('&','&amp;',$xml);
     */

    $deXml = simplexml_load_string($xml, null
      , LIBXML_NOCDATA);
    if($deXml === false && $xml)
    {
      $deXml = json_decode($xml, true);
      if($deXml)$this->usejson = true;
    }
    if(isset($deXml->xml) && isset($deXml->xml->cdata) && $deXml->xml->cdata)
    {
      $this->usecdata = true;
    }
    elseif(isset($deXml->cdata) && $deXml->cdata)$this->usecdata = true;
    if($this->usejson)$this->usecdata = true;
    return $deXml;
  }

  function XMLPost()
  {
    if(isset($this->app->Secure->POST['xml'])) {
      $xml = $this->app->Secure->POST['xml'];
    }
    elseif(isset($this->app->Secure->POST['json']))
    {
      $xml = $this->app->Secure->POST['json'];
    }
    else {
      $xml = '';
    }

    /*
    //$xml = $this->app->Secure->GetPOST("xml");
    $xml = mysqli_real_escape_string($this->app->DB->connection,$this->app->Secure->POST["xml"]);
    $xml = str_replace('<?xml version=\"1.0\" encoding=\"UTF-8\"?>','<?xml version="1.0" encoding="UTF-8"?>',$xml);
    $xml = str_replace('>\n','>',$xml);
    $xml = str_replace('\"','"',$xml);
    $xml = str_replace('&#13;','',$xml);
    //$xml = str_replace('&','&amp;',$xml);
     */

    $deXml = simplexml_load_string($xml, null
      , LIBXML_NOCDATA);
    if($deXml === false && $xml)
    {
      $deXml = json_decode($xml, true);
      if($deXml)$this->usejson = true;
    }
    if($this->app->Secure->GetGET('json'))
    {
      $this->usejson = true;
    }
    $deJson = json_encode($deXml);
    $xml_array = json_decode($deJson,TRUE);
    if(isset($xml_array['cdata']) && $xml_array['cdata'])
    {
      $this->usecdata = true;
    }elseif(isset($xml_array['xml']) && isset($xml_array['xml']['cdata']) && $xml_array['xml']['cdata'])
    {
      $this->usecdata = true;
    }
    if($this->app->Secure->GetGET('cdata'))
    {
      $this->usecdata = true;
    }
    if($this->usejson)$this->usecdata = true;

    try {
      $api_cleanutf8 = $this->getApiAccount()->isCleanUtf8Active();
      $isHtmlTransformation = $this->getApiAccount()->isHtmlTransformationActive();
    } catch (ApiAccountNotFoundException $e){
      $api_cleanutf8 = false;
      $isHtmlTransformation = false;
    }


    if(isset($xml_array['xml'])) {
      $tmp = $xml_array['xml'];
    }elseif($this->usejson) {
      $tmp = $xml_array;
    }

    $action = $this->app->Secure->GetGET('action');

    if(in_array($action,
      [
        'AuftragEdit',
        'AuftragCreate',
        'BestellungEdit',
        'BestellungCreate',
        'AngebotCreate',
        'AngebotEdit',
        'LieferscheinCreate',
        'LieferscheinEdit',
        'RetoureCreate',
        'RetoureEdit',
        'RechnungCreate',
        'RechnungEdit',
        'GutschriftCreate',
        'GutschriftEdit'
      ]
    ))
    {
      if($api_cleanutf8 == true){
        $this->XMLCleanUTF8($tmp, false, $isHtmlTransformation);
      }
      else{
        $this->XMLClean($tmp, $isHtmlTransformation);
      }
    }
    else if(in_array($action, ['AdresseEdit','AdresseCreate','AdresseGet']))
    {
      if($api_cleanutf8 == true){
        $this->XMLCleanUTF8($tmp, true,$isHtmlTransformation);
      }
      else{
        $this->XMLClean($tmp, $isHtmlTransformation);
      }
    }
    else if(in_array($action, ['ArtikelEdit', 'ArtikelCreate','ArtikelGet']))
    {
      if($api_cleanutf8 == true){
        $this->XMLCleanUTF8($tmp, false, $isHtmlTransformation);
      }
      else{
        $this->XMLClean($tmp, $isHtmlTransformation);
      }
    }
    else if(in_array($action, ['GruppeEdit','GruppeCreate']))
    {
      if($api_cleanutf8 == true){
        $this->XMLCleanUTF8($tmp, false, $isHtmlTransformation);
      }
      else{
        $this->XMLClean($tmp, $isHtmlTransformation);
      }
    }
    else{
      if($action==='ArtikelList') {
        return $tmp;
      }
      $this->XMLClean($tmp);
    }
    return $tmp;
  }

  function MessageCode($messagecode)
  {
    switch($messagecode)
    {
      case 1: $message = "OK"; break;
      case 2: $message = "Wrong Hash"; break;
      case 3: $message = "Wrong number of GET parameters"; break;
      case 4: $message = "Wrong XML data structure for method"; break;
      case 5: $message = "Invalid key (id)"; break;
      case 6: $message = "Wrong md5sum"; break;
      case 7: $message = "Username exists already"; break;
      case 8: $message = "Data not found"; break;
      case 9: $message = "Wrong or no api_id provided. (https://community.xentral.com/hc/de/articles/360017436919-API-Dokumentation#toc-0)"; break;
      default: $message = "Unknown message code";
    }
    return $message;
  }

  function ApiAdresseCreate($internal=false)
  {
    $xmldata = $this->XMLPost();
    // anlegen der adresse
    if($xmldata['name']!="" && !is_array($xmldata['name']))
    {
      //adresse anlegen
      $xmldata['strasse'] = $xmldata['strasse']." ".$xmldata['hausnummer'];
      if($xmldata['strasse_hausnummer']!="" && !is_array($xmldata['strasse_hausnummer'])) $xmldata['strasse'] = $xmldata['strasse_hausnummer'];

      $xmldata['email'] = str_replace(" ","",$xmldata['email']);

      switch($xmldata['typ'])
      {
        case "mr": $xmldata['typ']="herr"; break;
        case "mr.": $xmldata['typ']="herr"; break;
        case "ms": $xmldata['typ']="frau"; break;
        case "mrs": $xmldata['typ']="frau"; break;
        case "mrs.": $xmldata['typ']="frau"; break;
      }

      if($xmldata['firma']!="" && !is_array($xmldata['firma']))
      {
        if($xmldata['vorname']!="" && !is_array($xmldata['vorname']))
          $xmldata['ansprechpartner']=$xmldata['vorname']." ".$xmldata['name'];
        else
          $xmldata['ansprechpartner']=$xmldata['name'];
        $xmldata['name']=$xmldata['firma'];
        $xmldata['typ']='firma';
      } else
      {
       if($xmldata['vorname']!="" && !is_array($xmldata['vorname']))
         $xmldata['name']=$xmldata['vorname']." ".$xmldata['name'];
      }

    }

    $id = $this->app->erp->CreateAdresse($xmldata['name']);

    //kundennummer=1 bedeutet gleiche Rolle Kunde anlegen
    if($xmldata['projekt']!="" && !is_array($xmldata['projekt'])){
      $xmldata['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='" . $xmldata['projekt'] . "' LIMIT 1");
    }
    else{
      $xmldata['projekt'] = $this->app->erp->GetStandardProjekt();
    }

    $tmp_data_adresse = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id='$id' LIMIT 1");

    if(strtoupper($xmldata['kundennummer'])==='NEW' || strtoupper($xmldata['kundennummer'])==='NEU')
    {
      $xmldata['kundennummer'] = $this->app->erp->GetNextKundennummer($xmldata['projekt'],$tmp_data_adresse);
      $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_kundennummer","Kundennummer ".$xmldata['kundennummer']." erhalten");
    }

    if(strtoupper($xmldata['lieferantennummer'])==='NEW' || strtoupper($xmldata['lieferantennummer'])==='NEU')
    {
      $xmldata['lieferantennummer'] = $this->app->erp->GetNextLieferantennummer($xmldata['projekt'],$tmp_data_adresse);
      $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_lieferantennummer","Lieferantennummer ".$xmldata['lieferantennummer']." erhalten");
    }

    if($xmldata['porto_preis']!="" && $xmldata['porto_artikelid']!="" && !is_array($xmldata['porto_preis']))
      $this->app->erp->AddVerkaufspreis($xmldata['porto_artikelid'],1,$id,$xmldata['porto_preis']);


    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)) {
        $value='';
      }
      if($key==='sonstiges')  {
        $value = strip_tags(html_entity_decode($value));
      }
      if($key==='rabattinformation') {
        $value = html_entity_decode($value);
      }
      if($key === 'geburtsdatum' && strpos($value,'.') !== false) {
        $value = $this->app->String->Convert($value,'%1.%2.%3','%3-%2-%1');
      }
      if($key!=='id'){
        $this->app->DB->Update("UPDATE adresse SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }

    // Wenn Kundennummer vorhanden sofort Lieferant anlegen
    if($xmldata['kundennummer']!="" && !is_array($xmldata['kundennummer']))
      $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Projekt", $xmldata['projekt'] );

    if($xmldata['lieferantennummer']!="" && !is_array($xmldata['lieferantennummer']))
      $this->app->erp->AddRolleZuAdresse($id, "Lieferant", "von", "Projekt", $xmldata['projekt'] );

    if($xmldata['verband']!="" && !is_array($xmldata['verband']))
      $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Gruppe", $xmldata['verband']);

    if($xmldata['liefername']!="" && !is_array($xmldata['liefername']))
    {
      $xmldata['liefername'] = $xmldata['liefervorname']." ".$xmldata['liefername'];
      $xmldata['lieferstrasse'] = $xmldata['lieferstrasse']." ".$xmldata['lieferhausnummer'];

      if($xmldata['lieferfirma']!="" && !is_array($xmldata['lieferfirma']))
      {
        $xmldata['lieferadresszusatz']=$xmldata['liefervorname']." ".$xmldata['liefername'];
        $xmldata['liefername']=$xmldata['lieferfirma'];                $xmldata['liefertyp']='firma';
      }

      $xmldata['liefername'] = trim($xmldata['liefername']);
      $xmldata['lieferstrasse'] = trim($xmldata['lieferstrasse']);
      $xmldata['lieferadresszusatz'] = trim($xmldata['lieferadresszusatz']);

      if(is_array($xmldata['lieferabteilung'])) $xmldata['lieferabteilung'] = "";
      if(is_array($xmldata['lieferunterabteilung'])) $xmldata['lieferunterabteilung'] = "";
      if(is_array($xmldata['lieferland'])) $xmldata['lieferland'] = "";
      if(is_array($xmldata['lieferstrasse'])) $xmldata['lieferstrasse'] = "";
      if(is_array($xmldata['lieferort'])) $xmldata['lieferort'] = "";
      if(is_array($xmldata['lieferplz'])) $xmldata['lieferplz'] = "";
      if(is_array($xmldata['liefertelefon'])) $xmldata['liefertelefon'] = "";
      if(is_array($xmldata['liefertelefax'])) $xmldata['liefertelefax'] = "";
      if(is_array($xmldata['lieferemail'])) $xmldata['lieferemail'] = "";
      if(is_array($xmldata['lieferansprechpartner'])) $xmldata['lieferansprechpartner'] = "";
      if(is_array($xmldata['liefertyp'])) $xmldata['liefertyp'] = "";
      if(is_array($xmldata['lieferadresszusatz'])) $xmldata['lieferadresszusatz'] = "";

      $this->app->DB->Insert("INSERT INTO lieferadressen                   
                  (id,name,abteilung,unterabteilung,land,strasse,ort,plz,telefon,telefax,email,ansprechpartner,adresse,typ,adresszusatz,standardlieferadresse)
                  VALUES ('','{$xmldata['liefername']}','{$xmldata['lieferabteilung']}','{$xmldata['lieferunterabteilung']}',                    
                  '{$xmldata['lieferland']}','{$xmldata['lieferstrasse']}','{$xmldata['lieferort']}',
                    '{$xmldata['lieferplz']}','{$xmldata['liefertelefon']}','{$xmldata['liefertelefax']}','{$xmldata['lieferemail']}',
                    '{$xmldata['lieferansprechpartner']}','$id','{$xmldata['liefertyp']}','{$xmldata['lieferadresszusatz']}',1)");
    }

    if(!empty($xmldata['dateien']) && is_array($xmldata['dateien']))
    {
      $this->AddFiles($xmldata['dateien'], 'adresse', $id);
    }

    if($xmldata['lieferantennummer']=="")
    {
      if($internal) return $xmldata['kundennummer'];
      $this->XMLResponse(1,"<id>$id</id><kundennummer>".$xmldata['kundennummer']."</kundennummer>");
    } else {
      if($internal) return $xmldata['lieferantennummer'];
      $this->XMLResponse(1,"<id>$id</id><lieferantennummer>".$xmldata['lieferantennummer']."</lieferantennummer>");
    }
    $this->app->ExitXentral();
  }

  function ApiAdresseEdit($intern = false)
  {
    $xmldata = $this->XMLPost();
    if(isset($xmldata['adresse']))
    {
      if(is_array($xmldata['adresse']) && isset($xmldata['adresse'][0]))
      {
      }else{
        $xmldata['adresse'][0] = $xmldata['adresse'];
      }
      foreach($xmldata['adresse'] as $_key => $_xmldata)
      {

        $id = 0;
        $kundennummer = '';
        $projekt = 0;
        if(isset($_xmldata['id']))$id = (int)$_xmldata['id'];
        if(isset($_xmldata['kundennummer']))$kundennummer = $this->app->DB->real_escape_string($_xmldata['kundennummer']);
        if(isset($_xmldata['projekt']))$projekt = (int)$_xmldata['projekt'];

        if($kundennummer!="")
        {
          if($projekt !="")
          {
            $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
            $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' AND projekt='$projekt' LIMIT 1");
          } else {
            $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' LIMIT 1");
          }
        }
        if($id)
        {
          if($_xmldata['porto_preis']!="" && $_xmldata['porto_artikelid']!="" && !is_array($_xmldata['porto_preis']))
            $this->app->erp->AddVerkaufspreis($_xmldata['porto_artikelid'],1,$id,$_xmldata['porto_preis']);

          if($_xmldata['projekt']!="" && !is_array($_xmldata['projekt']) && !is_numeric($_xmldata['projekt']))
            $_xmldata['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$_xmldata['projekt']."' LIMIT 1");

          $tmp_data_adresse = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id='$id' LIMIT 1");

          if(strtoupper($_xmldata['kundennummer'])==='NEW' || strtoupper($_xmldata['kundennummer'])==='NEU')
          {

            $_xmldata['kundennummer'] = $this->app->erp->GetNextKundennummer($_xmldata['projekt'],$tmp_data_adresse);
            $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_kundennummer","Kundennummer ".$_xmldata['kundennummer']." erhalten");
          }

          if(strtoupper($_xmldata['lieferantennummer'])==='NEW' || strtoupper($_xmldata['lieferantennummer'])==='NEU')
          {
            $_xmldata['lieferantennummer'] = $this->app->erp->GetNextLieferantennummer($_xmldata['projekt'],$tmp_data_adresse);
            $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_lieferantennummer","Lieferantennummer ".$_xmldata['lieferantennummer']." erhalten");
          }

          if($_xmldata['kundennummer']!="" && !is_array($_xmldata['kundennummer']))
            $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Projekt", $_xmldata['projekt'] );

          if($_xmldata['lieferantennummer']!="" && !is_array($_xmldata['lieferantennummer']))
            $this->app->erp->AddRolleZuAdresse($id, "Lieferant", "von", "Projekt", $_xmldata['projekt'] );

          if($_xmldata['verband']!="" && !is_array($_xmldata['verband']))
          {
            if($this->app->erp->GetVerband($id)!=$_xmldata['verband'])
            {
              // alle verbaende loeschen
              $this->app->DB->Update("UPDATE adresse_rolle ad LEFT JOIN gruppen g 
                  ON g.id=ad.parameter SET ad.bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE ad.objekt='Gruppe' AND g.art='verband'
                  AND ad.adresse='$id'");
            }
            $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Gruppe", $_xmldata['verband']);
          }
          else
          {
            // alle verbaende loeschen
            $this->app->DB->Update("UPDATE adresse_rolle ad LEFT JOIN gruppen g 
                ON g.id=ad.parameter SET ad.bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE ad.objekt='Gruppe' AND g.art='verband'
                AND ad.adresse='$id'");
          }
          foreach($_xmldata as $key=>$value) {
            if(is_array($value)) {
              $value='';
            }
            if($key==='sonstiges') {
              $value = strip_tags(html_entity_decode($value));
            }
            if($key==='rabattinformation') {
              $value = html_entity_decode($value);
            }
            if($key === 'geburtsdatum' && strpos($value,'.') !== false) {
              $value = $this->app->String->Convert($value,'%1.%2.%3','%3-%2-%1');
            }
            if($key!=='id'){
              $this->app->DB->Update("UPDATE adresse SET $key='$value' WHERE id='$id' LIMIT 1");
            }
          }
        }
      }
      if(!empty($xmldata['dateien']) && is_array($xmldata['dateien']))
      {
        $this->AddFiles($xmldata['dateien'], 'adresse', $id);
      }
      if($intern){
        return $id;
      }
      $this->XMLResponse(1);
      $this->app->ExitXentral();
    }
    $id = $this->app->Secure->GetGET("id");
    $kundennummer = $this->app->Secure->GetGET("kundennummer");

    if(strtoupper($xmldata['kundennummer'])==="NEW" || strtoupper($xmldata['kundennummer'])==="NEU")
    {

      $xmldata['kundennummer'] = $this->app->erp->GetNextKundennummer($xmldata['projekt'],$id);
      $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_kundennummer","Kundennummer ".$xmldata['kundennummer']." erhalten");
    }

    if(strtoupper($xmldata['lieferantennummer'])==="NEW" || strtoupper($xmldata['lieferantennummer'])==="NEU")
    {
      $xmldata['lieferantennummer'] = $this->app->erp->GetNextLieferantennummer($xmldata['projekt'],$id);
      $this->app->erp->ObjektProtokoll("adresse",$id,"adresse_next_lieferantennummer","Lieferantennummer ".$xmldata['lieferantennummer']." erhalten");
    }

    $projekt = $this->app->Secure->GetGET("projekt");

    if($kundennummer!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' AND projekt='$projekt' LIMIT 1");
      } else {
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' LIMIT 1");
      }
    }

    // Key gibt es nicht
    if($id <= 0)
    {

      if($intern)return false;
      $this->XMLResponse(5);
    }



    if($xmldata['porto_preis']!="" && $xmldata['porto_artikelid']!="" && !is_array($xmldata['porto_preis']))
      $this->app->erp->AddVerkaufspreis($xmldata['porto_artikelid'],1,$id,$xmldata['porto_preis']);

    if($xmldata['projekt']!="" && !is_array($xmldata['projekt']))
      $xmldata['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['projekt']."' LIMIT 1");

    if($xmldata['kundennummer']!="" && !is_array($xmldata['kundennummer']))
      $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Projekt", $xmldata['projekt'] );

    if($xmldata['lieferantennummer']!="" && !is_array($xmldata['lieferantennummer']))
      $this->app->erp->AddRolleZuAdresse($id, "Lieferant", "von", "Projekt", $xmldata['projekt'] );

    if($xmldata['verband']!="" && !is_array($xmldata['verband']))
    {
      if($this->app->erp->GetVerband($id)!=$xmldata['verband'])
      {
        // alle verbaende loeschen
        $this->app->DB->Update("UPDATE adresse_rolle ad LEFT JOIN gruppen g 
            ON g.id=ad.parameter SET ad.bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE ad.objekt='Gruppe' AND g.art='verband'
            AND ad.adresse='$id'");
      }
      $this->app->erp->AddRolleZuAdresse($id, "Kunde", "von", "Gruppe", $xmldata['verband']);
    }
    else
    {
      // alle verbaende loeschen
      $this->app->DB->Update("UPDATE adresse_rolle ad LEFT JOIN gruppen g 
          ON g.id=ad.parameter SET ad.bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE ad.objekt='Gruppe' AND g.art='verband'
          AND ad.adresse='$id'");
    }

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)){
        $value='';
      }
      if($key==='sonstiges') {
        $value = strip_tags(html_entity_decode($value));
      }
      if($key==='rabattinformation') {
        $value = html_entity_decode($value);
      }
      if($key!=='id'){
        $this->app->DB->Update("UPDATE adresse SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }
    if(!empty($xmldata['dateien']) && is_array($xmldata['dateien']))
    {
      $this->AddFiles($xmldata['dateien'], 'adresse', $id);
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAdresseGet($intern = false,$id="")
  {
    if($id=="")
      $id = $this->app->Secure->GetGET("id");
    $kundennummer = $this->app->Secure->GetGET("kundennummer");
    $projekt = $this->app->Secure->GetGET("projekt");


    $xmldata = $this->XMLPost();

    if($id=="" && isset($xmldata['id']))$id = $xmldata['id'];
    if($kundennummer=="" && isset($xmldata['kundennummer']))$kundennummer = $xmldata['kundennummer'];
    if($projekt=="" && isset($xmldata['projekt']))$projekt = $xmldata['projekt'];

    if($kundennummer!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' AND projekt='$projekt' LIMIT 1");
      } else {
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' LIMIT 1");
      }
    }

    //check
    $id = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$id' LIMIT 1");

    if($id > 0)
    {
      if($intern) {
        return $this->app->erp->XMLAdresse($id);
      }
      $this->XMLResponse(1,$this->app->erp->XMLAdresse($id));
      $this->app->ExitXentral();
    }
    if($intern) {
      return false;
    }
    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }

  function ApiAngebotCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'angebot');
  }

  public function ApiAuftragCreate($intern = false, $doctype = 'auftrag') {
    return $this->ApiBelegCreate($intern, $doctype);
  }

  public function ApiBelegCreate($intern = false, $doctype = 'auftrag')
  {
    if(!in_array($doctype, array('angebot', 'gutschrift', 'lieferschein', 'rechnung','bestellung','retoure'))){
      $doctype = 'auftrag';
    }
    $xmldata = $this->XMLPost();
    // wenn gleich eine neue Adresse mitangelegt werden soll
    if($doctype === 'bestellung'){
      if(strtoupper($xmldata['lieferantennummer']) === 'NEW' || strtoupper($xmldata['lieferantennummer']) === 'NEU'){
        $xmldata['lieferantennummer'] = $this->ApiAdresseCreate(true);
      }
      $adresse = 0;
      if(!empty($xmldata['lieferantennummer'])){
        $adresse = $this->app->DB->Select(
          sprintf(
            "SELECT id FROM adresse WHERE lieferantennummer='%s' AND lieferantennummer <> '' AND IFNULL(geloescht,0) = 0  LIMIT 1",
            $xmldata['lieferantennummer']
          )
        );
      }
      if(!$adresse && !empty($xmldata['kundennummerlieferant'])) {
        $adresse = $this->app->DB->Select(
          sprintf(
            "SELECT id FROM adresse 
          WHERE kundennummer='%s' AND lieferantennummer <> '' AND IFNULL(geloescht,0) = 0  LIMIT 1",
            $xmldata['kundennummerlieferant']
          )
        );
      }

    }else{
      if(strtoupper($xmldata['kundennummer']) === 'NEW' || strtoupper($xmldata['kundennummer']) === 'NEU' || $xmldata['kundennummer'] == '' || !isset($xmldata['kundennummer'])){
        $xmldata['kundennummer'] = $this->ApiAdresseCreate(true);
      }
      $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$xmldata['kundennummer']."' AND kundennummer <> '' LIMIT 1");
    }

    // anlegen der adresse


    if($adresse <= 0)
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5,'address not found');
      $this->app->ExitXentral();
    }

    switch ($doctype) {
      case 'angebot':
        $id = $this->app->erp->CreateAngebot($adresse);
        $this->app->erp->LoadAngebotStandardwerte($id,$adresse);
        break;

      case 'gutschrift':
        $id = $this->app->erp->CreateGutschrift($adresse);
        $this->app->erp->LoadGutschriftStandardwerte($id,$adresse);
        break;

      case 'lieferschein':
        $id = $this->app->erp->CreateLieferschein($adresse);
        $this->app->erp->LoadLieferscheinStandardwerte($id,$adresse);
        break;

      case 'retoure':
        $id = $this->app->erp->CreateRetoure($adresse);
        $this->app->erp->LoadRetoureStandardwerte($id,$adresse);
        break;

      case 'rechnung':
        $id = $this->app->erp->CreateRechnung($adresse);
        $this->app->erp->LoadRechnungStandardwerte($id,$adresse);
        break;

      case 'bestellung':
        $this->app->erp->LogFile($adresse);
        $id = $this->app->erp->CreateBestellung($adresse);
        $this->app->erp->LoadBestellungStandardwerte($id,$adresse);
        break;
      default:
        $id = $this->app->erp->CreateAuftrag($adresse);
        $this->app->erp->LoadAuftragStandardwerte($id,$adresse);
        break;
    }

    $xmldata['belegnr'] = (string)$this->app->DB->Select("SELECT belegnr FROM $doctype WHERE id = '$id' LIMIT 1");
    if($xmldata['belegnr'] === '' || $xmldata['belegnr'] === '0'){$xmldata['belegnr'] = $this->app->erp->GetNextNummer($doctype,$xmldata['projekt'],$id);}
    if($doctype === 'bestellung')
    {
      $xmldata['lieferantkdrnummer'] = $xmldata['lieferantennummer'];
    }else{
      $xmldata['lieferantkdrnummer'] = $xmldata['kundennummer'];
    }
    if($doctype==='auftrag'){
      $this->app->DB->Update("UPDATE $doctype SET lieferantkdrnummer='" . $xmldata['lieferantkdrnummer'] . "' WHERE id='" . $id . "' LIMIT 1");
    }
    if($doctype === 'bestellung')
    {
      if(!empty($xmldata['lieferantennummer'])){
        $this->app->DB->Update("UPDATE $doctype SET lieferantennummer='" . $xmldata['lieferantennummer'] . "' WHERE id='" . $id . "' LIMIT 1");
      }
    }else{
      $this->app->DB->Update("UPDATE $doctype SET kundennummer='" . $xmldata['kundennummer'] . "' WHERE id='" . $id . "' LIMIT 1");
    }

    if($xmldata['shopextid']=='' || $xmldata['shopextid']==0){
      $xmldata['shopextid'] = 1;
    }
    if($xmldata['projekt']==''){
      $xmldata['projekt'] = $this->app->DB->Select(
        sprintf(
          'SELECT pr.abkuerzung 
          FROM `%s` AS b
          INNER JOIN adresse AS adr ON b.adresse = adr.id
          INNER JOIN projekt AS pr ON adr.projekt = pr.id AND pr.geloescht <> 1
          WHERE b.id = %d',
          $doctype, $id
        )
      );
      if($xmldata['projekt']=='' && $doctype === 'auftrag') {
        $xmldata['projekt'] = $this->app->DB->Select(
          sprintf(
            "SELECT pr.abkuerzung 
            FROM `auftrag` AS b
            INNER JOIN adresse AS adr ON b.adresse = adr.id AND b.lieferantenauftrag = 0
            INNER JOIN adresse_rolle AS ar on adr.id = ar.adresse AND ar.subjekt = 'Kunde' AND ar.objekt = 'Projekt'
                AND (IFNULL(ar.bis,'0000-00-00') = '0000-00-00' OR ar.bis >= CURDATE())
            INNER JOIN projekt AS pr ON ar.parameter = pr.id AND pr.geloescht <> 1
            WHERE b.id = %d
            ORDER BY ar.id
            LIMIT 1",
            $id
          )
        );
      }
      if($xmldata['projekt']=='') {
        $xmldata['projekt'] = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='" . $this->app->erp->Firmendaten("projekt") . "' LIMIT 1");
      }
    }

    $this->app->DB->Update("UPDATE $doctype SET belegnr='".$xmldata['belegnr']."' WHERE id='".$id."' LIMIT 1");
    if(!isset($xmldata['status'])){
      $xmldata['status'] = 'freigegeben';
    }
    $this->app->DB->Update("UPDATE $doctype SET status='freigegeben' WHERE id='".$id."' AND (status = 'angelegt' OR status = '') LIMIT 1");
    $this->ApiBelegEdit(true,$id, $doctype, $xmldata);
    if($intern){
      return $id;
    }
    $this->XMLResponse(1,"<id>$id</id><belegnr>".$xmldata['belegnr'].'</belegnr>');

    $this->app->ExitXentral();
  }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
  public function ApiGutschriftFreigabe($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }
    $ret = $this->ApiBelegFreiabe('gutschrift', $id);
    if(!$intern) {
      if(!empty($ret)) {
        if(!empty($ret['error'])) {
          $this->XMLResponse($ret['error']);
        }
        $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
      }
    }

    return $ret;
  }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
  public function ApiRechnungVersenden($intern = false, $id = null)
  {
    return $this->ApiBelegVersenden($intern, $id, 'rechnung');
  }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiAuftragVersenden($intern = false, $id = null)
    {
      return $this->ApiBelegVersenden($intern, $id, 'auftrag');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiAngebotVersenden($intern = false, $id = null)
    {
      return $this->ApiBelegVersenden($intern, $id, 'angebot');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiGutschriftVersenden($intern = false, $id = null)
    {
      return $this->ApiBelegVersenden($intern, $id, 'gutschrift');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiLieferscheinVersenden($intern = false, $id = null)
    {
      return $this->ApiBelegVersenden($intern, $id, 'lieferschein');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiReisekostenVersenden($intern = false, $id = null)
    {
      return $this->ApiBelegVersenden($intern, $id, 'reisekosten');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiAuftragArchivieren($intern = false, $id = null)
    {
      return $this->ApiBelegArchivieren($intern, $id, 'auftrag');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiRechnungArchivieren($intern = false, $id = null)
    {
      return $this->ApiBelegArchivieren($intern, $id, 'rechnung');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiAngebotArchivieren($intern = false, $id = null)
    {
      return $this->ApiBelegArchivieren($intern, $id, 'angebot');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiLieferscheinArchivieren($intern = false, $id = null)
    {
      return $this->ApiBelegArchivieren($intern, $id, 'lieferschein');
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return int
     */
    public function ApiGutschriftArchivieren($intern = false, $id = null)
    {
      return $this->ApiBelegArchivieren($intern, $id, 'gutschrift');
    }

    /**
     * @param bool   $intern
     * @param int    $id
     * @param string $doctype
     *
     * @return int
     */
    public function ApiBelegArchivieren($intern, $id, $doctype)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }

      if($id <= 0){
        if(!$intern){
          $this->XMLResponse(5);
        }
        else {
          return 5;
        }
      }
      $projectId = $this->app->DB->Select(
        sprintf(
          'SELECT projekt FROM `%s` WHERE id = %d LIMIT 1',
          $doctype, $id
        )
      );
      $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable;
      $class = ucfirst($doctype).'PDFCustom';
      if(!class_exists($class)) {
        $class = ucfirst($doctype).'PDF';
      }
      if(!class_exists($class)) {
        if(!$intern){
          $this->XMLResponse(5);
        }
        else {
          return 5;
        }
      }

      $pdf = new $class($this->app, $projectId);
      $method = 'Get'.ucfirst($doctype);
      if(!method_exists($pdf, $method)) {
        if(!$intern){
          $this->XMLResponse(5);
        }
        else {
          return 5;
        }
      }
      $pdf->$method($id);
      $tmpfile = $pdf->displayTMP();
      $pdf->ArchiviereDocument();
      unlink($tmpfile);
      $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable;
      $pdf = new $class($this->app, $projectId);
      $pdf->$method($id);
      $tmpfile = $pdf->displayTMP();
      $pdf->ArchiviereDocument(1);
      $this->app->DB->Update(sprintf('UPDATE `%s` SET schreibschutz=1 WHERE id=%d', $doctype, $id));
      unlink($tmpfile);
      if(!$intern){
        $this->XMLResponse(1, '<id>'.$id.'</id>');
      }

      return 1;
    }

    /**
     * @param string $doctype
     * @param int    $doctypeId
     * @param array  $xmldata
     *
     * @return int
     */
  public function ApiBelegVersenden($intern, $id, $doctype)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }

    if($id <= 0){
      if(!$intern){
        $this->XMLResponse(5);
      }
      else {
        return 5;
      }
    }
    $xmldata = $this->XMLPost();
    $type = !empty($xmldata['versandart'])?$xmldata['versandart']:$xmldata['art'];
    $printer = !empty($xmldata['drucker'])?$xmldata['drucker']:$xmldata['email'];
    if(!in_array($doctype, ['rechnung','angebot','auftrag','gutschrift','lieferschein','reisekosten'])) {
      if(!$intern){
        $this->XMLResponse(5);
      }
      else {
        return 5;
      }
    }

    if($type!=='email' && $type!=='brief'){
      if(!$intern){
        $this->XMLResponse(5);
      }
      else {
        return 5;
      }
    }
    $this->getEmailSettings();
    $this->app->erp->BelegVersand($doctype, $id, $type, $printer);

    if(!$intern){
      $this->XMLResponse(1, '<id>'.$id.'</id>');
    }

    return 1;
  }

    /**
     * @param bool     $intern
     * @param null|int $id
     */
  public function ApiWeiterfuehrenRechnungZuGutschrift($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }

    if($id <= 0){
      if(!$intern){
        $this->XMLResponse(5);
      }
      else {
        return;
      }
    }
    $returnOrderId = $this->app->erp->WeiterfuehrenRechnungZuGutschrift($id);
    if(empty($returnOrderId)) {
      if(!$intern){
        $this->XMLResponse(5);
      }
    }
    if(!$intern){
      $this->XMLResponse(1, '<id>' . $returnOrderId . '</id>');
    }
  }

    /**
     * @param bool     $intern
     * @param null|int $id
     */
  public function ApiWeiterfuehrenAuftragZuRechnung($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }

    if($id <= 0){
      if(!$intern){
        $this->XMLResponse(5);
      }
      else {
        return;
      }
    }
    $invoiceId = $this->app->erp->WeiterfuehrenAuftragZuRechnung($id);
    if(empty($invoiceId)) {
      if(!$intern){
        $this->XMLResponse(5);
      }
    }
    if(!$intern){
      $this->XMLResponse(1, '<id>' . $invoiceId . '</id>');
    }
  }

    /**
     * @param bool     $intern
     * @param null|int $id
     *
     * @return bool
     */
  public function ApiRechnungVersendetMarkieren($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }
    if(empty($id)) {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
    }
    /** @var Rechnung $obj */
    $obj = $this->app->erp->LoadModul('rechnung');
    if(empty($obj)) {
      $ok = false;
    }
    else{
      $ok = $obj->markInvoiceAsClosed();
    }
    if(!$intern) {
      if($ok) {
        $this->XMLResponse(1, '<id>'.$id.'</id>');
      }
      else {
        $this->XMLResponse(5);
      }
    }

    return $ok;
  }

    /**
     * @param bool     $intern
     * @param null|int $id
     *
     * @return array
     */
  public function ApiAuftragAbschliessen($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }
    /** @var Auftrag $obj */
    $obj = $this->app->erp->LoadModul('auftrag');
    $ret = $obj->closeOrder($id);
    if(!$intern){
      if(!empty($ret['error'])){
        $this->XMLResponse(5);
      }
      $this->XMLResponse(1, '<id>'.$id.'</id>');
    }

    return $ret;
  }

    /**
     * @param bool     $intern
     * @param null|int $id
     *
     * @return array
     */
  public function ApiRechnungAlsBezahltMarkieren($intern = false, $id = null)
  {
    if($id==''){
      $id = $this->getIdFromData();
    }
    /** @var Rechnung $obj */
    $obj = $this->app->erp->LoadModul('rechnung');
    $ret = $obj->setManualPayed($id);
    if(!$intern){
      if(!empty($ret['error'])){
        $this->XMLResponse(5);
      }
      $this->XMLResponse(1, '<id>'.$id.'</id>');
    }

    return $ret;
  }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
    public function ApiAngebotFreigabe($intern = false, $id = null)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }
      $ret = $this->ApiBelegFreiabe('angebot', $id);
      if(!$intern) {
        if(!empty($ret)) {
          if(!empty($ret['error'])) {
            $this->XMLResponse($ret['error']);
          }
          $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
        }
      }

      return $ret;
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
    public function ApiBestellungFreigabe($intern = false, $id = null)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }
      $ret = $this->ApiBelegFreiabe('bestellung', $id);
      if(!$intern) {
        if(!empty($ret)) {
          if(!empty($ret['error'])) {
            $this->XMLResponse($ret['error']);
          }
          $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
        }
      }

      return $ret;
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
    public function ApiRechnungFreigabe($intern = false, $id = null)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }
      $ret = $this->ApiBelegFreiabe('rechnung', $id);
      if(!$intern) {
        if(!empty($ret)) {
          if(!empty($ret['error'])) {
            $this->XMLResponse($ret['error']);
          }
          $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
        }
      }

      return $ret;
    }

    /**
     * @return array|mixed|string
     */
    protected function getIdFromData()
    {
      $id = $this->app->Secure->GetGET('id');
      if(empty($id)) {
        $xmldata = $this->XMLPost();
        if(is_array($xmldata) && !empty($xmldata['id'])) {
          $id = $xmldata['id'];
        }
      }

      return $id;
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
    public function ApiAuftragFreigabe($intern = false, $id = null)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }

      $ret = $this->ApiBelegFreiabe('auftrag', $id);
      if(!$intern) {
        if(!empty($ret)) {
          if(!empty($ret['error'])) {
            $this->XMLResponse($ret['error']);
          }
          $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
        }
      }

      return $ret;
    }

    /**
     * @param bool $intern
     * @param null $id
     *
     * @return array|bool
     */
    public function ApiLieferscheinFreigabe($intern = false, $id = null)
    {
      if($id==''){
        $id = $this->getIdFromData();
      }
      $ret = $this->ApiBelegFreiabe('lieferschein', $id);
      if(!$intern) {
        if(!empty($ret)) {
          if(!empty($ret['error'])) {
            $this->XMLResponse($ret['error']);
          }
          $this->XMLResponse(1,"<id>$id</id><belegnr>".$ret['belegnr'].'</belegnr>');
        }
      }

      return $ret;
    }

    /**
     * @param string $typ
     * @param int    $id
     *
     * @return bool|array
     */
  public function ApiBelegFreiabe($typ, $id)
  {
    if($id <= 0) {
      return ['error' => 5];
    }
    if(!in_array($typ, ['auftrag','angebot','rechnung','gutschrift','lieferschein','bestellung'])) {
      return ['error' => 5];
    }

    $row = $this->app->DB->SelectRow(
      sprintf(
        "SELECT id, belegnr, status
        FROM `%s` 
        WHERE id = %d
        LIMIT 1",
        $typ, $id
      )
    );
    if(empty($row)) {
      return ['error' => 8];
    }

    if(in_array($row['status'], ['storniert','abgeschlossen','versendet'])) {
      return ['error' => 8];
    }
    $this->app->erp->BelegFreigabe($typ, $id);

    return ['id' => $id, 'belegnr' => $this->app->DB->Select(sprintf('SELECT belegnr FROM `%s` WHERE id = %d', $typ, $id))];
  }

  function ApiEtikettendrucker($intern=false)
  {
    $xmldata = $this->XMLPost();

    //  id pruefen
    if($xmldata['etikett'] <= 0)
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }

    //$xmldata['kennung']
    $xmldata['etikett']=(isset($xmldata['etikett'])?$xmldata['etikett']:"");
    $xmldata['anzahl']=(isset($xmldata['anzahl']) && $xmldata['anzahl'] > 0?$xmldata['anzahl']:1);
    $xmldata['tabelle']=(isset($xmldata['tabelle'])?$xmldata['tabelle']:"");
    $xmldata['id']=(isset($xmldata['id'])?$xmldata['id']:"");
    $xmldata['drucker']=(isset($xmldata['drucker'])?$xmldata['drucker']:"");

    $tmp = array();
    if(isset($xmldata['parameter']) && is_array($xmldata['parameter']))
    {
      foreach($xmldata['parameter'] as $keyname=>$value)
        $tmp[$keyname] = $value;
    }

    $this->app->erp->EtikettenDrucker($xmldata['etikett'],$xmldata['anzahl'],$xmldata['tabelle'],$xmldata['id'],$tmp,"",$xmldata['drucker']);

    if($intern) {
      return true;
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAuftragZuRechnung($intern=false,$id="")
  {
    if($id=="")
      $id = $this->app->Secure->GetGET("id");
    $xmldata = $this->XMLPost();
    if($id==""){
      $id= $xmldata['id'];
    }
    //  id pruefen
    $id = $this->app->DB->Select("SELECT id FROM auftrag WHERE id='".(int)$id."' LIMIT 1");
    if($id <= 0)
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    if(!class_exists('FormHandler'))
    {
      include_once(__DIR__ ."/../../phpwf/plugins/class.formhandler.php");
      $this->app->FormHandler = new FormHandler($this->app);
    }else{
      if(empty($this->app->FormHandler))$this->app->FormHandler = new FormHandler($this->app);
    }
    $rechnung = $this->app->erp->WeiterfuehrenAuftragZuRechnung($id);
    if($intern) {
      return $rechnung;
    }
    $this->XMLResponse(1,$this->ApiRechnungGet(true, $rechnung));
    $this->app->ExitXentral();
  }

  function ApiAngebotZuAuftrag($intern=false,$id="")
  {
    if($id=="")
      $id = $this->app->Secure->GetGET("id");
    $xmldata = $this->XMLPost();
    if($id==""){
      $id= $xmldata['id'];
    }
    //  id pruefen
    $id = $this->app->DB->Select("SELECT id FROM angebot WHERE id='".(int)$id."' LIMIT 1");
    if($id <= 0)
    {
      if($intern) {
        return false;
      }
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    if(!class_exists('FormHandler'))
    {
      include_once(__DIR__ ."/../../phpwf/plugins/class.formhandler.php");
      $this->app->FormHandler = new FormHandler($this->app);
    }else{
      if(empty($this->app->FormHandler))$this->app->FormHandler = new FormHandler($this->app);
    }
    $auftrag = $this->app->erp->WeiterfuehrenAngebotZuAuftrag($id);
    if($intern) {
      return $auftrag;
    }
    $this->XMLResponse(1,$this->ApiAuftragGet(true, $auftrag));
    $this->app->ExitXentral();
  }

  public function ApiAngebotEdit($intern=false,$id='')
  {
    return $this->ApiBelegEdit($intern, $id, 'angebot');
  }

  public function ApiAuftragEdit($intern=false,$id='', $doctype = 'auftrag', $xmldata = null)
  {
    return $this->ApiBelegEdit($intern,$id, $doctype, $xmldata);
  }

  public function ApiBelegEdit($intern=false,$id='', $doctype = 'auftrag', $xmldata = null)
  {
    if($id==''){
      $id = $this->app->Secure->GetGET('id');
    }


    if(empty($xmldata)){
      $xmldata = $this->XMLPost();
    }

    if(!$intern && $doctype === 'auftrag' && isset($xmldata['belegnr']) && (strtoupper($xmldata['belegnr']) === 'NEW' || strtoupper($xmldata['belegnr']) === 'NEU'))
    {
      $this->ApiAuftragCreate();
    }

    if($id==''){
      $id = $xmldata['id'];
    }

    if(empty($id) && !empty($xmldata['belegnr'])){
      $id = $this->app->DB->Select("SELECT id FROM $doctype WHERE belegnr='".$this->app->DB->real_escape_string($xmldata['belegnr'])."' LIMIT 1");
    }

    //  id pruefen
    $id = $this->app->DB->Select("SELECT id FROM $doctype WHERE id='".(int)$id."' LIMIT 1");

    if($id <= 0)
    {
      if($intern){
        return false;
      }
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    // anlegen der adresse
    $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id='".$id."' LIMIT 1");
    if($adresse <= 0)
    {
      if($intern){
        return false;
      }
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }

    if($xmldata['status']!=='angelegt' && $xmldata['status']!=='freigegeben' &&
      $xmldata['status']!=='abgeschlossen' && $xmldata['status']!=='storniert'){
      $xmldata['status'] = 'angelegt';
    }

    //if($xmldata['status']=="freigegeben")
    //  $xmldata['status']="angelegt";

     //kundennummer=1 bedeutet gleiche Rolle Kunde anlegen
    if($xmldata['projekt']!='' && !is_array($xmldata['projekt'])){
      $xmldata['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='" . $xmldata['projekt'] . "' LIMIT 1");
    }

    if($xmldata['projekt'] <=0){
      $xmldata['projekt'] = $this->app->erp->ImportGetStandardProjekt();
    }

    // schaue ob kundennummer angebene ist und mache Load
    if($doctype !== 'bestellung'){
      if($xmldata['kundennummer'] != '' && strtoupper($xmldata['kundennummer']) !== 'NEW' &&
        strtoupper($xmldata['kundennummer']) !== 'NEU' && !is_array($xmldata['kundennummer'])){
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='" . $xmldata['kundennummer'] . "' LIMIT 1");
        $_funktion = 'Load' . ucfirst($doctype) . 'Standardwerte';
        if(method_exists($this->app->erp, $_funktion)){
          $this->app->erp->$_funktion($id, $adresse);
        }
        //$this->app->erp->LoadAuftragStandardwerte($id,$adresse);
      }else{
        if($xmldata['land'] == ''){
          $xmldata['land'] = 'DE';
        }
      }
    } else{
      if($xmldata['lieferantennummer'] != '' && strtoupper($xmldata['lieferantennummer']) !== 'NEW' &&
        strtoupper($xmldata['lieferantennummer']) !== 'NEU' && !is_array($xmldata['kundennummer'])){
        if(!$adresse){
          $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='" . $xmldata['lieferantennummer'] . "' LIMIT 1");
        }
        $_funktion = 'Load' . ucfirst($doctype) . 'Standardwerte';
        if(method_exists($this->app->erp, $_funktion)){
          $this->app->erp->$_funktion($id, $adresse);
        }
        //$this->app->erp->LoadAuftragStandardwerte($id,$adresse);
      }else{
        if($xmldata['land'] == ''){
          $xmldata['land'] = 'DE';
        }
      }
    }


    $this->app->DB->Delete("DELETE FROM $doctype"."_position WHERE $doctype='$id'");

    if($xmldata['status']==''){
      $xmldata['status'] = 'freigegeben';
    }

    // updat alle felde die angeben wurden sind

    $doctypeArr = $this->app->DB->SelectRow(
      sprintf(
        'SELECT * FROM `%s` WHERE id = %d LIMIT 1',$doctype,$id
      )
    );
    $doctypeKeys = array_keys($doctypeArr);
    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)){
        $value='';
      }
      if($key!=='id'){
        if(!in_array($key,$doctypeKeys)) {
          continue;
        }
        $this->app->DB->Update("UPDATE $doctype SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }

    if(isset($xmldata['artikelliste']['position']['menge']))
    {
      $tmp = $xmldata['artikelliste']['position'];
      unset($xmldata['artikelliste']['position']);
      $xmldata['artikelliste']['position'][0] = $tmp;
    }elseif(!isset($xmldata['artikelliste']['position'][0]))
    {
      $tmp = $xmldata['artikelliste']['position'];
      unset($xmldata['artikelliste']['position']);
      $xmldata['artikelliste']['position'][0] = $tmp;
    }
    // alle positionen der reihe nach

    $cposition = isset($xmldata['artikelliste']['position'])?count($xmldata['artikelliste']['position']):0;
    for($i=0;$i<$cposition;$i++)
    {
      $projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      if(!empty($xmldata['artikelliste']['position'][$i]['nummer'])){
        if($projektid > 0){
          $positionid = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='" . $xmldata['artikelliste']['position'][$i]['nummer'] . "' AND projekt='" . $projektid . "' LIMIT 1");
        }else{
          $positionid = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='" . $xmldata['artikelliste']['position'][$i]['nummer'] . "' LIMIT 1");
        }
      }elseif($doctype === 'bestellung' && !empty($xmldata['artikelliste']['position'][$i]['bestellnummer'])) {
        $positionid = $this->app->DB->Select(sprintf(
          'SELECT artikel FROM einkaufspreise WHERE adresse = %d AND bestellnummer = \'%s\'',
          $adresse,$this->app->DB->real_escape_string($xmldata['artikelliste']['position'][$i]['bestellnummer'])
          )
        );
      }

      $xmldata['artikelliste']['position'][$i]['menge'] = str_replace(',','.',$xmldata['artikelliste']['position'][$i]['menge']);

      if($xmldata['artikelliste']['position'][$i]['waehrung']=='' || is_array($xmldata['artikelliste']['position'][$i]['waehrung'])){
        $xmldata['artikelliste']['position'][$i]['waehrung'] = 'EUR';
      }

      if($doctype === 'bestellung'){
        $bezeichnungcol = 'bezeichnunglieferant';
      }else{
        $bezeichnungcol = 'bezeichnung';
      }

      if($positionid <= 0)
      {
        //TODO den Artikel gibt es in der datenbank nicht!
        if($doctype === 'bestellung' && empty($xmldata['artikelliste']['position'][$i]['bezeichnung']) && !empty($xmldata['artikelliste']['position'][$i]['bezeichnunglieferant']))
        {
          $felder['name_de'] = $xmldata['artikelliste']['position'][$i]['bezeichnunglieferant'];
        }else{
          $felder['name_de'] = $xmldata['artikelliste']['position'][$i]['bezeichnung'];
        }
        $felder['anabregs_text'] = $xmldata['artikelliste']['position'][$i]['beschreibung'];
        if($doctype === 'bestellung' && empty($xmldata['artikelliste']['position'][$i]['nummer']) && !empty($xmldata['artikelliste']['position'][$i]['bestellnummer'])){
          $felder['nummer'] = $xmldata['artikelliste']['position'][$i]['bestellnummer'];
        }else{
          $felder['nummer'] = $xmldata['artikelliste']['position'][$i]['nummer'];
        }
        $felder['lagerartikel'] = 1;
        if($projektid > 0){
          $felder['projekt'] = $projektid;
        }
        else{
          $felder['projekt'] = $this->app->erp->GetStandardProjekt();
        }

        $positionid = $this->app->erp->AddArtikel($felder);
        $tmpartikelid = $positionid;
      } else {
        $xmldata['artikelliste']['position'][$i]['artikel'] = $positionid;
        $tmpartikelid = $positionid;
        // wenn key == nummer alles laden und kopieren wenn felder leer
        if($doctype === 'bestellung' && !empty($xmldata['artikelliste']['position'][$i]['nummer']) && empty($xmldata['artikelliste']['position'][$i]['bestellnummer']))
        {
          $xmldata['artikelliste']['position'][$i]['bestellnummer'] = $xmldata['artikelliste']['position'][$i]['nummer'];
        }
        if($doctype === 'bestellung' && !empty($xmldata['artikelliste']['position'][$i]['bezeichnung']) && empty($xmldata['artikelliste']['position'][$i]['bezeichnunglieferant']))
        {
          $xmldata['artikelliste']['position'][$i]['bezeichnunglieferant'] = $xmldata['artikelliste']['position'][$i]['bezeichnung'];
        }
        if($xmldata['artikelliste']['position'][$i][$bezeichnungcol]==''){
          $xmldata['artikelliste']['position'][$i][$bezeichnungcol] = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='" . $positionid . "' LIMIT 1");
        }

        if($xmldata['artikelliste']['position'][$i][$bezeichnungcol]==''){
          $xmldata['artikelliste']['position'][$i][$bezeichnungcol] = $this->app->DB->Select("SELECT anabregs_text FROM artikel WHERE id='" . $positionid . "' LIMIT 1");
        }

        if($xmldata['artikelliste']['position'][$i]['preis']==''){
          if($doctype === 'bestellung'){
            $originalwaehrung = null;
            $originalpreis = null;
            $xmldata['artikelliste']['position'][$i]['preis'] = $this->app->erp->GetEinkaufspreisWaehrung($positionid, $xmldata['artikelliste']['position'][$i]['menge'], $xmldata['artikelliste']['position'][$i]['waehrung'], $originalwaehrung, $originalpreis, $adresse);
          }else{
            $xmldata['artikelliste']['position'][$i]['preis'] = $this->app->erp->GetVerkaufspreis($positionid, $xmldata['artikelliste']['position'][$i]['menge'],
              $adresse, $xmldata['artikelliste']['position'][$i]['waehrung']);
          }
        }
      }

      $this->app->DB->Insert("INSERT INTO $doctype"."_position (id,$doctype,sort,artikel) VALUES ('','".$id."','".($i+1)."','".$positionid."')");
      $positionid= $this->app->DB->GetInsertID();
      $this->app->erp->RunHook('beleg_afterinsertposition', 5, $doctype,$id,$tmpartikelid,$xmldata['artikelliste']['position'][$i]['menge'],$positionid);

      // anpassen der felder
      $posArr = $this->app->DB->SelectRow(
        sprintf(
          'SELECT * FROM `%s` WHERE id = %d LIMIT 1',
          $doctype.'_position', $positionid
        )
      );
      $posKeys = array_keys($posArr);
      foreach($xmldata['artikelliste']['position'][$i] as $key=>$value)
      {
        if(is_array($value)){
          $value='';
        }
        if($key!=='id'){
          if(!in_array($key, $posKeys)) {
            continue;
          }
          $this->app->DB->Update("UPDATE $doctype" . "_position SET $key='$value' WHERE id='$positionid' LIMIT 1");
        }
      }
      if($doctype === 'bestellung' && !empty($tmpartikelid) && !empty($positionid)) {
        $this->app->DB->Update(
          sprintf(
            'UPDATE bestellung_position AS bp 
            INNER JOIN artikel AS art ON bp.artikel = art.id
            SET bp.bestellnummer = art.nummer 
            WHERE bp.bestellnummer = \'\' AND bp.id = %d 
            ',
            (int)$positionid
          )
        );

        $this->app->DB->Update(
          sprintf(
            'UPDATE bestellung_position AS bp 
            INNER JOIN artikel AS art ON bp.artikel = art.id
            SET bp.bezeichnunglieferant = art.name_de 
            WHERE bp.bezeichnunglieferant = \'\' AND bp.id = %d 
           ',
            (int)$positionid
          )
        );
      }

      $artikelnummerkunde = !empty($xmldata['artikelliste']['position'][$i]['kundenartikelnummer'])?$xmldata['artikelliste']['position'][$i]['kundenartikelnummer']:$this->app->DB->real_escape_string(
        $this->app->DB->Select(
          "SELECT kundenartikelnummer 
          FROM verkaufspreise WHERE adresse='$adresse' AND artikel='$tmpartikelid' AND kundenartikelnummer!='' AND ab_menge <=".
          (float)$xmldata['artikelliste']['position'][$i]['menge']." 
          AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') 
          ORDER by ab_menge DESC 
          LIMIT 1"
        ));

      if($artikelnummerkunde == ''){
        // Anzeige Artikel Nummer von Gruppe aus Verkaufspreis
        $gruppevkresult = $this->app->erp->GetVerkaufspreis($tmpartikelid, $xmldata['artikelliste']['position'][$i]['menge'], $adresse, $xmldata['artikelliste']['position'][$i]['waehrung'], $returnwaehrung, true);
        if($gruppevkresult['kundenartikelnummer'] != ''){
          $artikelnummerkunde = $gruppevkresult['kundenartikelnummer'];
        }
      }

      if(!empty($artikelnummerkunde)) {
        $this->app->DB->Update(
          sprintf(
            "UPDATE `%s` SET artikelnummerkunde = '%s' WHERE id = %d ",
            $doctype.'_position',
            $this->app->DB->real_escape_string($artikelnummerkunde),
            $positionid
          )
        );
      }
    }
    $_funktion = ucfirst($doctype).'Neuberechnen';
    if(method_exists($this->app->erp, $_funktion)){
      $this->app->erp->$_funktion($id);
    }

    $xmldata['belegnr'] = $this->app->DB->Select("SELECT belegnr FROM $doctype WHERE id='".$id."' LIMIT 1");
    if(!empty($xmldata['dateien']) && is_array($xmldata['dateien']))
    {
      $this->AddFiles($xmldata['dateien'], $doctype, $id);
    }
    if($intern) {
      return $id;
    }
    $this->XMLResponse(1,"<id>$id</id><belegnr>".$xmldata['belegnr'].'</belegnr>');
    $this->app->ExitXentral();
  }

    /**
     * Create Files from XML
     * @param array  $files Array of files
     * @param string $doctype
     * @param int    $doctypeid
     */
  protected function AddFiles($files, $doctype, $doctypeid)
  {
    if(empty($doctype) || empty($doctypeid) || empty($files))
    {
      return;
    }
    foreach($files as $file)
    {
      if(empty($file['dateiname']))
      {
        continue;
      }

      $isfile = false;
      $data = null;
      if(is_file($file['dateiname'])){
        $type = mime_content_type(basename($file['dateiname']));
        if($type != 'text/x-php' && $type != 'text/php' && $type != 'application/php' && $type != 'application/x-php' && $type != 'application/x-httpd-php' && $type != 'application/x-httpd-php-source'){
          if(empty($file['dateiinhalt'])){
            $data = file_get_contents($file['dateiname']);
            //$singledatei->dateiinhalt = base64_encode($dateiinhalt);
            $isfile = true;
          }
        }else{
          $file['dateiinhalt'] = '';
        }
      }
      if(empty($data))
      {
        if(empty($file['dateiinhalt']))
        {
          $data = '';
        }else{
          $data = base64_decode($file['dateiinhalt']);
        }
      }
      if(empty($data))
      {
        continue;
      }
      if($isfile){
        $name = $this->app->erp->GetTmp().basename($file['dateiname']);
      }else{
        $name = $this->app->erp->GetTmp().$file['dateiname'];
      }

      file_put_contents($name, $data);

      $pfad = $this->app->Conf->WFuserdata;
      $pfad = rtrim($pfad);
      $pfad .= '/dms/';

      if(!file_exists($pfad) && !mkdir($pfad, 0777, true) && !is_dir($pfad))
      {
        $this->app->erp->LogFile($pfad.' konnte nicht erstellt werden');
      }

      $speicherpfad = $pfad.$this->app->Conf->WFdbname;

      if(!file_exists($speicherpfad) && !mkdir($speicherpfad, 0777, true) &&
        !is_dir($speicherpfad))
      {
        $this->app->erp->LogFile($speicherpfad.' konnte nicht erstellt werden');
      }

      $fileid = $this->app->erp->CreateDatei($file['dateiname'], !empty($file['titel'])?$file['titel']:$file['dateiname'], !empty($file['beschreibung'])?(string)$file['beschreibung']:'', '', $name, '',true,$speicherpfad);
      $subjekt = !empty($file['subjekt'])?(string)$file['subjekt']:'Sonstige';
      if($doctype == 'adresse'){
        $doctype = 'Adressen';
      }
      $this->app->erp->AddDateiStichwort($fileid, $subjekt, $doctype, $doctypeid);
    }
  }

  function ApiAngebotGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'angebot');
  }

  function ApiAuftragGet($intern = false, $id = null, $doctype = 'auftrag')
  {
    return $this->ApiBelegGet($intern, $id, 'auftrag');
  }




  function ApiBelegGet($intern = false, $id = null, $doctype = 'auftrag')
  {
    if(!$id)$id = $this->app->Secure->GetGET("id");
    $belegnr = $this->app->Secure->GetGET("belegnr");
    $projekt= $this->app->Secure->GetGET("projekt");

    $xmldata = $this->XMLPost();
    if(is_array($xmldata) && !empty($xmldata)){
      $id = $xmldata['id'];
      $belegnr = $xmldata['belegnr'];
      $projekt= $xmldata['projekt'];
    }
    if($belegnr!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
        $id = $this->app->DB->Select("SELECT id FROM $doctype WHERE belegnr='$belegnr' AND projekt='$projekt' LIMIT 1");
      } else {
        $id = $this->app->DB->Select("SELECT id FROM $doctype WHERE belegnr='$belegnr' LIMIT 1");
      }
    }

    //check
    $id = $this->app->DB->Select("SELECT id FROM $doctype WHERE id='$id' LIMIT 1");

    if($id > 0)
    {
      if($intern) {
        return $this->app->erp->XMLAuftrag($id, $doctype);
      }
      $this->XMLResponse(1,$this->app->erp->XMLAuftrag($id, $doctype));
      $this->app->ExitXentral();
    }

    if($intern) {
      return false;
    }
    $this->XMLResponse(5, "<error>".ucfirst($doctype)." nicht gefunden</error>");

    $this->app->ExitXentral();
  }

  function ApiGutschriftGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'gutschrift');
  }

  function ApiGutschriftEdit($intern=false,$id="")
  {
    return $this->ApiBelegEdit($intern, $id, 'gutschrift');
  }

  function ApiGutschriftCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'gutschrift');
  }

  function ApiLieferscheinGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'lieferschein');
  }

  function ApiLieferscheinEdit($intern=false,$id="")
  {
    return $this->ApiBelegEdit($intern, $id, 'lieferschein');
  }

  function ApiLieferscheinCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'lieferschein');
  }

  function ApiRetoureGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'retoure');
  }

  function ApiRetoureEdit($intern=false,$id="")
  {
    return $this->ApiBelegEdit($intern, $id, 'retoure');
  }

  function ApiRetoureCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'retoure');
  }

  function ApiRechnungGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'rechnung');
  }

  function ApiRechnungEdit($intern=false,$id="")
  {
    return $this->ApiBelegEdit($intern, $id, 'rechnung');
  }

  function ApiRechnungCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'rechnung');
  }

  function ApiBestellungGet($intern = false, $id = null)
  {
    return $this->ApiBelegGet($intern, $id, 'bestellung');
  }

  function ApiBestellungEdit($intern=false,$id="")
  {
    return $this->ApiBelegEdit($intern, $id, 'bestellung');
  }

  function ApiBestellungCreate($intern = false)
  {
    return $this->ApiBelegCreate($intern, 'bestellung');
  }


  function ApiArtikelCreate($internal = false)
  {
    $xmldata = $this->XMLPost();
    // anlegen der adresse
    $felder = array();
    if($xmldata['name_de']!="" && !is_array($xmldata['name_de'])) {
        $id = $this->app->erp->AddArtikel($felder);
    } else {
      if ($internal) {
        return false;
      }
      $this->XMLResponse(5);
    }

    //kundennummer=1 bedeutet gleiche Rolle Kunde anlegen
    if($xmldata['projekt']!="" && !is_array($xmldata['projekt'])){
      $projektId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['projekt']."' LIMIT 1");
      if(empty($projektId)){
        $projektId = $this->app->DB->Select("SELECT id FROM projekt WHERE id='".(int)$xmldata['projekt']."' LIMIT 1");
      }
      $xmldata['projekt'] = $projektId;
    }else{
      $xmldata['projekt'] = $this->app->erp->GetStandardProjekt();
    }

    if(strtoupper($xmldata['nummer'])=="NEW" || strtoupper($xmldata['nummer'])=="NEU" || $xmldata['nummer']=="")
      $xmldata['nummer'] = $this->app->erp->GetNextArtikelnummer($xmldata['typ'],1,$xmldata['projekt']);

    if($xmldata['lager_platz']!="" && !is_array($xmldata['lager_platz']))
    {
      $lagerid = $this->app->DB->Select("SELECT MIN(id) FROM lager WHERE geloescht!='1'");
      if($lagerid<=0)
      {
        $this->app->DB->Insert("INSERT INTO lager (id,bezeichnung,firma) VALUES ('','Hauptlager',1)");
        $lagerid = $this->app->DB->GetInsertID();
      }
      $xmldata['lager_platz'] = $this->app->erp->CreateLagerplatz($lagerid,$xmldata['lager_platz'],$firma="1");

      if($xmldata['lager_menge'] > 0)
      {
        $menge = $this->app->DB->Select("SELECT SUM(menge) FROM lager_platz_inhalt WHERE artikel='$id' AND lager_platz='".$xmldata['lager_platz']."'");
        if($menge != $xmldata['lager_menge'])
        {
          $this->app->DB->Delete("DELETE FROM lager_platz_inhalt WHERE artikel='$id' AND lager_platz='".$xmldata['lager_platz']."'");
          $this->app->erp->LagerEinlagern($id,$xmldata['lager_menge'],$xmldata['lager_platz'],$xmldata['projekt'],"XML Importtool Anpassung");
        }
      }
      $xmldata['lagerartikel']=1;
    }

    if($xmldata['aktiv']=="1") $xmldata['inaktiv']=0;
    if($xmldata['aktiv']=="0"|| (array_key_exists('aktiv', $xmldata) && $xmldata['aktiv']=="")) $xmldata['inaktiv']=1;

    if($xmldata['inaktiv']=="1") {
        $xmldata['intern_gesperrtgrund']="Artikel inaktiv";
        $xmldata['intern_gesperrt']="1";
    }

    if($xmldata['variante_von_nummer']!="" && !is_array($xmldata['variante_von_nummer'])) {
      // pruefen ob es einen echte id ist
      $xmldata['variante_von'] = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$xmldata['variante_von_nummer']."' AND nummer!='' LIMIT 1");
      if($xmldata['variante_von'] > 0)
        $xmldata['variante']=1;
    }

    if(!empty($xmldata['typ_ext']))$typ_ext = (int)$xmldata['typ_ext'];
    if(isset($typ_ext) && $typ_ext)$typ_ext = $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE id = '$typ_ext' LIMIT 1");
    if(isset($typ_ext) && $typ_ext)
    {
      $xmldata['typ'] = $typ_ext.'_kat';
      unset($xmldata['typ_ext']);
    }elseif(isset($xmldata['typ']) && strpos($xmldata['typ'],'_kat') && !empty($xmldata['artikelkategorie']))
    {
      $kategorie = $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE bezeichnung = '".$this->app->DB->real_escape_string($xmldata['artikelkategorie'])."' LIMIT 1");
      if($kategorie)
      {
        $xmldata['typ'] = $kategorie.'_kat';
        unset($xmldata['artikelkategorie']);
      }
    }

    $this->app->DB->Update("UPDATE artikel SET logdatei=now() WHERE id='$id' LIMIT 1");

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value))$value="";
      if(is_array($value))$value="";
      if($key=="beschreibung_de") $value = html_entity_decode($value);
      if($key=="beschreibung_en") $value = html_entity_decode($value);
      if($key=="uebersicht_de") $value = html_entity_decode($value);
      if($key=="uebersicht_en") $value = html_entity_decode($value);
      if($key=="links_de") $value = html_entity_decode($value);
      if($key=="links_en") $value = html_entity_decode($value);
      if($key=="startseite_de") $value = html_entity_decode($value);
      if($key=="startseite_en") $value = html_entity_decode($value);
      if($key=="katalogtext_de") $value = html_entity_decode($value);
      if($key=="katalogtext_de") $value = html_entity_decode($value);
      if($key=="internerkommentar") $value = strip_tags(html_entity_decode($value));


      if($key!="id")
        $this->app->DB->Update("UPDATE artikel SET $key='$value' WHERE id='$id' LIMIT 1");
    }
    // alle positionen der reihe nach
    if($xmldata['stueckliste_artikel']['artikel']['menge']  > 0)
    {
      $tmp = $xmldata['stueckliste_artikel']['artikel'];
      $xmldata['stueckliste_artikel']['artikel']= null;
      $xmldata['stueckliste_artikel']['artikel'][0] = $tmp;
    }

    $cliste = isset($xmldata['stueckliste_artikel']['artikel'])?count($xmldata['stueckliste_artikel']['artikel']):0;
    for($i=0;$i<$cliste;$i++)
    {
      //$projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      $artikel = $id;
      $menge = $xmldata['stueckliste_artikel']['artikel'][$i]['menge'];
      $xmldata['stueckliste_artikel']['artikel'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['stueckliste_artikel']['artikel'][$i]['projekt']."' LIMIT 1");

      if($xmldata['stueckliste_artikel']['artikel'][$i]['projekt']!="" && !is_array($xmldata['stueckliste_artikel']['artikel'][$i]['projekt']))
        $stuecklisteartikel = $this->app->DB->Select("SELECT id FROM adresse WHERE nummer='".$xmldata['stueckliste_artikel']['artikel'][$i]['nummer']."' AND projekt='".$xmldata['stueckliste_artikel']['artikel'][$i]['projekt']."' LIMIT 1");
      else
        $stuecklisteartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$xmldata['stueckliste_artikel']['artikel'][$i]['nummer']."' LIMIT 1");

      $this->app->DB->Insert("INSERT INTO stueckliste (id,sort,artikel,stuecklistevonartikel,menge) VALUES ('','".($i+1)."','$stuecklisteartikel','$artikel','$menge')");
    }

    // eiinkaufspreise
    if($xmldata['einkaufspreise']['staffelpreis']['ab_menge']  > 0 || $xmldata['einkaufspreise']['staffelpreis']['preis']  > 0)
    {
      $tmp = $xmldata['einkaufspreise']['staffelpreis'];
      $xmldata['einkaufspreise']['staffelpreis']= null;
      $xmldata['einkaufspreise']['staffelpreis'][0] = $tmp;
    }

    $cliste = isset($xmldata['einkaufspreise']['staffelpreis'])?count($xmldata['einkaufspreise']['staffelpreis']):0;
    for($i=0;$i<$cliste;$i++)
    {
      //$projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      $artikel = $id;
      $abmenge = $xmldata['einkaufspreise']['staffelpreis'][$i]['ab_menge'];
      $xmldata['einkaufspreise']['staffelpreis'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");

      if($xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']))
      {
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' 
          AND lieferantennummer!='' AND projekt='".$xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");

      }
      else
      {
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']))
          $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' 
            AND lieferantennummer!='' LIMIT 1");

      }

      if($adresse <=0)
      {
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']))
          $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE name='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']."' AND name!='' LIMIT 1");

      }

      if($adresse <=0)
      {
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']=="")
          $xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']="Lieferant";

        $adresse = $this->app->erp->CreateAdresse($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname'],$firma="1");

        //wenn lieferanennummer vorhanden dann diese verwenden
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']))
          $this->app->DB->Update("UPDATE adresse SET lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' WHERE id='$adresse' LIMIT 1");

        $this->app->erp->AddRolleZuAdresse($adresse, "Lieferant", "von", "Projekt", $xmldata['projekt'] );
      }


      $bestellnummer = $xmldata['einkaufspreise']['staffelpreis'][$i]['bestellnummer'];
      $bezeichnunglieferant = $xmldata['einkaufspreise']['staffelpreis'][$i]['bezeichnunglieferant'];
      if(is_array($bestellnummer))$bestellnummer="";

      if($bezeichnunglieferant=="")
        $bezeichnunglieferant = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1");
      if(is_array($bezeichnunglieferant) || $bezeichnunglieferant=="" )$bezeichnunglieferant=$xmldata['name_de'];

      $preis = str_replace(',','.',$xmldata['einkaufspreise']['staffelpreis'][$i]['preis']);
      $waehrung = $xmldata['einkaufspreise']['staffelpreis'][$i]['waehrung'];
      if(is_array($waehrung) || $waehrung=="")$waehrung="EUR";

      $this->app->erp->AddEinkaufspreis($artikel,$abmenge,$adresse,$bestellnummer,$bezeichnunglieferant,$preis,$waehrung);
    }


    if($xmldata['verkaufspreise']['staffelpreis']['ab_menge']  > 0)
    {
      $tmp = $xmldata['verkaufspreise']['staffelpreis'];
      $xmldata['verkaufspreise']['staffelpreis']= null;
      $xmldata['verkaufspreise']['staffelpreis'][0] = $tmp;
    }
    // alle positionen der reihe nach
    $cstaffelpreise = isset($xmldata['verkaufspreise']['staffelpreis'])?count($xmldata['verkaufspreise']['staffelpreis']):0;
    for($i=0;$i<$cstaffelpreise;$i++)
    {
      $artikel = $id;
      $abmenge = $xmldata['verkaufspreise']['staffelpreis'][$i]['ab_menge'];
      $xmldata['verkaufspreise']['staffelpreis'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");


      if($xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']!="" && !is_array($xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']))
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']."' AND projekt='".$xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");
      else
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']."' LIMIT 1");

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']=="")
        $adresse = 0;
      else {
        // kunde gibt es nicht
        if($adresse <=0)
          continue;
      }

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['gruppe']>0)
        $gruppe = $this->app->DB->Select("SELECT id FROM gruppen WHERE id='".$xmldata['verkaufspreise']['staffelpreis'][$i]['gruppe']."' LIMIT 1");
      else $gruppe = 0;

      $preis = str_replace(',','.',$xmldata['verkaufspreise']['staffelpreis'][$i]['preis']);
      $waehrung = $xmldata['verkaufspreise']['staffelpreis'][$i]['waehrung'];
      if(is_array($waehrung) || is_array($waehrung)) $waehrung = "EUR";


      //$projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      if($gruppe > 0)
        $this->app->erp->AddVerkaufspreisGruppe($artikel,$abmenge,$gruppe,$preis,$waehrung);
      else
        $this->app->erp->AddVerkaufspreis($artikel,$abmenge,$adresse,$preis,$waehrung);
    }

    $xmldata['nummer'] = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$id' LIMIT 1");
    if($internal) {
      return $xmldata['nummer'];
    }

    $this->XMLResponse(1,"<id>$id</id><nummer>".$xmldata['nummer']."</nummer>");
    $this->app->ExitXentral();
  }


  function ApiArtikelEdit($intern = false)
  {
    $id = $this->app->Secure->GetGET("id");
    $nummer = $this->app->Secure->GetGET("nummer");
    $projekt = $this->app->Secure->GetGET("projekt");
    $xmldata = $this->XMLPost();
    if($nummer=="" && !empty($xmldata['nummer']))
      $nummer = $xmldata['nummer'];

    if(!empty($xmldata['id_ext']))$id_ext = (int)$xmldata['id_ext'];
    if(!empty($xmldata['typ_ext']))$typ_ext = (int)$xmldata['typ_ext'];
    if(isset($id_ext) && $id_ext)$id_ext = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht != 1 AND id = '$id_ext' LIMIT 1");
    if(isset($typ_ext) && $typ_ext)$typ_ext = $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE id = '$typ_ext' LIMIT 1");
    if(isset($typ_ext) && $typ_ext)
    {
      $xmldata['typ'] = $typ_ext.'_kat';
      unset($xmldata['typ_ext']);
    }elseif(isset($xmldata['typ']) && strpos($xmldata['typ'],'_kat') && !empty($xmldata['artikelkategorie']))
    {
      $kategorie = $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE bezeichnung = '".$this->app->DB->real_escape_string($xmldata['artikelkategorie'])."' LIMIT 1");
      if($kategorie)
      {
        $xmldata['typ'] = $kategorie.'_kat';
        unset($xmldata['artikelkategorie']);
      }
    }
    if(isset($id_ext) && $id_ext)
    {
      $id = $id_ext;
    }else{
      if($nummer!="")
      {
        if($projekt!="")
        {
          $projektId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
          if(empty($projektId)){
            $projektId = $this->app->DB->Select("SELECT id FROM projekt WHERE id='".(int)$projekt."' LIMIT 1");
          }
          $projekt = $projektId;
          $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' AND projekt='$projekt' LIMIT 1");
        } else {
          $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' LIMIT 1");
        }
      }
    }

    // Key gibt es nicht
    if($id <= 0) {
        if ($intern == true) {
            return false;
        }
        $this->XMLResponse(5);
    }

    //kundennummer=1 bedeutet gleiche Rolle Kunde anlegen
    if($xmldata['projekt']!="" && !is_array($xmldata['projekt']))
      $xmldata['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['projekt']."' LIMIT 1");


    // TODO wenn juststueckliste ist es nie ein lager artikel
    if($xmldata['juststueckliste']=="1")
    {
      $xmldata['lagerartikel']=0;
      $xmldata['lager_platz']="";
      $xmldata['lager_menge'] = 0;
    }


    if($xmldata['lager_platz']!="" && !is_array($xmldata['lager_platz']))
    {
      $lagerid = $this->app->DB->Select("SELECT MIN(id) FROM lager WHERE geloescht!='1'");
      if($lagerid<=0)
      {
        $this->app->DB->Insert("INSERT INTO lager (id,bezeichnung,firma) VALUES ('','Hauptlager',1)");
        $lagerid = $this->app->DB->GetInsertID();
      }

      $xmldata['lager_platz'] = $this->app->erp->CreateLagerplatz($lagerid,$xmldata['lager_platz'],$firma="1");
      if($xmldata['lager_menge'] > 0)
      {
        $menge = $this->app->DB->Select("SELECT SUM(menge) FROM lager_platz_inhalt WHERE artikel='$id' AND lager_platz='".$xmldata['lager_platz']."'");
        if($menge != $xmldata['lager_menge'])
        {
          $this->app->DB->Delete("DELETE FROM lager_platz_inhalt WHERE artikel='$id' AND lager_platz='".$xmldata['lager_platz']."'");
          $this->app->erp->LagerEinlagern($id,$xmldata['lager_menge'],$xmldata['lager_platz'],$xmldata['projekt'],"XML Importtool Anpassung");
        }
      }
      $xmldata['lagerartikel']=1;
    }

    if($xmldata['aktiv']=="1") $xmldata['inaktiv']=0;
    if($xmldata['aktiv']=="0"|| (array_key_exists('aktiv', $xmldata) && $xmldata['aktiv']=="")) $xmldata['inaktiv']=1;

    if($xmldata['inaktiv']=="1") {
        $xmldata['intern_gesperrtgrund']="Artikel inaktiv";
        $xmldata['intern_gesperrt']="1";
    }

    if($xmldata['variante_von_nummer']!="" && !is_array($xmldata['variante_von_nummer'])) {
      // pruefen ob es einen echte id ist
      $xmldata['variante_von'] = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$xmldata['variante_von_nummer']."' AND nummer!='' LIMIT 1");
      if($xmldata['variante_von'] > 0)
        $xmldata['variante']=1;
    }

    $this->app->DB->Update("UPDATE artikel SET logdatei=now() WHERE id='$id' LIMIT 1");

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value))$value="";
      if($key=="beschreibung_de") $value = html_entity_decode($value);
      if($key=="beschreibung_en") $value = html_entity_decode($value);
      if($key=="uebersicht_de") $value = html_entity_decode($value);
      if($key=="uebersicht_en") $value = html_entity_decode($value);
      if($key=="links_de") $value = html_entity_decode($value);
      if($key=="links_en") $value = html_entity_decode($value);
      if($key=="startseite_de") $value = html_entity_decode($value);
      if($key=="startseite_en") $value = html_entity_decode($value);
      if($key=="katalogtext_de") $value = html_entity_decode($value);
      if($key=="katalogtext_de") $value = html_entity_decode($value);
      if($key=="internerkommentar") $value = strip_tags(html_entity_decode($value));

      if($key!="id")
        $this->app->DB->Update("UPDATE artikel SET $key='$value' WHERE id='$id' LIMIT 1");
    }

    if($xmldata['stueckliste_artikel']['artikel']['menge']  > 0)
    {
      $tmp = $xmldata['stueckliste_artikel']['artikel'];
      $xmldata['stueckliste_artikel']['artikel']= NULL;
      $xmldata['stueckliste_artikel']['artikel'][0] = $tmp;
    }

    if(count($xmldata['stueckliste_artikel']['artikel']) > 0)
      $this->app->DB->Delete("DELETE FROM stueckliste WHERE stuecklistevonartikel='".$id."'");

    $cartikel = isset($xmldata['stueckliste_artikel']['artikel'])?count($xmldata['stueckliste_artikel']['artikel']):0;
    for($i=0;$i<$cartikel;$i++)
    {
      //$projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      $artikel = $id;
      $menge = $xmldata['stueckliste_artikel']['artikel'][$i]['menge'];
      $xmldata['stueckliste_artikel']['artikel'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['stueckliste_artikel']['artikel'][$i]['projekt']."' LIMIT 1");

      if($xmldata['stueckliste_artikel']['artikel'][$i]['projekt']!="" && !is_array($xmldata['stueckliste_artikel']['artikel'][$i]['projekt']))
        $stuecklisteartikel = $this->app->DB->Select("SELECT id FROM adresse WHERE nummer='".$xmldata['stueckliste_artikel']['artikel'][$i]['nummer']."' AND projekt='".$xmldata['stueckliste_artikel']['artikel'][$i]['projekt']."' LIMIT 1");
      else
        $stuecklisteartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$xmldata['stueckliste_artikel']['artikel'][$i]['nummer']."' LIMIT 1");

      $this->app->DB->Insert("INSERT INTO stueckliste (id,sort,artikel,stuecklistevonartikel,menge) VALUES ('','".($i+1)."','$stuecklisteartikel','$artikel','$menge')");
    }

    if($xmldata['einkaufspreise']['staffelpreis']['ab_menge']  > 0 || $xmldata['einkaufspreise']['staffelpreis']['preis']  > 0)
    {
      $tmp = $xmldata['einkaufspreise']['staffelpreis'];
      $xmldata['einkaufspreise']['staffelpreis']= NULL;
      $xmldata['einkaufspreise']['staffelpreis'][0] = $tmp;
    }

    $this->app->erp->SetzteSperreAPIArtikelPreise($id);
    $cstaffelpreise = isset($xmldata['einkaufspreise']['staffelpreis'])?count($xmldata['einkaufspreise']['staffelpreis']):0;
    for($i=0;$i<$cstaffelpreise;$i++)
    {
      //$projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");
      $artikel = $id;
      // Markierung fuer SPerrung aller nicht uebegebenen Preise

      $abmenge = $xmldata['einkaufspreise']['staffelpreis'][$i]['ab_menge'];
      $xmldata['einkaufspreise']['staffelpreis'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");

      if($xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']))
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' 
          AND projekt='".$xmldata['einkaufspreise']['staffelpreis'][$i]['projekt']."' AND lieferantennummer!='' LIMIT 1");
      else
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' 
          AND lieferantennummer!='' LIMIT 1");

      if($adresse <=0)
      {
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE name='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']."' AND name!='' LIMIT 1");
      }

      if($adresse <=0)
      {
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']=="")
          $xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname']="Lieferant";

        $adresse = $this->app->erp->CreateAdresse($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantname'],$firma="1");
        // wenn lieferantennummer vorhanden dann diese verwenden
        if($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']!="" && !is_array($xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']))
          $this->app->DB->Update("UPDATE adresse SET lieferantennummer='".$xmldata['einkaufspreise']['staffelpreis'][$i]['lieferantennummer']."' WHERE id='$adresse' LIMIT 1");

        $this->app->erp->AddRolleZuAdresse($adresse, "Lieferant", "von", "Projekt", $xmldata['projekt'] );
      }



      $bestellnummer = $xmldata['einkaufspreise']['staffelpreis'][$i]['bestellnummer'];
      $bezeichnunglieferant = $xmldata['einkaufspreise']['staffelpreis'][$i]['bezeichnunglieferant'];
      if(is_array($bestellnummer))$bestellnummer="";

      if($bezeichnunglieferant=="")
        $bezeichnunglieferant = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1");


      $preis = str_replace(',','.',$xmldata['einkaufspreise']['staffelpreis'][$i]['preis']);
      $waehrung = $xmldata['einkaufspreise']['staffelpreis'][$i]['waehrung'];
      if(is_array($waehrung) || $waehrung=="")
        $waehrung="EUR";

      $this->app->erp->AddEinkaufspreis($artikel,$abmenge,$adresse,$bestellnummer,$bezeichnunglieferant,$preis,$waehrung);
    }

    if($xmldata['verkaufspreise']['staffelpreis']['ab_menge']  > 0)
    {
      $tmp = $xmldata['verkaufspreise']['staffelpreis'];
      $xmldata['verkaufspreise']['staffelpreis']= NULL;
      $xmldata['verkaufspreise']['staffelpreis'][0] = $tmp;
    }

    // alle positionen der reihe nach
    $cstaffelpreise = isset($xmldata['verkaufspreise']['staffelpreis'])?count($xmldata['verkaufspreise']['staffelpreis']):0;
    for($i=0;$i<$cstaffelpreise;$i++)
    {
      $artikel = $id;
      $abmenge = $xmldata['verkaufspreise']['staffelpreis'][$i]['ab_menge'];
      $xmldata['verkaufspreise']['staffelpreis'][$i]['projekt'] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']!="" && !is_array($xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']))
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']."' AND projekt='".$xmldata['verkaufspreise']['staffelpreis'][$i]['projekt']."' LIMIT 1");
      else
        $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']."' LIMIT 1");

      $preis = str_replace(',','.',$xmldata['verkaufspreise']['staffelpreis'][$i]['preis']);
      $waehrung = $xmldata['verkaufspreise']['staffelpreis'][$i]['waehrung'];
      if(is_array($waehrung) || $waehrung=="") $waehrung = "EUR";
      $kundenartikelnummer = $xmldata['verkaufspreise']['staffelpreis'][$i]['kundenartikelnummer'];

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['geloescht']=="1") $geloescht = 1;
      else $geloescht = 0;

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['kundennummer']=="")
        $adresse = 0;
      else {
        // kunde gibt es nicht
        if($adresse <=0)
          continue;
      }

      // pruefe ob es diesen Preis schon gibt? wenn nicht lege einen neuen an ...
      // $projektid = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$xmldata['artikelliste']['position'][$i]['projekt']."' LIMIT 1");

      if($xmldata['verkaufspreise']['staffelpreis'][$i]['gruppe']>0)
        $gruppe = $this->app->DB->Select("SELECT id FROM gruppen WHERE id='".$xmldata['verkaufspreise']['staffelpreis'][$i]['gruppe']."' LIMIT 1");
      else $gruppe = 0;

      if($gruppe > 0)
        $this->app->erp->AddVerkaufspreisGruppe($artikel,$abmenge,$gruppe,$preis,$waehrung);
      else
        $this->app->erp->AddVerkaufspreis($artikel,$abmenge,$adresse,$preis,$waehrung);

      //deaktiviere alle alten preise von dem Artikel
    }
    $this->app->erp->EntferneSperreAPIArtikelPreise($id);

    if ($intern == true) {
      return true;
    }
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }


  function ApiArtikelGet($intern = false, $id="")
  {
    if($id=="")
      $id = $this->app->Secure->GetGET("id");
    $nummer = $this->app->Secure->GetGET("nummer");
    $projekt = $this->app->Secure->GetGET("projekt");

    $xmldata = $this->XMLPost();

    if($nummer=="") $nummer = $xmldata["nummer"];
    if($id=="") $id = $xmldata["id"];
    if($projekt=="") $projekt = $xmldata["projekt"];

    if($nummer!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
        $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' AND projekt='$projekt' LIMIT 1");
      } else {
        $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' LIMIT 1");
      }
    }
    //check
    $id = $this->app->DB->Select("SELECT id FROM artikel WHERE id='$id' LIMIT 1");


    if($id > 0) {
      if ($intern == true) {
        return $this->app->erp->XMLArtikel($id);
      }
      $this->XMLResponse(1, $this->app->erp->XMLArtikel($id));
      $this->app->ExitXentral();
    }
    if ($intern == true) {
      return false;
    }
    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }


  function ApiBenutzerCreate()
  {
    $xmldata = $this->XMLPost();
    // pruefe ob es adresse gibt
    $adressecheck = $this->app->DB->Select("SELECT id FROM adresse WHERE id='".$xmldata["adresse"]."' LIMIT 1");
    if($adressecheck <=0)
      $this->XMLResponse(5);

    // pruefe ob es username gibt
    $usercheck = $this->app->DB->Select("SELECT id FROM user WHERE username='".$xmldata["username"]."' LIMIT 1");
    if($usercheck > 0)
      $this->XMLResponse(5);

    // pruefe ob ein Passwort uebertragen wird
    if($xmldata["password"] == ""){
      $this->XMLResponse(5,"<error>kein Passwort übergeben</error>");
    }

    $felder = $xmldata;

    if($felder['type']!="admin")
    {
      $rechtevorlage = $felder['type'];
      $felder['vorlage']=$rechtevorlage;
      $felder['type']="standard";
    }

    $id = $this->app->erp->CreateBenutzer($felder);
    foreach($xmldata as $key=>$value)
    {
      if(is_array($value))$value="";

      if($key=="sonstiges") $value = strip_tags(html_entity_decode($value));
      if($key!="id") {
        if($key=="password") {
          $this->app->DB->Update("UPDATE `user` SET `passwordmd5` = MD5('$value') WHERE `id` = '$id' LIMIT 1");
          $this->app->DB->Update("UPDATE `user` SET `password` = '' WHERE `id` = '$id' LIMIT 1");
        } else {
          $this->app->DB->Update("UPDATE `user` SET $key='$value' WHERE `id` = '$id' LIMIT 1");
        }
      }

    }
    if(empty($xmldata['passwordunenescaped']) && empty($xmldata['passwordsha512']))$this->app->DB->Update("UPDATE `user` SET salt = '', passwordsha512 = '' WHERE id = '$id' LIMIT 1");

    $this->app->erp->AbgleichBenutzerVorlagen();
    $this->XMLResponse(1,"<id>$id</id>");
    $this->app->ExitXentral();
  }



  function ApiBenutzerEdit()
  {
    $xmldata = $this->XMLPost();
    if($xmldata['id'] != ''){
      $id = $xmldata['id'];
    }else{
      $id = $this->app->Secure->GetGET("id");
    }


    $usercheck = $this->app->DB->Select("SELECT id FROM `user` WHERE id='".$id."' LIMIT 1");
    // User gibt es nicht
    if($usercheck <= 0)
      $this->XMLResponse(5);

    $xmldata = $this->XMLPost();
    $usernamecheck = $this->app->DB->Select("SELECT id FROM `user` WHERE username='".$xmldata["username"]."' AND id!='".$id."' LIMIT 1");
    // Username hat schon jemand anders
    if($usernamecheck > 0)
      $this->XMLResponse(6);

    if($xmldata['type']!="admin")
    {
      $rechtevorlage = $xmldata['type'];
      $xmldata['vorlage']=$rechtevorlage;
      $xmldata['type']="standard";
    }

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value))$value="";
      if($key=="sonstiges") $value = strip_tags(html_entity_decode($value));
      if($key!="id")
        $this->app->DB->Update("UPDATE `user` SET $key='$value' WHERE id='$id' LIMIT 1");
    }

    if(empty($xmldata['passwordunenescaped']) && empty($xmldata['passwordsha512']) && !empty($xmldata['passwordmd5']))$this->app->DB->Update("UPDATE `user` SET salt = '', passwordsha512 = '' WHERE id = '$id' LIMIT 1");

    $this->app->erp->AbgleichBenutzerVorlagen();
    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiBenutzerGet()
  {
    $xmldata = $this->XMLPost();
    if($xmldata['id'] != ''){
      $id = $xmldata['id'];
    }else{
      $id = $this->app->Secure->GetGET("id");
    }


    //checl
    $id = $this->app->DB->Select("SELECT id FROM user WHERE id='$id' LIMIT 1");

    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLBenutzer($id));
      $this->app->ExitXentral();
    }

    $this->XMLResponse(5);

    $this->app->ExitXentral();
  }

  function ApiPreiseEdit()
  {
    $xmldata = $this->XMLPostPlain();

    foreach ($xmldata->xml->artikel as $artikel){
      if($artikel->id > 0)
        $id = $this->app->DB->Select("SELECT id FROM artikel WHERE id='$artikel->id' LIMIT 1");
      else if ($artikel->nummer!="")
        $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$artikel->nummer."' LIMIT 1");

      if($id<=0) continue;
      $this->app->erp->SetzteSperreAPIArtikelPreise($id);

      foreach ($artikel->verkaufspreise as $vk) {
        foreach ($vk->staffelpreis as $staffelpreis) {

          if($staffelpreis->kundennummer!="")
            $staffelpreis->adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$staffelpreis->kundennummer."' LIMIT 1");
          if($staffelpreis->gruppe > 0)
            $this->app->erp->AddVerkaufspreisGruppe($id,$staffelpreis->ab_menge,$staffelpreis->gruppe,$staffelpreis->preis);
          else if($staffelpreis->adresse > 0)
            $this->app->erp->AddVerkaufspreis($id,$staffelpreis->ab_menge,$staffelpreis->adresse,$staffelpreis->preis);
          else if($staffelpreis->kundennummer=="" && $staffelpreis->adresse <= 0)
            $this->app->erp->AddVerkaufspreis($id,$staffelpreis->ab_menge,0,$staffelpreis->preis);
        }
      }

      // test
      foreach ($artikel->einkaufspreise as $ek) {
        foreach ($ek->staffelpreis as $staffelpreis) {

    $lieferantadresse = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$staffelpreis->lieferantennummer."' AND lieferantennummer!='' LIMIT 1");
    if($lieferantadresse > 0)
    {
            $this->app->erp->AddEinkaufspreis($id,$staffelpreis->ab_menge,$lieferantadresse,$staffelpreis->bestellnummer,$staffelpreis->bezeichnunglieferant,
    $staffelpreis->preis,$staffelpreis->waehrung);
    }
        }
      }

      $this->app->erp->EntferneSperreAPIArtikelPreise($id);
    }

    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }


  function ApiSessionStart()
  {

    $xmldata = $this->XMLPost();

    $sessionid = $xmldata['sessionID'];
    $userID = $xmldata['userID'];
    $validSession = $xmldata['isValidSession'];

    if($validSession=="1")
      $this->app->DB->Insert("INSERT INTO useronline (user_id,login,sessionid,time) VALUES ('$userID','1','$sessionid',NOW())");

    $this->XMLResponse(1);
    // Eintrag anlegen in useronline
    // class.acl.php erweitern, wenn diese merkt das externer login war dann session freischalten ...
    $this->app->ExitXentral();
  }


  function ApiSessionClose()
  {
    $xmldata = $this->XMLPost();

    $sessionid = $xmldata['sessionID'];

    $this->app->DB->Delete("DELETE FROM useronline WHERE sessionid='$sessionid' LIMIT 1");

    $this->XMLResponse(1);
    // loeschen aktiver login
    $this->app->ExitXentral();
  }


  function ApiAdresseKontaktCreate()
  {
    $id = $this->app->Secure->GetGET("id");
    $kundennummer = $this->app->Secure->GetGET("kundennummer");
    $projekt = $this->app->Secure->GetGET("projekt");


    $xmldata = $this->XMLPost();
    if($id=="" && $kundennummer=="")
    {
      if($xmldata["kundennummer"]!="" && !is_array($xmldata["kundennummer"]))
        $kundennummer = $xmldata["kundennummer"];
      else
        $id = $xmldata["adresse"];
    }
    if($kundennummer!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' AND projekt='$projekt' LIMIT 1");
      } else {
        $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$kundennummer' LIMIT 1");
      }
    }

    // Key gibt es nicht
    $id = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$id' LIMIT 1");
    if($id <= 0){
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }

    $bezeichnung = $xmldata["bezeichnung"];
    $kontakt = $xmldata["kontakt"];
    $this->app->DB->Insert("INSERT INTO adresse_kontakte (id,adresse,bezeichnung,kontakt) VALUES ('','$id','$bezeichnung','$kontakt')");

    $id = $this->app->DB->GetInsertID();

    $this->XMLResponse(1,"<id>$id</id>");
    $this->app->ExitXentral();
  }


  function ApiAdresseKontaktEdit()
  {
    $id = $this->app->Secure->GetGET("id");
	  if($id==''){
		  $xmldata = $this->XMLPost();
		  $id = $xmldata['id'];
    }
    $id = $this->app->DB->Select("SELECT id FROM adresse_kontakte WHERE id='$id' LIMIT 1");
    // Key gibt es nicht
    if($id <= 0){
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }

    $xmldata = $this->XMLPost();

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)) {
        $value='';
      }
      if($key!='id'){
        $this->app->DB->Update("UPDATE adresse_kontakte SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }

    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  function ApiAdresseKontaktList()
  {
    $id = (int)$this->app->Secure->GetGET("id");
	  if(!$id){
	    $xmldata = $this->XMLPost();
	    if($xmldata['id']){
	      $id = $xmldata['id'];
      }
	  }


    if(!$this->app->DB->Select("SELECT id FROM adresse WHERE id = '$id' AND geloescht <> 1 LIMIT 1"))
    {
      $this->XMLResponse(5);
      $this->app->ExitXentral();
    }
    $kontakte = $this->app->DB->SelectArr("SELECT * FROM adresse_kontakte WHERE adresse = '$id' ORDER BY bezeichnung");
    if($kontakte)
    {
      $xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<kontakte2>
</kontakte2>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
      $xmlobj = $_xmlobj->AddChild('kontakte','');
      $xmlobj->AddChild('anz_gesamt',(!empty($kontakte)?count($kontakte):0));
      $xmlobj->AddChild('anz_result',(!empty($kontakte)?count($kontakte):0));
      //$sxe->addAttribute('type', 'documentary');

      foreach($kontakte as $kontakt)
      {
        $kobj = $xmlobj->AddChild('kontakt','');
        foreach($kontakt as $k => $v)
        {
          $valobj = $kobj->AddChild($k, (string)$v);
        }
      }

      $xml = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<kontakte2>",'</kontakte2>'),array('','',''),$_xmlobj->asXML());
      $this->XMLResponse(1,$xml);
      $this->app->ExitXentral();
    }
    $this->XMLResponse(8);
    $this->app->ExitXentral();
  }

  function ApiAdresseKontaktGet()
  {
	  $id = (int)$this->app->Secure->GetGET("id");
	  if(!$id){
		  $xmldata = $this->XMLPost();
		  if($xmldata['id']){
			  $id = $xmldata['id'];
		  }
	  }

    //checl
    $id = $this->app->DB->Select("SELECT id FROM adresse_kontakte WHERE id='$id' LIMIT 1");
    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLAdresseKontakt($id));
      $this->app->ExitXentral();
    }

    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }

  function ApiAdresseListeGet($intern = false)
  {
    $xmldata = $this->XMLPost();
    $exakt = false;
    $filterspalten = array('email','name','plz','ort','kundennummer','land','strasse','abteilung','unterabteilung','id');
    $limit = '';
    $_limit = 999999999;
    $offset = 0;
    if(isset($xmldata['limit']))
    {
      $_limit = $xmldata['limit'];
      if(isset($xmldata['offset']))
      {
        $offset = $xmldata['offset'];
        //$limit = ' LIMIT '.(int)$xmldata['offset'].', '.(int)$xmldata['limit'];
      }else{
        //$limit = ' LIMIT '.(int)$xmldata['limit'];
      }
    }

    if(!empty($xmldata['gruppen']))
    {
      if(isset($xmldata['gruppen']['kennziffer']))
      {
        if(!is_array($xmldata['gruppen']['kennziffer']))
        {
          $gruppen[0] = $xmldata['gruppen']['kennziffer'];
        }else{
          foreach($xmldata['gruppen']['kennziffer'] as $k => $gruppe)
          {
            $gruppen[] = $gruppe;
          }
        }
      }
    }

    $sumjoin = '';
    $sumwhere = '';
    $sumspalten = '';
    $re = false;
    $gu = false;
    $be = false;
    $ab = false;
    $an = false;
    $filterkategorie = false;

    $bvertrieb = 0;
    if($xmldata && is_array($xmldata))
    {
      foreach($xmldata as $key => $filter)
      {
        $filterescaped = '';
        if(!is_array($filter))$filterescaped = $this->app->DB->real_escape_string($filter);
        switch(strtoupper($key))
        {
          case 'VERTRIEB':
            $bvertrieb = (int)$filter;
          break;
          case 'KATEGORIE':
            $filterkategorie = (int)$filter;
          break;
        }
      }
    }

    if(isset($xmldata['summierung']))
    {
      if(isset($xmldata['summierung']['beleg']))
      {
        if(!is_array($xmldata['summierung']['beleg']) || !isset($xmldata['summierung']['beleg'][0]))
        {
          $belegea[0] = $xmldata['summierung']['beleg'];
        }else{
          $belegea = $xmldata['summierung']['beleg'];
        }
        foreach($belegea as $beleg)
        {
          switch($beleg)
          {
            case 'rechnung':
              if(!$re)
              {
                $re = true;
                $sumspalten .= ', (SELECT sum(re.umsatz_netto) FROM rechnung re  WHERE re.adresse = adr.id '.($bvertrieb?" AND re.vertriebid = '".$bvertrieb."' ":'');
                $sumjoin .= ' LEFT JOIN rechnung re ON re.adresse = adr.id ';
                $skat = '';
                if($filterkategorie)$skat = ' , (SELECT rear.id FROM rechnung re2 INNER JOIN rechnung_position rep2 ON re2.id = rep2.rechnung  INNER JOIN artikel rear ON rep2.artikel = rear.id WHERE re2.adresse = adr.id AND rear.typ = \''.$filterkategorie.'_kat\' ';
                //if($sumwhere != '')$sumwhere .= ' AND ';
                if(isset($xmldata['status']))
                {
                  $sumspalten .= " AND re.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $skat .= " AND re2.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  //$sumwhere .= " (isnull(re.id) OR (re.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                }else{
                  $sumspalten .= " AND re.status != 'storniert' AND re.status <> 'angelegt' ";
                  $skat .= " AND re2.status != 'storniert' AND re2.status <> 'angelegt' ";
                  //$sumwhere .= " (isnull(re.id) OR (re.status != 'storniert' AND re.status <> 'angelegt' ";
                }
                if(isset($xmldata['datumvon']))
                {
                  $sumspalten .= " AND re.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  $skat .= " AND re2.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  //$sumwhere .= " AND re.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                }
                if(isset($xmldata['datumbis']))
                {
                  $sumspalten .= " AND re.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  $skat .= " AND re2.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  //$sumwhere .= " AND re.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                }
                //$sumwhere .= "))";

                $sumspalten .= ') as rechnung_umsatz_netto';
                if($filterkategorie)$skat .= ' LIMIT 1) as re_iskat ';
                if($filterkategorie)$sumspalten .= $skat;
              }
            break;
            case 'gutschrift':
              if(!$gu)
              {
                $gu = true;
                $sumspalten .= ', (SELECT sum(gu.umsatz_netto) FROM gutschrift gu WHERE gu.adresse = adr.id '.($bvertrieb?" AND gu.vertriebid = '".$bvertrieb."' ":'');
                //$sumspalten .= ', sum(gu.soll) as gutschrift_soll';
                $sumjoin .= ' LEFT JOIN gutschrift gu ON gu.adresse = adr.id ';
                $skat = '';
                if($filterkategorie)$skat = ' , (SELECT guar.id FROM gutschrift gu2 INNER JOIN gutschrift_position gup2 ON gu2.id = gup2.gutschrift  INNER JOIN artikel guar ON gup2.artikel = guar.id WHERE gu2.adresse = adr.id  AND guar.typ = \''.$filterkategorie.'_kat\' ';
                //if($sumwhere != '')$sumwhere .= ' AND ';
                if(isset($xmldata['status']))
                {
                  $sumspalten .= " AND gu.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $skat .= " AND gu2.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  //$sumwhere .= " (isnull(gu.id) OR (gu.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                }else{
                  $sumspalten .= " AND gu.status != 'storniert' AND gu.status <> 'angelegt' ";
                  $skat .= " AND gu2.status != 'storniert' AND gu2.status <> 'angelegt' ";
                  //$sumwhere .= " (isnull(gu.id) OR (gu.status != 'storniert' AND gu.status <> 'angelegt'  ";
                }
                if(isset($xmldata['datumvon']))
                {
                  $sumspalten .= " AND gu.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  $skat .= " AND gu2.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  //$sumwhere .= " AND gu.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                }
                if(isset($xmldata['datumbis']))
                {
                  $sumspalten .= " AND gu.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  $skat .= " AND gu2.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  //$sumwhere .= " AND gu.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                }
                //$sumwhere .= "))";
                $sumspalten .= ') as gutschrift_umsatz_netto';
                if($filterkategorie)$skat .= ' LIMIT 1) as gu_iskat ';
                if($filterkategorie)$sumspalten .= $skat;
              }
            break;
            case 'bestellung':
              if(!$be)
              {
                $be = true;
                //$sumspalten .= ', sum(be.gesamtsumme) as bestellung_gesamtsumme';
                $sumspalten .= ', (SELECT sum(be.gesamtsumme) FROM bestellung be WHERE be.adresse = adr.id ';
                $sumjoin .= ' LEFT JOIN bestellung be ON be.adresse = adr.id ';
                $skat = '';
                if($filterkategorie)$skat = ' , (SELECT bear.id FROM bestellung be2 INNER JOIN bestellung_position bep2 ON be2.id = bep2.bestellung  INNER JOIN artikel bear ON bep2.artikel = bear.id WHERE be2.adresse = adr.id  AND bear.typ = \''.$filterkategorie.'_kat\' ';
                //if($sumwhere != '')$sumwhere .= ' AND ';
                if(isset($xmldata['status']))
                {
                  $sumspalten .= " AND be.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $skat .= " AND be2.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  //$sumwhere .= " (isnull(be.id) OR (be.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                }else{
                  $sumspalten .= " AND be.status != 'storniert' AND be.status <> 'angelegt' ";
                  $skat .= " AND be2.status != 'storniert' AND be2.status <> 'angelegt' ";
                  //$sumwhere .= " (isnull(be.id) OR (be.status != 'storniert' AND be.status <> 'angelegt' ";
                }
                if(isset($xmldata['datumvon']))
                {
                  $sumspalten .= " AND be.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  $skat .= " AND be2.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  //$sumwhere .= " AND be.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                }
                if(isset($xmldata['datumbis']))
                {
                  $sumspalten .= " AND be.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  $skat .= " AND be2.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  //$sumwhere .= " AND be.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                }
                //$sumwhere .= "))";
                $sumspalten .= ') as bestellung_gesamtsumme ';
                if($filterkategorie)$skat .= ' LIMIT 1) as be_iskat ';
                if($filterkategorie)$sumspalten .= $skat;
              }
            break;
            case 'auftrag':
              if(!$ab)
              {
                $ab = true;
                $sumspalten .= ', (SELECT sum(ab.umsatz_netto) FROM auftrag ab WHERE ab.adresse = adr.id '.($bvertrieb?" AND re.vertriebid = '".$bvertrieb."' ":'');
                //$sumspalten .= ', sum(ab.gesamtsumme) as auftrag_gesamtsumme';
                $sumjoin .= ' LEFT JOIN auftrag ab ON ab.adresse = adr.id ';
                $skat = '';
                if($filterkategorie)$skat = ' , (SELECT abar.id FROM auftrag ab2 INNER JOIN auftrag_position abp2 ON ab2.id = abp2.auftrag INNER JOIN artikel abar ON abp2.artikel = abar.id WHERE ab2.adresse = adr.id  AND abar.typ = \''.$filterkategorie.'_kat\' ';
                //if($sumwhere != '')$sumwhere .= ' AND ';
                if(isset($xmldata['status']))
                {
                  $sumspalten .= " AND ab.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $skat .= " AND ab2.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  //$sumwhere .= " (isnull(ab.id) OR (ab.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                }else{
                  $sumspalten .= " AND ab.status != 'storniert' AND ab.status <> 'angelegt' ";
                  $skat .= " AND ab2.status != 'storniert' AND ab2.status <> 'angelegt' ";
                  //$sumwhere .= " (isnull(ab.id) OR (ab.status != 'storniert' AND ab.status <> 'angelegt' ";
                }
                if(isset($xmldata['datumvon']))
                {
                  $sumspalten .= " AND ab.datum <= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  $skat .= " AND ab2.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  //$sumwhere .= " AND ab.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                }
                if(isset($xmldata['datumbis']))
                {
                  $sumspalten .= " AND ab.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  $skat .= " AND ab2.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  //$sumwhere .= " AND ab.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                }
                //$sumwhere .= "))";
                $sumspalten .= ') as auftrag_umsatz_netto ';
                if($filterkategorie)$skat .= ' LIMIT 1) as ab_iskat ';
                if($filterkategorie)$sumspalten .= $skat;
              }
            break;
            case 'angebot':
              if(!$an)
              {
                $an = true;
                $sumspalten .= ', (SELECT sum(an.umsatz_netto) FROM angebot an WHERE an.adresse = adr.id '.($bvertrieb?" AND an.vertriebid = '".$bvertrieb."' ":'');
                //$sumspalten .= ', sum(an.gesamtsumme) as angebot_gesamtsumme';
                $sumjoin .= ' LEFT JOIN angebot an ON an.adresse = adr.id ';
                $skat = '';
                if($filterkategorie)$skat = ' , (SELECT anar.id FROM angebot an2 INNER JOIN angebot_position an2 ON an2.id = anp2.auftrag INNER JOIN artikel anar ON anp2.artikel = anar.id WHERE an2.adresse = adr.id  AND anar.typ = \''.$filterkategorie.'_kat\' ';
                //if($sumwhere != '')$sumwhere .= ' AND ';
                if(isset($xmldata['status']))
                {
                  //$sumwhere .= " (isnull(an.id) OR (an.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $sumspalten .= " AND an.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                  $skat .= " AND an2.status like '".$this->app->DB->real_escape_string($xmldata['status'])."' ";
                }else{
                  //$sumwhere .= " (isnull(an.id) OR (an.status != 'storniert' AND an.status <> 'angelegt' ";
                  $sumspalten .= " AND an.status != 'storniert' AND an.status <> 'angelegt' ";
                  $skat .= " AND an2.status != 'storniert' AND an2.status <> 'angelegt' ";
                }
                if(isset($xmldata['datumvon']))
                {
                  $sumspalten .= " AND an.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  $skat .= " AND an2.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                  //$sumwhere .= " AND an.datum >= '".$this->app->DB->real_escape_string($xmldata['datumvon'])."' ";
                }
                if(isset($xmldata['datumbis']))
                {
                  $sumspalten .= " AND an.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  $skat .= " AND an2.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                  //$sumwhere .= " AND an.datum <= '".$this->app->DB->real_escape_string($xmldata['datumbis'])."' ";
                }
                //$sumwhere .= "))";
                $sumspalten .= ') as angebot_umsatz_netto ';
                if($filterkategorie)$skat .= ' LIMIT 1) as an_iskat ';
                if($filterkategorie)$sumspalten .= $skat;
              }
            break;
          }
        }
        /*
        if($sumwhere != '')
        {

          if($re)
          {
            $sumwherea[] = " not isnull(re.id) ";
          }
          if($gu)
          {
            $sumwherea[] = " not isnull(gu.id) ";
          }
          if($ab)
          {
            $sumwherea[] = " not isnull(ab.id) ";
          }
          if($an)
          {
            $sumwherea[] = " not isnull(an.id) ";
          }
          if($be)
          {
            $sumwherea[] = " not isnull(be.id) ";
          }

          $sumwhere .= " AND ( ".implode(" OR ",$sumwherea)." ) ";
        }*/
      }
    }

    //if($sumwhere != '')$sumwhere = ' AND ('.$sumwhere.') ';
    $sumwhere = '';
    $sumjoin = '';
    $searchmode = ' AND ';
    if($xmldata && is_array($xmldata))
    {
      foreach($xmldata as $key => $filter)
      {
        $filterescaped = '';
        if(!is_array($filter))$filterescaped = $this->app->DB->real_escape_string($filter);
        switch(strtoupper($key))
        {
          case 'EXAKT':
            $exakt = true;
          break;
          case 'SEARCHMODE':
            if(strtoupper($filter) == 'AND')$searchmode = ' AND ';
            if(strtoupper($filter) == 'OR')$searchmode = ' OR ';
          break;
          case 'SEARCH':

            if(is_array($filter))
            {
              if(isset($filter[0]))
              {
                foreach($filter as $k => $_filter)
                {
                  if(isset($_filter['SUCHE']))$_filter['suche'] = $_filter['SUCHE'];
                  if(isset($_filter['FIELD']))$_filter['field'] = $_filter['FIELD'];
                  if(isset($_filter['EXAKT']))$_filter['exakt'] = $_filter['EXAKT'];
                  if(isset($_filter['suche']) && isset($_filter['field']) && in_array(strtolower($_filter['field']),$filterspalten))
                  {
                    if(isset($_filter['exakt']) && $_filter['exakt'] == 1)
                    {
                      if(strtolower($_filter['field']) == 'id')
                      {
                        $swhere[] = " adr.".$_filter['field']." LIKE '".$this->app->DB->real_escape_string((int)($_filter['suche']))."' ";
                      }else
                      $swhere[] = " adr.".$_filter['field']." LIKE '".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."' ";
                    }else{
                      if(strtolower($_filter['field']) == 'id')
                      {
                        $swhere[] = " adr.".$_filter['field']." LIKE '%".$this->app->DB->real_escape_string((int)($_filter['suche']))."%' ";
                      }
                        else
                      $swhere[] = " adr.".$_filter['field']." LIKE '%".$this->app->DB->real_escape_string(base64_decode($_filter['suche']))."%' ";
                    }
                  }
                }
              }else{
                if(isset($filter['SUCHE']))$filter['suche'] = $filter['SUCHE'];
                if(isset($filter['FIELD']))$filter['field'] = $filter['FIELD'];
                if(isset($filter['EXAKT']))$filter['exakt'] = $filter['EXAKT'];
                if(isset($filter['suche']) && isset($filter['field']) && in_array(strtolower($filter['field']),$filterspalten))
                {
                  if(strtolower($filter['field']) == 'id')
                  {
                    if(isset($filter['exakt']) && $filter['exakt'] == 1)
                    {
                      $swhere[] = " adr.".$filter['field']." LIKE '".$this->app->DB->real_escape_string((int)($filter['suche']))."' ";
                    }else{
                      $swhere[] = " adr.".$filter['field']." LIKE '%".$this->app->DB->real_escape_string((int)($filter['suche']))."%' ";
                    }

                  }else{
                    if(isset($filter['exakt']) && $filter['exakt'] == 1)
                    {
                      $swhere[] = " adr.".$filter['field']." LIKE '".$this->app->DB->real_escape_string(base64_decode($filter['suche']))."' ";
                    }else{
                      $swhere[] = " adr.".$filter['field']." LIKE '%".$this->app->DB->real_escape_string(base64_decode($filter['suche']))."%' ";
                    }
                  }
                }
              }
            }else{
              $suchbegriff = $this->app->DB->real_escape_string(base64_decode($filterescaped));
            }

            //$subwhere[] = " (adr.name like '%$filterescaped%' OR adr.plz like '%$filterescaped%'  OR adr.ort like '%$filterescaped%' OR adr.kundennummer like '%$filterescaped%') ";

          break;
          case 'SUCHSPALTE':
            //if($filterescaped)$customsearch[] = $filterescaped;
          break;
          case 'VERTRIEB':
            $subwhere[] = " adr.vertrieb = '".(int)$filter."' ";
          break;
          case 'EXT':
            $filter_ext = $filter;
          break;
          case 'ID':
            if(is_array($filter) && isset($filter[0]))
            {
              foreach($filter as $k => $_filter)
              {
                $subwhere[] = " adr.id = '".(int)$_filter."' ";
              }
            }else
            $subwhere[] = " adr.id = '".(int)$filter."' ";
          break;
        }
      }
    }


    if(isset($suchbegriff) || !empty($swhere))
    {
      if(empty($swhere))
      {
        foreach($filterspalten as $f)
        {
          $swhere[] = " adr.".$f." like '".($exakt?'':"%").($suchbegriff).($exakt?'':"%")."' ";
        }
        $subwhere[] = ' ('.implode(' '.$searchmode.' ', $swhere).') ';
      }else{
        /*foreach($customsearch as $f)
        {
          if(in_array($f, $filterspalten))$swhere[] = " adr.".$f." like '".($exakt?'':"%").($suchbegriff).($exakt?'':"%")."' ";
        }*/
        if(!empty($swhere))$subwhere[] = " (".implode(' '.$searchmode.' ', $swhere).') ';
      }
    }
    $where = '1';
    if(!empty($subwhere))$where = implode(' '.$searchmode.' ',$subwhere);


    $order = '';
    if(isset($xmldata['order'])){
      if(!isset($xml['order'][0]))
      {
        $xmldata['order'][0] = $xmldata['order'];
      }
      foreach($xmldata['order'] as $key => $sort)
      {
        $field = '';
        if(isset($sort['field']))
        {
          switch(strtolower($sort['field']))
          {
            case 'gruppenname':
            case 'kennziffer':
              if($gruppen)$field = 'gr.name';
            break;

            case 'name':
            case 'plz':
            case 'ort':
            case 'telefon':
            case 'telefax':
            case 'ansprechpartner':
            case 'typ':
            case 'strasse':
            case 'land':
            case 'email':
            case 'kundennummer':
            case 'lieferantennummer':
              $field = 'adr.'.strtolower($sort['field']);
            break;
          }
          if(!empty($field))
          {
            if(isset($sort['desc']) && $sort['desc'] == 1)
            {
              $field .= " DESC";
            }
            if($order != '')$order .= ',';
            $order .= $field;
          }
        }
      }
    }
    if($order != '')$order = $order.',';

    if(isset($gruppen))
    {
      $where .= " AND (gr.kennziffer = '".implode("' OR gr.kennziffer = '",$gruppen). "') AND (ar.bis = '0000-00-00' OR ar.bis >= date(now())) ";
      if(isset($filter_ext))
      {
        if(strtolower($filter_ext) == 'ja')
        {
          $where .= " AND not isnull(am.id) ";
        }elseif(strtolower($filter_ext) == 'nein')
        {
          $where .= " AND isnull(am.id) ";
        }
        $sql = "SELECT adr.*, gr.kennziffer, gr.name as gruppenname,am.id_ext $sumspalten FROM adresse adr LEFT JOIN api_mapping am ON am.id_int = adr.id AND am.tabelle = 'adresse' INNER JOIN adresse_rolle ar ON adr.id = ar.adresse AND ar.objekt like 'gruppe' INNER JOIN gruppen gr ON gr.id = ar.parameter $sumjoin WHERE $where $sumwhere ORDER BY $order adr.name, adr.id $limit";
        $adressen = $this->app->DB->Query($sql);

      }else{
        $sql = "SELECT adr.*, gr.kennziffer, gr.name as gruppenname $sumspalten FROM adresse adr INNER JOIN adresse_rolle ar ON adr.id = ar.adresse AND ar.objekt like  'gruppe' INNER JOIN gruppen gr ON gr.id = ar.parameter $sumjoin WHERE $where $sumwhere ORDER BY $order adr.name, adr.id $limit";
        $adressen = $this->app->DB->Query($sql);

      }
    }
    else{
      if(isset($filter_ext))
      {
        if(strtolower($filter_ext) == 'ja' || $filter_ext === '1' || $filter_ext === 1)
        {
          $where .= " AND not isnull(am.id) ";
        }elseif(strtolower($filter_ext) == 'nein' || $filter_ext === '0' || $filter_ext === 0)
        {
          $where .= " AND isnull(am.id) ";
        }
        $sql = "SELECT adr.*,am.id_ext $sumspalten FROM adresse adr LEFT JOIN api_mapping am ON am.id_int = adr.id AND am.tabelle = 'adresse' $sumjoin WHERE $where $sumwhere ORDER BY $order adr.name, adr.id $limit";
        $adressen = $this->app->DB->Query($sql);

      }else{
        $sql = "SELECT adr.* $sumspalten FROM adresse adr $sumjoin WHERE $where  $sumwhere ORDER BY $order adr.name, adr.id $limit";
        $adressen = $this->app->DB->Query($sql);

      }
    }
    error_log($sql . "\r\n", 3, "/var/www/html/debug.log");
    if($adressen)
    {

$xmlstr = <<<XML
<?xml version="1.0" standalone="yes"?>
<adressen2>
</adressen2>
XML;
      $_xmlobj = new SimpleXMLExtended($xmlstr);
      $xmlobj = $_xmlobj->AddChild('adressen','');
      //$sxe->addAttribute('type', 'documentary');



      $xml = '';
      $anz_gesamt = 0;
      $anz_result = 0;
      $i = 0;
      $gesamt_umsatz = 0;
      $anzeige_umsatz = 0;
      while($adresse = $this->app->DB->Fetch_Array($adressen))
      {

        $do = true;
        if($re && $gu)
        {

          if(isset($xmldata['umsatzvon']))
          {
            if((float)$adresse['rechnung_umsatz_netto'] - (float)$adresse['gutschrift_umsatz_netto'] < (float)$xmldata['umsatzvon'])$do = false;
          }
          if(isset($xmldata['umsatzbis']))
          {
            if((float)$adresse['rechnung_umsatz_netto'] - (float)$adresse['gutschrift_umsatz_netto'] > (float)$xmldata['umsatzbis'])$do = false;
          }
        }elseif($re)
        {
          if(isset($xmldata['umsatzvon']))
          {
            if((float)$adresse['rechnung_umsatz_netto'] < (float)$xmldata['umsatzvon'])$do = false;
          }
          if(isset($xmldata['umsatzbis']))
          {
            if((float)$adresse['rechnung_umsatz_netto'] > (float)$xmldata['umsatzbis'])$do = false;
          }
        }
        if($filterkategorie && $do)
        {
          $do2 = false;
          if($re && $adresse['re_iskat'])$do2 = true;
          if($gu && $adresse['gu_iskat'])$do2 = true;
          if($be && $adresse['be_iskat'])$do2 = true;
          if($ab && $adresse['ab_iskat'])$do2 = true;
          if($an && $adresse['an_iskat'])$do2 = true;
          if(!$do2)$do = false;
        }
        if($do && $re && $gu)
        {
          $gesamt_umsatz += (float)$adresse['rechnung_umsatz_netto'] - (float)$adresse['gutschrift_umsatz_netto'];
        }
        if($do && $i >= $offset && $i < $offset+$_limit)
        {
          $anzeige_umsatz += (float)$adresse['rechnung_umsatz_netto'] - (float)$adresse['gutschrift_umsatz_netto'];
          $adrobj = $xmlobj->AddChild('adresse','');
          //$xml .= '<adresse>';
          $RowKeys = array_keys($adresse);
          $RowValues = array_values($adresse);
          $cRowKeys = (!empty($RowKeys)?count($RowKeys):0);
          for($k = 1; $k < $cRowKeys;$k+=2)
          {
            if($RowKeys[$k] !== 're_iskat' && $RowKeys[$k] !== 'gu_iskat' && $RowKeys[$k] !== 'be_iskat' && $RowKeys[$k] !== 'ab_iskat' && $RowKeys[$k] !== 'an_iskat')
            {
              if($RowKeys[$k] === 'rechnung_umsatz_netto' || $RowKeys[$k] === 'gutschrift_umsatz_netto' || $RowKeys[$k] === 'bestellung_umsatz_netto' || $RowKeys[$k] === 'auftrag_umsatz_netto' || $RowKeys[$k] === 'angebot_umsatz_netto')
                $RowValues[$k] = number_format((float)$this->GetPlainText($RowValues[$k]),2,'.','');
              $valobj = $adrobj->AddChild($RowKeys[$k],'');
              if($this->usecdata)
              {
                if ((string)$this->GetPlainText($RowValues[$k]) != '')$valobj->addCData($RowValues[$k]);
              }else {
                if ((string)$this->GetPlainText($RowValues[$k]) != '') $valobj->value = (string)$this->app->erp->GetPlainText($RowValues[$k]);
              }
            }
            //$xml .= '<'.$RowKeys[$k].'>'.(string)$this->app->erp->GetPlainText($RowValues[$k]).'</'.$RowKeys[$k].'>';
          }
          //$xml .= '</adresse>';
          $anz_result++;
        }
        if($do)$i++;
      }
      $xmlobj->AddChild('anz_gesamt',$i);
      $xmlobj->AddChild('anz_result',$anz_result);
      if($re && $gu)
      {
        $xmlobj->AddChild('anzeige_umsatz',number_format($anzeige_umsatz,2,'.',''));
        $xmlobj->AddChild('gesamt_umsatz',number_format($gesamt_umsatz,2,'.',''));
      }
      $xml = str_replace(array('<?xml version="1.0" standalone="yes"?>',"<adressen2>",'</adressen2>'),array('','',''),$_xmlobj->asXML());
      unset($_xmlobj);

    }else{
      $xml = '<anz_result>0</anz_result><anz_gesamt>0</anz_gesamt>';
      if($this->app->DB->error())
      {
        $xml .= '<sqlerror>' .$this->GetPlainText($this->app->DB->error()).'</sqlerror>';
      }
    }
    //$xml .= $xmldata;
    if ($intern != false) {
      return $xml;
    }
    $this->XMLResponse(1,$xml);
    $this->app->ExitXentral();
  }


  function ApiGruppeCreate()
  {
    $id = $this->app->Secure->GetGET("id");

    $xmldata = $this->XMLPost();

    $this->app->DB->Insert("INSERT INTO gruppen (id) VALUES ('')");

    $id = $this->app->DB->GetInsertID();

    $this->ApiGruppeEdit($id,true);

    $this->XMLResponse(1,"<id>$id</id>");
    $this->app->ExitXentral();
  }


  function ApiGruppeEdit($id="",$internal=false)
  {
    $xmldata = $this->XMLPost();
    $id = $xmldata['id'];
    if($id <=0)
      $id = $this->app->Secure->GetGET("id");

    $id = $this->app->DB->Select("SELECT id FROM gruppen WHERE id='$id' LIMIT 1");
    // Key gibt es nicht
    if($id <= 0)
      $this->XMLResponse(5);

    $xmldata = $this->XMLPost();

    if($xmldata['porto_preis']!="" && $xmldata['porto_artikelid']!="" && !is_array($xmldata['porto_preis']))
    {
      $this->app->erp->AddVerkaufspreisGruppe($xmldata['porto_artikelid'],1,$id,$xmldata['porto_preis']);
    }

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value)) {
        $value='';
      }
      if($key==='internebemerkung') {
        $value = html_entity_decode($value);
      }
      if($key!=='id'){
        $this->app->DB->Update("UPDATE gruppen SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }

    if($internal){
      return $id;
    }

    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }


  public function ApiGruppeGet()
  {
    $xmldata = $this->XMLPost();
    if($xmldata['id'] == '') {
      $id = $this->app->Secure->GetGET("id");
    }else{
      $id =$xmldata['id'];
    }
    //checl
    $id = $this->app->DB->Select("SELECT id FROM gruppen WHERE id='$id' LIMIT 1");

    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLGruppe($id, $this->usecdata));
      $this->app->ExitXentral();
    }

    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }


  // alte funktion
  public function ApiShopimages()
  {
    $artikel = $this->app->Secure->GetGET("artikel");
    $number = $this->app->Secure->GetGET("number");
    $datei = $this->app->DB->SelectArr("SELECT datei FROM  datei_stichwoerter WHERE subjekt='Shopbild' AND objekt='Artikel' AND parameter='$artikel'");
    if($number <= 0) $number = 1;

    $datei = $datei[$number-1]['datei'];

    $mimetype = mime_content_type($this->app->erp->GetDateiPfad($datei));
    // Wir werden eine PDF Datei ausgeben
    header('Content-type: '.$mimetype);
    echo $this->app->erp->GetDatei($datei);
    $this->app->ExitXentral();
  }

  public function ApiExportVorlageGet()
  {
    $id = $this->app->Secure->GetGET("id");
    $projekt = $this->app->Secure->GetGET("projekt");
    $von = $this->app->Secure->GetGET("von");
    $bis = $this->app->Secure->GetGET("bis");

    if($id!="")
    {
      if($projekt!="")
      {
        $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' LIMIT 1");
      }
    }

    //check
    $id = $this->app->DB->Select("SELECT id FROM exportvorlage WHERE id='$id' AND apifreigabe=1 LIMIT 1");

    $filter['projekt']=$projekt;
    $filter['von']=$von;
    $filter['bis']=$bis;

    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLExportVorlage($id, $filter, $this->usecdata));
      $this->app->ExitXentral();
    }

    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }

  public function ApiBerichteGet()
  {
    $id = $this->app->Secure->GetGET("id");

    $xmldata = $this->XMLPost();
    if($id=="") $id = $xmldata['id'];

    $id = $this->app->DB->Select("SELECT id FROM berichte WHERE id='$id' LIMIT 1");

    if($id > 0){
      $this->XMLResponse(1, $this->app->erp->XMLBerichte($id, $this->usecdata));
      $this->app->ExitXentral();
    }
    $this->XMLResponse(5);
    $this->app->ExitXentral();
  }

  public function ApiArtikelList($intern = false)
  {
    $xmldata = $this->XMLPost();
    $keys = array_keys($xmldata);
    $sql = "SELECT SQL_CALC_FOUND_ROWS a.id,  a.* FROM artikel a";
    if($xmldata['kategorie'] != ''){
      $sql = "SELECT SQL_CALC_FOUND_ROWS a.id,  a.*,ak.bezeichnung FROM artikel a";
      $tabellenkuerzel = "a.";
      $sql .= "  inner join artikelkategorien ak on ak.id = SUBSTRING_INDEX(a.typ,'_',1)";
    }
    $wherevorhanden = false;
    $ckeys = (!empty($keys)?count($keys):0);
    for($i=0; $i<$ckeys; $i++){
      if( ($keys[$i] != "order") && ($keys[$i] != "field") && ($keys[$i] != "limit") && ($keys[$i] != "offset") ){
        $this->app->DB->Select("SELECT '" . $keys[$i] . "' FROM artikel LIMIT 1");
        if ($this->app->DB->error() == '') {
          if ($wherevorhanden == false) {
            if($keys[$i] == 'kategorie'){
              // schauen ob mehrere kategorien
              if(is_array($xmldata[$keys[$i]])){
                $sql .= " WHERE (";
                foreach($xmldata[$keys[$i]] as $katvalue){
                  if(is_numeric($katvalue)){
                    $sql .= " ak.id = '" . $katvalue . "' OR ";
                  } else {
                    $sql .= " ak.bezeichnung LIKE '%" . $katvalue . "%' OR ";
                  }
                }
                $sql = rtrim($sql, " OR");
                $sql .= " ) ";

              }else{
                if(is_numeric($xmldata[$keys[$i]])){
                  $sql .= " WHERE ak.id = '" . $xmldata[$keys[$i]] . "' AND ";
                } else {
                  $sql .= " WHERE ak.bezeichnung LIKE '%" . $xmldata[$keys[$i]] . "%' AND ";
                }
              }
            } else {
              $sql .= " WHERE " . $tabellenkuerzel.$keys[$i] . " LIKE '%" . $xmldata[$keys[$i]] . "%' AND ";
            }

            $wherevorhanden = true;
          } else {
            if($keys[$i] === 'kategorie') {
              $sql .= "ak.bezeichnung LIKE '%" . $xmldata[$keys[$i]] . "%' AND ";
            }elseif($keys[$i] === 'nummer') {
              if(is_array($xmldata[$keys[$i]])) {

              } else{
                $sql .= $tabellenkuerzel . $keys[$i] . " LIKE '%" . $xmldata[$keys[$i]] . "%' AND ";
              }
            } else{
              $sql .= $tabellenkuerzel.$keys[$i] . " LIKE '%" . $xmldata[$keys[$i]] . "%' AND ";
            }
          }
        }
      }
    }
    $sql = trim($sql);
    $sql = rtrim($sql, " AND");

    if (array_key_exists('order', $xmldata)) {
      if (is_array($xmldata['order'])) {
        $orderkeys = array_keys($xmldata['order']);
        if (array_key_exists('field', $xmldata['order'])) {
          if ($xmldata['order']['field'] != "") {
            $this->app->DB->Select("SELECT " . $xmldata['order']['field'] . " FROM artikel LIMIT 1");
            if ($this->app->DB->error() == '') {
              if ($xmldata['order']['desc'] == 0 || $xmldata['order']['desc'] == "") {
                $sql .= " ORDER BY " . $tabellenkuerzel . $xmldata['order']['field'] . " ASC";
              } elseif ($xmldata['order']['desc'] == 1) {
                $sql .= " ORDER BY " . $tabellenkuerzel . $xmldata['order']['field'] . " DESC";
              }
            }
          }

        }
      }

      if (array_key_exists('limit', $xmldata)) {
        if ($xmldata['limit'] > 0) {
          if (array_key_exists('offset', $xmldata)) {
            if ($xmldata['offset'] != "") {
              $sql .= " LIMIT " . $xmldata['offset'] . ", " . $xmldata['limit'];
            } else {
              $sql .= " LIMIT " . $xmldata['limit'];
            }
          } else {
            $sql .= " LIMIT " . $xmldata['limit'];
          }
        }
      }
    }

    $ergebnis = $this->app->DB->SelectArr($sql);
    $anz_gesamt = $this->app->DB->Select("SELECT FOUND_ROWS()");
    if(!is_array($ergebnis)){
      $this->XMLResponse(1,$sql);
    }

    $output = "";

    if((!empty($ergebnis)?count($ergebnis):0)>0)
    {
      $output .= "<items>";

      $cergebnis = (!empty($ergebnis)?count($ergebnis):0);
      for($i=0;$i<$cergebnis;$i++)
      {
        $output .= "<item>";

        foreach($ergebnis[$i] as $key=>$value){
          if($this->usecdata) {
            $output .= "<$key><![CDATA[" . htmlspecialchars($value) . "]]></$key>";
          }else{
            $output .= "<$key>" . htmlspecialchars($value) . "</$key>";
          }
        }
        $output .= "</item>";
      }
      $output .= "<anz_gesamt>".$anz_gesamt."</anz_gesamt>";
      $output .= "<anz_result>".(!empty($ergebnis)?count($ergebnis):0)."</anz_result>";
      $output .= "<sql>".$sql."</sql>";
      $output .= "</items>";
    }

    if($output != ""){
      if ($intern != false) {
        return $output;
      }
      $this->XMLResponse(1, $output);
      $this->app->ExitXentral();
    }
    if ($intern != false) {
      return false;
    }
    $this->XMLResponse(4);
    $this->app->ExitXentral();
  }

  public function ApiArtikelStueckliste()
  {
    $xmldata = $this->XMLPost();

    $keys = array_keys($xmldata);

    //$this->app->erp->LogFile(print_r($xmldata, 1));

    $mineininserterfolgreich = false;

    if(array_key_exists('stuecklistevonartikel', $xmldata)){
      $artikelvorhanden = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$xmldata['stuecklistevonartikel']."' LIMIT 1");
      if($artikelvorhanden != ""){
        $altestueckliste = $this->app->DB->SelectArr("SELECT id FROM stueckliste WHERE stuecklistevonartikel = '$artikelvorhanden'");
        if(array_key_exists('items', $xmldata)){
          if(is_array($xmldata['items'])){
            if($xmldata['items']['item'][1] != ""){
              $stuecklistearray = $xmldata['items']['item'];
            }else{
              $stuecklistearray = $xmldata['items'];
            }
            foreach($stuecklistearray as $key=>$value){
              if(array_key_exists('stuecklistemenge', $value)){
                $stuecklistemenge = str_replace(',', '.', $value['stuecklistemenge']);
                if($stuecklistemenge > 0){
                  if(array_key_exists('nummer', $value)){
                    $nummervorhanden = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$value['nummer']."' LIMIT 1");
                    if($nummervorhanden != ""){
                      //hier optional
                      if(array_key_exists('stuecklisteart', $value) && !is_array($value['stuecklisteart'])){//standard et
                        $stuecklisteart = $value['stuecklisteart'];
                        if($stuecklisteart != "et" && $stuecklisteart != "it" && $stuecklisteart != "bt"){
                          $stuecklisteart = "et";
                        }else{
                          $stuecklisteart = $value['stuecklisteart'];
                        }
                        if($stuecklisteart == ""){
                          $stuecklisteart = "et";
                        }
                      }else{
                        $stuecklisteart = "et";
                      }
                      if(array_key_exists('stuecklistealternative', $value) && !is_array($value['stuecklistealternative'])){
                        $stuecklistealternative = $value['stuecklistealternative'];
                        if($stuecklistealternative == ""){
                          $stuecklistealternative = "0";
                        }else{
                          $alternativevorhanden = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '$stuecklistealternative' LIMIT 1");
                          if($alternativevorhanden != ""){
                            $stuecklistealternative = $alternativevorhanden;
                          }else{
                            $stuecklistealternative = 0;
                          }
                        }
                      }else{
                        $stuecklistealternative = "0";
                      }
                      if(array_key_exists('stuecklistereferenz', $value) && !is_array($value['stuecklistereferenz'])){
                        $stuecklistereferenz = $value['stuecklistereferenz'];
                        if($stuecklistereferenz == ""){
                          $stuecklistereferenz = "";
                        }
                      }else{
                        $stuecklistereferenz = "";
                      }
                      if(array_key_exists('stuecklistelayer', $value) && !is_array($value['stuecklistelayer'])){//standard Top
                        if($value['stuecklistelayer'] != "Top" && $value['$stuecklistelayer'] != "Bottom"){
                          $stuecklistelayer = "Top";
                        }else{
                          $stuecklistelayer = $value['stuecklistelayer'];
                        }
                        if($stuecklistelayer == ""){
                          $stuecklistelayer = "Top";
                        }
                      }else{
                        $stuecklistelayer = "Top";
                      }
                      if(array_key_exists('stuecklisteplatzierung', $value) && !is_array($value['stuecklisteplatzierung'])){//standard DP
                        if($value['stuecklisteplatzierung'] != "DP" && $value['$stuecklisteplatzierung'] != "DNP"){
                          $stuecklisteplatzierung = "DP";
                        }else{
                          $stuecklisteplatzierung = $value['stuecklisteplatzierung'];
                        }
                        if($stuecklisteplatzierung == ""){
                          $stuecklisteplatzierung = "DP";
                        }
                      }else{
                        $stuecklisteplatzierung = "DP";
                      }
                      if(array_key_exists('stuecklistewert', $value) && !is_array($value['stuecklistewert'])){
                        $stuecklistewert = $value['stuecklistewert'];
                        if($stuecklistewert == ""){
                          $stuecklistewert = "";
                        }
                      }else{
                        $stuecklistewert = "";
                      }
                      if(array_key_exists('stuecklistebauform', $value) && !is_array($value['stuecklistebauform'])){
                        $stuecklistebauform = $value['stuecklistebauform'];
                        if($stuecklistebauform == ""){
                          $stuecklistebauform = "";
                        }
                      }else{
                        $stuecklistebauform = "";
                      }
                      if(array_key_exists('stuecklistezachse', $value) && !is_array($value['stuecklistezachse'])){
                        $stuecklistezachse = $value['stuecklistezachse'];
                        if($stuecklistezachse == ""){
                          $stuecklistezachse = "";
                        }
                      }else{
                        $stuecklistezachse = "";
                      }
                      if(array_key_exists('stuecklistexposition', $value) && !is_array($value['stuecklistexposition'])){
                        $stuecklistexposition = $value['stuecklistexposition'];
                        if($stuecklistexposition == ""){
                          $stuecklistexposition = "";
                        }
                      }else{
                        $stuecklistexposition = "";
                      }
                      if(array_key_exists('stuecklisteyposition', $value) && !is_array($value['stuecklisteyposition'])){
                        $stuecklisteyposition = $value['stuecklisteyposition'];
                        if($stuecklisteyposition == ""){
                          $stuecklisteyposition = "";
                        }
                      }else{
                        $stuecklisteyposition = "";
                      }

                      $this->app->DB->Insert("INSERT INTO stueckliste (artikel, referenz, place, layer, stuecklistevonartikel, 
                        menge, firma, wert, bauform, alternative, zachse, xpos, ypos, art) 
                              VALUES ('$nummervorhanden', '$stuecklistereferenz', '$stuecklisteplatzierung', '$stuecklistelayer', '$artikelvorhanden', 
                              '$stuecklistemenge', 1, '$stuecklistewert', '$stuecklistebauform', '$stuecklistealternative', '$stuecklistezachse', '$stuecklistexposition', '$stuecklisteyposition', '$stuecklisteart')");

                      if(!$this->app->DB->error()){
                        $this->app->DB->Update("UPDATE artikel SET stueckliste = 1 WHERE id = '$artikelvorhanden'");
                        $mineininserterfolgreich = true;
                      }

                    }else{
                      $this->XMLResponse(4);
                    }
                  }
                }else{
                  $this->XMLResponse(4);
                }
              }
            }

            if($mineininserterfolgreich == true){
              foreach($altestueckliste as $key2=>$value2){
                $this->app->DB->Delete("DELETE FROM stueckliste WHERE id = '".$value2['id']."'");
              }
              $this->XMLResponse(1);
              $this->app->ExitXentral();
            }
          }
        }
      }else{
        $this->XMLResponse(4);
      }
    }else{
      $this->XMLResponse(4);
    }
  }


  public function ApiAdresseAccountsGet()
  {
    $xmldata = $this->XMLPost();
    $id = $this->app->Secure->GetGET("id");
    $art = $this->app->Secure->GetGET("art");
    if($xmldata['id']!=''){
      $id = $xmldata['id'];
    }
    if($xmldata['art']!=''){
      $art = $xmldata['art'];} else{$art = '%%';
    }
    $filter['art']=$art;
    $filter['id']=$id;
    if($id > 0 ) {
      $this->XMLResponse(1, $this->app->erp->XMLAdresseAccounts($filter, $this->usecdata));
    } else {
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  public function ApiAdresseAccountCreate()
  {
    $xmldata = $this->XMLPost();

    if($xmldata['adresse'] == '' || is_array($xmldata['adresse']) || $xmldata['bezeichnung'] == '' || is_array($xmldata['bezeichnung'])){
      $this->XMLResponse(5, "<error>Adress-ID und/oder Bezeichnung fehlt</error>");
      $this->app->ExitXentral();
    }

    $newId = $this->app->erp->CreateAccount($xmldata['adresse'],$xmldata);
    $this->XMLResponse(1,"<id>$newId</id>");
    $this->app->ExitXentral();
  }

  public function ApiAdresseAccountEdit(){

    $id = $this->app->Secure->GetGET("id");
    if($id==''){
      $xmldata = $this->XMLPost();
      $id = $xmldata['id'];
    }
    $id = $this->app->DB->Select("SELECT id FROM adresse_accounts WHERE id='$id' LIMIT 1");

    // Key gibt es nicht
    if($id <= 0){
      $this->XMLResponse(5);
    }

    $xmldata = $this->XMLPost();

    foreach($xmldata as $key=>$value)
    {
      if(is_array($value))
      {
        $value='';
      }
      if($key!=="id"){
        if($key === "gueltig_ab" || $key === "gueltig_bis"){
          if($value == "" || $value == "0000-00-00" || $value === "00.00.0000"){
            $value = '0000-00-00';
          }else{
            $value = date('Y-m-d',strtotime($value));
          }
        }
        $this->app->DB->Update("UPDATE adresse_accounts SET $key='$value' WHERE id='$id' LIMIT 1");
      }
    }

    $this->XMLResponse(1);
    $this->app->ExitXentral();
  }

  public function ApiArtikelkontingenteGet()
  {
    $xmldata = $this->XMLPost();
    if(is_array($xmldata) && !empty($xmldata)){
      $filter = $xmldata;
    }else{
      $filter['id'] = $this->app->Secure->GetGET("id");
      $filter['projekt'] = $this->app->Secure->GetGET("projekt");
      $filter['nummer'] = $this->app->Secure->GetGET("nummer");
      $filter['von'] = $this->app->Secure->GetGET("von");
      $filter['bis'] = $this->app->Secure->GetGET("bis");
    }

    if($filter['nummer']!="" || $filter['id']!=""){
      $this->XMLResponse(1, $this->app->erp->XMLArtikelkontingente($filter, $this->usecdata));
    }
    else{
      $this->XMLResponse(5);
    }
    $this->app->ExitXentral();
  }

  protected function getApiAccount(){
    if(!$this->apiAccount){
      $this->apiAccount = $this->apiAccountService->getApiAccountById($this->api_id);
    }

    return $this->apiAccount;
  }

    public function EventAPIAdd($eventname,$parameter,$module,$action,$kommentar='', $api = 0)
    {
      $module_call_from = isset($this->app->Secure)?$this->app->Secure->GetGET('module'):'';

      try {
        $apiaktiv = $this->getApiAccount()->isActive();
      } catch (ApiAccountNotFoundException $e){
        $apiaktiv = false;
      }


      if($module_call_from !=='api')
      {
        $uebertragungen = $this->app->DB->SelectArr("select a.id FROM api_account a INNER JOIN uebertragungen_account u ON a.id = u.api AND a.aktiv=1 AND u.aktiv = 1 INNER JOIN uebertragungen_event_einstellungen e ON u.id = e.uebertragung_account AND e.aktiv = 1 WHERE e.eventname = '$eventname' group by a.id");

        if($uebertragungen)
        {
          foreach($uebertragungen as  $uebertragung)
          {
            $aacount = $uebertragung['id'];
            if($aacount){
              $this->app->DB->Insert("INSERT INTO event_api (id,cachetime,eventname,parameter,retries,module,action,kommentar,api)
          VALUES ('',NOW(),'$eventname','$parameter','0','$module','$action','$kommentar','$aacount')");
              $tmpid =  $this->app->DB->GetInsertID();
              $this->EventCall($tmpid);
            }
          }
        }
      }

      if($apiaktiv === true && $module_call_from !== 'api')
      {
        $this->app->DB->Insert("INSERT INTO event_api (cachetime,eventname,parameter,retries,module,action,kommentar,api)
        VALUES (NOW(),'$eventname','$parameter','0','$module','$action','$kommentar','$api')");
        $tmpid =  $this->app->DB->GetInsertID();
        $this->EventCall($tmpid);
      } else {
        return false;
      }

      return null;
    }

    /**
     * @param int $id
     *
     * @return bool
     */
    public function EventCall($id)
    {
      $eventApiArr = $id <= 0?null:$this->app->DB->SelectRow(
        sprintf(
          'SELECT * FROM `event_api` WHERE `id` = %d LIMIT 1',
          $id
        )
      );

      if(empty($eventApiArr)) {
        return false;
      }

      $eventname = $eventApiArr['eventname'];
      $parameter = $eventApiArr['parameter'];
      $module = $eventApiArr['module'];
      $action = $eventApiArr['action'];
      $api = $eventApiArr['api'];

      switch($module)
      {
        case "adresse":
          $xml = $this->app->erp->XMLAdresse($parameter);
          break;

        case "artikel":
          $xml = $this->app->erp->XMLArtikel($parameter, $api);
          break;

        case "auftrag":
          $xml = $this->app->erp->XMLAuftrag($parameter);
          break;

        case "gruppe":
          $xml = $this->app->erp->XMLGruppe($parameter);
          break;

        case "adresse_kontakt":
          $xml = $this->app->erp->XMLAdresseKontakt($parameter);
          break;

        default:
          $this->app->DB->Delete("DELETE FROM event_api WHERE id='$id' LIMIT 1");
          return false;
      }

      $hash = $this->generateHashFromApi($api);
      //$result = $this->EventSendRequest($eventname,$xml,$hash,"&id=".$parameter);
      //Hack
      $result_body = null;
      $result = $this->EventSendRequest($eventname,$xml,$hash,"&id=".$parameter,$result_body, $api);
      switch($eventname) {
        case "EventArtikelCreate":
          if($api && $parameter)
          {
            if(isset($result_body['xml']['id']) && $result_body['xml']['id']!="")
            {
              $this->app->DB->Insert("INSERT INTO api_mapping (tabelle, id_int, id_ext, api, zeitstempel) VALUES ('artikel','$parameter','".$this->app->DB->real_escape_string($result_body['xml']['id'])."','$api',now())");
            }
          }
          break;
        case "EventAuftragEdit":
          //print_r($result_body);
          if(isset($result_body['xml']['belegnr']) && $result_body['xml']['belegnr']!="")
          {
            $this->app->DB->Update("UPDATE auftrag SET belegnr='".$result_body['xml']['belegnr']."' WHERE id='".$parameter."' AND id > 0 LIMIT 1");
            $this->app->DB->Delete("DELETE FROM event_api WHERE id='$id' LIMIT 1");
          }
          break;
        default:
          $result = true;
      }

      if($result===false) {
        $this->app->DB->Update("UPDATE event_api SET retries=retries+1 WHERE id='$id' LIMIT 1");
        return false;
      }
      $this->app->DB->Delete("DELETE FROM event_api WHERE id='$id' LIMIT 1");

      return true;
    }

    public function EventSendRequest($methodname,$xml,$hash,$parameter='',&$result_body='', $api = 0)
    {
      try {
        $url = $this->getApiAccount()->getEventUrl();
      } catch (ApiAccountNotFoundException $e){
        return false;
      }

      if($url == ''){
        return false;
      }

      $xml ='<?xml version="1.0" encoding="UTF-8"?>
      <request>
      <status>
      <function>'.$methodname.'</function>
      </status>
      <xml>'.$xml.'</xml>
      </request>';

      if(strpos($url,'?') === false){
        $url = $url.'?hash='.$hash.$parameter;
      } else{
        $url = $url.'&hash='.$hash.$parameter;
      }
      if(strpos($url,'module=api') === false){
        $url .= '&module=api';
      }
      $url .= '&action='.substr($methodname,5);
      $data = array('xml' => $xml);

      // use key 'http' even if you send the request to https://...
      $options = array(
        'http' => array(
          'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
          'method'  => 'POST',
          'content' => http_build_query($data),
        ),
      );
      $context  = stream_context_create($options);
      $result = file_get_contents($url, false, $context);

      if($result===false) {
        return false;
      }

      $deXml = simplexml_load_string($result);
      $deJson = json_encode($deXml);
      $xml_array = json_decode($deJson,TRUE);

      $result_body = $xml_array;
      if(isset($xml_array['xml']['status']['messageCode'])){
        $xml_array['xml']['status']['messageCode'] = strtolower($xml_array['xml']['status']['messageCode']);
        return $xml_array['xml']['status']['messageCode'] == 0;
      }

      return false;
    }

    /**
     * @param string $initKey
     * @param string $remoteDomain
     *
     * @return string
     */
    public function generateHashFromDomainAndKey($initKey, $remoteDomain)
    {
      $date = gmdate('dmY');

      $hash = '';

      for($i = 0; $i <= 200; $i++) {
        $hash = sha1($hash . $initKey . $remoteDomain . $date);
      }

      return $hash;
    }

    /**
     * @param int $id
     *
     * @return string
     */
    public function generateHashFromApi($id = 0)
    {
      try {
        $initKey = $this->getApiAccount()->getInitKey();
        $remoteDomain = $this->getApiAccount()->getRemoteDomain();
      } catch (ApiAccountNotFoundException $e){
        $initKey = '';
        $remoteDomain = '';
      }

      return $this->generateHashFromDomainAndKey($initKey, $remoteDomain);
    }

    public function GetPlainText($string)
    {
      $string = str_replace('NONBLOCKINGZERO','&#65279;',$string);
      return htmlspecialchars(trim(html_entity_decode($string, ENT_QUOTES, 'UTF-8')));
    }


    public function XMLGruppe($id, $cdata = false)
    {
      if($id > 0){
        $arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM gruppen WHERE id=%d LIMIT 1',$id));
      }
      if(empty($arr)){
        return '';
      }
      $result = '';
      foreach($arr as $key=>$value) {
        if(is_array($value)){
          $value='';
        }
        if($cdata && $value != '' && !is_numeric($value)) {
          $result .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
        }else{
          $result .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
        }
      }
      return $result;
    }

    public function XMLAdresseKontakt($id, $cdata = false)
    {
      if($id > 0){
        $address_arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM adresse_kontakte WHERE id=%d LIMIT 1', $id));
      }
      if(empty($address_arr)){
        return '';
      }
      $result = '';
      foreach($address_arr as $key=>$value)
      {
        if(is_array($value)){
          $value='';
        }
        if($cdata && $value != '' && !is_numeric($value)) {
          $result .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
        }else{
          $result .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
        }
      }
      return $result;
    }


    public function XMLAdresse($id, $cdata = false)
    {
      if($id > 0){
        $address_arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM adresse WHERE id=%d LIMIT 1',$id));
      }
      if(empty($address_arr)){
        return '';
      }
      $result = '';
      foreach($address_arr as $key=>$value) {
        if(is_array($value)){
          $value='';
        }
        if($cdata && $value != '' && !is_numeric($value)) {
          $result .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
        }else{
          $result .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
        }
      }
      return $result;
    }

    public function XMLAuftrag($id, $doctype = 'auftrag', $cdata = false)
    {
      if($id > 0 && !empty($doctype)){
        $order_arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM `%s` WHERE id=%d LIMIT 1',$doctype,$id));
      }
      if(empty($order_arr)){
        return '';
      }
      $result = '';

      foreach($order_arr as $key=>$value)
      {
        if(is_array($value)){
          $value='';
        }
        if($cdata && $value != '' && !is_numeric($value)) {
          $result .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
        }else{
          $result .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
        }
      }

      if (in_array($doctype, array('gutschrift', 'rechnung'))) {
        $sqlExplodiertParent = 'AND ap.explodiert_parent_artikel<=0';
      }
      else if ($doctype==="bestellung")
      {
        $sqlExplodiertParent ='';
      }
      else {
        $sqlExplodiertParent = 'AND ap.explodiert_parent<=0';
      }
      $order_arr = $this->app->DB->SelectArr("SELECT ap.*, art.ean FROM $doctype"."_position ap LEFT JOIN artikel art ON ap.artikel = art.id WHERE ap.$doctype='$id' {$sqlExplodiertParent} ORDER by ap.sort");

      $result .='<artikelliste>';
      $corder_arr = !empty($order_arr)?count($order_arr):0;
      for($i=0;$i<$corder_arr;$i++)
      {
        $result .='<position>';
        foreach($order_arr[$i] as $key=>$value)
        {
          if(is_array($value)){
            $value='';
          }
          if($cdata && $value != '' && !is_numeric($value)) {
            $result .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
          }else{
            $result .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
          }

        }
        $result .='</position>';
      }
      $result .='</artikelliste>';
      return $result;
    }

    public function XMLBenutzer($id, $cdata = false)
    {
      if($id > 0){
        $address_arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM user WHERE id=%d LIMIT 1',$id));
      }
      if(empty($address_arr))
      {
        return '';
      }
      $result = '';
      foreach($address_arr as $key=>$value)
      {
        if(is_array($value))$value='';
        if($key==='startseite')
          $result .='<'.$key.'>'.$this->app->erp->base64_url_encode($value).'</'.$key.'>';
        else {
          if($cdata && $value != '' && !is_numeric($value)) {
            $result .= '<' . $key . '><![CDATA[' . ($value) . ']]></' . $key . '>';
          }else {
            $result .= '<' . $key . '>' . $this->GetPlainText($value) . '</' . $key . '>';
          }
        }
      }
      return $result;
    }

    public function XMLAdresseAccounts($filter=array(), $cdata = false)
    {
      if(!empty($filter['id'])){
        $sql = "SELECT * FROM adresse_accounts WHERE adresse='" . $filter['id'] . "' AND art LIKE '" . $filter['art'] . "' AND aktiv=1";
        $result = $this->app->DB->SelectArr($sql);
      }
      if(empty($result))
      {
        return '';
      }
      $output ='<adresse_accounts>';
      foreach($result as $account)
      {
        $output .='<account>';
        foreach($account as $key=>$value)
        {
          if($cdata && $value != '' && !is_numeric($value))
          {
            $output .= sprintf('<%1$s><![CDATA[%2$s]]></%1$s>', $key, $value);
          }else
            $output .= sprintf('<%1$s>%2$s</%1$s>', $key, $value);
        }
        $output .='</account>';
      }
      $output .='</adresse_accounts>';
      return $output;
    }

    public function XMLBerichte($id, $cdata = false){
      if($id > 0){
        $result = $this->app->DB->SelectRow(sprintf('SELECT * FROM berichte WHERE id = %d LIMIT 1', $id));
      }
      if(empty($result) || empty($result['struktur']))
      {
        return '';
      }

      $rows = $this->app->DB->SelectArr($result['struktur']);
      $output ='<items>';
      if(!empty($rows)) {
        foreach($rows as $row) {
          $output .='<item>';
          foreach($row as $key=>$value)
          {
            if($cdata && $value != '' && !is_numeric($value)) {
              $output .= "<" . $key . "><![CDATA[" . ($value) . "]]></" . $key . ">";
            }else{
              $output .= "<" . $key . ">" . $this->GetPlainText($value) . "</" . $key . ">";
            }
          }
          $output .='</item>';
        }
      }
      $output .='</items>';
      return $output;
    }

    public function XMLArtikelkontingente($filter=array(), $cdata = false)
    {
      if($filter['id']=='')
      {
        if($filter['projekt']!='')
        {
          $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='".$filter['projekt']."' AND abkuerzung!=''");
          if($projekt > 0){
            $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='" . $filter['nummer'] . "' AND projekt = $projekt AND nummer!='' LIMIT 1");
          }else{
            $artikel = 0;
          }
        } else {
          $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$filter['nummer']."' AND nummer!='' LIMIT 1");
        }
      } else {
        $artikel = $filter['id'];
      }
      if($artikel > 0){
        $artikel = $this->app->DB->Select(sprintf('SELECT id FROM artikel WHERE id = %d LIMIT 1', $artikel));
      }
      if($artikel <= 0)
      {
        return '';
      }

      if($filter['von']!='')
      {
        $fall = 1;
        $result = $this->app->DB->SelectArr("SELECT SUM(ap.menge) as gebucht,
        if(ak.menge IS NULL,(SELECT ak2.menge FROM artikelkontingente ak2 WHERE (ak2.datum='1970-01-01' OR ak2.datum='0000-00-00' OR ak2.datum IS NULL) AND ak2.artikel=ap.artikel),ak.menge)
            as menge,
        if(a.lieferdatum ='0000-00-00' OR a.lieferdatum is NULL, a.datum, a.lieferdatum) as datum
        FROM auftrag_position ap
          LEFT JOIN auftrag a ON a.id=ap.auftrag
          LEFT JOIN artikelkontingente ak ON ak.artikel=ap.artikel AND if(a.lieferdatum ='0000-00-00' OR a.lieferdatum is NULL, a.datum, a.lieferdatum)=ak.datum
          WHERE
            if(a.lieferdatum ='0000-00-00' OR a.lieferdatum is NULL,
              (a.datum >='".$filter['von']."' AND a.datum <='".$filter['bis']."'),(a.lieferdatum >='".$filter['von']."' AND a.lieferdatum <='".$filter['bis']."'))
            AND a.status='freigegeben'
          AND ap.artikel='$artikel' GROUP by 3 ORDER by 3");
      }
      else {
        $fall = 2;
        $result = $this->app->DB->SelectArr("SELECT * FROM artikelkontingente ak WHERE ak.artikel='$artikel' AND (datum >= DATE_FORMAT(NOW(),'%Y-%m-%d') OR datum='0000-00-00' OR datum='1970-01-01')");
      }

      if(empty($result))
      {
        return '';
      }

      $output = '<artikelkontingente>';
      foreach($result as $artikelkontigent) {
        $output .='<kontingent>';
        foreach($artikelkontigent as $key=>$value)
        {
          if($key==='datum') {
            $value=str_replace('1970-01-01','0000-00-00',$value);
          }

          if($key!=='id' && $key!=='artikel')
          {
            if($cdata && $value != '' && !is_numeric($value)) {
              $output .= '<' . $key . '><![CDATA[' . ($value) . ']]></' . $key . '>';
            }else{
              $output .= '<' . $key . '>' . $this->GetPlainText($value) . '</' . $key . '>';
            }
          }
          if($key==='datum' && $fall==2)
          {
            $gebucht = $this->app->DB->Select(sprintf('SELECT SUM(ap.menge) 
              FROM auftrag_position AS ap 
              INNER JOIN auftrag a ON a.id=ap.auftrag
              WHERE a.lieferdatum=\'%s\' AND a.status=\'freigegeben\' AND ap.artikel= %d ',$value, $artikel));
            if($gebucht <=0) {
              $gebucht = 0;
            }
            $output .='<gebucht>'.$gebucht.'</gebucht>';
          }
        }
        $output .='</kontingent>';
      }
      $output .='</artikelkontingente>';

      return $output;
    }

    public function XMLExportVorlage($id,$filter=array(), $cdata = false)
    {
      /** @var Exportvorlage $tmp */
      $tmp = $this->app->erp->LoadModul('exportvorlage');
      $csv = $tmp->ExportvorlageExport(true,$id,$filter);

      $csv_array = preg_split ('/$\R?^/m', $csv);

      if($id > 0){
        $vorlageArr = $this->app->DB->SelectRow(sprintf('SELECT exporttrennzeichen, exporterstezeilenummer,exportdatenmaskierung FROM exportvorlage WHERE id= %d  LIMIT 1', $id));
      }
      if(!empty($vorlageArr))
      {
        $exporttrennzeichen = $vorlageArr['exporttrennzeichen'];
        $exportdatenmaskierung = $vorlageArr['exportdatenmaskierung'];
        $exporterstezeilenummer = $vorlageArr['exporterstezeilenummer'];
      }else{
        $exporttrennzeichen = '';
        $exportdatenmaskierung = '';
        $exporterstezeilenummer = '';
      }

      if($exporttrennzeichen==='semikolon') {
        $exporttrennzeichen=';';
      }
      else if($exporttrennzeichen==='komma') {
        $exporttrennzeichen=',';
      }
      else if($exporttrennzeichen==='tab') {
        $exporttrennzeichen="\t";
      }
      else {
        $exporttrennzeichen=';';
      }

      if($exportdatenmaskierung==='gaensefuesschen') {
        $exportdatenmaskierung='"';
      } else {
        $exportdatenmaskierung='';
      }

      $output = '';
      $field_name = [];
      $counter = 0;
      if(!empty($csv_array)){
        foreach ($csv_array as $row) {
          $fields = explode($exporttrennzeichen, $row);
          if($counter == 0){
            foreach ($fields as $value) {
              if($exportdatenmaskierung != ''){
                $value = str_replace($exportdatenmaskierung, '', $value);
              }
              $field_name[] = $value;
            }
          }else{
            $output .= '<item>';
            foreach($field_name as $field_index => $fieldValue) {
              $value = str_replace('"', '', $fields[$field_index]);
              if($cdata && $value != '' && !is_numeric($value)){
                $output .= '<' . $field_name[$field_index] . '><![CDATA[' . $value . ']]></' . $field_name[$field_index] . ">\r\n";
              }else{
                $output .= '<' . $field_name[$field_index] . '>' . $value . '</' . $field_name[$field_index] . ">\r\n";
              }
            }
            $output .= '</item>';
          }
          $counter++;
        }
      }
      return '<items>'.$output.'</items>';
    }

    public function XMLArtikel($id, $api = 0)
    {
      if($id > 0){
        $artikel_arr = $this->app->DB->SelectRow(sprintf('SELECT * FROM artikel WHERE id=%d LIMIT 1',$id));
      }
      $result = '';
      if(!empty($artikel_arr)){
        foreach ($artikel_arr as $key => $value) {
          if($key !== 'usereditid' && $key !== 'useredittimestamp'){
            if(is_array($value)){
              $value = '';
            }
            if($key === 'id' && $api){
              $extid = $this->app->DB->Select("SELECT id_ext FROM api_mapping WHERE tabelle = 'artikel' AND id_int = '$id' AND api = '$api' LIMIT 1");
              if($extid){
                $result .= '<id_ext>' . $this->GetPlainText($extid) . '</id_ext>';
              }
            }
            if($key === 'projekt') $value = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id = '$value' LIMIT 1");
            $result .= '<' . $key . '>' . $this->GetPlainText($value) . "</" . $key . ">";
            if($key === 'typ'){
              if(strpos($value, '_kat') !== false){
                $kategorie = (int)str_replace('_kat', '', $value);
                $bezeichnung = $this->app->DB->Select("SELECT bezeichnung FROM artikelkategorien WHERE id = '" . $kategorie . "' LIMIT 1");
                if($bezeichnung){
                  $result .= '<artikelkategorie>' . $this->GetPlainText($bezeichnung) . '</artikelkategorie>';
                  $extid = $this->app->DB->Select("SELECT id_ext FROM api_mapping WHERE tabelle = 'artikelkategorien' AND id_int = '$kategorie' AND api = '$api' LIMIT 1");
                  if($extid){
                    $result .= '<typ_ext>' . $this->GetPlainText($extid) . '</typ_ext>';
                  }
                }
              }
            }

          }
        }
      }
      // Lagerbestand
      $summe = $this->app->DB->Select("SELECT SUM(lpi.menge) FROM lager_platz_inhalt lpi LEFT JOIN lager_platz lp ON lp.id=lpi.lager_platz WHERE lpi.artikel='$id' AND lp.sperrlager!=1");
      $reserviert = $this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='$id'");// AND datum >= NOW()");
      $auftraege = $this->app->DB->Select("SELECT SUM(ap.menge) as menge,ap.bezeichnung FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel LEFT JOIN auftrag auf ON auf.id=ap.auftrag WHERE a.id='$id' AND a.lagerartikel=1 AND auf.status='freigegeben'");
      $liefern= $this->app->DB->Select("SELECT SUM(ap.menge) as menge,ap.bezeichnung FROM auftrag_position ap, auftrag aa, artikel a WHERE a.id=ap.artikel AND aa.id = ap.auftrag AND a.id='$id' AND a.lagerartikel=1 AND aa.status='freigegeben'");
      $reserviert_im_versand = $this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='$id' AND objekt='lieferschein'");
      $berechnet = $summe - $auftraege - $reserviert_im_versand;
      $verkaufte = $auftraege + $reserviert_im_versand;

      $rest = $summe - $liefern;
      if($reserviert=='') {
        $reserviert =0;
      }
      if($liefern <=0) {
        $liefern=0;
      }

      if($rest > 0) {
        $verfuegbar = (string)$rest;
      } else {
        $verfuegbar = '0';
      }

      $verkaufbare = $this->app->erp->ArtikelAnzahlVerkaufbar($id);
      $summe = round($summe, $this->app->erp->GetLagerNachkommastellen());
      $reserviert = round($reserviert ,$this->app->erp->GetLagerNachkommastellen());
      $liefern = round($liefern ,$this->app->erp->GetLagerNachkommastellen());
      $verkaufte = round($verkaufte ,$this->app->erp->GetLagerNachkommastellen());
      $berechnet = round($berechnet ,$this->app->erp->GetLagerNachkommastellen());
      $verkaufbare = round($verkaufbare ,$this->app->erp->GetLagerNachkommastellen());

      $result .= "<artikel_lagerbestand>$summe</artikel_lagerbestand>";
      $result .= "<artikel_reserviert>$reserviert</artikel_reserviert>";
      $result .= "<artikel_offeneauftraege>$liefern</artikel_offeneauftraege>";
      $result .= "<artikel_verkaufte>$verkaufte</artikel_verkaufte>";
      $result .= "<artikel_berechneterbestand>$berechnet</artikel_berechneterbestand>";
      $result .= "<artikel_verkaufbare>$verkaufbare</artikel_verkaufbare>";

      // stueckliste
      if($artikel_arr['stueckliste']=='1'){
        $arr_stueckliste = $this->app->DB->SelectArr(sprintf('SELECT * FROM stueckliste WHERE stuecklistevonartikel=%d',$id));
        if(!empty($arr_stueckliste)){
          $result .= '<stueckliste_artikel>';
          foreach($arr_stueckliste as $stuecklisteKey => $stuecklisteRow) {
            $artikelArr = $this->app->DB->SelectRow(sprintf('SELECT nummer, projekt 
            FROM artikel WHERE id = %d LIMIT 1', $stuecklisteRow['artikel']));
            if(!empty($artikelArr))
            {
              $arr_stueckliste[$stuecklisteKey]['nummer'] = $artikelArr['nummer'];
              $projekt = $artikelArr['projekt'];
              if($projekt > 0)
              {
                $arr_stueckliste[$stuecklisteKey]['projekt'] = $this->app->DB->Select(
                  sprintf('SELECT abkuerzung 
                    FROM projekt 
                    WHERE id = %d LIMIT 1', $projekt));
              }else{
                $arr_stueckliste[$stuecklisteKey]['projekt'] = '';
              }
            }else{
              $arr_stueckliste[$stuecklisteKey]['nummer'] = '';
              $arr_stueckliste[$stuecklisteKey]['projekt'] = '';
            }
            $result .= '<artikel>';
            $result .= '<menge>' . $arr_stueckliste[$stuecklisteKey]['menge'] . '</menge>';
            $result .= '<nummer>' . $arr_stueckliste[$stuecklisteKey]['nummer'] . '</nummer>';
            $result .= '<artikel>' . $arr_stueckliste[$stuecklisteKey]['artikel'] . '</artikel>';
            $result .= '<projekt>' . $arr_stueckliste[$stuecklisteKey]['projekt'] . '</projekt>';
            $result .= "</artikel>";
          }
          $result .= '</stueckliste_artikel>';
        }
      }
      // einkaufspreise
      $arr_einkauf = $this->app->DB->SelectArr("SELECT * FROM einkaufspreise WHERE artikel='$id' AND (gueltig_bis >= NOW() OR gueltig_bis='0000-00-00')");
      if(!empty($arr_einkauf))
      {
        $result .='<einkaufspreise>';
        foreach($arr_einkauf as $einkaufKey => $einkaufValue) {
          if($einkaufValue['adresse'] > 0){
            $adresseArr = $this->app->DB->SelectRow(sprintf(
              'SELECT projekt, lieferantennummer FROM adresse WHERE id = %d ', $einkaufValue['adresse']
            ));
          }else{
            $adresseArr = null;
          }
          if(!empty($adresseArr))
          {
            $einkaufValue['lieferantennummer'] = $adresseArr['lieferantennummer'];
            $einkaufValue['projekt'] = $adresseArr['projekt'];
          }else{
            $einkaufValue['lieferantennummer'] = '';
            $einkaufValue['projekt'] = 0;
          }
          if($einkaufValue['projekt'] > 0)
          {
            $einkaufValue['projekt'] = $this->app->DB->SelectRow(sprintf('SELECT projekt FROM adresse WHERE id= %d LIMIT 1', $einkaufValue['projekt']));
          }else{
            $einkaufValue['projekt'] = '';
          }

          $result .='<staffelpreis>';
          $result .='<ab_menge>'.$einkaufValue['ab_menge'].'</ab_menge>';
          $result .='<preis>'.$einkaufValue['preis'].'</preis>';
          $result .='<waehrung>'.$einkaufValue['waehrung'].'</waehrung>';
          $result .='<lieferantennummer>'.$einkaufValue['lieferantennummer'].'</lieferantennummer>';
          $result .='<projekt>'.$einkaufValue['projekt'].'</projekt>';
          $result .='<bestellnummer>'.$this->GetPlainText($einkaufValue['bestellnummer']).'</bestellnummer>';
          $result .='<bezeichnunglieferant>'.$this->GetPlainText($einkaufValue['bezeichnunglieferant']).'</bezeichnunglieferant>';
          $result .='</staffelpreis>';
        }
        $result .='</einkaufspreise>';
      }

      // verkaufspreise
      $arr_verkauf = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise WHERE artikel='$id' AND (gueltig_bis >= NOW() OR gueltig_bis='0000-00-00' ) AND geloescht!='1'");
      if(!empty($arr_verkauf))
      {
        $result .='<verkaufspreise>';
        foreach($arr_verkauf as $verkaufValue) {
          if($einkaufValue['adresse'] > 0){
            $adresseArr = $this->app->DB->SelectRow(sprintf(
              'SELECT projekt, lieferantennummer FROM adresse WHERE id = %d ', $verkaufValue['adresse']
            ));
          }else{
            $adresseArr = null;
          }
          if(!empty($adresseArr))
          {
            $verkaufValue['lieferantennummer'] = $adresseArr['lieferantennummer'];
            $verkaufValue['projekt'] = $adresseArr['projekt'];
          }else{
            $verkaufValue['lieferantennummer'] = '';
            $verkaufValue['projekt'] = 0;
          }
          if($verkaufValue['projekt'] > 0)
          {
            $verkaufValue['projekt'] = $this->app->DB->SelectRow(sprintf('SELECT projekt FROM adresse WHERE id= %d LIMIT 1', $einkaufValue['projekt']));
          }else{
            $verkaufValue['projekt'] = '';
          }
          $arr_verkauf[$i]['kundennummer'] = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id='".$arr_verkauf[$i]['adresse']."' LIMIT 1");
          $arr_verkauf[$i]['projekt'] = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='".$arr_verkauf[$i]['adresse']."' LIMIT 1");
          $arr_verkauf[$i]['projekt'] = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$arr_verkauf[$i]['projekt']."' LIMIT 1");

          $result .='<staffelpreis>';
          $result .='<ab_menge>'.$verkaufValue['ab_menge'].'</ab_menge>';
          $result .='<preis>'.$verkaufValue['preis'].'</preis>';
          $result .='<vpe>'.$verkaufValue['vpe'].'</vpe>';
          if($verkaufValue['vpe_menge'] > 0){
            $result .= '<vpe_menge>' . $verkaufValue['vpe_menge'] . '</vpe_menge>';
          }

          $result .='<waehrung>'.$verkaufValue['waehrung'].'</waehrung>';

          if($verkaufValue['kundennummer']!='')
          {
            $result .='<kundennummer>'.$verkaufValue['kundennummer'].'</kundennummer>';
            $result .='<projekt>'.$verkaufValue['projekt'].'</projekt>';
            if($verkaufValue['kundenartikelnummer']!=''){
              $result .= '<kundenartikelnummer>' . $verkaufValue['kundenartikelnummer'] . '</kundenartikelnummer>';
            }
          }
          $result .='</staffelpreis>';
        }
        $result .='</verkaufspreise>';
      }
      return $result;
    }


    public function BelegeimportAusfuehren($idliste = null, $uebertragungen = false)
    {
      $ret = null;
      $erlaubtebelege = array(
        'auftrag',
        'lieferschein',
        'rechnung',
        'gutschrift',
        'angebot',
        'preisanfrage',
        'bestellung',
        'produktion',
        'proformarechnung',
        'retoure'
      );
      $belege = $this->app->DB->SelectArr('SELECT * 
        FROM belegeimport 
        WHERE '.($idliste?' id in ('.implode(', ',$idliste).') ':"userid='".$this->app->User->GetID()."'").' 
        ORDER BY art, beleg_hauptbelegnr, beleg_belegnr,artikel_sort, id');
      if($belege) {
        if($uebertragungen) {
          $transferData = $this->app->DB->SelectRow(
            sprintf(
              'SELECT `api`, `projekt`,`auftrageingang`,`bestellungeingang`, `createproduction`, `ownaddress`, 
                    `createarticleifnotexists`, `createarticleasstoragearticle`
              FROM `uebertragungen_account` 
              WHERE `id` = %d 
              LIMIT 1',
              $uebertragungen
            )
          );
          $this->uebertragung_account = $uebertragungen;
          $this->api_id = $transferData['api'];
          $projekt = $transferData['projekt'];
          $ret = null;
          if(empty($transferData['alldoctypes'])) {
            $erlaubtebelege = array();
            if($transferData['auftrageingang']) {
              $erlaubtebelege[] = 'auftrag';
              $erlaubtebelege[] = 'angebot';
            }
            if($transferData['bestellungeingang']) {
              $erlaubtebelege[] = 'bestellung';
              $erlaubtebelege[] = 'produktion';
            }
          }
        }
        $aktbelegart = false;
        $aktbelegnr = false;
        $aktbelegid = false;
        $hauptbelegnr = false;
        //Für Belegstatus "angelegt", um die Belegnr entfernen zu können
        $erstelltebelegeids = array();
        $erstelltebelegeNichtAngelegtids = [];
        foreach($belege as $beleg) {
          if(!empty($beleg['art'])) {
            $beleg['art'] = trim(strtolower($beleg['art']));
          }
          if($beleg['art'] && $beleg['beleg_belegnr'] && in_array($beleg['art'],$erlaubtebelege)) {
            if($beleg['art'] != $aktbelegart || $beleg['beleg_belegnr'] != $aktbelegnr)
            {
              $projekt = !empty($beleg['projekt'])?$beleg['projekt']:0;
              if(empty($projekt)) {
                $projekt = !empty($beleg['beleg_projekt'])?$beleg['beleg_projekt']:0;
              }
              $aktbelegnr = $beleg['beleg_belegnr'];
              $hauptbelegnr = $beleg['beleg_hauptbelegnr'];
              $aktbelegart = $beleg['art'];
              $aktbelegid = false;
              $alteadresse = $beleg['adresse'];
              if($beleg['adresse'] && $uebertragungen) {
                $beleg['adresse'] = $this->GetFromExtID('adresse', $beleg['adresse']);
              }
              if(!$beleg['adresse'] && $uebertragungen && $beleg['beleg_lieferantennummer'] != '' && ($beleg['art'] === 'bestellung' || $beleg['art'] === 'produktion')) {
                $beleg['adresse'] = $this->app->DB->Select(
                  sprintf(
                    'SELECT id 
                    FROM adresse 
                    WHERE lieferantennummer <> \'\' AND lieferantennummer = \'%s\' AND IFNULL(geloescht,0) = 0
                    ORDER BY projekt = %d DESC 
                    LIMIT 1',
                    $this->app->DB->real_escape_string($beleg['beleg_lieferantennummer']), (int)$beleg['projekt']
                  )
                );
              }

              if($uebertragungen && !empty($beleg['adresse']) && $beleg['art'] === 'bestellung'
                && !empty($transferData['createproduction']) && $beleg['adresse'] == $transferData['ownaddress']
              ) {
                $beleg['art'] = 'produktion';
              }

              if($uebertragungen) {
                $hauptbelegnr = $this->GetFromExtID($beleg['art'], $hauptbelegnr);
                if($hauptbelegnr != '')$hauptbelegnr = $this->app->DB->Select("SELECT belegnr 
                    FROM '".$beleg['art']."' WHERE id = '$hauptbelegnr' LIMIT 1");
                if(!$beleg['beleg_projekt']) {
                  $beleg['beleg_projekt'] = $projekt;
                }
              }

              if($uebertragungen && !$beleg['adresse'] && $beleg['art'] === 'produktion' && !empty($beleg['beleg_auftragid'])){
                $beleg['adresse'] = $this->app->DB->Select(
                  sprintf(
                    'SELECT adresse FROM auftrag WHERE id = %d LIMIT 1', $beleg['beleg_auftragid']
                  )
                );
              }

              if(!$beleg['adresse'] && $uebertragungen) {
                $adresseprojekt = '';
                if($projekt) {
                  $adresseprojekt = " AND projekt = '$projekt' ";
                }
                if(in_array($beleg['art'],
                  array('auftrag','lieferschein','rechnung','gutschrift','angebot','produktion','retoure')
                )) {
                  $beleg['adresse'] = $this->app->DB->Select("SELECT id FROM adresse 
                    WHERE name='".$this->app->DB->real_escape_string($beleg['beleg_name'])."' 
                    AND email='".$this->app->DB->real_escape_string($beleg['beleg_email'])."' 
                          AND strasse='".$this->app->DB->real_escape_string((string)$beleg['beleg_strasse'])."' 
                          AND plz='".$this->app->DB->real_escape_string((string)$beleg['beleg_plz'])."'
                          AND ort='".$this->app->DB->real_escape_string((string)$beleg['beleg_ort'])."' 
                          AND kundennummer <> '' AND geloescht!=1 $adresseprojekt LIMIT 1");
                }
                else {
                  $beleg['adresse'] = $this->app->DB->Select("SELECT id FROM adresse 
                      WHERE name='".
                    $this->app->DB->real_escape_string($beleg['beleg_name'])."' 
                    AND email='".$this->app->DB->real_escape_string($beleg['beleg_email'])."' 
                          AND strasse='".$this->app->DB->real_escape_string((string)$beleg['beleg_strasse'])."' 
                          AND plz='".$this->app->DB->real_escape_string((string)$beleg['beleg_plz'])."' 
                          AND ort='".$this->app->DB->real_escape_string((string)$beleg['beleg_ort'])."' 
                          AND lieferantennummer <> '' AND geloescht!=1 $adresseprojekt LIMIT 1");
                }
                if($beleg['beleg_kundennummer'] == '' && $beleg['adresse']) {
                  $beleg['beleg_kundennummer'] = $this->app->DB->Select("SELECT kundennummer 
                  FROM adresse WHERE id = '".$beleg['adresse']."' LIMIT 1");
                }
              }
              $belegKundennummer = !empty($beleg['beleg_kundennummer'])?$beleg['beleg_kundennummer']:'';
              if(empty($belegKundennummer)) {
                $belegKundennummer = !empty($beleg['kundennummer'])?$beleg['kundennummer']:'';
              }
              if(strtoupper((string)$belegKundennummer) === 'NEU' || strtoupper($belegKundennummer) === 'NEW') {
                $beleg['adresse'] = 0;
              }

              if(!$beleg['adresse']) {
                if(in_array($beleg['art'],array('auftrag','lieferschein','rechnung','gutschrift','angebot', 'produktion'))) {
                  $adr['kundennummer'] = $beleg['beleg_kundennummer'];
                  if((string)$adr['kundennummer'] === '' || strtoupper((string)$adr['kundennummer']) === 'NEU' ||
                    strtoupper($adr['kundennummer']) === 'NEW') {
                    $adr['kundennummer'] = $this->app->erp->GetNextKundennummer($beleg['beleg_projekt']);
                  }
                }else{
                  $adr['lieferantennummer'] = $this->app->erp->GetNextLieferantennummer($beleg['beleg_projekt']);
                }
                if(!$beleg['beleg_projekt'])$beleg['beleg_projekt'] = $this->app->erp->Firmendaten('projekt');
                $adr['name'] = $beleg['beleg_name'];
                $adr['abteilung'] = $beleg['beleg_abteilung'];
                $adr['unterabteilung'] = $beleg['beleg_unterabteilung'];
                $adr['adresszusatz'] = $beleg['beleg_adresszusatz'];
                $adr['ansprechpartner'] = $beleg['beleg_ansprechpartner'];
                $adr['telefon'] = $beleg['beleg_telefon'];
                $adr['adresszusatz'] = $beleg['beleg_adresszusatz'];
                $adr['email'] = $beleg['beleg_email'];
                $adr['land'] = $beleg['beleg_land'];
                if($adr['land']=="") {
                  $adr['land'] = $this->app->erp->Firmendaten("land");
                  $beleg['beleg_land'] = $adr['land'];
                }
                $adr['strasse'] = $beleg['beleg_strasse'];
                $adr['plz'] = $beleg['beleg_plz'];
                $adr['ort'] = $beleg['beleg_ort'];
                $adr['lieferbedingung'] = $beleg['beleg_lieferbedingung'];
                $adr['projekt'] = $beleg['beleg_projekt'];

                $beleg['adresse'] = $this->app->erp->InsertUpdateAdresse($adr);
                if($alteadresse && $alteadresse != $beleg['adresse'])
                {
                  $this->SetExtIDMapping('adresse', $beleg['adresse'], $alteadresse);
                }
                unset($adr);
              }
              if($beleg['adresse'])
              {
                if($uebertragungen)
                {
                  $check = $this->GetFromExtID($beleg['art'], $beleg['beleg_belegnr']);
                }else{
                  $check = $this->app->DB->Select("SELECT id FROM ".$beleg['art']." 
                  WHERE belegnr = '".$this->app->DB->real_escape_string($beleg['beleg_belegnr'])."' LIMIT 1");
                }
                if(!$check)
                {
                  $methode = 'Create'.ucfirst($beleg['art']);
                  $methodeLoad = 'Load'.ucfirst($beleg['art']).'Standardwerte';
                  if(method_exists($this->app->erp, $methode))
                  {
                    $check = $this->app->erp->$methode($beleg['adresse']);
                    if($uebertragungen)
                    {
                      $beleg['id'] = $check;
                      $ret[] = $beleg;
                    }
                    if(method_exists($this->app->erp, $methodeLoad)){
                      $this->app->erp->$methodeLoad($check, $beleg['adresse']);
                    }

                    if($beleg['status'] !== 'angelegt')
                    {
                      if($beleg['beleg_belegnr']==='NEU' || $beleg['beleg_belegnr']==='NEW' || $beleg['beleg_belegnr']=='' ||
                        $beleg['beleg_belegnr']==='ENTWURF' || !isset($beleg['beleg_belegnr']) || $uebertragungen)  {
                        $beleg['beleg_belegnr'] = $this->app->erp->GetNextNummer($beleg['art'],$beleg['beleg_projekt'],$check);
                      }
                    }else {
                      $beleg['beleg_belegnr'] = '';
                    }

                    if($check)
                    {
                      $adressArr = $this->app->DB->SelectRow(
                        sprintf(
                          'SELECT * FROM adresse WHERE id = %d LIMIT 1',
                          $beleg['adrese']
                        )
                      );

                      if(!$beleg['beleg_projekt']) {
                        $beleg['beleg_projekt'] = $this->app->DB->Select("SELECT projekt 
                          FROM adresse 
                          WHERE id = '".$beleg['adresse']."' 
                          LIMIT 1");
                      }

                      if($beleg['beleg_projekt'] &&
                        $beleg['beleg_projekt'] != $this->app->DB->Select("SELECT projekt 
                        FROM ".$beleg['art']." 
                        WHERE id = '$check' LIMIT 1"))
                      {
                        $this->app->DB->Update("UPDATE ".$beleg['art']." SET projekt = '".$beleg['beleg_projekt']."' 
                          WHERE id = '$check' LIMIT 1");
                        if($beleg['art'] === 'auftrag')
                        {
                          $standardlager = $this->app->DB->Select("SELECT standardlager FROM projekt WHERE id = '".$beleg['beleg_projekt']."' LIMIT 1");
                          if($standardlager)$this->app->DB->Update("UPDATE auftrag SET standardlager = '$standardlager' 
                            WHERE id = '$check' LIMIT 1");
                          if($this->app->erp->StandardZahlungsweise($beleg['beleg_projekt'])==="rechnung")
                          {
                            $this->app->DB->Update("UPDATE auftrag 
                              set zahlungsweise = '".$this->app->erp->StandardZahlungsweise($beleg['beleg_projekt'])."',
                              zahlungszieltage = '".$this->app->erp->ZahlungsZielTage($beleg['beleg_projekt'])."', 
                              zahlungszieltageskonto = '".$this->app->erp->ZahlungsZielTageSkonto($beleg['beleg_projekt'])."', 
                              zahlungszielskonto = '".$this->app->erp->ZahlungsZielSkonto($beleg['beleg_projekt'])."' 
                              WHERE id = '$check' LIMIT 1");
                          }else{
                            $this->app->DB->Update("UPDATE auftrag 
                              set zahlungsweise = '".$this->app->erp->StandardZahlungsweise($beleg['beleg_projekt'])."',
                              zahlungszieltage = '0', zahlungszieltageskonto = '0', zahlungszielskonto = '0' 
                              WHERE id = '".$check."' LIMIT 1");
                          }
                        }
                        $this->app->erp->LoadSteuersaetzeWaehrung($check,$beleg['art'],$beleg['beleg_projekt']);
                      }

                      $teillieferungvon = false;
                      if($hauptbelegnr)
                      {
                        $teillieferungvon = $this->app->DB->Select("SELECT id 
                          FROM auftrag 
                          WHERE belegnr = '".$this->app->DB->real_escape_string($hauptbelegnr)."' 
                          LIMIT 1");
                        if($teillieferungvon)
                        {
                          $teillieferungnummer= $this->app->DB->Select("SELECT MAX(teillieferungnummer) FROM auftrag WHERE teillieferungvon='$teillieferungvon'");
                          $teillieferungnummer++;
                          $this->app->DB->Update("UPDATE ".$beleg['art']." 
                            SET teillieferungvon = '".$teillieferungvon."',teillieferungnummer='$teillieferungnummer' 
                            WHERE id = '$check' LIMIT 1");
                        }
                      }

                      $fields_fromdb = array('name','strasse','ort','land','plz');
                      foreach($fields_fromdb as $fieldname)
                      {
                        if($beleg['beleg_'.$fieldname]=='') {
                          $beleg['beleg_'.$fieldname] = $this->app->DB->Select("SELECT ".$fieldname." 
                          FROM adresse 
                          WHERE id='".$beleg['adresse']."' 
                          LIMIT 1");
                        }
                      }

                      $belegArt = $beleg['art'];

                      if($beleg['beleg_status']) {
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET status = '".$this->app->DB->real_escape_string($beleg['beleg_status'])."' WHERE id = '$check' LIMIT 1");
                      }else{
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET status = '".$this->app->DB->real_escape_string($beleg['status'])."' WHERE id = '$check' LIMIT 1");
                      }
                      if($beleg['beleg_datum'])
                      {
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET datum = '".$this->app->DB->real_escape_string($beleg['beleg_datum'])."' WHERE id = '$check' LIMIT 1");
                      }else{
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET datum = now() WHERE id = '$check' AND datum = '0000-00-00' LIMIT 1");
                      }
                      if($beleg['beleg_lieferdatum'])
                      {
                        if($belegArt === 'bestellung') {
                          $this->app->DB->Update("UPDATE bestellung
                          SET gewuenschteslieferdatum = '" . $this->app->DB->real_escape_string($beleg['beleg_lieferdatum']) . "' WHERE id = '$check' LIMIT 1");
                        }else{
                          $this->app->DB->Update("UPDATE " . $belegArt . " 
                          SET lieferdatum = '" . $this->app->DB->real_escape_string($beleg['beleg_lieferdatum']) . "' WHERE id = '$check' LIMIT 1");
                        }
                      }
                      if($beleg['beleg_tatsaechlicheslieferdatum'])
                      {
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET tatsaechlicheslieferdatum = '".$this->app->DB->real_escape_string($beleg['beleg_tatsaechlicheslieferdatum'])."' WHERE id = '$check' LIMIT 1");
                      }
                      if($beleg['beleg_art'])
                      {
                        $this->app->DB->Update("UPDATE ".$belegArt." 
                        SET art = '".$this->app->DB->real_escape_string($beleg['beleg_art'])."' WHERE id = '$check' LIMIT 1");
                      }

                      if($beleg['beleg_versandart'])
                      {
                        $this->app->DB->Update("UPDATE ".$belegArt." SET versandart = '".$this->app->DB->real_escape_string($beleg['beleg_versandart'])."' WHERE id = '$check' LIMIT 1");
                      }
                      if($beleg['beleg_zahlungsweise'])
                      {
                        $this->app->DB->Update("UPDATE ".$belegArt." SET zahlungsweise = '".$this->app->DB->real_escape_string($beleg['beleg_zahlungsweise'])."' WHERE id = '$check' LIMIT 1");
                      }
                      $this->app->DB->Update("UPDATE ".$belegArt." SET belegnr = '".$this->app->DB->real_escape_string($beleg['beleg_belegnr'])."' WHERE id = '$check' LIMIT 1");
                      if(empty($beleg['kundennummer']) && $beleg['art'] !== 'bestellung') {
                        $beleg['kundennummer'] = $adressArr['kundennummer'];
                      }
                      if(empty($beleg['beleg_name'])) {
                        $beleg['beleg_name'] = $adressArr['name'];
                        $beleg['beleg_plz'] = $adressArr['plz'];
                        $beleg['beleg_ort'] = $adressArr['ort'];
                        $beleg['beleg_land'] = $adressArr['land'];
                        $beleg['beleg_abteilung'] = $adressArr['abteilung'];
                        $beleg['beleg_unterabteilung'] = $adressArr['unterabteilung'];
                        $beleg['beleg_adresszusatz'] = $adressArr['adresszusatz'];
                      }
                      $this->app->DB->Update("UPDATE ".$belegArt." SET name = '".$this->app->DB->real_escape_string($beleg['beleg_name'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET abteilung = '".$this->app->DB->real_escape_string($beleg['beleg_abteilung'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET unterabteilung = '".$this->app->DB->real_escape_string($beleg['beleg_unterabteilung'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET strasse = '".$this->app->DB->real_escape_string($beleg['beleg_strasse'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET plz = '".$this->app->DB->real_escape_string($beleg['beleg_plz'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET ort = '".$this->app->DB->real_escape_string($beleg['beleg_ort'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET land = '".$this->app->DB->real_escape_string($beleg['beleg_land'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET email = '".$this->app->DB->real_escape_string($beleg['beleg_email'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET telefon = '".$this->app->DB->real_escape_string($beleg['beleg_telefon'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET adresszusatz = '".$this->app->DB->real_escape_string($beleg['beleg_adresszusatz'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET kundennummer = '".$this->app->DB->real_escape_string($beleg['beleg_kundennummer'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET adresse = '".$this->app->DB->real_escape_string($beleg['adresse'])."' WHERE id = '$check' LIMIT 1");

                      $this->app->DB->Update("UPDATE ".$belegArt." SET internebemerkung = '".$this->app->DB->real_escape_string($beleg['beleg_internebemerkung'])."' WHERE id = '$check' LIMIT 1");
                      $this->app->DB->Update("UPDATE ".$belegArt." SET internebezeichnung = '".$this->app->DB->real_escape_string($beleg['beleg_internebezeichnung'])."' WHERE id = '$check' LIMIT 1");
                      if($belegArt !== 'bestellung') {
                        $this->app->DB->Update("UPDATE " . $belegArt . " SET aktion = '" . $this->app->DB->real_escape_string($beleg['beleg_aktion']) . "' WHERE id = '$check' LIMIT 1");
                      }
                      if($belegArt === 'bestellung') {
                        $this->app->DB->Update("UPDATE ".$belegArt." SET lieferantennummer = '".$this->app->DB->real_escape_string($beleg['beleg_lieferantennummer'])."' WHERE id = '$check' LIMIT 1");
                      }
                      $this->app->DB->Update("UPDATE ".$belegArt." SET freitext = '".$this->app->DB->real_escape_string($beleg['beleg_freitext'])."' WHERE id = '$check' LIMIT 1");
                      if($belegArt !== 'bestellung'){
                        $this->app->DB->Update("UPDATE " . $belegArt . " SET ihrebestellnummer = '" . $this->app->DB->real_escape_string($beleg['beleg_ihrebestellnummer']) . "' WHERE id = '$check' LIMIT 1");
                      }
                      $this->app->DB->Update("UPDATE ".$belegArt." SET lieferbedingung = '".$this->app->DB->real_escape_string($beleg['beleg_lieferbedingung'])."' WHERE id = '$check' LIMIT 1");
                      if($belegArt === 'produktion') {
                        $this->app->DB->Update(
                          sprintf(
                            'UPDATE produktion SET unterlistenexplodieren = %d WHERE id = %d LIMIT 1',
                            $beleg['beleg_unterlistenexplodieren'], $check
                          )
                        );
                        if(!empty($beleg['beleg_auftragid'])) {
                          $this->app->DB->Update(
                            sprintf(
                              'UPDATE produktion SET auftragid = %d WHERE id = %d LIMIT 1',
                              $beleg['beleg_auftragid'], $check
                            )
                          );
                          $datumauslieferung = $this->app->DB->Select(
                            sprintf(
                              'SELECT datumauslieferung FROM produktion WHERE id = %d', $check
                            )
                          );
                          IF($datumauslieferung == '' || $datumauslieferung === '0000-00-00') {
                            $datumauslieferung = $this->app->DB->Select(
                              sprintf(
                                'SELECT lieferdatum FROM auftrag WHERE id = %d', $beleg['beleg_auftragid']
                              )
                            );
                            IF($datumauslieferung == '' || $datumauslieferung === '0000-00-00') {
                              $datumauslieferung = $this->app->DB->Select(
                                sprintf(
                                  'SELECT datum FROM auftrag WHERE id = %d', $beleg['beleg_auftragid']
                                )
                              );
                            }
                            if($datumauslieferung != '' && $datumauslieferung !== '0000-00-00') {
                              $this->app->DB->Update(
                                sprintf(
                                  "UPDATE produktion SET datumauslieferung = '%s' WHERE id = %d",
                                  $datumauslieferung, $check
                                )
                              );
                            }
                          }
                        }
                      }
                    }
                  }
                }
                if($check)
                {
                  $aktbelegid = $check;
                  if($beleg['status'] === 'angelegt'){
                    //Merken der Belegids für nachträgliches löschen der Belegnummern aus der Angebotstabelle
                    $erstelltebelegeids[$check] = $beleg['art'];
                  } else {
                    $erstelltebelegeNichtAngelegtids[$check] = $beleg['art'];
                  }
                }
              }
            }
            if($aktbelegid && ($beleg['artikel'] || $beleg['artikel_nummer'])) {
              if(!$beleg['artikel']) {
                $beleg['artikel'] = $this->app->DB->Select("SELECT id 
                  FROM artikel 
                  WHERE nummer = '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."' and geloescht <> 1 
                  ORDER BY projekt = '".$beleg['beleg_projekt']."' DESC 
                  LIMIT 1");
                if(!$beleg['artikel'] && isset($beleg['artikel_ean']) && $beleg['artikel_ean'] != '') {
                  $beleg['artikel'] = $this->app->DB->Select("SELECT id 
                    FROM artikel 
                    WHERE ean = '".$this->app->DB->real_escape_string($beleg['artikel_ean'])."' AND ean <> '' and geloescht <> 1 
                    ORDER BY projekt = '".$beleg['beleg_projekt']."' DESC 
                    LIMIT 1");
                }
              }
              if(!$beleg['artikel']) {
                $art['nummer'] = $beleg['artikel_nummer'];
                if(isset($beleg['artikel_ean']) && $beleg['artikel_ean'] != '') {
                  $art['ean'] = $beleg['artikel_ean'];
                }
                $art['projekt'] = $beleg['beleg_projekt'];
                $art['name_de'] = $beleg['artikel_bezeichnung'];
                $art['anabregs_text'] = $beleg['artikel_bezeichnung'];
                if($beleg['artikel_umsatzsteuer'] === 'ermaessigt') {
                  $art['umsatzsteuer'] = $beleg['artikel_umsatzsteuer'];
                }
                $art['einheit'] = $beleg['artikel_einheit'];
                $art['zolltarifnummer'] = $beleg['artikel_zolltarifnummer'];
                $art['herkunftsland'] = $beleg['artikel_herkunftsland'];
                if(!empty($uebertragungen)
                  && !empty($transferData['createarticleifnotexists'])
                  && !empty($transferData['createarticleasstoragearticle'])
                ) {
                  $art['lagerartikel'] = 1;
                }
                $beleg['artikel'] = $this->app->erp->InsertUpdateArtikel($art);
                unset($art);
              }
              if($beleg['artikel'])
              {
                if(empty($beleg['artikel_nummer'])) {
                  $beleg['artikel_nummer'] = $this->app->DB->Select(
                    sprintf(
                      'SELECT nummer FROM artikel WHERE id = %d LIMIT 1',
                      $beleg['artikel']
                    )
                  );
                }

                if(empty($beleg['artikel_bezeichnung'])) {
                  $article = $this->app->DB->SelectRow(
                    sprintf(
                      'SELECT art.name_de, art.name_en, art.`anabregs_text_en`, art.anabregs_text 
                        FROM `artikel` AS `art` WHERE art.id = %d',
                      $beleg['artikel']
                    )
                  );
                  $sprache = $this->app->DB->Select(
                    sprintf(
                      'SELECT `sprache` FROM `%s` WHERE `id` = %d LIMIT 1',
                      $aktbelegart, $aktbelegid
                    )
                  );
                  if(empty($sprache)) {
                    $sprache = $this->app->DB->Select(
                      sprintf(
                        'SELECT `sprache` FROM `adresse` WHERE `id` = %d LIMIT 1',
                        $beleg['adresse']
                      )
                    );
                  }
                  if($sprache !== 'deutsch' && $sprache != '' && strtolower($sprache) !== 'de') {
                    if(!empty($article['name_en'])) {
                      $beleg['artikel_bezeichnung'] = $article['name_en'];
                      if(!empty($aricle['anabregs_text_en'])) {
                        $beleg['artikel_beschreibung'] = $aricle['anabregs_text_en'];
                      }
                    }
                  }
                  if(empty($beleg['artikel_bezeichnung'])){
                    $beleg['artikel_bezeichnung'] = $aricle['name_de'];
                  }
                }
                elseif($uebertragungen > 0) {
                  $article = $this->app->DB->SelectRow(
                    sprintf(
                      'SELECT art.name_de, art.name_en, art.`anabregs_text_en`, art.anabregs_text 
                      FROM `artikel` AS `art` WHERE art.id = %d',
                      $beleg['artikel']
                    )
                  );
                  if(!empty($article['name_en']) && $beleg['artikel_bezeichnung'] !== $article['name_en']) {
                    $sprache = $this->app->DB->Select(
                      sprintf(
                        'SELECT `sprache` FROM `%s` WHERE `id` = %d LIMIT 1',
                        $aktbelegart, $aktbelegid
                      )
                    );
                    if(empty($sprache)) {
                      $sprache = $this->app->DB->Select(
                        sprintf(
                          'SELECT `sprache` FROM `adresse` WHERE `id` = %d LIMIT 1',
                          $beleg['adresse']
                        )
                      );
                    }
                    if($sprache !== 'deutsch' && $sprache != '' && strtolower($sprache) !== 'de') {
                      $beleg['artikel_bezeichnung'] = $article['name_en'];
                      if(!empty($article['anabregs_text_en'])) {
                        $beleg['artikel_beschreibung'] = $article['anabregs_text_en'];
                      }
                    }
                  }
                }
                $belegpos = false;
                switch($aktbelegart)
                {
                  case 'auftrag':
                    $belegpos = $this->app->erp->AddAuftragPositionManuell($aktbelegid, $beleg['artikel'],
                      ($beleg['artikel_preis']/$beleg['artikel_preisfuermenge']), $beleg['artikel_menge'],
                      $beleg['artikel_bezeichnung'],$beleg['artikel_beschreibung']);
                    if(!$belegpos) {
                      $belegpos = $this->app->DB->GetInsertID();
                    }

                    if($teillieferungvon)
                    {
                      if(!$this->app->DB->Select("SELECT porto FROM artikel WHERE id = '".$beleg['artikel']."' LIMIT 1"))
                      {
                        $checkhauptartikel = $this->app->DB->SelectArr("SELECT id, menge, sort 
                          FROM auftrag_position 
                          WHERE artikel = '".$beleg['artikel']."' AND auftrag = '$teillieferungvon' 
                          ORDER BY sort, menge = '".$beleg['menge']."' DESC, menge > '".$beleg['menge']."' DESC");
                        if($checkhauptartikel)
                        {
                          foreach($checkhauptartikel as $k => $v)
                          {
                            if($beleg['artikel_menge'] > 0)
                            {
                              if($v['menge'] > $beleg['artikel_menge'])
                              {
                                $this->app->DB->Update("UPDATE auftrag_position SET menge = menge - ".$beleg['artikel_menge']."  
                                  WHERE id = '".$v['id']."' LIMIT 1");
                                $beleg['artikel_menge'] = 0;
                              }else{
                                $this->app->DB->Delete("DELETE FROM auftrag_position WHERE id = '".$v['id']."' LIMIT 1");
                                $this->app->DB->Update("UPDATE auftrag_position SET sort = sort - 1 
                                WHERE auftrag = '$teillieferungvon' AND sort > '".$v['sort']."'");
                                $beleg['artikel_menge'] -= $v['menge'];
                              }
                            }
                          }
                          $checkmengen = $this->app->DB->Select("SELECT ap.id FROM auftrag_position ap.left 
                                join artikel a on ap.artikel = a.id WHERE ap.auftrag = '$teillieferungvon' AND a.porto <> 1 LIMIT 1");
                          if(!$checkmengen) {
                            $this->app->DB->Update("UPDATE auftrag SET status = 'abgeschlossen' 
                              WHERE id = '$teillieferungvon' LIMIT 1");
                          }
                          $this->app->erp->ANABREGSNeuberechnen($teillieferungvon,$aktbelegart);
                        }
                      }
                    }
                    if($beleg['artikel_rabatt']) {
                      $this->app->DB->Update("UPDATE auftrag_position SET rabatt = '".$beleg['artikel_rabatt']."' 
                      WHERE id = '$belegpos' LIMIT 1");
                    }
                    if($beleg['artikel_waehrung']) {
                      $this->app->DB->Update("UPDATE auftrag_position 
                      SET waehrung = '".$this->app->DB->real_escape_string($beleg['artikel_waehrung'])."' 
                      WHERE id = '$belegpos' LIMIT 1");
                    }

                    break;
                  case 'rechnung':
                    $belegpos = $this->app->erp->AddRechnungPositionManuell($aktbelegid, $beleg['artikel'],
                      ($beleg['artikel_preis']/$beleg['artikel_preisfuermenge']),$beleg['artikel_menge'],$beleg['artikel_bezeichnung'],
                      $beleg['artikel_bezeichnung'],$beleg['artikel_waehrung']);
                    if(!$belegpos) {
                      $belegpos = $this->app->DB->GetInsertID();
                    }

                    if($beleg['artikel_rabatt'])$this->app->DB->Update("UPDATE rechnung_position 
                        SET rabatt = '".$beleg['artikel_rabatt']."' WHERE id = '$belegpos' LIMIT 1");

                    break;
                  case 'gutschrift':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM gutschrift_position WHERE gutschrift = '$aktbelegid'");

                    $this->app->DB->Insert("INSERT INTO gutschrift_position (gutschrift, artikel, sort, 
                      preis, menge, waehrung, rabatt, bezeichnung,beschreibung) 
                      values ('".$aktbelegid."','".$beleg['artikel']."','".$sort."',
                      '".($beleg['artikel_preis']/$beleg['artikel_preisfuermenge'])."','".$beleg['artikel_menge']."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_waehrung'])."','".$beleg['artikel_rabatt']."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."')");

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'bestellung':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM bestellung_position WHERE bestellung = '$aktbelegid'");

                    $umsatzsteuer = $beleg['artikel_umsatzsteuer'] === 'ermaessigt'?'ermaessigt':'';
                    $datum = $this->app->DB->Select("SELECT datum FROM bestellung WHERE id = '$aktbelegid' LIMIT 1");

                    $einkauf = $this->app->erp->Einkaufspreis($beleg['artikel'],$beleg['artikel_menge'],$beleg['adresse']);

                    if(!empty($einkauf)){
                      $bestellnummer = $this->app->DB->Select(
                        sprintf(
                          'SELECT e.bestellnummer FROM `einkaufspreise` AS `e` WHERE e.id = %d',
                          $einkauf
                        )
                      );
                      $bestellnummer = $this->app->DB->real_escape_string($bestellnummer);
                    }

                    if(empty($bestellnummer)){
                      $bestellnummer = $this->app->DB->real_escape_string($beleg['artikel_nummer']);
                    }

                    $this->app->DB->Insert(
                      sprintf(
                        "INSERT INTO bestellung_position (bestellung,artikel,bezeichnunglieferant,bestellnummer,menge,preis, 
                          waehrung, sort,lieferdatum, umsatzsteuer, status,projekt, beschreibung)
                        VALUES (%d,%d,'%s','%s',%f,%f,
                        '%s',%d,'%s','%s',
                        'angelegt','%s','%s')",
                        (int)$aktbelegid,
                        (int)$beleg['artikel'],
                        $this->app->DB->real_escape_string($beleg['artikel_bezeichnung']),
                        $bestellnummer,
                        (float)$beleg['artikel_menge'],
                        (float)($beleg['artikel_preis']/$beleg['artikel_preisfuermenge']),
                        $this->app->DB->real_escape_string($beleg['artikel_waehrung']),
                        $sort,$datum,$umsatzsteuer,
                        $this->app->DB->real_escape_string($beleg['artikel_bezeichnung']),
                        $this->app->DB->real_escape_string($beleg['artikel_beschreibung'])
                      )
                    );

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'angebot':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM angebot_position WHERE angebot = '$aktbelegid'");

                    $umsatzsteuer = $beleg['artikel_umsatzsteuer'] === 'ermaessigt'?'ermaessigt':'';
                    $datum = $this->app->DB->Select("SELECT datum FROM angebot WHERE id = '$aktbelegid' LIMIT 1");

                    $this->app->DB->Insert("INSERT INTO angebot_position (angebot,artikel,beschreibung,bezeichnung,nummer,menge,preis, 
                      waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe)
                      VALUES ($aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."',
                      '".$beleg['artikel_menge']."','".($beleg['artikel_preis']/$beleg['artikel_preisfuermenge'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_waehrung'])."','$sort','$datum','$umsatzsteuer','angelegt',
                      '$projekt','')");

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'lieferschein':
                    $datum = '0000-00-00';
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM lieferschein_position WHERE lieferschein = '$aktbelegid'");

                    $this->app->DB->Insert("INSERT INTO lieferschein_position (lieferschein,artikel,beschreibung,bezeichnung,nummer,menge, 
                        sort,lieferdatum, status,projekt)
                         VALUES ('$aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                        '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                        '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."','".$beleg['artikel_menge']."',
                        '$sort','$datum','angelegt','$projekt')");

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'retoure':
                    $datum = '0000-00-00';
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM retoure_position WHERE retoure = '$aktbelegid'");

                    $this->app->DB->Insert("INSERT INTO retoure_position (retoure,artikel,beschreibung,bezeichnung,nummer,menge, 
                        sort,lieferdatum, projekt)
                         VALUES ('$aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                        '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                        '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."','".$beleg['artikel_menge']."',
                        '$sort','$datum','$projekt')");

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'preisanfrage':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM preisanfrage_position WHERE preisanfrage= '$aktbelegid'");
                    $datum = $this->app->DB->Select("SELECT datum FROM preisanfrage WHERE id = '$aktbelegid' LIMIT 1");
                    $this->app->DB->Insert("INSERT INTO preisanfrage_position (preisanfrage,artikel,beschreibung,bezeichnung,nummer,menge, 
                      sort,lieferdatum, status,projekt)
                      VALUES ('$aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."','".$beleg['artikel_menge']."',
                      '$sort','$datum','angelegt','$projekt')");

                    $belegpos = $this->app->DB->GetInsertID();

                    break;
                  case 'proformarechnung':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM proformarechnung_position WHERE proformarechnung = '$aktbelegid'");
                    $datum = $this->app->DB->Select("SELECT datum FROM proformarechnung WHERE id = '$aktbelegid' LIMIT 1");
                    $umsatzsteuer = $beleg['artikel_umsatzsteuer'] === 'ermaessigt'?'ermaessigt':'';
                    $this->app->DB->Insert("INSERT INTO proformarechnung_position (proformarechnung,artikel,beschreibung,bezeichnung,
                        nummer,menge, sort,lieferdatum, status,projekt,umsatzsteuer)
                      VALUES ($aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."','".$beleg['artikel_menge']."','$sort',
                      '$datum','angelegt','$projekt','$umsatzsteuer')");

                    $belegpos = $this->app->DB->GetInsertID();
                    break;
                  case 'produktion':
                    $sort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM produktion_position WHERE produktion= '$aktbelegid'");
                    $datum = $this->app->DB->Select("SELECT datum FROM produktion WHERE id = '$aktbelegid' LIMIT 1");
                    $this->app->DB->Insert("INSERT INTO produktion_position (produktion,artikel,beschreibung,bezeichnung,nummer,menge, 
                      sort,lieferdatum, status,projekt)
                      VALUES ('$aktbelegid','".$beleg['artikel']."','".$this->app->DB->real_escape_string($beleg['artikel_beschreibung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_bezeichnung'])."',
                      '".$this->app->DB->real_escape_string($beleg['artikel_nummer'])."','".$beleg['artikel_menge']."','$sort',
                      '$datum','angelegt','$projekt')");

                    $belegpos = $this->app->DB->GetInsertID();
                    $already_new_item_is_bom = $this->app->DB->Select(
                      sprintf('SELECT stueckliste FROM artikel WHERE id=%d AND produktion=1',
                        $beleg['artikel']
                      )
                    );
                    $already = $this->app->DB->Select(
                      sprintf(
                        'SELECT id FROM produktion_position WHERE produktion=%d AND explodiert=1 LIMIT 1',
                        $aktbelegid
                      )
                    );

                    if(!$already || !$already_new_item_is_bom) {
                      /** @var Produktion $objProduction */
                      $objProduction = $this->app->erp->LoadModul('produktion');
                      if(!empty($objProduction) && method_exists($objProduction, 'addArbeitsanweisungenFunktionsprotokoll')) {
                        $objProduction->addArbeitsanweisungenFunktionsprotokoll($aktbelegid,$belegpos, $beleg['artikel']);
                      }
                    }
                    if(!empty($objProduction)){
                      $this->app->erp->AuftragExplodieren($aktbelegid, 'produktion');
                      $objProduction->ProduktionEinzelnBerechnen($aktbelegid);
                      $objProduction->ProduktionNeuberechnen($aktbelegid);
                    }
                    break;
                  default:
                    break;
                }
                if($belegpos)
                {
                  $artikelnummerkunde = $this->app->DB->real_escape_string(
                    $this->app->DB->Select(
                      "SELECT kundenartikelnummer 
                                    FROM verkaufspreise 
                                    WHERE adresse='".$beleg['beleg_adresse']."' AND artikel='".$beleg['artikel']."' 
                                    AND kundenartikelnummer!='' AND ab_menge <=".
                      (float)$beleg['artikel_menge']." 
                                    AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') 
                                    ORDER by ab_menge DESC 
                                    LIMIT 1"
                    ));

                  if($artikelnummerkunde == ''){
                    // Anzeige Artikel Nummer von Gruppe aus Verkaufspreis
                    $returnwaehrung = null;
                    $gruppevkresult = $this->app->erp->GetVerkaufspreis(
                      $beleg['artikel'],
                      (float)$beleg['artikel_menge'],
                      $beleg['adresse'],
                      !empty($beleg['artikel_waehrung'])?$beleg['artikel_waehrung']:'EUR',
                      $returnwaehrung,
                      true
                    );
                    if($gruppevkresult['kundenartikelnummer'] != ''){
                      $artikelnummerkunde = $gruppevkresult['kundenartikelnummer'];
                    }
                  }

                  if(!empty($artikelnummerkunde)) {
                    $this->app->DB->Update(
                      sprintf(
                        "UPDATE `%s` SET artikelnummerkunde = '%s' WHERE id = %d ",
                        $aktbelegart.'_position',
                        $this->app->DB->real_escape_string($artikelnummerkunde),
                        $belegpos
                      )
                    );
                  }


                  $felder = array('artikelnummerkunde','herkunftsland','zolltarifnummer','einheit','lieferdatum');
                  for($i = 1; $i <= 20; $i++) {
                    $felder[] = 'freifeld'.$i;
                  }
                  foreach($felder as $feld)
                  {
                    $this->app->DB->Update("UPDATE ".$aktbelegart."_position 
                    SET $feld = '".$this->app->DB->real_escape_string($beleg['artikel_'.$feld])."' 
                    WHERE id = '$belegpos' LIMIT 1");
                  }
                  $this->app->erp->ANABREGSNeuberechnen($aktbelegid,$aktbelegart);
                  $this->app->DB->Delete("DELETE FROM belegeimport WHERE id = '".$beleg['id']."' LIMIT 1");
                }
              }
            }
          }
        }
        foreach ($erstelltebelegeids as $belegid => $belegart) {
          //Nachträgliches löschen aller Belegnummern aus den Angeboten wenn Status == angelegt
          $this->app->DB->Update("UPDATE " . $belegart . " SET belegnr = '' WHERE id = '$belegid' LIMIT 1");
        }
        foreach ($erstelltebelegeNichtAngelegtids as $belegid => $belegart) {
          if($this->app->DB->Select(
            sprintf('
              SELECT id 
              FROM `%s` 
              WHERE id = %d AND (status = \'freigegeben\' OR status = \'abgeschlossen\' OR status = \'versendet\') AND belegnr = \'\'
              ', $belegart, $belegid
            )
          )
          ){
            $this->app->erp->BelegFreigabe($belegart, $belegid);
          }
        }
        $msg = $this->app->erp->base64_url_encode("<div class=\"info\">Die Belege wurden importiert!</div>");
      }else{
        $msg = $this->app->erp->base64_url_encode("<div class=\"info\">Keine Belege zum Importieren gefunden!</div>");
      }
      if($uebertragungen) {
        return $ret;
      }
      if($idliste) {
        return !empty($belege)?count($belege):0;
      }
      return $msg;
    }

    public function BelegeimportDatei($_datei = null, $uebertragungen = false)
    {
      $ret = null;
      $_projekt = 0;
      if($uebertragungen) {
        $_projekt = $this->app->DB->Select("SELECT projekt FROM uebertragungen_account WHERE id = '$uebertragungen' LIMIT 1");
      }
      if($_datei === null)
      {
        //$this->app->erp->BelegeimportMenu();
        //$this->app->YUI->TableSearch('TAB1','belegeimport_list', 'show','','',basename(__FILE__), __CLASS__);

        $art = $this->app->Secure->GetPOST("art");
        $status = $this->app->Secure->GetPOST("status");
        $datei = (int)$this->app->Secure->GetGET('datei');
      }else{
        $ret = null;
        $art = '';
        $datei = $_datei;
        $status = 'angelegt';
      }
      if($uebertragungen) {
        $api = $this->app->DB->Select("SELECT api FROM uebertragungen_account WHERE id = '$uebertragungen' LIMIT 1");
      }
      $row = 1;
      if($_datei === null)
      {
        $art = $this->app->Secure->GetPOST("art");
        $status = $this->app->Secure->GetPOST("status");
        $datei = (int)$this->app->Secure->GetGET('datei');
      }else{
        $ret = null;
        $art = '';
        $datei = $_datei;
        $status = 'angelegt';
      }

      if($datei || (!empty($_FILES['datei']) && !empty($_FILES['datei']['tmp_name'])))
      {
        if (
          ($handle = fopen(
            $_datei === null?(isset($_FILES['datei'])?$_FILES['datei']['tmp_name']:$this->app->erp->GetDateiPfad($datei)):$datei,
            'r')
          ) !== FALSE
        ) {
          $vkpreisex = false;
          $artikel_bezeichnung = false;
          $beleg_datum = false;
          $menge = false;
          $beleg_art = false;
          $beleg_nr_parent = 0;
          $oldbeleg_belegnr = '';
          $fields = [];
          $csvseparator = $this->app->DB->Select(
            sprintf(
              'SELECT csvseparator FROM uebertragungen_account WHERE id = %d',
              $uebertragungen
            )
          );
          if(empty($csvseparator)) {
            $csvseparator = ';';
          }
          while (($data = fgetcsv($handle, 0, $csvseparator,'"')) !== FALSE) {
            $num = (!empty($data)?count($data):0);
            //echo "<p> $num Felder in Zeile $row: <br /></p>\n";

            if($row > 1){
              if($_datei !== null) {
                $status = 'angelegt';
              }
              for ($c=0; $c < $num; $c++){
                if($fields[$c] === 'art' && $data[$c]) {
                  $art = trim(strtolower($data[$c]));
                }
              }
              $this->app->DB->Insert("INSERT INTO belegeimport (userid,status,art) VALUES ('".($_datei === null?$this->app->User->GetID():0)."','$status','$art')");
              $rowid = $this->app->DB->GetInsertID();
              if($uebertragungen) {
                $this->app->DB->Update("UPDATE belegeimport SET beleg_projekt = '$_projekt' WHERE id = '$rowid' LIMIT 1");
              }
              $ret[] = $rowid;
            }
            $preis = 0;
            $preisfuermenge = 1;
            $projekt = $_projekt;
            $tmpartikelid = 0;
            $tmpadresseid = 0;
            for ($c=0; $c < $num; $c++){
              if($row==1){
                $fields[$c]=$this->app->DB->real_escape_string($data[$c]);
                if($fields[$c] === 'artikel_preis')$vkpreisex = str_replace(',','.',$c);
                if($fields[$c] === 'artikel_menge')$menge = str_replace(',','.',$c);
                if($fields[$c] === 'artikel_bezeichnung')$artikel_bezeichnung = $c;
                if($fields[$c] === 'beleg_datum')$beleg_datum = $c;
                if($fields[$c] === 'beleg_art')$beleg_art = $c;
              }else{
                switch($fields[$c])
                {
                  case 'beleg_status':
                    if(in_array($data[$c],['angelegt','freigegeben','storniert','abgeschlossen','gestartet','versendet'])) {
                      $status = $data[$c];

                    }

                    break;
                  case 'beleg_belegnr':

                    if($uebertragungen && ($data[$c] != '' && $data[$c] == $oldbeleg_belegnr))
                    {
                      $data[$c] = 'PARENT';
                    }elseif($uebertragungen && $oldbeleg_belegnr != $data[$c] && $data[$c] !== 'NEW' && $data[$c] !== 'PARENT')
                    {
                      $oldbeleg_belegnr = $data[$c];
                    }

                    if(($data[$c] !== 'PARENT' && $status === 'angelegt') || $data[$c] == ''){
                      $data[$c] = "NEW";
                    }

                    if($data[$c] === 'PARENT'){
                      if($beleg_nr_parent){
                        //Übernimm Belegnummer der vorherigen Zeile
                        $data[$c] = $beleg_nr_parent;
                      }else{
                        //Falls vor dieser PARENT Zeile kein Eintrag vorhanden ist soll sie als NEW betrachtet werden
                        $data[$c] = 'NEW';
                      }
                    }


                    if($data[$c] === 'NEW'){
                      if($status === 'angelegt'){
                        //Neue Entwurfsbelegnummer
                        $data[$c] = 'ENTWURF_'.$rowid.'_';
                      }else{
                        //suche nächste freie Belegnummer falls NEW oder leere Belegnummer
                        $data[$c] = $this->app->erp->GetNextNummer($art);
                      }
                      $oldbeleg_belegnr = $data[$c];
                    }
                    //Merke die aktuelle Belegnummer falls der nächste Eintrag PARENT ist
                    $beleg_nr_parent = $data[$c];
                    break;

                  case 'beleg_projekt':
                    if((!is_numeric($data[$c]) || strpos($data[$c],'.') !== false) && $data[$c])
                    {
                      $data[$c] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($data[$c])."' LIMIT 1");
                      if($data[$c]) {
                        $projekt = $data[$c];
                      }
                    }
                    break;

                  case 'artikel':
                    if($uebertragungen && $api)
                    {
                      if(!$tmpartikelid)
                      {
                        $tmpartikelid = $this->app->DB->Select(
                          "SELECT id_int 
                          FROM api_mapping 
                          WHERE id_ext = '%s' AND id_ext != '' AND id_int <> 0 AND tabelle = 'artikel' AND api = %d 
                          LIMIT 1",
                          $data[$c], (int)$api
                        );
                        if($tmpartikelid > 0) {
                          $this->app->DB->Update("UPDATE belegeimport SET artikel='$tmpartikelid' WHERE id='".$rowid."' LIMIT 1");
                        }
                      }
                    }
                    break;

                  case 'artikel_nummer':
                    if(!$tmpartikelid) {
                      $tmpartikelid = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='".$this->app->DB->real_escape_string($data[$c])."' AND nummer!='' AND geloescht!=1 ORDER BY projekt = '$projekt' DESC LIMIT 1");
                    }
                    if($tmpartikelid > 0) {
                      $this->app->DB->Update("UPDATE belegeimport SET artikel='$tmpartikelid' WHERE id='".$rowid."' LIMIT 1");
                    }
                    break;

                  case 'artikel_ean':
                    if(!$tmpartikelid)$tmpartikelid = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='".$this->app->DB->real_escape_string($data[$c])."' AND ean != '' AND nummer!='' AND geloescht!=1 ORDER BY projekt = '$projekt' DESC LIMIT 1");
                    if($tmpartikelid > 0) {
                      $this->app->DB->Update("UPDATE belegeimport SET artikel='$tmpartikelid' WHERE id='".$rowid."' LIMIT 1");
                    }
                    break;

                  case 'adresse':
                    if($uebertragungen && $api)
                    {
                      $tmpadresseid = (int)$data[$c];
                    }
                    break;

                  case 'beleg_kundennummer':
                    if(!$tmpadresseid)
                    {
                      $tmpadresseid = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='".$this->app->DB->real_escape_string($data[$c])."' AND kundennummer!='' AND geloescht!=1 ORDER BY projekt = '$projekt' DESC LIMIT 1");
                      if($tmpadresseid > 0) {
                        $this->app->DB->Update("UPDATE belegeimport SET adresse='$tmpadresseid' WHERE id='".$rowid."' LIMIT 1");
                      }
                      else $tmpadresseid = 0;
                    }
                    if($data[$c]=='') {
                      $data[$c] = 'NEW';
                    }
                    break;
                  case 'beleg_lieferantennummer':
                    if(!$tmpadresseid)
                    {
                      $tmpadresseid = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='".$this->app->DB->real_escape_string($data[$c])."' AND lieferantennummer!='' AND geloescht!=1 ORDER BY projekt = '$projekt' DESC LIMIT 1");
                      if($tmpadresseid > 0) {
                        $this->app->DB->Update("UPDATE belegeimport SET adresse='$tmpadresseid' WHERE id='".$rowid."' LIMIT 1");
                      }
                      else $tmpadresseid = 0;
                    }
                    if($data[$c]=='') {
                      $data[$c] = 'NEW';
                    }
                    break;

                  case 'beleg_datum':
                    if(strpos($data[$c],'.') !== false)
                    {
                      $datuma = explode('.',$data[$c]);
                      if((!empty($datuma)?count($datuma):0) == 3)
                      {
                        if(strlen($datuma[2]) == 2)
                        {
                          $curryear = date("Y")-2000;
                          if((int)$datuma[2] <= $curryear)
                          {
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.20'.$datuma[2];
                          }else{
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.19'.$datuma[2];
                          }
                        }
                      }
                      $data[$c] = date('Y-m-d',strtotime($data[$c]));
                    }
                    break;

                  case 'beleg_lieferdatum':
                    if(strpos($data[$c],'.') !== false)
                    {
                      $datuma = explode('.',$data[$c]);
                      if((!empty($datuma)?count($datuma):0) == 3)
                      {
                        if(strlen($datuma[2]) == 2)
                        {
                          $curryear = date("Y")-2000;
                          if((int)$datuma[2] <= $curryear)
                          {
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.20'.$datuma[2];
                          }else{
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.19'.$datuma[2];
                          }
                        }
                      }
                      $data[$c] = date('Y-m-d',strtotime($data[$c]));
                    }
                    break;

                  case 'beleg_tatsaechlicheslieferdatum':
                    if(strpos($data[$c],'.') !== false)
                    {
                      $datuma = explode('.',$data[$c]);
                      if((!empty($datuma)?count($datuma):0) == 3)
                      {
                        if(strlen($datuma[2]) == 2)
                        {
                          $curryear = date("Y")-2000;
                          if((int)$datuma[2] <= $curryear)
                          {
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.20'.$datuma[2];
                          }else{
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.19'.$datuma[2];
                          }
                        }
                      }
                      $data[$c] = date('Y-m-d',strtotime($data[$c]));
                    }
                    break;

                  case 'artikel_lieferdatum':
                    if(strpos($data[$c],'.') !== false)
                    {
                      $datuma = explode('.',$data[$c]);
                      if((!empty($datuma)?count($datuma):0) == 3)
                      {
                        if(strlen($datuma[2]) == 2)
                        {
                          $curryear = date("Y")-2000;
                          if((int)$datuma[2] <= $curryear)
                          {
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.20'.$datuma[2];
                          }else{
                            $data[$c] = $datuma[0].'.'.$datuma[1].'.19'.$datuma[2];
                          }
                        }
                      }
                      $data[$c] = date('Y-m-d',strtotime($data[$c]));
                    }
                    break;

                  case 'artikel_preis':
                    $preis = str_replace(',','.',$data[$c]);
                    if ($preisfuermenge == 0) {
                      $preisfuermenge =1;
                    }
                    $data[$c] = $preis / $preisfuermenge;
                    break;
                  case 'artikel_preisfuermenge':
                    $preisfuermenge = str_replace(',','.',$data[$c]);
                    if ($preisfuermenge == 0) {
                      $preisfuermenge =1;
                    }
                    $data['artikel_preis'] = $preis / $preisfuermenge;
                    break;
                  case 'artikel_rabatt':
                  case 'artikel_menge':
                    $data[$c] = str_replace(',','.',$data[$c]);
                    break;

                }
                if(isset($fields[$c]) && $fields[$c])
                {
                  $this->app->DB->Update("UPDATE belegeimport SET ".$fields[$c]." = '".$this->app->DB->real_escape_string($data[$c])."' WHERE id='".$rowid."' LIMIT 1");
                }
                if(!empty($status)) {
                  $this->app->DB->Update(
                    sprintf(
                      "UPDATE belegeimport SET status = '%s' WHERE id = %d",
                      $this->app->DB->real_escape_string($status), $rowid
                    )
                  );
                }

              }
              //echo $data[$c] . "<br />\n";
            }

            if($row > 1){
              if($menge === false)
              {
                $this->app->DB->Update("UPDATE belegeimport SET artikel_menge = 1 WHERE id='".$rowid."' LIMIT 1");
              }
              if($beleg_datum === false)
              {
                $this->app->DB->Update("UPDATE belegeimport SET beleg_datum = now() WHERE id = '".$rowid."' LIMIT 1");
              }
              if($tmpadresseid && $beleg_art === false)
              {
                $arttmp = $this->app->DB->Select("SELECT art FROM adresse WHERE id = '$tmpadresseid' LIMIT 1");
                if($arttmp) {
                  $this->app->DB->Update("UPDATE belegeimport SET beleg_art = '".$this->app->DB->real_escape_string($arttmp)."' WHERE id = '".$rowid."' LIMIT 1");
                }
              }
              if( $tmpartikelid)
              {
                if($vkpreisex === false)
                {
                  $this->app->DB->Update("UPDATE belegeimport SET artikel_preis = '".$this->app->erp->GetVerkaufspreis($tmpartikelid,($menge === false?1: ($data[$menge]>0?$data[$menge]:1)),$tmpadresseid )."' WHERE id = '".$rowid."' LIMIT 1");
                }
                if($artikel_bezeichnung === false)
                {
                  $this->app->DB->Update("UPDATE belegeimport SET artikel_bezeichnung = '".$this->app->DB->real_escape_string($this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$tmpartikelid' LIMIT 1" ))."' WHERE id = '".$rowid."' LIMIT 1");
                }
              }
              if(!$data[$menge]){
                //Artikel mit Menge 0 entfernen
                $this->app->DB->Update("DELETE FROM belegeimport WHERE id='".$rowid."'");
              }
            }

            $row++;
          }
          fclose($handle);
        }
      }
      return $ret;
    }
  }