";
$remoteDBisActive = false;
if (BWV2_checkEmpRemoteDBAccess($useRemoteDB, $emp_id)) :
$remoteDBisActive = BWV2_setRemoteDBAccessParameter();
endif;
// ******************************************************
/*
FLOW:
- General definitions
- Get courier-id from http-request
- Search MSISDN from courier-id
- Generate request
- Send request
- Parse response
- Search x,y-coordinates in cells to be valid
- Compute longitude and latitude (transformation)
- Get zipcode from coordinates
- Update zipcode of the courier
- Write to log-file|log-db (employee, datetime, courier-id, msisdn, [zipcode, x_y_of_cell])
- Output zipcode
*/
// ***********************
// * General definitions *
// ***********************
// Proxy und Port fuer HTTPS
$proxy = "";
// $port = ":9883"; // D2 LBS-Testsystem
$port = ":705"; // D2 LBS-Live
$constPort = getParameterValue("0", "LOCATING_LBS_PORT", "0");
if ($constPort != "") : $port = $constPort; endif;
// $server = "213.148.156.83"; // D2 LBS-Testsystem
$server = "139.7.25.166"; // D2 LBS-Live
$constServer = getParameterValue("0", "LOCATING_LBS_SERVER", "0");
if ($constServer != "") : $server = $constServer; endif;
// Access to a special remote file
// $file = "ats/receiver"; // D2 LBS-Testsystem
$file = "LocationQueryService"; // D2 LBS-Live
// Request id
// $requestID = "1";
$requestID = rand(1,30000);
// User and password
$vaspID = "mi2ju GmbH"; // D2 Live
$constVaspID = getParameterValue("0", "LOCATING_LBS_VASP_ID", "0");
if ($constVaspID != "") : $vaspID = $constVaspID; endif;
$password = "mi2ju03#"; // D2 Live
$constPassword = getParameterValue("0", "LOCATING_LBS_PASSWORD", "0");
if ($constPassword != "") : $password = $constPassword; endif;
// Service ID
// $serviceId = "mi2juTest"; // D2 Testsystem
$serviceId = "mi2ju"; // D2 Live
$constServiceId = getParameterValue("0", "LOCATING_LBS_SERVICE_ID", "0");
if ($constServiceId != "") : $serviceId = $constServiceId; endif;
// Maximum of age of locating info
$maxAgeOfLocatingInfoInSeconds = "300";
// Minimum of the granularity
$minOfGranularityInMeter = "99999";
// Client Certificate and Private Key
$clientcertkey = '-cert cacert.pem -key privkey.pem';
// Path to openssl
$openssl = 'openssl';
// Port of openssl
$opensslPort = "9213";
// Only for output
$status_message = "";
// Logging enabled
$loggingEnabled = TRUE;
$logFile = "../log/COM_LOG";
// Echo enabled
$echoEnabled = FALSE;
// *************
// * Functions *
// *************
function writeLocatingLog($file, $value) {
global $loggingEnabled;
if ($loggingEnabled) :
writeToFile($file, $value);
endif;
}
function connectD2($completeReq) {
global $server, $port;
$response = "";
$errno = "";
$errstr = "";
$fp = fsockopen ($server, substr($port, 1), $errno, $errstr, 10);
if (!$fp) {
$response = "$errstr ($errno) \n";
} else {
fputs ($fp, $completeReq);
if (fflush($fp)) :
// Read header
$httpHeader = "";
$httpBodyLength = 0;
if (!feof($fp)) :
$line = trim(fgets ($fp,1024));
$httpHeader .= trim($line);
while (!feof($fp) && $line != "") {
$line = trim(fgets ($fp,1024));
$httpHeader .= $line;
if (!(strpos($line, "Content-Length: ") === FALSE)) :
$httpBodyLength = trim(substr($line, 16));
endif;
}
endif;
// writeLocatingLog($logFile, "::: " . $httpHeader . "\r\n");
// writeLocatingLog($logFile, "::: " . $httpBodyLength . "\r\n");
/*
// while (!feof($fp) && $line != "") {
while (!feof($fp) && strlen($response) < ($httpBodyLength - 7)) {
$line = trim(fgets ($fp,1024));
$response .= $line;
}
*/
$count = 0;
while (!feof($fp) && $count < $httpBodyLength) {
$line = trim(fgets ($fp,2));
$response .= $line;
$count++;
}
// writeLocatingLog($logFile, ":# Loops: " . $count . "\r\n");
else :
$response = "ERR: " . $errno . " " . $errstr;
endif;
fclose ($fp);
}
return $response;
}
// *********************************
// * Search MSISDN from courier-id *
// *********************************
// Get courier-id from the courier-sid (e.g. SIDs: 1013, 1019, etc.)
$cr_id = getFieldValueFromId("courier","cr_sid",$f_cr_sid,"cr_id");
$msisdn = getFieldValueFromId("courier","cr_id",$cr_id,"cr_mobile_pda");
$imei = getFieldValueFromId("courier","cr_id",$cr_id,"cr_imei");
$serialno = getFieldValueFromId("courier","cr_id",$cr_id,"cr_serialno");
// Remove blanks in MSISDN and check beginning with "49"
// (IMPORTANT: No check for other chars because checked in javascript !!!)
$msisdn = ereg_replace (" ", "", $msisdn);
$msisdn = str_replace("+", "", $msisdn);
if (!ereg("^" . COUNTRY_FON_PREFIX, $msisdn)) :
if (ereg("^0", $msisdn)) :
$msisdn = substr($msisdn, 1);
endif;
$msisdn = COUNTRY_FON_PREFIX . $msisdn;
endif;
// Check necessity of new locating process
$locatingStateArray = checkLocatingState($cr_id);
//echo $locatingStateArray[0] . "\n";
// ********************************************************
// * Generate request if broker service will be contacted *
// ********************************************************
/*
if ($locatingStateArray[0] == "1") :
writeLocatingLog($logFile, json_encode($locatingStateArray) . "\r\n");
// Define header request
$requestheaderOrg = "POST /" . $file . " HTTP/1.1\r\n" .
"Host: $server$port\r\n" .
"Content-Type: application/x-www-form-urlencoded\r\n" .
"Content-Length: LENGTH\r\n\r\n";
// Connection request
$requestContext = "$vaspID$password$serviceId";
$requestMethod = "SLIR";
$requestBody = "" . $msisdn . "";
$requestContext = urlencode($requestContext);
$requestBody = urlencode($requestBody);
// Merge "Context", "Method" and "Body"
$requestContext = "Context=" . $requestContext . "&Method=" . $requestMethod . "&Body=" . $requestBody;
$laenge = strlen($requestContext);
$requestheader = $requestheaderOrg;
$requestheader = str_replace ("LENGTH", $laenge, $requestheader);
if ($echoEnabled) : echo $requestheader . $requestContext . "\n\n\n"; endif;
writeLocatingLog($logFile, $requestheader . $requestContext . "\r\n");
$currentTime = getDateTime("0");
writeLocatingLog($logFile, "Time begin: " . $currentTime . "\r\n");
// $response = connectD2($requestheader.$requestContext."\r\n");
$response = "dummy";
$currentTime = getDateTime("0");
writeLocatingLog($logFile, "Time end: " . $currentTime . "\r\n");
if ($echoEnabled) : echo $response . "\n\n\n"; endif;
writeLocatingLog($logFile, $response . "\r\n");
else :
*/
$longitude = $locatingStateArray[1];
$latitude = $locatingStateArray[2];
$gpsTime = $locatingStateArray[4];
// Generate a faked response to be parsed correctly
$response = "";
$response .= "";
$response .= " ";
$response .= " " . $locatingStateArray[2] . "";
$response .= " " . $locatingStateArray[1] . "";
$response .= " ";
$response .= "";
$response .= "XXXX";
//endif;
// Evaluation of the response
if ($response == "") :
// Error occurred, response is empty ...
$status_message = "Es wurde keine Antwort geliefert!";
else :
if ((FALSE && !(strpos($response, "") === FALSE)) || ($longitude == 0 && $latitude == 0)) :
// Error occurred, ...
$status_message = "Die Nummer konnte nicht geortet werden!";
else :
if ((strpos($response, "") === FALSE)) :
$status_message = "Die Lokalisierung war nicht möglich!";
else :
// GET LOCATING INFOS OF THE RESPONSE
// Get latitude
/*
$beginPos = strpos($response, "") + 5;
$endPos = strpos($response, "");
$latitude = substr($response, $beginPos, $endPos - $beginPos);
$latitude = substr($latitude, 0, -4) . "." . substr($latitude, -4); // Insert char "."
*/
// Get longitude
/*
$beginPos = strpos($response, "") + 6;
$endPos = strpos($response, "");
$longitude = substr($response, $beginPos, $endPos - $beginPos);
$longitude = substr($longitude, 0, -4) . "." . substr($longitude, -4); // Insert char "."
*/
/*
491736281211523011.999132424.001293+0200OKAAADswAAARIkPfYcZByzGh+MVoO8Dt2Uevwx
*/
/*
// GET LOCATING INFOS OF THE RESPONSE
// If no request has to be send to the server the current longitude and latitude are defined
if ($locatingStateArray[0] == "1") :
// Get latitude from connection request
$beginPos = strpos($response, "") + 5;
$endPos = strpos($response, "");
$latitudeRaw = substr($response, $beginPos, $endPos - $beginPos);
if ($echoEnabled) : echo "CoordPair: " . $coordPair . " "; endif;
// Get longitude from connection request
$beginPos = strpos($response, "") + 6;
$endPos = strpos($response, "");
$longitudeRaw = substr($response, $beginPos, $endPos - $beginPos);
if ($echoEnabled) : echo "CoordPair: " . $coordPair . " "; endif;
// Get radius from connection request
$beginPos = strpos($response, "") + 5;
$endPos = strpos($response, "");
$radius = substr($response, $beginPos, $endPos - $beginPos);
if ($echoEnabled) : echo "CoordPair: " . $coordPair . " "; endif;
// Transform data
// Example: $coordPair = "555555,133333"
// $coordPairArray[0] = "555555" | $coordPairArray[0] = "133333"
// $x_coord_array[0] = "55" (Stellen 0 und 1) | $x_coord_array[1] = "55" (Stellen 2 und 3) | $x_coord_array[2] = "55" (Stellen 4 und 5)
// $y_coord_array[0] = "13" (Stellen 0 und 1) | $y_coord_array[1] = "33" (Stellen 2 und 3) | $y_coord_array[2] = "33" (Stellen 4 und 5)
$latitudeRawArray = array();
$tmpPos = strpos($latitudeRaw, ".");
if (!($tmpPos === FALSE)) :
$latitudeRawArray[0] = substr($latitudeRaw, 0, $tmpPos);
$latitudeRawArray[1] = substr($latitudeRaw, $tmpPos);
else :
$latitudeRawArray[0] = $latitudeRaw;
$latitudeRawArray[1] = "0";
endif;
$longitudeRawArray = array();
$tmpPos = strpos($longitudeRaw, ".");
if (!($tmpPos === FALSE)) :
$longitudeRawArray[0] = substr($longitudeRaw, 0, $tmpPos);
$longitudeRawArray[1] = substr($longitudeRaw, $tmpPos);
else :
$longitudeRawArray[0] = $longitudeRaw;
$longitudeRawArray[1] = "0";
endif;
$latitudeRawArray[0] = pad($latitudeRawArray[0], 6, "0"); // if less than 6 chars
$longitudeRawArray[0] = pad($longitudeRawArray[0], 6, "0"); // if less than 6 chars
if ($latitudeRawArray[1] == "") : $latitudeRawArray[1] = "0"; endif;
if ($longitudeRawArray[1] == "") : $longitudeRawArray[1] = "0"; endif;
$x_coord_array[0] = substr($latitudeRawArray[0], 0, 2);
$x_coord_array[1] = substr($latitudeRawArray[0], 2, 2);
$x_coord_array[2] = substr($latitudeRawArray[0], 4);
$y_coord_array[0] = substr($longitudeRawArray[0], 0, 2);
$y_coord_array[1] = substr($longitudeRawArray[0], 2, 2);
$y_coord_array[2] = substr($longitudeRawArray[0], 4);
// ***************************************************
// * Compute longitude and latitude (transformation) *
// ***************************************************
$longitude = $y_coord_array[0] + $y_coord_array[1] / 60 + ($y_coord_array[2] + $longitudeRawArray[1]) / 3600;
$latitude = $x_coord_array[0] + $x_coord_array[1] / 60 + ($x_coord_array[2] + $latitudeRawArray[1]) / 3600;
writeLocatingLog($logFile, "-->" . $latitude . " " . $longitude . "<-- \r\n");
endif;
*/
// ********************************
// * Get zipcode from coordinates *
// ********************************
$constLocatingMode = LOCATING_MODE;
if ($constLocatingMode == "0") :
$zipcode = findZipcodeArea($longitude, $latitude);
if (trim($zipcode) == "") :
$constLocatingMode = "1";
endif;
endif;
if ($constLocatingMode == "1") :
// Get nearest coordinates
$sqlquery = "SELECT srvp.srvp_id, srvp.srvp_plz, srvp.srvp_latitude, srvp.srvp_longitude, "
. "SQRT(POW(ABS(srvp.srvp_latitude - $latitude),2) + POW(ABS(srvp.srvp_longitude - $longitude),2)) AS nb"
. " FROM serviceplz AS srvp"
. " ORDER BY nb"
. " LIMIT 0,1";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
// all defined db-fields an titles shall become content of the following arrays
while ($row = $result->fetch_assoc()):
$f_srvp_plz = $row["srvp_plz"]; // Zipcode to be displayed
endwhile;
$result->free();
$zipcode = $f_srvp_plz;
endif;
$status_message = "Letzte erfolgreiche Ortung: " . $zipcode . ""
. "(" . $longitude . " / " . $latitude . " um " . formatOutput($gpsTime,"datetime","4") . " " . formatOutput($gpsTime,"datetime","10") . ")"
. "[Kartendarstellung]
";
// *********************************
// * Update zipcode of the courier *
// *********************************
$updateRankingTime = TRUE;
// Get current zipcode of the courier out of the table "courier" (cr_locationzipcode) to compare with locating zipcode
$crLocationZipcode = getFieldValueFromId("courier","cr_id",$cr_id,"cr_locationzipcode");
$status_message .= "(Freimeldung des Kuriers: " . $crLocationZipcode . ")
";
if ($zipcode != "" && $crLocationZipcode != "" && is_numeric($crLocationZipcode)) :
// Check current zipcode with locating zipcode
if ($zipcode == $crLocationZipcode) :
$updateRankingTime = FALSE;
else :
// Check locating zipcode is in neighbourhood
// If true then ok => do not update ranking time
// Get the general mediation mode for the headquarter
$mediationMode = MODE_INTERMEDIATION;
if ($mediationMode == "") :
$mediationMode = getFieldValueFromId("headquarters", "hq_id", "$hq_id", "hq_invmode");
endif;
// Get all neighbours for the current zipcode(area)
if ($mediationMode == "1") :
$zicodeArray = getCourierByRanking($crLocationZipcode, "0000010000", "", "");
$zicodeArray = $zicodeArray[5];
else :
$areaIdArray = getCourierByRanking($crLocationZipcode, "0000010000", "", "");
$areaIdArray = $areaIdArray[5];
// Add ID of the main mediation area
$srvpIdZipcode = getFieldValueFromId("serviceplz","srvp_plz",$crLocationZipcode,"srvp_id");
// $srvpaIdMain = getFieldValueFromId("serviceplzareamapping","srvp_id",$srvpIdZipcode,"srvpa_id");
$srvpaIdMain = $db->getOne("SELECT srvpam.srvpa_id FROM serviceplzarea AS srvpa, serviceplzareamapping AS srvpam" .
" WHERE srvpam.srvp_id = '" . $srvpIdZipcode . "' AND srvpa.srvpa_id = srvpam.srvpa_id AND srvpa.hq_id = '" . $hq_id . "'");
if ($areaIdArray == "") : $areaIdArray = array(); endif;
array_push($areaIdArray, $srvpaIdMain);
$areaIdArrayLen = count($areaIdArray);
$outputOfAllValidMainZipcodes = "GÜLTIGE BEREICHE: ";
$outputOfAllValidMainZipcodes .= "_________________
";
$outputOfAllValidMainZipcodes .= "Hauptbereich: ";
$outputOfAllValidNeighbourZipcodes = "";
$zicodeArray = array();
for ($i = 0; $i < $areaIdArrayLen; $i++) :
if ($i < $areaIdArrayLen - 1) :
$outputOfAllValidNeighbourZipcodes .= "Nachbarbereich " . ($i + 1) . " ";
endif;
$sqlquery = "SELECT srvp.srvp_plz"
. " FROM serviceplzareamapping AS srvpam, serviceplz AS srvp"
. " WHERE srvpam.srvp_id = srvp.srvp_id AND srvpam.srvpa_id = '" . $areaIdArray[$i] . "'";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
while ($row = $result->fetch_assoc()):
$zicodeArray[] = $row[srvp_plz];
if ($i < $areaIdArrayLen - 1) :
$outputOfAllValidNeighbourZipcodes .= $row[srvp_plz] . " ";
else :
$outputOfAllValidMainZipcodes .= $row[srvp_plz] . " ";
endif;
endwhile;
$result->free();
if ($i < $areaIdArrayLen - 1) :
$outputOfAllValidNeighbourZipcodes .= "-----------------