<?php

/**
 *
 * Copyright (C) Die Randgruppe GmbH
 *
 * http://www.randshop.com
 * http://www.dierandgruppe.com
 *
 * Unter der Lizenz von Die Randgruppe GmbH:
 * http://www.randshop.com/Lizenz
 *
 * $Author$
 * $Date$
 * $Revision$
 *
 */

include_once(DATEIPFAD . "includes/functions.artikel.inc.php");

define('BUCHUNGS_EINGANG', 1);
define('BUCHUNGS_AUSGANG', 2);
define('VORSCHAU_ANZAHL', 5);

function SetBestellungLager($BestellID) {


	// Lagerbucheintrag
	$SQLString = 'SELECT ';
	$SQLString .= TABLE_BESTELLEN . '.kunden_id, ';
	$SQLString .= TABLE_BESTELLEN . '.session, ';
	$SQLString .= TABLE_BESTELLEN . '.rechnungsnummer, ';
	$SQLString .= TABLE_BESTELLEN . '.set_lager, ';
	$SQLString .= 'DATE_FORMAT(' . TABLE_BESTELLEN . '.rechnungsdatum, \'%d.%m.%Y\') AS rechnungsdatum_format ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_BESTELLEN . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_BESTELLEN . '.id = \'' . $BestellID . '\' ';

	$BestellObject = mysql_fetch_object(mysql_query($SQLString));

	LogLager('SetBestellungLager()', $BestellID);

	if (!$BestellObject->set_lager) {

		$SQLString = 'SELECT ';
		$SQLString .= TABLE_WARENKORB . '.id, ';
		$SQLString .= TABLE_WARENKORB . '.artikel_id, ';
		$SQLString .= TABLE_WARENKORB . '.menge ';
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_WARENKORB . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_WARENKORB . '.session = \'' . $BestellObject->session . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		$Lagerbuchbemerkung = 'Kundenbestellung / Rechnung ' . $BestellObject->rechnungsnummer . ' (Kd Nr: ' . $BestellObject->kunden_id . ') vom ' . $BestellObject->rechnungsdatum_format;

		while ($WarenkorbRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

			RemoveWarenbestand($WarenkorbRow['artikel_id'], $WarenkorbRow['menge'], $Lagerbuchbemerkung, $BestellID, $WarenkorbRow['id']);

		}

		$SQLString = 'UPDATE ' . TABLE_BESTELLEN . ' SET ';
		$SQLString .= TABLE_BESTELLEN . '.set_lager = 1 ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_BESTELLEN . '.id = \'' . $BestellID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

	}

}


function SetBestellungBestellLager($BestellID) {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_BESTELLEN . '.session, ';
	$SQLString .= TABLE_BESTELLEN . '.set_lager_bestellung ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_BESTELLEN . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_BESTELLEN . '.id = \'' . $BestellID . '\' ';

	$BestellObject = mysql_fetch_object(mysql_query($SQLString));

	if (!$BestellObject->set_lager_bestellung) {

		$SQLString = 'SELECT ';
		$SQLString .= TABLE_WARENKORB . '.artikel_id,';
		$SQLString .= TABLE_WARENKORB . '.menge ';
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_WARENKORB . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_WARENKORB . '.session = \'' . $BestellObject->session . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		while ($WarenkorbRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

			RemoveBestellLagerbestand($WarenkorbRow["artikel_id"], $WarenkorbRow["menge"]);

		}

		$SQLString = 'UPDATE ' . TABLE_BESTELLEN . ' SET ';
		$SQLString .= TABLE_BESTELLEN . '.set_lager_bestellung = 1 ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_BESTELLEN . '.id = \'' . $BestellID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

	}

}

function KorrekturWarenbestand($ArtikelID, $KorrekturLager) {

	global $a_wb_korrektur_bemerkung;

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_ARTIKEL . '.lager ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$ArtikelObject = mysql_fetch_object(mysql_query($SQLString));

	$LagerDifferenz  = $KorrekturLager - $ArtikelObject->lager;

	if ($LagerDifferenz == 0) {
		return false;
	}

	// Warenausgang
	if ($LagerDifferenz < 0)  {

		RemoveWarenbestand($ArtikelID, ($LagerDifferenz * (-1)), sprintf($a_wb_korrektur_bemerkung, date('d.m.Y')));

	// Wareneingang
	} else {

		AddWarenbestand($ArtikelID, $LagerDifferenz, '', sprintf($a_wb_korrektur_bemerkung, date('d.m.Y')), 0, 0, 0, 0, false);

	}

}

function RemoveBestellLagerbestand($ArtikelID, $Warenausgang) {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_ARTIKEL . '.gruppenartikel ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$ArtikelObject = mysql_fetch_object(mysql_query($SQLString));

	if ($ArtikelObject->gruppenartikel) {

		$SQLString = 'SELECT ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id, ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.menge ';
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		while ($ArtikelGruppenRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

			RemoveBestellLagerbestand($ArtikelGruppenRow['teilartikel_id'], ($ArtikelGruppenRow['menge'] * $Warenausgang));

		}

	} else {

		$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
		$SQLString .= TABLE_ARTIKEL . '.lager_bestellungen = (' . TABLE_ARTIKEL . '.lager_bestellungen - \'' . $Warenausgang . '\') ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		LogLager('RemoveBestellLagerbestand()', $SQLString);

        UpdateMerkmalkombiParentLagerbestaende($ArtikelID);
	}

}

function CheckWarenbestand($ArtikelID, $Warenausgang) {

	$ArtikelObject = GetArtikelDetail($ArtikelID);

	if ($Warenausgang > $ArtikelObject->lager_bestellungen) {
		return false;
	} else {
		return true;
	}

}

function GetOffeneWarenkorbDataArray($ArtikelID) {

	$OffeneWarenkorbDataArray = array();

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_BESTELLEN . '.auftragsnummer, ';
	$SQLString .= 'DATE_FORMAT(' . TABLE_BESTELLEN . '.auftragsdatum, \'%d.%m.%Y\') AS auftragsdatum_format, ';
	$SQLString .= TABLE_WARENKORB . '.menge, ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.menge AS gruppen_menge ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_BESTELLEN . ' ';
	$SQLString .= 'LEFT JOIN ' . TABLE_WARENKORB . ' ON ' . TABLE_BESTELLEN . '.session = ' . TABLE_WARENKORB . '.session ';
	$SQLString .= 'LEFT JOIN ' . TABLE_ARTIKEL_GRUPPEN . ' ON ' . TABLE_WARENKORB . '.artikel_id = ' . TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id ';
	$SQLString .= 'WHERE ';
	$SQLString .= '(';
	$SQLString .= TABLE_BESTELLEN . '.set_lager_bestellung = 1 AND ';
	$SQLString .= TABLE_BESTELLEN . '.set_lager = 0 ';
	$SQLString .= ') AND ';
	$SQLString .= TABLE_BESTELLEN . '.lieferantenbestellung = 0 AND ';
	$SQLString .= '(';
	$SQLString .= TABLE_WARENKORB . '.artikel_id = \'' . $ArtikelID . '\' OR ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id = \'' . $ArtikelID . '\' ';
	$SQLString .= ')';
	$SQLString .= 'ORDER BY ' . TABLE_BESTELLEN . '.auftragsdatum ';

//	echo '$SQLString: ' . $SQLString . '<br>';

	$MySQLQueryReference = mysql_query($SQLString);

	while ($WarenkorbRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

		if ($WarenkorbRow['gruppen_menge']) {
			$WarenkorbRow['menge'] = $WarenkorbRow['menge'] * $WarenkorbRow['gruppen_menge'];
		}

		$OffeneWarenkorbDataArray[] = $WarenkorbRow;

	}

	return $OffeneWarenkorbDataArray;

}


function GetLagerbuchAnzahl($ArtikelID = '', $SearchField = '', $SearchString = '') {

	$SQLString = 'SELECT ';
	$SQLString .= 'COUNT(DISTINCT(' . TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id)) AS lagerbuch_anzahl ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_LAGERBUCH . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= '( ';

	if ($ArtikelID) {
		$SQLString .= '(' . TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\') AND ';
	}

	if ($SearchField && $SearchString) {
		$SQLString .= '(' . $SearchField . ' = \'' . $SearchString . '\') AND ';
	}

	$SQLString .= ' 1) ';

//	echo '$SQLString: ' . $SQLString . '<br>';

	$LagerbuchAnzahlObject = mysql_fetch_object(mysql_query($SQLString));

	return $LagerbuchAnzahlObject->lagerbuch_anzahl;

}

function GetLagerbuchDataArray($ArtikelID = '', $SearchField = '', $SearchString = '', $SortField = '', $SortOrder = '', $DataOffset = '', $DataCount = '') {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_LAGERBUCH . '.artikel_nr, ';
	$SQLString .= TABLE_LAGERBUCH . '.artikel_name, ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_datum, ';
	$SQLString .= 'DATE_FORMAT(' . TABLE_LAGERBUCH . '.buchungs_datum, \'%d.%m.%Y\') AS buchungs_datum_format, ';
	$SQLString .= 'SUM(' . TABLE_LAGERBUCH . '.buchungs_menge) AS buchungs_menge, ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_preis, ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_verbrauch, ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_type, ';
	$SQLString .= TABLE_LAGERBUCH . '.parent_lagerbuch_id, ';
	$SQLString .= TABLE_LAGERBUCH . '.bestell_id, ';
	$SQLString .= TABLE_LAGERBUCH . '.warenkorb_id, ';
	$SQLString .= TABLE_LAGERBUCH . '.bemerkung ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_LAGERBUCH . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= '( ';

	if ($ArtikelID) {
		$SQLString .= '(' . TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\') AND ';
	}

	if ($SearchField && $SearchString) {
		$SQLString .= '(' . $SearchField . ' = \'' . $SearchString . '\') AND ';
	}

	$SQLString .= ' 1) ';

	$SQLString .= 'GROUP BY ' . TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id ';

	if ($SortField && $SortOrder) {
		$SQLString .= 'ORDER BY ' . $SortField . ' ' . $SortOrder . ' ';
	}

	if (($DataOffset !== '') && ($DataCount !== '')) {
		$SQLString .= 'LIMIT ' . $DataOffset . ', ' . $DataCount . ' ';
	}

	$MySQLQueryReference = mysql_query($SQLString);

//	echo '$SQLString: ' . $SQLString . '<br>';

	$LagerbuchDataArray = array();

	$LagerbuchCounter = 0;

	while ($LagerbuchRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

		$LagerbuchDataArray[$LagerbuchCounter] = $LagerbuchRow;
		$LagerbuchCounter++;

	}

	return $LagerbuchDataArray;

}


function AddLieferantenBestellungLieferung($BestellID) {

	LogLager('AddLieferantenBestellungLieferung()', $BestellID);

	$BestellObject = GetLieferantenBestellenDetail($BestellID);

	$Lagerbuchbemerkung = 'Lieferantenbestellung / Bestellnummer ' . $BestellObject->bestellnummer . ' vom ' . $BestellObject->bestelldatum_format;

	foreach ($BestellObject->warenkorbdataarray["warenkorbarray"] as $WarenkorbEintrag) {

		AddWarenbestand($WarenkorbEintrag['artikel_id'], $WarenkorbEintrag['menge'], $WarenkorbEintrag['preis_netto'], $Lagerbuchbemerkung, $BestellID, $WarenkorbEintrag['id'], '', '', false);

	}

}

function AddLieferantenBestellungTeillieferung($BestellID, $TeilmengenArray) {

	$BestellObject = GetLieferantenBestellenDetail($BestellID);

	$Lagerbuchbemerkung = "Lieferantenbestellung / Bestellnummer " . $BestellObject->bestellnummer . " vom " . $BestellObject->bestelldatum_format;

	LogLager('AddLieferantenBestellungTeillieferung()', $BestellID);

	foreach ($TeilmengenArray as $WarenkorbID => $Teilmengen) {

		$SQLString = "SELECT ";
		$SQLString .= TABLE_WARENKORB . ".artikel_id, ";
		$SQLString .= TABLE_WARENKORB . ".artikel_nr, ";
		$SQLString .= TABLE_WARENKORB . ".artikel_name, ";
		$SQLString .= TABLE_WARENKORB . ".preis_netto, ";
		$SQLString .= TABLE_WARENKORB . ".lieferant_geliefert AS geliefert ";
		$SQLString .= "FROM ";
		$SQLString .= TABLE_WARENKORB . " ";
		$SQLString .= "WHERE ";
		$SQLString .= TABLE_WARENKORB . ".id = '" . $WarenkorbID . "' ";

		$WarenkorbObject = mysql_fetch_object(mysql_query($SQLString));

		AddWarenbestand($WarenkorbObject->artikel_id, ((int)$Teilmengen - (int)$WarenkorbObject->geliefert), $WarenkorbObject->preis_netto, $Lagerbuchbemerkung, $BestellID, $WarenkorbID, "", "", false);

	}

}

function LogLager($Headline, $Text = '') {

	if (!file_exists(DATEIPFAD . 'admin/data/logs/lager')) {
		mkdir(DATEIPFAD . 'admin/data/logs/lager', 0755, true);
	}

	if (!file_exists(DATEIPFAD . 'admin/data/logs/lager/' . date('Y_m').'.log')) {
		$FileHandler = fopen(DATEIPFAD . 'admin/data/logs/lager/' . date('Y_m').'.log',  'a');
	} else {
		$FileHandler = fopen(DATEIPFAD . 'admin/data/logs/lager/' . date('Y_m').'.log',  'a');
	}

	$LogEntrie = date('d.m.Y - H.i.s') . ' ';
	$LogEntrie .= $_SERVER['REMOTE_ADDR'] . ' ';
	$LogEntrie .= $Headline . ' ';
	$LogEntrie .= $Text . ' ';

	fwrite($FileHandler, $LogEntrie . "\n");

	fclose($FileHandler);

}

function GetNewLagerbuchVorgangsID() {

	$SQLString = 'SELECT ';
	$SQLString .= 'MAX(' . TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id) AS new_lagerbuch_vorgangs_id ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_LAGERBUCH . ' ';

	$NewLagerbuchVorgnagsObject = mysql_fetch_object(mysql_query($SQLString));

	return $NewLagerbuchVorgnagsObject->new_lagerbuch_vorgangs_id + 1;

}

function AddWarenbestand($ArtikelID, $Wareneingang, $BuchungsPreis = 0, $WareneingangBemerkung = '', $BestellID = 0, $WarenkorbID = 0, $ParentLagerbuchID = 0, $BuchungsVerbrauch = 0, $Bestseller = true) {

	if ($Wareneingang == 0) {
		return false;
	}

	$ArtikelObject = GetArtikelDetail($ArtikelID);
	$LagerbuchVorgangsID = GetNewLagerbuchVorgangsID();

	// Lagerbuch
	$SQLString = 'INSERT INTO ' . TABLE_LAGERBUCH . ' SET ';
	$SQLString .= TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id = \'' . $LagerbuchVorgangsID . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.artikel_nr = \'' . $ArtikelObject->artikel_nr . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.artikel_name = \'' . $ArtikelObject->artikel_name . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_datum = NOW(), ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_menge = \'' . $Wareneingang . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_verbrauch = \'' . $BuchungsVerbrauch . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_preis = \'' . $BuchungsPreis . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.buchungs_type = \'' . BUCHUNGS_EINGANG . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.parent_lagerbuch_id = \'' . $ParentLagerbuchID . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.bestell_id = \'' . $BestellID . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.warenkorb_id = \'' . $WarenkorbID . '\', ';
	$SQLString .= TABLE_LAGERBUCH . '.bemerkung = \'' . $WareneingangBemerkung . '\' ';

	$MySQLQueryReference = mysql_query($SQLString);

	// TODO: hier ist kein Unterschied der Aufrufe?

	// Lagerestand
	if ($BestellID) {
		AddLagerbestand($ArtikelID, $Wareneingang, true, $Bestseller);
	} else {
		AddLagerbestand($ArtikelID, $Wareneingang, true, $Bestseller);
	}

}

function AddBestellLagerbestand($ArtikelID, $Wareneingang) {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_ARTIKEL . '.gruppenartikel ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$ArtikelObject = mysql_fetch_object(mysql_query($SQLString));

	if ($ArtikelObject->gruppenartikel) {

		$SQLString = 'SELECT ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id, ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.menge ';
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		while ($ArtikelGruppenRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

			AddBestellLagerbestand($ArtikelGruppenRow['teilartikel_id'], ($ArtikelGruppenRow['menge'] * $Wareneingang));

		}

	} else {

		$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
		$SQLString .= TABLE_ARTIKEL . '.lager_bestellungen = (' . TABLE_ARTIKEL . '.lager_bestellungen + \'' . $Wareneingang . '\') ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		LogLager('AddBestellLagerbestand()', $SQLString);

        UpdateMerkmalkombiParentLagerbestaende($ArtikelID);

    }

}


function RemoveLagerbestand($ArtikelID, $Warenausgang, $BestellLager = true, $Bestseller = false) {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_ARTIKEL . '.gruppenartikel ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$ArtikelObject = mysql_fetch_object(mysql_query($SQLString));

	$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
	$SQLString .= TABLE_ARTIKEL . '.lager = (' . TABLE_ARTIKEL . '.lager - \'' . $Warenausgang . '\') ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$MySQLQueryReference = mysql_query($SQLString);

	LogLager('RemoveLagerbestand()', $SQLString);

	if ($BestellLager)
	{
		RemoveBestellLagerbestand($ArtikelID, $Warenausgang);
	}

	if ($Bestseller)
	{

		$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
		$SQLString .= TABLE_ARTIKEL . '.wie_oft_bestellt = (' . TABLE_ARTIKEL . '.wie_oft_bestellt + \'' . $Warenausgang . '\') ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);
        UpdateMerkmalkombinationWieOftBestellt($ArtikelID);
	}


	// Alle Gruppenartikel heraussuchen denen dieser Artikel zugeordnet ist und für
	// diese den Lagerstand neu berechnen

	$SQLString = 'SELECT ';
	$SQLString .=  TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id = \'' . $ArtikelID . '\' ';

	$MySQLQueryReference = mysql_query($SQLString);

	while ($GruppenartikelID = mysql_fetch_row($MySQLQueryReference)) {
		UpdateArtikelGruppeLagerbestand($GruppenartikelID[0]);
	}

    UpdateMerkmalkombiParentLagerbestaende($ArtikelID);

}

function AddLagerbestand($ArtikelID, $Wareneingang, $BestellLager = true, $Bestseller = false) {

	$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
	$SQLString .= TABLE_ARTIKEL . '.lager = (' . TABLE_ARTIKEL . '.lager + \'' . $Wareneingang . '\') ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$MySQLQueryReference = errorlogged_mysql_query($SQLString);

	LogLager('AddLagerbestand()', $SQLString);

	if ($BestellLager) {

		AddBestellLagerbestand($ArtikelID, $Wareneingang);

	}

	if ($Bestseller) {

		$SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET ';
		$SQLString .= TABLE_ARTIKEL . '.wie_oft_bestellt = (' . TABLE_ARTIKEL . '.wie_oft_bestellt - \'' . $Wareneingang . '\') ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = errorlogged_mysql_query($SQLString);
        UpdateMerkmalkombinationWieOftBestellt($ArtikelID);
	}

	// Alle Gruppenartikel heraussuchen denen dieser Artikel zugeordnet ist und für
	// diese den Lagerstand neu berechnen

	$SQLString = 'SELECT ';
	$SQLString .=  TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id = \'' . $ArtikelID . '\' ';

	$MySQLQueryReference = mysql_query($SQLString);

	while ($GruppenartikelID = mysql_fetch_row($MySQLQueryReference)) {
		UpdateArtikelGruppeLagerbestand($GruppenartikelID[0]);
	}

    UpdateMerkmalkombiParentLagerbestaende($ArtikelID);
}

	function StorniereWarenbestand($WarenkorbID, $menge = false) {

		$SQLString = "SELECT ";
		$SQLString .= TABLE_WARENKORB . ".artikel_id, ";
		$SQLString .= TABLE_WARENKORB . ".menge, " ;
		$SQLString .= TABLE_ARTIKEL . ".gruppenartikel, " ;
        $SQLString .= TABLE_BESTELLEN . '.set_lager, ';
        $SQLString .= TABLE_BESTELLEN . '.set_lager_bestellung ';
		$SQLString .= "FROM ";
		$SQLString .= TABLE_WARENKORB . " ";
		$SQLString .= "LEFT JOIN " . TABLE_ARTIKEL . " ON " . TABLE_WARENKORB . ".artikel_id = " . TABLE_ARTIKEL . ".id ";
        $SQLString .= "LEFT JOIN " . TABLE_BESTELLEN . " ON " . TABLE_WARENKORB . ".session = " . TABLE_BESTELLEN . ".session ";
		$SQLString .= "WHERE ";
		$SQLString .= TABLE_WARENKORB . ".id = '" . $WarenkorbID . "' ";

		$MySQLQueryReference = errorlogged_mysql_query($SQLString);
        $artikel = mysql_fetch_assoc($MySQLQueryReference);
        if($menge !== false && $menge < $artikel['menge'])
            $artikel['menge'] = $menge;
		$artikelArray[] = $artikel;

        $StorniereLager = $artikel['set_lager'];
        $StorniereBestellLager = $artikel['set_lager_bestellung'];

		if($artikelArray[0]['gruppenartikel'] == 1)
		{
			$artikelArray = array();

			$SQLString = "SELECT ";
			$SQLString .= TABLE_ARTIKEL_GRUPPEN . ".teilartikel_id as artikel_id, ";
			$SQLString .= TABLE_WARENKORB . ".menge as wk_menge, ";
            $SQLString .= TABLE_ARTIKEL_GRUPPEN . ".menge as teilartikel_menge ";
			$SQLString .= "FROM ";
			$SQLString .= TABLE_WARENKORB . " ";
			$SQLString .= "LEFT JOIN " . TABLE_ARTIKEL_GRUPPEN . " ON " . TABLE_WARENKORB . ".artikel_id = " . TABLE_ARTIKEL_GRUPPEN . ".gruppenartikel_id ";
			$SQLString .= "WHERE ";
			$SQLString .= TABLE_WARENKORB . ".id = '" . $WarenkorbID . "' ";

			$MySQLQueryReference = errorlogged_mysql_query($SQLString);

			while($artikel = mysql_fetch_assoc($MySQLQueryReference)) {
                if($menge !== false && $menge < $artikel['wk_menge']) {
                    $artikel['menge'] = $menge * $artikel['teilartikel_menge'];
                } else {
                    $artikel['menge'] = $artikel['wk_menge'] * $artikel['teilartikel_menge'];
                }
                $artikelArray[] = $artikel;
            }
		}

		foreach($artikelArray as $artikel)
		{
            if($StorniereLager) {
			    AddLagerbestand($artikel["artikel_id"], $artikel["menge"], false);
            }
            if($StorniereBestellLager) {
                AddBestellLagerbestand($artikel["artikel_id"], $artikel["menge"]);
            }
		}
	}

function RemoveWarenbestand($ArtikelID, $Warenausgang, $WarenausgangsBemerkung, $BestellID = 0, $WarenkorbID = 0) {

	$SQLString = 'SELECT ';
	$SQLString .= TABLE_ARTIKEL . '.gruppenartikel ';
	$SQLString .= 'FROM ';
	$SQLString .= TABLE_ARTIKEL . ' ';
	$SQLString .= 'WHERE ';
	$SQLString .= TABLE_ARTIKEL . '.id = \'' . $ArtikelID . '\' ';

	$ArtikelObject = mysql_fetch_object(mysql_query($SQLString));

	if ($ArtikelObject->gruppenartikel) {

		$SQLString = 'SELECT ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.teilartikel_id, ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.menge ';
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= TABLE_ARTIKEL_GRUPPEN . '.gruppenartikel_id = \'' . $ArtikelID . '\' ';

		$MySQLQueryReference = mysql_query($SQLString);

		while ($ArtikelGruppenRow = mysql_fetch_array($MySQLQueryReference, MYSQL_ASSOC)) {

			RemoveWarenbestand($ArtikelGruppenRow['teilartikel_id'], ($ArtikelGruppenRow['menge'] * $Warenausgang), $WarenausgangsBemerkung, $BestellID, $WarenkorbID);

		}

	} else {

		$WarenausgangRest = $Warenausgang;
		$WarenausgangsSortierung = 'ASC';

		$ArtikelObject = GetArtikelDetail($ArtikelID);
		$LagerbuchVorgangsID = GetNewLagerbuchVorgangsID();

		// Letzten Eintrag des Artikels finden
		$SQLString = 'SELECT ';
		$SQLString .= TABLE_LAGERBUCH . '.lagerbuch_id, ';
		$SQLString .= '(' . TABLE_LAGERBUCH . '.buchungs_menge - ' . TABLE_LAGERBUCH . '.buchungs_verbrauch) AS rest_menge ' ;
		$SQLString .= 'FROM ';
		$SQLString .= TABLE_LAGERBUCH . ' ';
		$SQLString .= 'WHERE ';
		$SQLString .= '(' . TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\') AND  ';
		$SQLString .= '(' . TABLE_LAGERBUCH . '.buchungs_type = \'' . BUCHUNGS_EINGANG . '\') AND  ';
		$SQLString .= '((' . TABLE_LAGERBUCH . '.buchungs_menge - ' . TABLE_LAGERBUCH . '.buchungs_verbrauch) > 0) ';
		$SQLString .= 'ORDER BY ';
		$SQLString .= TABLE_LAGERBUCH . '.buchungs_datum ' . $WarenausgangsSortierung;

		$MySQLQueryReference = mysql_query($SQLString);

		while (($WarenkorbLagerbuchRow = mysql_fetch_array($MySQLQueryReference)) && ($WarenausgangRest > 0)) {

			// Prüfen, ob die verbleibende Menge des Lagerbucheintrags reicht
			if ($WarenkorbLagerbuchRow['rest_menge'] <= $WarenausgangRest) {
				$WarenausgangBuchwert = $WarenkorbLagerbuchRow['rest_menge'];
				$WarenausgangRest = $WarenausgangRest - $WarenkorbLagerbuchRow['rest_menge'];
			} else {
				$WarenausgangBuchwert = $WarenausgangRest;
				$WarenausgangRest = 0;
			}

			// Wareneingang vermerken
			$SQLString = 'UPDATE ' . TABLE_LAGERBUCH . ' SET ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_verbrauch = (' . TABLE_LAGERBUCH . '.buchungs_verbrauch + \'' . $WarenausgangBuchwert . '\') ';
			$SQLString .= 'WHERE ';
			$SQLString .= TABLE_LAGERBUCH . '.lagerbuch_id = \'' . $WarenkorbLagerbuchRow['lagerbuch_id'] . '\' ';

			$MySQLUpdateQueryReference = mysql_query($SQLString);

			// Warenausgang buchen
			$SQLString = 'INSERT INTO ' . TABLE_LAGERBUCH . ' SET ';
			$SQLString .= TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id = \'' . $LagerbuchVorgangsID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_nr = \'' . $ArtikelObject->artikel_nr . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_name = \'' . $ArtikelObject->artikel_name . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_datum = NOW(), ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_menge = \'' . $WarenausgangBuchwert . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_preis = 0, ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_verbrauch = \'' . $WarenausgangBuchwert . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_type = \'' . BUCHUNGS_AUSGANG . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.parent_lagerbuch_id = \'' . $WarenkorbLagerbuchRow['lagerbuch_id'] . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.bestell_id = \'' . $BestellID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.warenkorb_id = \'' . $WarenkorbID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.bemerkung = \'' . $WarenausgangsBemerkung . '\' ';

			$MySQLInsertQueryReference = mysql_query($SQLString);

		}

		if ($WarenausgangRest > 0) {

			$LagerbuchVorgangsID = GetNewLagerbuchVorgangsID();

			// Warenausgang buchen
			$SQLString = 'INSERT INTO ' . TABLE_LAGERBUCH . ' SET ';
			$SQLString .= TABLE_LAGERBUCH . '.lagerbuch_vorgangs_id = \'' . $LagerbuchVorgangsID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_id = \'' . $ArtikelID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_nr = \'' . $ArtikelObject->artikel_nr . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.artikel_name = \'' . $ArtikelObject->artikel_name . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_datum = NOW(), ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_menge = \'' . $WarenausgangRest . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_preis = 0, ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_verbrauch = \'' . $WarenausgangRest . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.buchungs_type = \'' . BUCHUNGS_AUSGANG . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.parent_lagerbuch_id = 0, ';
			$SQLString .= TABLE_LAGERBUCH . '.bestell_id = \'' . $BestellID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.warenkorb_id = \'' . $WarenkorbID . '\', ';
			$SQLString .= TABLE_LAGERBUCH . '.bemerkung = \'<span style=\'color: red\'>' . $WarenausgangsBemerkung . ' - Ware war nicht auf Lager!</span>\'';

			$MySQLInsertQueryReference = mysql_query($SQLString);

		}

		// Lagerestand
		if ($BestellID) {
			RemoveLagerbestand($ArtikelID, $Warenausgang, false, true);
		} else {
			RemoveLagerbestand($ArtikelID, $Warenausgang, true, false);
		}

	}

}

	function UpdateArtikelGruppeLagerbestand($GruppenArtikelID)
	{
		$SQLString = "SELECT FLOOR(MIN(" . TABLE_ARTIKEL . ".lager / " . TABLE_ARTIKEL_GRUPPEN . ".menge)) ";
		$SQLString .= "FROM " . TABLE_ARTIKEL . " INNER JOIN " . TABLE_ARTIKEL_GRUPPEN . " ON " . TABLE_ARTIKEL . ".id = " . TABLE_ARTIKEL_GRUPPEN . ".teilartikel_id ";
		$SQLString .= "WHERE " . TABLE_ARTIKEL_GRUPPEN . ".gruppenartikel_id = " . $GruppenArtikelID;
		$gruppenlager = mysql_fetch_row(errorlogged_mysql_query($SQLString));

		if($gruppenlager !== null && $gruppenlager[0] !== null) // zur Sicherheit falls ein Nicht-Gruppenartikel �bergeben wurde
		{
			$SQLString = "UPDATE " . TABLE_ARTIKEL . " SET " . TABLE_ARTIKEL . ".lager=" . $gruppenlager[0];
			$SQLString .= " WHERE " . TABLE_ARTIKEL . ".id=" . $GruppenArtikelID;
			errorlogged_mysql_query($SQLString);
		}
	}

function UpdateMerkmalkombinationWieOftBestellt($ArtikelID) {
    $SQLString = 'SELECT merkmalkombinationparentid FROM ' . TABLE_ARTIKEL . ' WHERE id = \'' . $ArtikelID . '\'';
    $row = mysql_fetch_row(errorlogged_mysql_query($SQLString));

    if($row && $row[0] != 0) {
        $ArtikelID = $row[0];
    }

    $SQLString = 'UPDATE ' . TABLE_ARTIKEL . ' SET wie_oft_bestellt = (SELECT summe FROM (SELECT sum(wie_oft_bestellt) as summe FROM ' . TABLE_ARTIKEL . ' WHERE merkmalkombinationparentid = \'' . $ArtikelID . '\') sumselect) WHERE merkmalkombination > 0 AND id = \'' . $ArtikelID . '\'';
    errorlogged_mysql_query($SQLString);
}