<?php 
if(!defined('sugarEntry') || !sugarEntry) die('-1');
if (!$_POST['job'] || $_POST['job']=='') die ('-1');
switch ($_POST['job']) {
	case 'getParentInfo': getParentInfo($_POST['id'], $_POST['type']); break;
	case 'generateNumber': generateNumber($_POST['stock_id']); break;
	case 'generateNumberCorrect': generateNumberCorrect(); break;
	case 'searchProducts': searchProducts($_POST['searchKey'], $_POST['searchCategory'], $_POST['searchStock'], $_POST['searchSort']); break;
	case 'getProduct': getProduct($_POST['id'], $_POST['pricebook'], $_POST['account_id'], $_POST['language']); break;
	case 'getItems': getItems($_POST['record'],$_POST['type']); break;
	case 'getItemsFromWZ': getItemsFromWZ($_POST['record'],$_POST['type']); break;
	case 'getItemsFromSale': getItemsFromSale($_POST['record'],$_POST['type']); break;
	case 'getCategoriesList': getCategoriesList(); break;
	case 'getTranslation': getTranslation($_POST['product_id'], $_POST['language'], $_REQUEST['unit_id']); break;
	case 'getPricesInfo': getPricesInfo($_POST['product_id'], $_POST['pricebook_id'], $_POST['account_id']); break;
	case 'getStockArray' : getStockArray($_POST['product_id']); break;
	case 'getPurchaseArray' : getPurchaseArray($_POST['product_id']); break;
	case 'getAddresses' : getAddresses($_POST['account_id']);break;
	case 'getPayers' : getPayers($_POST['account_id']);break;
	case 'getPayer' : getPayer($_POST['account_id']);break;
	case 'getAddress' : getAddress($_POST['account_id']);break;
	case 'getNBPCurrencyExchange' : getNBPCurrencyExchange($_POST['c_id'],$_POST['date']);break;
	case 'calculatePaymentDate' : calculatePaymentDate($_POST['pid'],$_POST['date']);break;
}

function calculatePaymentDate($pid,$d){

    global $timedate;

    $w = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query("select days from ecmpaymentconditions where id='".$pid."'"));
    $date = new DateTime($d);
    $date->add(new DateInterval('P'.$w['days'].'D'));
    echo json_encode($date->format('d.m.Y'));return;
}

function getNBPCurrencyExchange($c_id,$d){
    
    global $timedate;
    $d = explode('-',reset(explode(" ",$timedate->to_db($d))));
    $date = date("Y-m-d",@mktime(0,0,0,$d[1],$d[2],$d[0])+3600*24);
    
    //what day is it?
    $dn = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query("SELECT DAYNAME('$date') as dayname"));
    
    
    if ($dn['dayname'] == 'Sunday') //- 2 days
        $q = "SELECT value FROM currency_nbp_archive WHERE currency_id='$c_id' AND date = DATE_ADD('$date', INTERVAL -2 DAY)";
    elseif ($dn['dayname'] == 'Saturday') //- 1 day
    $q = "SELECT value FROM currency_nbp_archive WHERE currency_id='$c_id' AND date = DATE_ADD('$date', INTERVAL -1 DAY)";
    else //any other day - just get exchange
        $q = "SELECT value FROM currency_nbp_archive WHERE currency_id='$c_id' AND date='$date'";
    
    $w = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query($q));
    
    echo round($w['value'],2); return;
}
function getAddress($account_id){
    $a=new Account();
    echo json_encode($a->getAddress($account_id));
    unset($a);
    return;
}
function getPayer($account_id){
    $a=new Account();
    echo json_encode($a->getAddress($account_id));
    unset($a);
    return;
}
function getAddresses($account_id){
    $a=new Account();

    echo json_encode($a->getAddresses($account_id));
    unset($a);
    return;

}

function getPayers($account_id){
    $a=new Account();

    echo json_encode($a->getPayers($account_id));
    unset($a);
    return;

}

function getParentInfo($id, $type) {
	if (!$id || $id == '') die('-1');
	if (!$type || $type == '') die('-1');
	
	if ($type == 'Accounts')
		$a = new Account();
	elseif ($type == 'Leads')
		$a = new Lead();
	else
		die(-1);

		$a->retrieve($id);		
		$data = array();
		$data['name'] = $a->name;
		$data['parent_nip'] = $a->to_vatid;
		$data['parent_address_street'] = $a->billing_address_street;
		$data['parent_address_postalcode'] = $a->billing_address_postalcode;
		$data['parent_address_city'] = $a->billing_address_city;
		$data['parent_address_country'] = $a->billing_address_country;
		$data['invoice_type'] = $a->invoice_type;		
		$data['currency_id'] = $a->currency_id;	
		if ($a->ecmpaymentcondition_id && $a->ecmpaymentcondition_id!='') {
			$pc = new EcmPaymentCondition();
			$pc->retrieve($a->ecmpaymentcondition_id);
			$data['ecmpaymentcondition_id'] = $pc->id;
			$data['ecmpaymentcondition_name'] = $pc->name;
		}
		if ($a->ecmdeliverycondition_id && $a->ecmdeliverycondition_id!='') {
			$pc = new EcmdeliveryCondition();
			$pc->retrieve($a->ecmdeliverycondition_id);
			$data['ecmdeliverycondition_id'] = $pc->id;
			$data['ecmdeliverycondition_name'] = $pc->name;
		}
		
		if ($a->ecmprice_id && $a->ecmprice_id!='') {
			$pr = new EcmPrice();
			$pr->retrieve($a->ecmprice_id);
			$data['ecmprice_id'] = $pr->id;
			$data['ecmprice_name'] = $pr->name;
		}
		//get pricebooks, ownership pricebooks
		$pricebooks = array();
		$db=$GLOBALS['db'];
		$res = $db->query("SELECT id, name FROM ecmpricebooks WHERE account_id IN ('".$a->id."','".$a->parent_id."') AND active='1' AND deleted='0'");
		while ($row = $db->fetchByAssoc($res)) {
			$tmp = array();
			$tmp['id'] = $row['id'];
			$tmp['name'] = $row['name'];
			$pricebooks[] =  $tmp;
			unset($tmp);
		}
		$data['pricebooks'] = $pricebooks;
		echo json_encode($data);
		unset($data);
		unset($a);
		unset($res);
		return;
}	
function generateNumber($stock_id) {
	$data = array();
	$data['number'] = EcmInvoiceCosOut::generateNumber($stock_id);
	$data['document_no'] = EcmInvoiceCosOut::formatNumber($data['number'],$stock_id);
	echo json_encode($data);
	unset($data);
	return;
}

function generateNumberCorrect() {
	$data = array();
	$data['number'] = EcmInvoiceCosOut::generateNumberCorrect();
	$data['document_no'] = EcmInvoiceCosOut::formatNumberCorrect($data['number']);
	echo json_encode($data);
	unset($data);
	return;
}

function searchProducts($searchKey, $searchCategory, $searchStock, $searchSort) {
	
	$db = $GLOBALS['db'];
	$q = "SELECT id, code, name FROM ecmproducts WHERE
					(UPPER(code) LIKE '%$searchKey%' OR
					UPPER(name) LIKE '%$searchKey%')
					AND deleted='0' ";
	if ($searchCategory && $searchCategory!="")
		$q.="AND product_category_id='$searchCategory' ";
	
	if ($searchSort=='1')
		$q.="ORDER BY code";
	else if ($searchSort=='2')
		$q.="ORDER BY code DESC";
	else if ($searchSort=='3')
		$q.="ORDER BY name";
	else if ($searchSort=='4')
		$q.="ORDER BY name DESC";
	
	$q.=" LIMIT 0,50";
	
	$res = $db->query($q);
	$result = array();
	
	if ($searchStock!='1') {
		//get main stock id
		$stock_res = $db->fetchByAssoc($db->query("SELECT id FROM ecmstocks WHERE main='1' LIMIT 0,1"));
		$stock_id = $stock_res['id'];
	}
	while ($row = $db->fetchByAssoc($res)) {
		$tmp = array();
		$tmp['id'] = $row['id'];
		$tmp['name'] = $row['name'];
		$tmp['code'] = $row['code'];
		
		//get stock if necessary
		if ($searchStock!='1') {
			$tmp['stock_state'] = EcmStockOperation::getStock($row['id'], $stock_id);
		}
		
		if ($searchStock=='3' && $tmp['stock_state']==0) continue; //don't show null stock
		
		$result[] = $tmp;
	}
	echo json_encode($result);
	return;
}

function getProduct($id, $pricebook_id, $account_id, $language) {
	$db = $GLOBALS['db'];
	$p = $db->fetchByAssoc($db->query("SELECT p.id, p.code, p.name, v.id as ecmvat_id, v.name as ecmvat_name, v.value as ecmvat_value, p.ean, p.ean2, p.unit_id FROM ecmproducts as p INNER JOIN ecmvats as v ON v.id=p.vat_id WHERE p.id='$id'"));	
	global $app_list_strings;
	$p['unit_name'] = $app_list_strings['ecmproducts_unit_dom'][$p['unit_id']];	
	//try get recipient_code and price from pricebook
	if ($pricebook_id && $pricebook_id!='') {
		$pr = $db->fetchByAssoc($db->query("SELECT price, recipient_code FROM ecmpricebooks_ecmproducts WHERE ecmpricebook_id='$pricebook_id' AND ecmproduct_id='$id' AND deleted='0'"));
		$p['price_start'] = $pr['price'];
		$p['recipient_code'] = $pr['recipient_code'];
	}
	if (!$p['price_start'] || floatval($p['price_start'])==0) {
		//try price from default prices
		$pr = $db->fetchByAssoc($db->query("SELECT pp.price FROM ecmprices_ecmproducts AS pp INNER JOIN ecmprices AS p ON pp.ecmprice_id=p.id INNER JOIN accounts AS a ON p.id=a.ecmprice_id WHERE a.id='$account_id' AND pp.ecmproduct_id='$id'"));
		$p['price_start'] = $pr['price'];
	}
	
	if ($language=='en_us') {
		$r = $db->fetchByAssoc($db->query("SELECT short_description FROM ecmproduct_language WHERE ecmproduct_id='$id' AND language='en'"));
		$p['name'] = htmlspecialchars_decode($r['short_description']);
		
		$lists = return_app_list_strings_language($language);
		$p['unit_name'] = $lists['ecmproducts_unit_dom'][$p['unit_id']];

		$p['ecmvat_alter_id'] = $p['ecmvat_id'];
		$p['ecmvat_alter_name'] = $p['ecmvat_name'];
		$p['ecmvat_alter_value'] = $p['ecmvat_value'];
		$p['ecmvat_id'] = '9b783d21-5548-6653-e1d6-49610eb3f9dd';
		$p['ecmvat_name'] = '0%';
		$p['ecmvat_value'] = '0';
		unset($lists);
	}
	echo json_encode($p);
	return;
}

function getItems($record,$type) {
	$of = new EcmInvoiceCosOut();
	$of->retrieve($record);
	$pl = $of->getPositionList(true,$type);	
	unset($of);
	echo json_encode($pl);
	return;
}

function getItemsFromWZ($record,$type) {
	$of = new EcmStockDocOut();
	$of->retrieve($record);
	$pl = $of->getPositionList(true);
	unset($of);
	echo json_encode($pl);
	return;
}
function getItemsFromSale($record,$type) {
    $of = new EcmSale();
    $of->retrieve($record);
    $pl = $of->getPositionList(true);
    unset($of);
    echo json_encode($pl);
    return;
}
function getCategoriesList() {
	$db = $GLOBALS['db'];
	$res = $db->query("SELECT id, name FROM ecmproductcategories WHERE deleted='0'");
	$result = array();
	while ($row = $db->fetchByAssoc($res)) {
		$tmp = array();
		$tmp['id'] = $row['id'];
		$tmp['name'] = $row['name'];
		$result[] = $tmp;
	}
	echo json_encode($result);
	return;
}

function getTranslation($product_id, $language, $unit_id) {
	$db = $GLOBALS['db'];
	$result = array();
	if ($language=='en_us') {
		$r = $db->fetchByAssoc($db->query("SELECT short_description FROM ecmproduct_language WHERE ecmproduct_id='$product_id' AND language='en'"));
		$result['name'] = htmlspecialchars_decode($r['short_description']);			
	} else if ($language=='pl_pl') {
		$p = new EcmProduct();
		$p->retrieve($product_id);
		$result['name'] = htmlspecialchars_decode($p->name);
		unset($p);
	}
	$lists = return_app_list_strings_language($language);
	$result['unit_name'] = $lists['ecmproducts_unit_dom'][$unit_id];
	unset($lists);
	
	echo json_encode($result);
	return;
}

function getPricesInfo($product_id, $pricebook_id, $account_id) {
	$db = $GLOBALS['db'];
	
	$result = array();
	if ($pricebook_id && $pricebook_id!='') {
		//try get price from pricebook
		$res = $db->fetchByAssoc($db->query("SELECT price FROM ecmpricebooks_ecmproducts WHERE ecmpricebook_id='$pricebook_id' AND ecmproduct_id='$product_id' AND deleted='0'"));
		if ($res['price'] && $res['price']!='' && $res['price']!=0) {
			$tmp = array();
			$tmp['name'] = 'pricebook';
			$tmp['price'] = $res['price'];			
			$result[] = $tmp;
		}
	}
	
	//get from ecmprices
	$res = $db->query("SELECT p.name, pp.price FROM ecmprices_ecmproducts AS pp 
					   INNER JOIN ecmprices AS p
					   ON p.id=pp.ecmprice_id
					   WHERE
					   pp.ecmproduct_id='$product_id'
					   AND pp.price!=0");
	while ($row = $db->fetchByAssoc($res)) {
		$tmp = array();
		$tmp['name'] = $row['name'];
		$tmp['price'] = $row['price'];
		$result[] = $tmp;
	}
	
	//get last invoice price
	if ($account_id && $account_id!='') {
		$res = $db->fetchByAssoc($db->query("SELECT ii.subprice, i.id, i.document_no FROM ecminvoicecosoutitems AS ii
										     INNER JOIN ecminvoicecosouts AS i
											 ON ii.ecminvoicecosout_id=i.id
											 WHERE ii.ecmproduct_id='$product_id'
											 AND i.parent_id='$account_id'
											 AND ii.deleted='0'
											 AND i.deleted='0'
											 AND i.canceled='0'
											 ORDER BY i.register_date DESC
											 LIMIT 0,1"));
		if ($res && $res['subprice']!='') {
			$tmp = array();
			$tmp['name'] = $res['document_no'];
			$tmp['price'] = $res['subprice'];
			$result[] = $tmp;
		}
	}
	
	echo json_encode($result);
	return;
}

function getStockArray($product_id) {
	$o = new EcmStockOperation();
	echo json_encode($o->getStockArray($product_id));
	unset($o);
	return;
}

function getPurchaseArray($product_id) {
	$o = new EcmStockOperation();
	echo json_encode($o->getPurchaseArray($product_id));
	unset($o);
	return;
}
	