s2doservice.php
/// Art: Online Auftragsverwaltung
/// Inhalt: Webservice für die Auftragsverwaltung
/// Beschreibung: Serverkommunikation für die Auftragsverwaltung für Kunden, Aufträge, Vorlagen und Emails
/// Benötigt: Alle, siehe init
/// CCML-Parsing: notwendig
///
//////////////////////////////////////////////////////////////////////////////////////////
///
/// Letzte Änderungen:
/// 07.12.2008 Suchfunktion umgestellt
/// 30.01.2009 Minorbug Auftrag löschen
/// 24.04.2009 Korrektur MwSt.
/// 22.09.2009 split -> explode
/// 24.01.2010 Payment Kosten und Rabatte eingebaut
/// 25.03.2010 Rechnungserstellung bei Statuswechsel
/// 27.03.2010 Manuelle Rechnungserstellung
/// 02.08.2010 Bug Statusemail PDF
///
//////////////////////////////////////////////////////////////////////////////////////////
///<07.08.2010/7.0.1.9/>
define('ROOT', './');
define('ASSETS', ROOT.'assets/');
require(ASSETS.'s2diconf.php');
require(CC_INCLUDE_INIT);
require(CC_BLOGIC_CONFIG);
if (!$session->is_shopadmin())
	die();
////////////////////////////////////////////////////////////////////////////
function str2num($n) {
	$n = str_replace(CC_SITE_THOUSANDSOPERATOR, '', $n);
	$n = str_replace(CC_SITE_DECIMALSEPARATOR, '.', $n);
	return $n;
}
//////////////////////////////////////////////////////////////////////////// Mehrfach benutzte Funktionen
// Einen einzelnen Auftrag holen
function get_order() {
	$order_id = post(PARAMETER_ID, CHECK_NUM);
	$order = new order($order_id);
	$response[] = 'order_paymentcaption='.rawurlencode($order->payment_caption);
	$response[] = 'order_paymentamount='.rawurlencode(format::cleanprice($order->payment_amount));
	$response[] = 'order_paymentabsolute='.rawurlencode($order->payment_absolute);
	$response[] = 'order_paymentrebateamount='.rawurlencode(format::cleanprice($order->paymentrebate_amount));
	$response[] = 'order_paymentrebateabsolute='.rawurlencode($order->paymentrebate_absolute);
	$response[] = 'order_paymentvat='.rawurlencode(format::cleanprice($order->payment_vat));
	$response[] = 'order_shippingcaption='.rawurlencode($order->shipping_caption);
	$response[] = 'order_shippingcost='.rawurlencode(format::cleanprice($order->shipping_cost));
	$response[] = 'order_shippingvat='.rawurlencode(format::cleanprice($order->shipping_vat));
	$response[] = 'order_trackingid='.rawurlencode($order->tracking_id);
	$response[] = 'label_weight='.rawurlencode(format::weight($order->get_weight()));
	$response[] = 'client_bankaccountholder='.rawurlencode($order->client->bank_accountholder);
	$response[] = 'client_bankaccountnumber='.rawurlencode($order->client->bank_accountnumber);
	$response[] = 'client_bankcode='.rawurlencode($order->client->bank_code);
	$response[] = 'client_bankname='.rawurlencode($order->client->bank_name);
	$response[] = 'client_creditaccountholder='.rawurlencode($order->client->credit_accountholder);
	$response[] = 'client_creditaccountnumber='.rawurlencode($order->client->credit_accountnumber);
	$response[] = 'client_creditvaliduntil='.rawurlencode($order->client->credit_validuntil);
	$response[] = 'client_creditcvc='.rawurlencode($order->client->credit_cvc);
	$response[] = 'order_sumrebateamount='.rawurlencode(format::cleanprice($order->sumrebate_amount));
	$response[] = 'order_sumrebateabsolute='.rawurlencode($order->sumrebate_absolute);
	$response[] = 'order_couponrebateamount='.rawurlencode(format::cleanprice($order->couponrebate_amount));
	$response[] = 'order_couponrebateabsolute='.rawurlencode($order->couponrebate_absolute);
	$response[] = 'client_rebateamount='.rawurlencode(format::cleanprice($order->client->rebate_amount));
	$response[] = 'client_rebateabsolute='.rawurlencode($order->client->rebate_absolute);
	$response[] = 'client_salutation='.rawurlencode($order->client->salutation);
	$response[] = 'client_firstname='.rawurlencode($order->client->firstname);
	$response[] = 'client_lastname='.rawurlencode($order->client->lastname);
	$response[] = 'client_company='.rawurlencode($order->client->company);
	$response[] = 'client_street='.rawurlencode($order->client->street);
	$response[] = 'client_streetnumber='.rawurlencode($order->client->streetnumber);
	$response[] = 'client_zip='.rawurlencode($order->client->zip);
	$response[] = 'client_city='.rawurlencode($order->client->city);
	$response[] = 'client_country='.rawurlencode(substr($order->client->country, 11));
	$response[] = 'client_phone='.rawurlencode($order->client->phone);
	$response[] = 'client_cellphone='.rawurlencode($order->client->cellphone);
	$response[] = 'client_fax='.rawurlencode($order->client->fax);
	$response[] = 'client_custom1='.rawurlencode($order->client->custom1);
	$response[] = 'client_custom2='.rawurlencode($order->client->custom2);
	$response[] = 'client_custom3='.rawurlencode($order->client->custom3);
	$response[] = 'client_custom4='.rawurlencode($order->client->custom4);
	$response[] = 'client_custom5='.rawurlencode($order->client->custom5);
	$response[] = 'client_message='.rawurlencode($order->client->message);
	$response[] = 'order_message='.rawurlencode($order->message);
	$response[] = 'label_clientid='.rawurlencode($order->client->client_id);
	$response[] = 'order_status='.rawurlencode($order->status);
	$response[] = 'label_email='.rawurlencode($order->client->email);
	$response[] = 'label_orderid='.rawurlencode($order->order_id_prefix.$order->order_id);
	$response[] = 'label_orderdate='.rawurlencode(date(CC_SITE_DATEFORMAT, strtotime($order->order_date)).' '.$order->order_time);
	$response[] = 'label_billid='.rawurlencode($order->bill_id_prefix.$order->bill_id);
	$response[] = 'label_billdate='.rawurlencode($order->bill_date ? date(CC_SITE_DATEFORMAT, strtotime($order->bill_date)) : '');
	include_once(CC_BLOGIC_PDFDOC);
	$pdfdoc = new pdfdoc(CC_SITE_FILEKEY, DOCS, $order);
	if ($order->bill_id && !CC_SITE_BILLHASLEFTTHEBUILDING) {
		$bill_exists = true;
		$pdfdoc->verify($pdfdoc->MODE_BILL);
		$response[] = 'href_billpdflink=' . rawurlencode(CC_URL_OSPDF . '?' . PARAMETER_MODE . '=showbill&' . PARAMETER_ORDER . '=' . $order->order_id);
		$response[] = 'label_billpdflink=' . rawurlencode($pdfdoc->name($pdfdoc->MODE_BILL));
	} else
		$response[] = 'label_billpdflink=';
	if ($order->pdf_creation != PDF_CREATION_ONORDER && !CC_SITE_BILLHASLEFTTHEBUILDING) {
		$pdfdoc->verify($pdfdoc->MODE_CONFIRMATION);
		$response[] = 'href_orderpdflink=' . rawurlencode(CC_URL_OSPDF . '?' . PARAMETER_MODE . '=showconfirmation&' . PARAMETER_ORDER . '=' . $order->order_id);
		$response[] = 'label_orderpdflink=' . rawurlencode($pdfdoc->name($pdfdoc->MODE_CONFIRMATION));
	} else
		$response[] = 'label_orderpdflink=';
	$response[] = 'button_pdflink='. rawurlencode($order->pdf_creation == PDF_CREATION_NEVER && !$order->bill_id && !CC_SITE_BILLHASLEFTTHEBUILDING ? '1' : '0');
	$response[] = 'order_expecteddate='.($order->expected_date ? rawurlencode(date(CC_SITE_DATEFORMAT, strtotime($order->expected_date))) : '');
	$response[] = 'label_name='.rawurlencode($order->client->firstname.' '.$order->client->lastname);
	$response[] = 'client_deviatingshippingaddress='.rawurlencode($order->client->deviating_shipping_address);
	$response[] = 'client_shippingsalutation='.rawurlencode($order->client->shipping_salutation);
	$response[] = 'client_shippingfirstname='.rawurlencode($order->client->shipping_firstname);
	$response[] = 'client_shippinglastname='.rawurlencode($order->client->shipping_lastname);
	$response[] = 'client_shippingstreet='.rawurlencode($order->client->shipping_street);
	$response[] = 'client_shippingstreetnumber='.rawurlencode($order->client->shipping_streetnumber);
	$response[] = 'client_shippingzip='.rawurlencode($order->client->shipping_zip);
	$response[] = 'client_shippingcity='.rawurlencode($order->client->shipping_city);
	$response[] = 'client_shippingcountry='.rawurlencode(substr($order->client->shipping_country, 11));
	$response[] = 'client_shippingcompany='.rawurlencode($order->client->shipping_company);
	$response[] = 'multilabel_currency='.rawurlencode($order->currency);
	$response[] = 'label_b2who='.rawurlencode($order->b2b ? CC_RESSOURCE_BASKETNET : CC_RESSOURCE_BASKETGROSS);
	$response[] = 'label_couponid='.rawurlencode($order->coupon_id);
	$response[] = 'label_couponcaption='.rawurlencode($order->coupon_caption);
	$response[] = 'label_paymentdate='.($order->payment_date ? rawurlencode(date(CC_SITE_DATEFORMAT, strtotime($order->payment_date))) : '');
	$response[] = 'label_shippingdate='.($order->shipping_date ? rawurlencode(date(CC_SITE_DATEFORMAT, strtotime($order->shipping_date))) : '');
	$response[] = 'label_subtotal='.rawurlencode(format::price($order->get_subtotal(), $order->currency));
	$response[] = 'label_shippingpaymentcost='.rawurlencode(format::price($order->get_shipping_cost() + $order->get_payment_cost(), $order->currency));
	$response[] = 'label_rebate='.rawurlencode(format::price($order->get_rebate(), $order->currency));
	$response[] = 'label_vat='.rawurlencode(format::price($order->get_totalvat(), $order->currency));
	$response[] = 'label_total='.rawurlencode(format::price($order->get_totalprice(), $order->currency));
	die('1'.implode('&', $response));
}
// Alle Artikel zu einem Auftrag holen
function get_items(&$order) {
	global $orderstatus_ressources;
	$response = array();
	foreach ($order->items as $item) {
		$response[] = 'uid='.$item->uid.'_'.$item->position;
		$response[] = 'icon='.rawurlencode(constant('CC_ICON_STATUS'.($item->order_status ? strtoupper($item->order_status) : 'A')));
		$response[] = 'statusshort='.rawurlencode($item->order_status);
		$response[] = 'id='.rawurlencode($item->id);
		$response[] = 'caption='.rawurlencode($item->caption);
		if ($order->b2b) {
			$price = $response[] = 'gross='.rawurlencode(format::cleanprice(round($item->price * (1 + ($item->vat / 100)), 2)));
			$response[] = 'net='.rawurlencode(''.format::cleanprice($item->price).'');
		} else {
			$price = $response[] = 'gross='.rawurlencode(''.format::cleanprice($item->price).'');
			$response[] = 'net='.rawurlencode(format::cleanprice(round($item->price / (1 + ($item->vat / 100)), 2)));
		}
		$response[] = 'vat='.rawurlencode(format::cleanprice($item->vat));
		$response[] = 'quantity='.rawurlencode($item->quantity);
		$response[] = 'unit='.rawurlencode($item->unit);
		$response[] = 'total='.rawurlencode(format::cleanprice(round($item->quantity * $item->price, 2)));
		$response[] = 'push';
	}
	die('1'.implode('&', $response));
}
////////////////////////////////////////////////////////////////////////////
switch($mode = post(PARAMETER_MODE, CHECK_ALPHA_)) {
	//////////////////////////////////////////////////////////////////////////// Aufträge
	// Auftragsstatus ändern
	case 'set_orderstatus':
	case 'set_orderstatuscomplete':
		$ids = explode(',', post(PARAMETER_ID, CHECK_NUMCOMMA));
		$status = post(PARAMETER_STATUS, CHECK_ALPHA1);
		if (!in_array($status, $orderstatus))
			die('Fehler #1');
		foreach ($ids as $id) {
			$order = new order(floor($id));
			if (!$order->order_id)
				die('Fehler #2');
			$order->set_status($status, $mode == 'set_orderstatuscomplete');
			if ($order->status == CC_RESSOURCE_ORDERSTATUSSHORT_SHIPPED && $order->pdf_creation == PDF_CREATION_ONSHIPP) {
				include_once(CC_BLOGIC_PDFDOC);
				$pdf = new pdfdoc(CC_SITE_FILEKEY, DOCS, $order);
				$pdf->generate($pdf->MODE_BILL);
			}
			// Status Email verschicken
			if (post(PARAMETER_1, CHECK_NUM))
				$order->send_status_email();
		}
		die('1'.$order->status);
	break;
	// Rechnung erstellen und ggf. versenden
	case 'create_pdf':
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$order = new order($order_id);
		if (CC_SITE_BILLHASLEFTTHEBUILDING)
			die('0');
		include_once(CC_BLOGIC_PDFDOC);
		$pdf = new pdfdoc(CC_SITE_FILEKEY, DOCS, $order);
		$pdf->generate($pdf->MODE_BILL);
		$status = post(PARAMETER_STATUS, CHECK_BOOL);
		if ($status) {
			$order->send_status_email('p');
		}
		die('1'.$order->status);
	break;
	// Artikelstatus ändern
	case 'set_itemstatus':
		$ids = explode(',', post(PARAMETER_ID, CHECK_ALPHANUMCOMMA));
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$status = post(PARAMETER_STATUS, CHECK_ALPHA1);
		if (!in_array($status, $orderstatus))
			die('Fehler #1');
		$order = new order($order_id);
		foreach ($order->items as $item)
			if (in_array($item->uid.'_'.$item->position, $ids)) {
				$item->order_status = $status;
				$item->store();
			}
		die('1'.$status);
	break;
	// Einen Auftrag übertragen
	case 'get_order':
		get_order();
	break;
	// Einen geänderten Auftrag speichern
	case 'set_order':
	case 'update_order':
		$order_id = post(PARAMETER_ID, CHECK_NUM);
		$order = new order($order_id);
		$p = post('order_paymentcaption');
		if ($order->payment_caption != $p) {
			$order->payment_param = null;
		}
		$order->payment_caption = $p;
		$order->payment_amount = floatval(str2num(post('order_paymentamount'), CHECK_NUMVALUE));
		$order->payment_absolute = post('order_paymentabsolute', CHECK_BOOL);
		if (!$order->payment_absolute) {
			$order->payment_amount = min($order->payment_amount, 100);
			$order->payment_amount = max($order->payment_amount, 0);
		}
		$order->paymentrebate_amount = floatval(str2num(post('order_paymentrebateamount'), CHECK_NUMVALUE));
		$order->paymentrebate_absolute = post('order_paymentrebateabsolute', CHECK_BOOL);
		if (!$order->paymentrebate_absolute) {
			$order->paymentrebate_amount = min($order->paymentrebate_amount, 100);
			$order->paymentrebate_amount = max($order->paymentrebate_amount, 0);
		}
		$order->payment_vat = floatval(str2num(post('order_paymentvat', CHECK_NUMVALUE)));
		$order->payment_vat = min($order->payment_vat, 100);
		$order->payment_vat = max($order->payment_vat, 0);
		$order->expected_date = postornull('order_expecteddate');
		if ($order->expected_date) {
			// Tag
			$expr_date = CC_SITE_DATEFORMAT;
			$expr_date = str_replace('d', "([0123][0-9])", $expr_date);
			$expr_date = str_replace('m', "[01][0-9]", $expr_date);
			$expr_date = str_replace('Y', "20[0-9][0-9]", $expr_date);
			$expr_date = str_replace('.', "\.", $expr_date);
			preg_match('/'.$expr_date.'/', $order->expected_date, $parts);
			$day = $parts[1];
			// Monat
			$expr_date = CC_SITE_DATEFORMAT;
			$expr_date = str_replace('d', "[0123][0-9]", $expr_date);
			$expr_date = str_replace('m', "([01][0-9])", $expr_date);
			$expr_date = str_replace('Y', "20[0-9][0-9]", $expr_date);
			$expr_date = str_replace('.', "\.", $expr_date);
			preg_match('/'.$expr_date.'/', $order->expected_date, $parts);
			$month = $parts[1];
			// Jahr
			$expr_date = CC_SITE_DATEFORMAT;
			$expr_date = str_replace('d', "[0123][0-9]", $expr_date);
			$expr_date = str_replace('m', "[01][0-9]", $expr_date);
			$expr_date = str_replace('Y', "(20[0-9][0-9])", $expr_date);
			$expr_date = str_replace('.', "\.", $expr_date);
			preg_match('/'.$expr_date.'/', $order->expected_date, $parts);
			$year = $parts[1];
			$order->expected_date = date('Y-m-d', mktime(5, 5, 5, $month, $day, $year));
		}
		$s = post('order_shippingcaption');
		if ($order->shipping_caption != $s)
			$order->shipping_trackingurl = null;
		$order->shipping_caption = $s;
		$order->shipping_cost = floatval(str2num(post('order_shippingcost', CHECK_NUMVALUE)));
		$order->shipping_vat = floatval(str2num(post('order_shippingvat')));
		$order->shipping_vat = min($order->shipping_vat, 100);
		$order->shipping_vat = max($order->shipping_vat, 0);
		$order->tracking_id = postornull('order_trackingid');
		$order->message = postornull('order_message');
		$order->client->bank_accountholder = postornull('client_bankaccountholder');
		$order->client->bank_accountnumber = postornull('client_bankaccountnumber');
		$order->client->bank_code = postornull('client_bankcode');
		$order->client->bank_name = postornull('client_bankname');
		$order->client->credit_accountholder = postornull('client_creditaccountholder');
		$order->client->credit_accountnumber = postornull('client_creditaccountnumber');
		$order->client->credit_validuntil = postornull('client_creditvaliduntil');
		$order->client->credit_cvc = postornull('client_creditcvc');
		$order->sumrebate_amount = floatval(str2num(post('order_sumrebateamount', CHECK_NUMVALUE)));
		$order->sumrebate_absolute = post('order_sumrebateabsolute', CHECK_BOOL);
		if (!$order->sumrebate_absolute) {
			$order->sumrebate_amount = min($order->sumrebate_amount, 100);
			$order->sumrebate_amount = max($order->sumrebate_amount, 0);
		}
		$order->couponrebate_amount = floatval(str2num(post('order_couponrebateamount', CHECK_NUMVALUE)));
		$order->couponrebate_absolute = post('order_couponrebateabsolute', CHECK_BOOL);
		if (!$order->couponrebate_absolute) {
			$order->couponrebate_amount = min($order->couponrebate_amount, 100);
			$order->couponrebate_amount = max($order->couponrebate_amount, 0);
		}
		$order->client->rebate_amount = floatval(str2num(post('client_rebateamount', CHECK_NUMVALUE)));
		$order->client->rebate_absolute = post('client_rebateabsolute', CHECK_BOOL);
		if (!$order->client->rebate_absolute) {
			$order->client->rebate_amount = min($order->client->rebate_amount, 100);
			$order->client->rebate_amount = max($order->client->rebate_amount, 0);
		}
		$order->client->salutation = post('client_salutation');
		$order->client->firstname = post('client_firstname');
		$order->client->lastname = post('client_lastname');
		$order->search_name = $order->client->firstname.' '.$order->client->lastname;
		$order->client->street = post('client_street');
		$order->client->streetnumber = post('client_streetnumber');
		$order->client->zip = post('client_zip');
		$order->client->city = post('client_city');
		$order->client->country = substr($order->client->country, 0, 10).":".post('client_country');
		$order->client->company = postornull('client_company');
		$order->client->phone = postornull('client_phone');
		$order->client->cellphone = postornull('client_cellphone');
		$order->client->fax = postornull('client_fax');
		$order->client->custom1 = postornull('client_custom1');
		$order->client->custom2 = postornull('client_custom2');
		$order->client->custom3 = postornull('client_custom3');
		$order->client->custom4 = postornull('client_custom4');
		$order->client->custom5 = postornull('client_custom5');
		$order->client->message = postornull('client_message');
		$order->client->deviating_shipping_address = post('client_deviatingshippingaddress', CHECK_BOOL);
		if ($order->client->deviating_shipping_address) {
			$order->client->shipping_salutation = post('client_shippingsalutation');
			$order->client->shipping_firstname = post('client_shippingfirstname');
			$order->client->shipping_lastname = post('client_shippinglastname');
			$order->client->shipping_street = post('client_shippingstreet');
			$order->client->shipping_streetnumber = post('client_shippingstreetnumber');
			$order->client->shipping_zip = post('client_shippingzip');
			$order->client->shipping_city = post('client_shippingcity');
			$order->client->shipping_country = substr($order->client->shipping_country, 0, 10).":".post('client_shippingcountry');
			$order->client->shipping_company = post('client_shippingcompany');
		} else {
			$order->client->shipping_salutation = null;
			$order->client->shipping_firstname = null;
			$order->client->shipping_lastname = null;
			$order->client->shipping_street = null;
			$order->client->shipping_streetnumber = null;
			$order->client->shipping_zip = null;
			$order->client->shipping_city = null;
			$order->client->shipping_country = null;
			$order->client->shipping_company = null;
		}
		$changed = $order->set_status(post('order_status', CHECK_ALPHA1), false);
		if ($changed)
			$order->send_status_email();
		$order->client->store();
		$order->store();
		if ($mode == 'update_order')
			get_order();
		$config = new config('orders');
		$config->set('selected', $order_id);
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1');
	break;
	// Einen oder mehrer Aufträge löschen
	case 'delete_order' :
		$ids = explode(',', post(PARAMETER_ID, CHECK_NUMCOMMA));
		foreach ($ids as $id) {
			$order = new order($id);
			$order->delete();
			$deleted[] = floor($id);
		}
		die('1'.implode('&', $deleted));
	break;
	//////////////////////////////////////////////////////////////////////////// Artikel
	// Einen Artikel übertragen
	case 'get_item':
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$order = new order($order_id);
		$ident = explode('_', post(PARAMETER_ID, CHECK_ALPHANUM_));
		$uid = $ident[0];
		$position = $ident[1];
		$item = new item($uid, $order_id, $position);
		$response[] = 'item_id='.rawurlencode($item->id);
		$response[] = 'item_b2b=' .$order->b2b;
		$response[] = 'item_qprecision='.rawurlencode($item->qprecision);
		$response[] = 'item_caption='.rawurlencode($item->caption);
		$response[] = 'item_quantity='.rawurlencode(format::quantity($item->quantity, $item->qprecision, false));
		if ($order->b2b) {
			$response[] = 'item_gross='.rawurlencode(format::cleanprice(round($item->price * (1 + ($item->vat / 100)), 2)));
			$response[] = 'item_net='.rawurlencode(format::cleanprice($item->price));
		} else {
			$response[] = 'item_gross='.rawurlencode(format::cleanprice($item->price));
			$response[] = 'item_net='.rawurlencode(format::cleanprice(round($item->price / (1 + ($item->vat / 100)), 2)));
		}
		$response[] = 'item_vat='.rawurlencode(format::cleanprice($item->vat));
		$response[] = 'item_status='.rawurlencode($item->order_status ? $orderstatus_index[$item->order_status] : CC_RESSOURCE_ORDERSTATUSSHORT_NEW);
		$response[] = 'item_unit='.rawurlencode($item->unit);
		$response[] = 'item_weight='.rawurlencode(format::cleanprice($item->weight));
		$response[] = 'item_varacap='.rawurlencode($item->variationa_caption);
		$response[] = 'item_varbcap='.rawurlencode($item->variationb_caption);
		$response[] = 'item_specialinfo='.rawurlencode($item->specialinfo);
		$response[] = 'item_specialinfoid='.($item->specialinfo ? '1' : '0');
		$response[] = 'item_downloaduid='.rawurlencode($item->download_uid);
		die('1'.implode('&', $response));
	break;
	// Einen geänderten Artikel speichern
	case 'set_item':
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$order = new order($order_id);
		$ident = explode('_', post(PARAMETER_ID, CHECK_ALPHANUM_));
		$uid = $ident[0];
		$position = $ident[1];
		$item = new item($uid, $order_id, $position);
		$item->id = post('item_id');
		$item->caption = post('item_caption');
		$item->quantity = floatval(str2num(post('item_quantity', CHECK_NUMVALUE)));
		if ($order->b2b)
			$item->price = floatval(str2num(post('item_net', CHECK_NUMVALUE)));
		else
			$item->price = floatval(str2num(post('item_gross', CHECK_NUMVALUE)));
		$item->vat = floatval(str2num(post('item_vat', CHECK_NUMVALUE)));
		$item->vat = min($item->vat, 100);
		$item->vat = max($item->vat, 0);
		$item->order_status = post('item_status', CHECK_ALPHANUM1);
		$item->unit = post('item_unit');
		$item->weight = floatval(str2num(post('item_weight', CHECK_NUMVALUE)));
		$item->variationa_caption = post('item_varacap');
		$item->variationb_caption = post('item_varbcap');
		if ($item->specialinfo)
			$item->specialinfo = post('item_specialinfo');
		$item->store();
		$config = new config('items');
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		$order = new order($order_id);
		get_items($order);
	break;
	// Alle Artikel zu einer Bestellung auslesen
	case 'get_items':
		$order_id = post(PARAMETER_ID, CHECK_NUM);
		$order = new order($order_id);
		$config = new config('orders');
		$config->set('selected', $order_id);
		get_items($order);
	break;
	//////////////////////////////////////////////////////////////////////////// Kunden
	// Kundeauswhl merken
	case 'set_selectedclient':
		$client_id = post(PARAMETER_ID, CHECK_NUM);
		$config = new config('clients');
		$config->set('selected', $client_id);
		die('1');
	break;
	// Einen Kunden übertragen
	case 'get_client':
		$client_id = post(PARAMETER_ID, CHECK_NUM);
		$client = new client($client_id);
		$response[] = 'client_salutation='.rawurlencode($client->salutation);
		$response[] = 'client_firstname='.rawurlencode($client->firstname);
		$response[] = 'client_lastname='.rawurlencode($client->lastname);
		$response[] = 'client_company='.rawurlencode($client->company);
		$response[] = 'client_street='.rawurlencode($client->street);
		$response[] = 'client_streetnumber='.rawurlencode($client->streetnumber);
		$response[] = 'client_zip='.rawurlencode($client->zip);
		$response[] = 'client_city='.rawurlencode($client->city);
		$response[] = 'client_country1='.rawurlencode(substr($client->country, 0, 2));
		$response[] = 'client_country2='.rawurlencode(substr($client->country, 3, 3));
		$response[] = 'client_country3='.rawurlencode(substr($client->country, 7, 3));
		$response[] = 'client_country4='.rawurlencode(substr($client->country, 11));
		$response[] = 'client_phone='.rawurlencode($client->phone);
		$response[] = 'client_cellphone='.rawurlencode($client->cellphone);
		$response[] = 'client_fax='.rawurlencode($client->fax);
		$response[] = 'client_custom1='.rawurlencode($client->custom1);
		$response[] = 'client_custom2='.rawurlencode($client->custom2);
		$response[] = 'client_custom3='.rawurlencode($client->custom3);
		$response[] = 'client_custom4='.rawurlencode($client->custom4);
		$response[] = 'client_custom5='.rawurlencode($client->custom5);
		$response[] = 'client_newsletter='.rawurlencode($client->newsletter);
		$response[] = 'client_email='.rawurlencode($client->email);
		$response[] = 'client_reliability='.rawurlencode($client->reliability);
		$response[] = 'client_novat='.rawurlencode($client->novat);
		$response[] = 'client_rebateamount='.rawurlencode(format::cleanprice($client->rebate_amount));
		$response[] = 'client_rebateabsolute='.rawurlencode($client->rebate_absolute);
		$response[] = 'client_daystopayment='.rawurlencode($client->daystopayment);
		$response[] = 'label_currency='.rawurlencode(CC_SITE_CURRENCY);
		$response[] = 'label_clientid='.rawurlencode($client->client_id);
		die('1'.implode('&', $response));
	break;
	// Einen geänderten Kunden speichern
	case 'set_client':
		$client_id = post(PARAMETER_ID, CHECK_NUM);
		$client = new client($client_id ? $client_id : null);
		$client->salutation = post('client_salutation');
		$client->firstname = post('client_firstname');
		$client->lastname = post('client_lastname');
		$client->street = post('client_street');
		$client->streetnumber = post('client_streetnumber');
		$client->zip = post('client_zip');
		$client->city = post('client_city');
		$country1 = post('client_country1');
		$country2 = post('client_country2');
		$country3 = post('client_country3');
		$country4 = substr(post('client_country4'), 11);
		while (strlen($country1) < 2)
			$country1 .= ' ';
		while (strlen($country2) < 3)
			$country2 .= ' ';
		while (strlen($country3) < 3)
			$country3 .= ' ';
		$client->country = "$country1,$country2,$country3:$country4";
		$client->company = post('client_company') or null;
		$client->phone = post('client_phone') or null;
		$client->cellphone = post('client_cellphone') or null;
		$client->fax = post('client_fax') or null;
		$client->custom1 = post('client_custom1') or null;
		$client->custom2 = post('client_custom2') or null;
		$client->custom3 = post('client_custom3') or null;
		$client->custom4 = post('client_custom4') or null;
		$client->custom5 = post('client_custom5') or null;
		$client->newsletter = post('client_newsletter', CHECK_BOOL);
		// Email sollte überlesen werden
		$client->email = post('client_email');
		$client->reliability = intval(post('client_reliability', CHECK_SIGNETNUM));
		$client->novat = post('client_novat', CHECK_BOOL);
		$client->daystopayment = post('client_daystopayment', CHECK_NUM);
		$client->rebate_absolute = post('client_rebateabsolute', CHECK_BOOL);
		$client->rebate_amount = floatval(str2num(post('client_rebateamount', CHECK_NUMVALUE)));
		if (!$client->rebate_absolute && $client->rebate_amount > 100)
			$client->rebate_amount = 100;
		if (!$client->rebate_absolute && $client->rebate_amount < 0)
			$client->rebate_amount = 0;
		if ($client_id)
			$client->store(null);
		else
			$client_id = $client->store(true);
		$config = new config('clients');
		$config->set('selected', $client_id);
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1'.$client_id);
	break;
	// Einen oder mehrere Kunden löschen
	case 'delete_client' :
		$ids = explode(',', post(PARAMETER_ID, CHECK_NUMCOMMA));
		foreach ($ids as $id) {
			$client = new client($id);
			$client->delete();
			$deleted[] = $id;
		}
		die('1'.implode('&', $deleted));
	break;
	//////////////////////////////////////////////////////////////////////////// Vorlagen
	// Vorlagenauswahl merken
	case 'set_selectedtemplate':
		$id = post(PARAMETER_ID, CHECK_NUM);
		$config = new config('templates');
		$config->set('selected', $id);
		die('1');
	break;
	// Eine Vorlage übertragen
	case 'get_template':
		$id = post(PARAMETER_ID, CHECK_NUM);
		$mailtemplate = new abstractdb(TABLE_TEMPLATES, $id);
		$response[] = 'template_name='.rawurlencode($mailtemplate->name);
		$response[] = 'template_subject='.rawurlencode($mailtemplate->subject);
		$response[] = 'template_body='.rawurlencode($mailtemplate->body);
		$response[] = 'template_status='.rawurlencode($mailtemplate->status);
		die('1'.implode('&', $response));
	break;
	// Eine geänderte Vorlage speichern
	case 'set_template':
		$id = post(PARAMETER_ID, CHECK_NUM);
		$mailtemplate = new abstractdb(TABLE_TEMPLATES, $id ? $id : null);
		$mailtemplate->name = post('template_name');
		$mailtemplate->subject = post('template_subject');
		$mailtemplate->body = post('template_body');
		if ($id)
			$mailtemplate->store(null);
		else
			$id = $mailtemplate->store(true);
		$config = new config('templates');
		$config->set('selected', $id);
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1');
	break;
	// Einen oder mehrer Vorlagen löschen
	case 'delete_template' :
		$ids = explode(',', post(PARAMETER_ID, CHECK_NUMCOMMA));
		foreach ($ids as $id) {
			$mailtemplate = new abstractdb(TABLE_TEMPLATES, floor($id));
			$mailtemplate->delete();
			$deleted[] = floor($id);
		}
		die('1'.implode('&', $deleted));
	break;
	//////////////////////////////////////////////////////////////////////////// Emails
	// Emailauswahl merken
	case 'set_selectedemail':
		$id = post(PARAMETER_ID, CHECK_NUM);
		$config = new config('emails');
		$config->set('selected', $id);
		die('1');
	break;
	// Eine Email übertragen
	case 'get_email':
		$email_id = post(PARAMETER_ID, CHECK_NUM);
		$email = new email($email_id);
		$response[] = 'email_fromplain='.rawurlencode($email->from_plain);
		$response[] = 'email_fromemail='.rawurlencode($email->from_email);
		$response[] = 'email_toplain='.rawurlencode($email->to_plain);
		$response[] = 'email_toemail='.rawurlencode($email->to_email);
		$response[] = 'label_date='.rawurlencode(date(CC_SITE_DATEFORMAT, strtotime($email->date)).' '.$email->time);
		$response[] = 'label_orderid='.rawurlencode($email->order_id);
		$response[] = 'label_clientid='.rawurlencode($email->client_id);
		$response[] = 'email_subject='.rawurlencode($email->subject);
		$response[] = 'text_body='.rawurlencode(str_replace("\n", '
', $email->content_plain));
		$response[] = 'html_body='.rawurlencode($email->content_html);
		die('1'.implode('&', $response));
	break;
	// Eine neue Email speichern
	case 'set_email':
		$email = new email();
		if ($id = post('order_id', CHECK_NUM))
			$email->order_id = $id;
		if ($id = post('client_id', CHECK_SIGNETNUM))
			$email->client_id = $id;
		$email->to_plain = post('email_toplain');
		$email->from_email = post('email_fromemail');
		$email->from_plain = post('email_fromplain');
		$email->to_email = post('email_toemail');
		$email->subject = post('email_subject');
		$email->content_plain = post('email_body');
		$email->store();
		$config = new config('emails');
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1');
	break;
	// Eine oder mehrere Emails löschen
	case 'delete_email' :
		$ids = explode(',', post(PARAMETER_ID, CHECK_NUMCOMMA));
		foreach ($ids as $id) {
			$email = new email($id);
			$email->delete();
			$deleted[] = $id;
		}
		die('1'.implode('&', $deleted));
	break;
	//////////////////////////////////////////////////////////////////////////// Downloads
	// Downloadauswahl merken
	case 'set_selecteddownload':
		$id = post(PARAMETER_ID, CHECK_ALPHANUM);
		$config = new config('downloads');
		$config->set('selected', $id);
		die('1');
	break;
	// Downloadauftragsauswahl merken
	case 'set_selecteddownloadorder':
		$id = post(PARAMETER_ID, CHECK_ALPHANUM);
		$config = new config('downloadorders');
		$config->set('selected', $id);
		die('1');
	break;
	case 'set_downloadorderxy':
		$config = new config('downloadorders');
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1');
	break;
	case 'done_license':
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$id = post(PARAMETER_ID, CHECK_ALPHANUM);
		$status = post(PARAMETER_STATUS, CHECK_BOOL);
		$hk = post(PARAMETER_VIEW, CHECK_ALL);
		$myorder = new order($order_id);
		foreach ($myorder->items as $it)
			if ($it->download_uid == $id)
				$item = $it;
		$error = false;
		if ($status)
			$error = $item->license_new($myorder, $hk, false);
		else
			$item->license_refuse($myorder, $hk);
		$config = new config('downloadorders');
		$config->set('x', floatval(post('x', CHECK_SIGNETNUM)));
		$config->set('y', floatval(post('y', CHECK_SIGNETNUM)));
		die('1'.($error ? 'error' : ''));
	break;
	// Lizenzen übertragen
	case 'get_downloadorder':
		$order_id = post(PARAMETER_ORDER, CHECK_NUM);
		$id = post(PARAMETER_ID, CHECK_ALPHANUM);
		$licenses = new abstractdb(TABLE_ESDLICENSES);
		$response = array();
		$count = $licenses->db_numrows(array('order_id' => $order_id, 'id' => $id, 'license_pending' => 0));
		while($lic = $licenses->get(array('*'), array('order_id' => $order_id, 'id' => $id), array('date desc'))) {
			$response[] = 'date='.date(CC_SITE_DATEFORMAT, strtotime($lic->date));
			$response[] = 'count='.($lic->license_pending == LICENSE_OK ? $count-- : ($lic->license_pending == LICENSE_PENDING ? ' ' : '-'));
			$response[] = 'hardware_id='.$lic->hardware_id;
			$response[] = 'license_code='.($lic->license_code ? $lic->license_code : ' ');
			$response[] = 'client_comment='.rawurlencode($lic->client_comment);
			$response[] = 'license_pending='.$lic->license_pending;
			$response[] = 'push';
		}
		die('1'.implode('&', $response));
	break;
	default:
		die('Unknown mode '. $mode);
}
?>