= '" . $jbWeight . "' AND" . " crvh.crvh_length >= '" . $jbCrvhLength . "' AND" . " crvh.crvh_width >= '" . $jbCrvhWidth . "' AND" . " crvh.crvh_height >= '" . $jbCrvhHeight . "' AND" . " crvh.crvh_position >= '" . $jbCrvhPosition . "' AND "; endif; if (substr($mode,6,1) == "1") : $retArray[6] = $tmpArray; endif; endif; // Check for existence of zipcode and job id for favoured and blocked couriers according to the job if ($zipcode != "" && $jobId != "") : // ************************************************************************************ // * Get all couriers which are blocked for the involved customers of the current job * // ************************************************************************************ if (substr($mode,1,1) == "1") : $blockedCourierArray = array(); if ($jobId != "") : $constRankingBlockedCrForStation = getParameterValue("0", "RANKING_BLOCKED_COURIER_FOR_STATION", $currentHqId); if ($constRankingBlockedCrForStation == "") : $constRankingBlockedCrForStation = getParameterValue("0", "RANKING_BLOCKED_COURIER_FOR_STATION", "0"); endif; $constRankingBlockedCrForPayer = getParameterValue("0", "RANKING_BLOCKED_COURIER_FOR_PAYER", $currentHqId); if ($constRankingBlockedCrForPayer == "") : $constRankingBlockedCrForPayer = getParameterValue("0", "RANKING_BLOCKED_COURIER_FOR_PAYER", "0"); endif; // Ranking blocked courier for STATION if ($constRankingBlockedCrForStation == "1") : $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM tour AS tr, costcenter AS csc, customercourier AS cscr" . " WHERE tr.jb_id = '" . $jobId . "' AND" . " tr.csc_id = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cscr_relation = '0'" . " ORDER BY cscr.cr_id"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 4: {$tmpSqlquery} " . $result->getMessage()); while ($row = $result->fetch_assoc()): $blockedCourierArray[] = $row["cr_id"]; endwhile; $result->free(); endif; // Ranking blocked courier for PAYER if ($constRankingBlockedCrForPayer == "1") : // Check first job is a cashpayer one $cscIdPayer = getFieldValueFromId("job", "jb_id", $jobId, "csc_id_payer"); $constCscIdPayerCash = getParameterValue("0", "CSC_ID_PAYER_CASH", $currentHqId); if (($cscIdPayer != "") && ($cscIdPayer == $constCscIdPayerCash || $cscIdPayer == "-1" )) : // Job is cashpayer one => Get id of the cashpayer $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM job AS jb, costcenter AS csc, customercourier AS cscr" . " WHERE jb.jb_id = '" . $jobId . "' AND" . " jb.csc_id_payer_cash = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cscr_relation = '0'" . " ORDER BY cscr.cr_id"; else : // Job is an invoice one $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM tourservice AS trs, costcenter AS csc, customercourier AS cscr" . " WHERE trs.jb_id = '" . $jobId . "' AND" . " trs.csc_id = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cscr_relation = '0'" . " ORDER BY cscr.cr_id"; endif; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 4: {$tmpSqlquery} " . $result->getMessage()); while ($row = $result->fetch_assoc()): $blockedCourierArray[] = $row["cr_id"]; endwhile; $result->free(); endif; if (count($blockedCourierArray) > 0) : $blockedCouriersClause = " cr.cr_id NOT IN (" . implode(",", $blockedCourierArray) . ") AND "; endif; endif; $retArray[1] = $blockedCourierArray; endif; // ************************************************************************************* // * Get all couriers which are favoured for the involved customers of the current job * // ************************************************************************************* if (substr($mode,2,1) == "1" || substr($mode,7,1) == "1") : $favouredCourierArray = array(); if ($jobId != "") : $constRankingFavCrForStation = getParameterValue("0", "RANKING_FAVOURED_COURIER_FOR_STATION", $currentHqId); if ($constRankingFavCrForStation == "") : $constRankingFavCrForStation = getParameterValue("0", "RANKING_FAVOURED_COURIER_FOR_STATION", "0"); endif; $constRankingFavCrForPayer = getParameterValue("0", "RANKING_FAVOURED_COURIER_FOR_PAYER", $currentHqId); if ($constRankingFavCrForPayer == "") : $constRankingFavCrForPayer = getParameterValue("0", "RANKING_FAVOURED_COURIER_FOR_PAYER", "0"); endif; // Consider restrictions by job filter regarding vehicle filter if activated $fromClauseFavCr = ""; $whereClauseFavCr = ""; if ($mandatoryCourierFilterClause != "") : $constRankingFavCrConsiderFilter = getParameterValue("0", "RANKING_FAVOURED_COURIER_FILTER", $currentHqId); if ($constRankingFavCrConsiderFilter == "") : $constRankingFavCrConsiderFilter = getParameterValue("0", "RANKING_FAVOURED_COURIER_FILTER", "0"); endif; if ($constRankingFavCrConsiderFilter == "1") : $fromClauseFavCr = ", couriervehicle AS crvh"; $whereClauseFavCr = " AND cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause; endif; endif; // Consider restrictions by job measures regarding vehicle measures if activated $fromClauseFavCr2 = ""; $whereClauseFavCr2 = ""; if ($jb2crvhClause != "") : $constRankingFavCrConsiderCrvh = getParameterValue("0", "RANKING_FAVOURED_COURIER_CRVH", $currentHqId); if ($constRankingFavCrConsiderCrvh == "") : $constRankingFavCrConsiderCrvh = getParameterValue("0", "RANKING_FAVOURED_COURIER_CRVH", "0"); endif; if ($constRankingFavCrConsiderCrvh == "1") : $fromClauseFavCr2 = ", couriervehicle AS crvh"; $whereClauseFavCr2 = " cr.cr_sid = crvh.crvh_sid AND " . $jb2crvhClause; endif; endif; if ($fromClauseFavCr == "") : $fromClauseFavCr = $fromClauseFavCr2; endif; // Ranking favoured courier for STATION if ($constRankingFavCrForStation == "1") : $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM tour AS tr, costcenter AS csc, customercourier AS cscr, courier AS cr" . $fromClauseFavCr . " WHERE tr.jb_id = '" . $jobId . "' AND" . " tr.csc_id = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cr_id = cr.cr_id AND" . " cr.cr_available = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . $whereClauseFavCr2 . " cscr.cscr_relation = '1'" . $whereClauseFavCr . " ORDER BY cr.cr_availabletime"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 5: {$tmpSqlquery} " . $result->getMessage()); while ($row = $result->fetch_assoc()): // Check for filter only being in areas or concerning ALL favoured couriers if (substr($mode,7,1) == "1") : $crCurrentLocation = getLocationCourier($row["cr_id"], $zipcode, $currentHqId, ""); if ($crCurrentLocation != "0") : $favouredCourierArray[] = $row["cr_id"]; endif; else : $favouredCourierArray[] = $row["cr_id"]; endif; endwhile; $result->free(); endif; // Ranking favoured courier for PAYER if ($constRankingFavCrForPayer == "1") : // Check first job is a cashpayer one $cscIdPayer = getFieldValueFromId("job", "jb_id", $jobId, "csc_id_payer"); $constCscIdPayerCash = getParameterValue("0", "CSC_ID_PAYER_CASH", $currentHqId); if (($cscIdPayer != "") && ($cscIdPayer == $constCscIdPayerCash || $cscIdPayer == "-1" )) : // Job is cashpayer one => Get id of the cashpayer $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM job AS jb, costcenter AS csc, customercourier AS cscr, courier AS cr" . $fromClauseFavCr . " WHERE jb.jb_id = '" . $jobId . "' AND" . " jb.csc_id_payer_cash = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cr_id = cr.cr_id AND" . " cr.cr_available = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . $whereClauseFavCr2 . " cscr.cscr_relation = '1'" . $whereClauseFavCr . " ORDER BY cr.cr_availabletime"; else : // Job is an invoice one $tmpSqlquery = "SELECT DISTINCT cscr.cr_id" . " FROM tourservice AS trs, costcenter AS csc, customercourier AS cscr, courier AS cr" . $fromClauseFavCr . " WHERE trs.jb_id = '" . $jobId . "' AND" . " trs.csc_id = csc.csc_id AND" . " csc.cs_id = cscr.cs_id AND" . " cscr.cr_id = cr.cr_id AND" . " cr.cr_available = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . $whereClauseFavCr2 . " cscr.cscr_relation = '1'" . $whereClauseFavCr . " ORDER BY cr.cr_availabletime"; endif; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 5: {$tmpSqlquery} " . $result->getMessage()); while ($row = $result->fetch_assoc()): // Check for filter only being in areas or concerning ALL favoured couriers if (substr($mode,7,1) == "1") : $crCurrentLocation = getLocationCourier($row["cr_id"], $zipcode, $currentHqId, ""); if ($crCurrentLocation != "0") : $favouredCourierArray[] = $row["cr_id"]; endif; else : $favouredCourierArray[] = $row["cr_id"]; endif; endwhile; $result->free(); endif; endif; if (count($favouredCourierArray) > 0) : $favouredCouriersClause = " cr.cr_id NOT IN (" . implode(",", $favouredCourierArray) . ") AND "; endif; $retArray[2] = $favouredCourierArray; endif; endif; $sqlquery = ""; $fieldClause = ""; $whereClause = ""; $orderByClause = ""; $limitClause = ""; // Check for SERVICE_MODE to be the service by matrix of zipcodes or matrix of mediation areas if ($zipcode != "" && ($mediationMode == "1" || $mediationMode == "2" || $mediationMode == "3" || $mediationMode == "4")) : // ********************************* // * Service by matrix of zipcodes * // ********************************* if ($mediationMode == "1") : if (substr($mode,3,1) == "1") : $whereClause .= "cr.cr_locationzipcode = '" . $zipcode . "' AND "; $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, cr.cr_locationzipcode AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp" . " WHERE " . $whereClause . $blockedCouriersClause . $whereClauseHqId . " cr.cr_sid != '' AND" . " cr.cr_available = '1' AND" . $occupiedCourierClause . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $cr2crvhClause . $jb2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 6: {$sqlquery} " . $result->getMessage()); $crArray = array(); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); $retArray[3] = $crArray; endif; // If requested get all neighbours of the current zipcode if (substr($mode,4,1) == "1" || substr($mode,5,1) == "1") : // Get ID of the zipcode $srvp_id = getFieldValueFromId("serviceplz", "srvp_plz", $zipcode, "srvp_id"); // Get neighbours of the zipcode(-IDs) $tmpSqlquery = "SELECT srvp.srvp_plz" . " FROM serviceplzneighbour AS srvpn, serviceplz AS srvp" . " WHERE srvpn.srvp_id = '" . $srvp_id . "' AND" . " srvpn.srvp2_id = srvp.srvp_id AND" . " srvpn.hq_id = '" . $currentHqId . "'" . " ORDER BY srvpn.srvpn_sort"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 7: {$tmpSqlquery} " . $result->getMessage()); // Set new whereClause $tmpArray = array(); $whereClause = ""; while ($row = $result->fetch_assoc()): $tmpArray[] = "cr.cr_locationzipcode = '" . $row["srvp_plz"] . "'"; $retArray[5][] = $row["srvp_plz"]; endwhile; if (count($tmpArray) > 0) : $whereClause = "("; $whereClause .= implode(" || ",$tmpArray); $whereClause .= ") AND"; endif; $crArray = array(); if (substr($mode,4,1) == "1" && $whereClause != "") : $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, cr.cr_locationzipcode AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp" . " WHERE " . $whereClause . $blockedCouriersClause . $whereClauseHqId . " cr.cr_sid != '' AND" . " cr.cr_available = '1' AND" . $occupiedCourierClause . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $cr2crvhClause . $jb2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 8: {$sqlquery} " . $result->getMessage()); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); endif; $retArray[4] = $crArray; endif; endif; // **************************************** // * Service by matrix of mediation areas * // **************************************** if ($mediationMode == "2") : // Get ID of the zipcode $srvp_id = getFieldValueFromId("serviceplz", "srvp_plz", $zipcode, "srvp_id"); // Get ID of the mediationarea according to the current zipcode // $srvpa_id = getFieldValueFromId("serviceplzareamapping", "srvp_id", $srvp_id, "srvpa_id"); /* $srvpa_id = $db2->getOne("SELECT srvpam.srvpa_id FROM serviceplzarea AS srvpa, serviceplzareamapping AS srvpam" . " WHERE srvpam.srvp_id = '" . $srvp_id . "' AND srvpa.srvpa_id = srvpam.srvpa_id AND srvpa.hq_id = '" . $currentHqId . "'"); */ $srvpa_id = getOneStmt("SELECT srvpam.srvpa_id FROM serviceplzarea AS srvpa, serviceplzareamapping AS srvpam" . " WHERE srvpam.srvp_id = '" . $srvp_id . "' AND srvpa.srvpa_id = srvpam.srvpa_id AND srvpa.hq_id = '" . $currentHqId . "'", "srvpa_id"); if ($srvpa_id != "" && substr($mode,3,1) == "1") : $whereClause .= "srvpam.srvpa_id = '" . $srvpa_id . "' AND"; $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, srvpa.srvpa_name AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp," . " serviceplz AS srvp, serviceplzareamapping AS srvpam, serviceplzarea AS srvpa" . " WHERE cr.cr_sid != '' AND" . $blockedCouriersClause . $whereClauseHqId . " cr.cr_available = '1' AND" . $occupiedCourierClause . $cr2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' AND" . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $jb2crvhClause . " cr.cr_locationzipcode = srvp.srvp_plz AND" . " srvp.srvp_id = srvpam.srvp_id AND" . " " . $whereClause . " srvpam.srvpa_id = srvpa.srvpa_id " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 9: {$sqlquery} " . $result->getMessage()); $crArray = array(); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); $retArray[3] = $crArray; endif; // If requested get all neighbours of the current area if ($srvpa_id != "" && (substr($mode,4,1) == "1" || substr($mode,5,1) == "1")) : // Get neighbours of the area(-IDs) $tmpSqlquery = "SELECT srvpan.srvpa2_id" . " FROM serviceplzareaneighbour AS srvpan" . " WHERE srvpan.srvpa_id = '" . $srvpa_id . "'" . " ORDER BY srvpan.srvpan_sort"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 1: {$tmpSqlquery} " . $result->getMessage()); // Set new whereClause $tmpArray = array(); $whereClause = ""; while ($row = $result->fetch_assoc()): $tmpArray[] = "srvpam.srvpa_id = '" . $row["srvpa2_id"] . "'"; $retArray[5][] = $row["srvpa2_id"]; endwhile; if (count($tmpArray) > 0) : $whereClause = "("; $whereClause .= implode(" || ",$tmpArray); $whereClause .= ") AND"; endif; $crArray = array(); if (substr($mode,4,1) == "1" && $whereClause != "") : $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, srvpa.srvpa_name AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp," . " serviceplz AS srvp, serviceplzareamapping AS srvpam, serviceplzarea AS srvpa" . " WHERE cr.cr_sid != '' AND" . $blockedCouriersClause . $whereClauseHqId . " cr.cr_available = '1' AND" . $occupiedCourierClause . $cr2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' AND" . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $jb2crvhClause . " cr.cr_locationzipcode = srvp.srvp_plz AND" . " srvp.srvp_id = srvpam.srvp_id AND" . " " . $whereClause . " srvpam.srvpa_id = srvpa.srvpa_id " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 2: {$sqlquery} " . $result->getMessage()); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); endif; $retArray[4] = $crArray; endif; endif; // *************************************************************************************************************** // * Combined mode: Service by matrix of mediation areas, where each zipcode as member has an own neighbour area * // *************************************************************************************************************** if ($mediationMode == "3") : // Get ID of the zipcode $srvp_id = getFieldValueFromId("serviceplz", "srvp_plz", $zipcode, "srvp_id"); // Get ID of the mediation area according to the current zipcode // $srvpa_id = getFieldValueFromId("serviceplzareamapping", "srvp_id", $srvp_id, "srvpa_id"); /* $srvpa_id = $db2->getOne("SELECT srvpam.srvpa_id FROM serviceplzarea AS srvpa, serviceplzareamapping AS srvpam" . " WHERE srvpam.srvp_id = '" . $srvp_id . "' AND srvpa.srvpa_id = srvpam.srvpa_id AND srvpa.hq_id = '" . $currentHqId . "'"); */ $srvpa_id = getOneStmt("SELECT srvpam.srvpa_id FROM serviceplzarea AS srvpa, serviceplzareamapping AS srvpam" . " WHERE srvpam.srvp_id = '" . $srvp_id . "' AND srvpa.srvpa_id = srvpam.srvpa_id AND srvpa.hq_id = '" . $currentHqId . "'", "srvpa_id"); if ($srvpa_id != "" && substr($mode,3,1) == "1") : $whereClause .= "srvpam.srvpa_id = '" . $srvpa_id . "' AND"; $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, srvpa.srvpa_name AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp," . " serviceplz AS srvp, serviceplzareamapping AS srvpam, serviceplzarea AS srvpa" . " WHERE cr.cr_sid != '' AND" . $blockedCouriersClause . $whereClauseHqId . " cr.cr_available = '1' AND" . $occupiedCourierClause . $cr2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' AND" . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $jb2crvhClause . " cr.cr_locationzipcode = srvp.srvp_plz AND" . " srvp.srvp_id = srvpam.srvp_id AND" . " " . $whereClause . " srvpam.srvpa_id = srvpa.srvpa_id " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 9: {$sqlquery} " . $result->getMessage()); $crArray = array(); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); $retArray[3] = $crArray; endif; // If requested get all neighbour areas of the current zipcode if ($srvpa_id != "" && (substr($mode,4,1) == "1" || substr($mode,5,1) == "1")) : // Get specified(!) neighbour area of the current zipcode $whereClause = ""; if ($neighbourLevel != "") : $whereClause = " AND srvpna.srvpna_sort = '" . $neighbourLevel . "'"; endif; $tmpSqlquery = "SELECT srvpna.srvpa_id" . " FROM serviceplzneighbourarea AS srvpna" . " WHERE srvpna.srvp_id = '" . $srvp_id . "' AND" . " srvpna.hq_id = '" . $currentHqId . "'" . $whereClause . " ORDER BY srvpna.srvpna_sort"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 1: {$tmpSqlquery} " . $result->getMessage()); // Set new whereClause $tmpArray = array(); $whereClause = ""; while ($row = $result->fetch_assoc()): $tmpArray[] = "srvpam.srvpa_id = '" . $row["srvpa_id"] . "'"; $retArray[5][] = $row["srvpa_id"]; endwhile; if (count($tmpArray) > 0) : $whereClause = "("; $whereClause .= implode(" || ",$tmpArray); $whereClause .= ") AND"; endif; $crArray = array(); // Check mode AND $neighbourLevel // If $neighbourLevel is empty, ALL neighbours will be involved => OK // But if $neighbourLevel is set, the existence of at least one area of the specified zipcode is a must if (substr($mode,4,1) == "1" && ($neighbourLevel = "" || ($neighbourLevel != "" && count($tmpArray) > 0)) && $whereClause != "") : $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, srvpa.srvpa_name AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp," . " serviceplz AS srvp, serviceplzareamapping AS srvpam, serviceplzarea AS srvpa" . " WHERE cr.cr_sid != '' AND" . $blockedCouriersClause . $whereClauseHqId . " cr.cr_available = '1' AND" . $occupiedCourierClause . $cr2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' AND" . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $jb2crvhClause . " cr.cr_locationzipcode = srvp.srvp_plz AND" . " srvp.srvp_id = srvpam.srvp_id AND" . " " . $whereClause . " srvpam.srvpa_id = srvpa.srvpa_id " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 2: {$sqlquery} " . $result->getMessage()); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); endif; $retArray[4] = $crArray; endif; endif; // ********************************* // * Service by longhaul mediation * // ********************************* if ($mediationMode == "4") : // Explode special string with coordinates in "$zipcode" for longhaul jobs // [Components: 0 = Latitude start/target zipcode, 1 = Longitude start/target zipcode, 2 = Latitude desired/home zipcode, 3 = Longitude desired/home zipcode] $jbCoordArr = explode(",", $zipcode); if (substr($mode,3,1) == "1") : if ($radiusKm == 0) : $parRankingRadiusKm = getParameterValue("0", "RANKING_RADIUS_KM", $currentHqId); if ($parRankingRadiusKm == "") : $parRankingRadiusKm = getParameterValue("0", "RANKING_RADIUS_KM", "0"); endif; if ($parRankingRadiusKm == "" || !is_numeric($parRankingRadiusKm)) : $parRankingRadiusKm = "50"; endif; $radiusKm = $parRankingRadiusKm; endif; $coordClause = "SQRT(POW(ABS(cr.cr_gps_lat - " . $jbCoordArr[0] . "),2) + POW(ABS(cr.cr_gps_long - " . $jbCoordArr[1] . "),2))"; if (mcArrIsSet($jbCoordArr, 2) != "" && mcArrIsSet($jbCoordArr, 3) != "") : // Acting as if the driver is at his desired zipcode // $coordClause = "SQRT(POW(ABS(" . $jbCoordArr[2] . " - " . $jbCoordArr[0] . "),2) + POW(ABS(" . $jbCoordArr[3] . " - " . $jbCoordArr[1] . "),2))"; $coordClause = "SQRT(POW(ABS(cr.cr_gps_lat_home - " . $jbCoordArr[2] . "),2) + POW(ABS(cr.cr_gps_long_home - " . $jbCoordArr[3] . "),2))"; endif; $kmClause = "(" . $coordClause . " * 111)"; $fieldClause .= ", " . $kmClause . " AS nb"; $whereClause .= $kmClause . " < " . $radiusKm . " AND "; // $orderByClause = "ORDER BY cr.cr_availabletime"; $orderByClause = ""; // $limitClause = "LIMIT 0,100"; $limitClause = ""; $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, cr.cr_locationzipcode AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . $fieldClause . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp" . " WHERE " . $whereClause . $blockedCouriersClause . " cr.cr_sid != '' AND" . " cr.cr_available = '1' AND" . $occupiedCourierClause . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cmp.cmp_no_longhaul = '0' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $cr2crvhClause . $jb2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' " . " " . $orderByClause . " " . $limitClause; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF : {$sqlquery} " . $result->getMessage()); //echo($sqlquery); //if (mcArrIsSet($jbCoordArr, 2) != "" && mcArrIsSet($jbCoordArr, 3) != "") : // die(); //endif; $crArray = array(); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"], $row["nb"]); endwhile; $result->free(); $retArray[3] = $crArray; endif; // If requested get all neighbours of the current zipcode /* if (substr($mode,4,1) == "1" || substr($mode,5,1) == "1") : // Get ID of the zipcode $srvp_id = getFieldValueFromId("serviceplz", "srvp_plz", $zipcode, "srvp_id"); // Get neighbours of the zipcode(-IDs) $tmpSqlquery = "SELECT srvp.srvp_plz" . " FROM serviceplzneighbour AS srvpn, serviceplz AS srvp" . " WHERE srvpn.srvp_id = '" . $srvp_id . "' AND" . " srvpn.srvp2_id = srvp.srvp_id AND" . " srvpn.hq_id = '" . $currentHqId . "'" . " ORDER BY srvpn.srvpn_sort"; $result = $db2->query($tmpSqlquery); if (DB::isError($result)) die ("$PHP_SELF 7: {$tmpSqlquery} " . $result->getMessage()); // Set new whereClause $tmpArray = array(); $whereClause = ""; while ($row = $result->fetch_assoc()): $tmpArray[] = "cr.cr_locationzipcode = '" . $row["srvp_plz"] . "'"; $retArray[5][] = $row["srvp_plz"]; endwhile; if (count($tmpArray) > 0) : $whereClause = "("; $whereClause .= implode(" || ",$tmpArray); $whereClause .= ") AND"; endif; $crArray = array(); if (substr($mode,4,1) == "1" && $whereClause != "") : $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, cr.cr_locationzipcode AS name, cr.cr_availabletime, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp" . " WHERE " . $whereClause . $blockedCouriersClause . $whereClauseHqId . " cr.cr_sid != '' AND" . " cr.cr_available = '1' AND" . $occupiedCourierClause . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . " cr.vht_id >= '" . $jbVhtId . "' AND" . " cr.cr_outlay >= '" . $jbOutlay . "' AND" . $cr2crvhClause . $jb2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 8: {$sqlquery} " . $result->getMessage()); // Table with header while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_filter"]); endwhile; $result->free(); endif; $retArray[4] = $crArray; endif; */ endif; endif; // ******************************************** // * Get ALL couriers with or without blocked * // ******************************************** if (substr($mode,0,1) == "1" || substr($mode,8,1) == "1") : $whereClauseHqId = " cr.hq_id = '" . $currentHqId . "' AND "; // RESTRICTION because of ALL couriers if (substr($mode,8,1) == "1") : if ($f_hq_id == "" || count($f_hq_id) == 0) : $f_hq_id = array($hq_id); endif; $whereClauseHqId = " cr.hq_id IN " . getSQLMandatorArray($f_hq_id) . " AND "; endif; // For the rest of the couriers (and vehicles) use switch to pay attention for vehicle restrictions $whereClauseCrvhRestriction = ""; if ($jobId != "") : $parRankingUseCrvhRestriction = getParameterValue("0", "RANKING_USE_CRVH_RESTRICTION", $currentHqId); if ($parRankingUseCrvhRestriction == "1") : $whereClauseCrvhRestriction = $jb2crvhClause . " cr.vht_id >= '" . $jbVhtId . "' AND cr.cr_outlay >= '" . $jbOutlay . "' AND "; endif; endif; $sqlquery = "SELECT cr.cr_id, cr.cr_sid, cr.cr_eid, mt.mt_value, cr.cr_locationzipcode AS name, cr.cr_availabletime, cr.cr_occupied, cr.cr_filter, crvh.crvh_filter" . " FROM courier AS cr, couriervehicle AS crvh, metatype AS mt, company AS cmp" . " WHERE " . $blockedCouriersClause . $whereClauseHqId . " cr.cr_sid != '' AND" . " cr.cr_available = '1' AND" . " cr.cmp_id = cmp.cmp_id AND" . " cmp.cmp_authenticated = '1' AND" . $whereClauseCrvhRestriction . $cr2crvhClause . " cr.cr_sid = crvh.crvh_sid " . $mandatoryCourierFilterClause . " AND" . " crvh.vht_id = mt.mt_sort AND" . " mt.mt_type = 'vehicletype' " . " ORDER BY cr.cr_availabletime"; $result = $db2->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF 3: {$sqlquery} " . $result->getMessage()); // Table with header $crArray = array(); while ($row = $result->fetch_assoc()): $crArray[] = array($row["cr_id"], $row["cr_sid"], $row["cr_eid"], $row["mt_value"], $row["name"], $row["cr_availabletime"], $row["crvh_filter"], $row["cr_occupied"], $row["cr_filter"]); endwhile; $result->free(); $retArray[0] = $crArray; endif; return $retArray; } // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // BEISPIEL UND BESCHREIBUNG // 1. Komponente: Je nach Modus ex. Array (z.B. "101011" <=> $retArray[0], $retArray[2], $retArray[4], $retArray[5] existieren) // 2. Komponente: Datensatz innerhalb // 3. Komponente: Feld des Datensatzes (0=cr_id, 1=cr_sid, 2=cr_eid, 3=mt_value, 4=name, 5=cr_availabletime) // Folgend Ausgabe nur der cr_id´s /* if ($argv[1] == "XXXX") : echo "\n[----]\n"; $xxxx = getCourierByRanking("50.790913,9.593785","000100","21097271","3"); print_r($xxxx[3]); echo "\n[----]\n"; endif; */ /* $xxx = getCourierByRanking("28195","","5714"); echo "PLZ: 28195

"; echo "0: " . $xxx[0][0][0] . " " . $xxx[0][1][0] . " " . $xxx[0][2][0] . " " . $xxx[0][3][0] . " " . $xxx[0][4][0] . " " . $xxx[0][5][0] . " " . $xxx[0][6][0] . " " . $xxx[0][7][0] . " " . $xxx[0][8][0] . " " . $xxx[0][9][0] . " " . $xxx[0][10][0] . "

"; echo "1: " . $xxx[1][0] . " " . $xxx[1][1] . " " . $xxx[1][2] . " " . $xxx[1][3] . " " . $xxx[1][4] . "

"; echo "2: " . $xxx[2][0] . " " . $xxx[2][1] . " " . $xxx[2][2] . " " . $xxx[2][3] . " " . $xxx[2][4] . "

"; echo "3: " . $xxx[3][0][0] . " " . $xxx[3][1][0] . " " . $xxx[3][2][0] . " " . $xxx[3][3][0] . " " . $xxx[3][4][0] . "

"; echo "4: " . $xxx[4][0][0] . " " . $xxx[4][1][0] . " " . $xxx[4][2][0] . " " . $xxx[4][3][0] . " " . $xxx[4][4][0] . "

"; echo "5: " . $xxx[5][0] . " " . $xxx[5][1] . " " . $xxx[5][2] . " " . $xxx[5][3] . " " . $xxx[5][4] . " " . $xxx[5][5] . " " . $xxx[5][6] . " " . $xxx[5][7] . " " . $xxx[5][8] . " " . $xxx[5][9] . " " . $xxx[5][10] . " " . $xxx[5][11] . " " . $xxx[5][12] . " " . $xxx[5][13] . " " . $xxx[5][14] . "

"; echo "6: " . $xxx[6][0] . " " . $xxx[6][1] . " " . $xxx[6][2] . " " . $xxx[6][3] . " " . $xxx[6][4] . "

"; echo "7: " . $xxx[7][0][0] . " " . $xxx[7][1][0] . " " . $xxx[7][2][0] . " " . $xxx[7][3][0] . " " . $xxx[7][4][0] . "

"; echo "8: " . $xxx[8][0][0] . " " . $xxx[8][1][0] . " " . $xxx[8][2][0] . " " . $xxx[8][3][0] . " " . $xxx[8][4][0] . "

"; */ // 28207 28195 // echo $sqlquery . "

"; // Checks the couriers position // Returns: 0 = OUTSIDE OF ANY AREA // 1 = MAIN ZIPCODE // 2 = MAIN AREA AND NEIGHBOUR AREAS function getLocationCourier($cr_id, $zipcode, $currentHqId = "", $crLocationZipcodeInit = "") { global $db, $PHP_SELF, $hq_id; if ($currentHqId == "") : $currentHqId = $hq_id; endif; $crLocation = "0"; // OUTSIDE OF ANY AREA // Get current zipcode of the courier out of the table "courier" (cr_locationzipcode) to compare with locating zipcode if ($crLocationZipcodeInit == "") : $crLocationZipcode = getFieldValueFromId("courier","cr_id",$cr_id,"cr_locationzipcode"); else : $crLocationZipcode = $crLocationZipcodeInit; endif; // Check existence of the zipcode and check if it is real /* $zipcodeOK = false; if ($zipcode != "") : $srvpIdZipcode = getFieldValueFromId("serviceplz","srvp_plz",$zipcode,"srvp_id"); if ($srvpIdZipcode != "") : $srvpIsRealZipcode = getFieldValueFromId("serviceplz","srvp_id",$srvpIdZipcode,"srvp_isreal"); if ($srvpIsRealZipcode == "1") : $zipcodeOK = true; endif; endif; endif; */ if ($zipcode != "" && $crLocationZipcode != "") : // Check current zipcode with locating zipcode if ($zipcode == $crLocationZipcode) : $crLocation = "1"; // MAIN AREA 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 = getParameterValue("0", "MODE_INTERMEDIATION", $currentHqId); if ($mediationMode == "") : $mediationMode = getFieldValueFromId("headquarters", "hq_id", "$currentHqId", "hq_invmode"); endif; // Get all neighbours for the current zipcode(area) if ($mediationMode == "1") : $zipcodeArray = getCourierByRanking($crLocationZipcode, "0000010000", "", "", $currentHqId); $zipcodeArray = $zipcodeArray[5]; else : $areaIdArray = getCourierByRanking($crLocationZipcode, "0000010000", "", "", $currentHqId); $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 = '" . $currentHqId . "'"); */ $srvpaIdMain = getOneStmt("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 = '" . $currentHqId . "'", "srvpa_id"); if ($areaIdArray == "") : $areaIdArray = array(); endif; array_push($areaIdArray, $srvpaIdMain); $areaIdArrayLen = count($areaIdArray); $zipcodeArray = array(); for ($i = 0; $i < $areaIdArrayLen; $i++) : $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()): $zipcodeArray[] = $row["srvp_plz"]; endwhile; $result->free(); endfor; endif; $zipcodeArrayLen = count($zipcodeArray); for ($i = 0; $i < $zipcodeArrayLen; $i++) : if ($zipcode == $zipcodeArray[$i]) : $crLocation = "2"; // NEIGHBOUR AREA endif; endfor; endif; endif; return $crLocation; }; // Checks the couriers position regarding ranking // If courier is in area or in neighbour area the ranking will be lost // If courier is NOT in these areas, the ranking NOT will be lost function looseRanking($cr_id, $zipcode, $currentHqId = "") { global $db, $PHP_SELF, $hq_id; if ($currentHqId == "") : $currentHqId = $hq_id; endif; $looseRankingPosition = "0"; // Loose ranking NO $crLocation = getLocationCourier($cr_id, $zipcode, $currentHqId, ""); // Check for courier being in area or neighbour area if ($crLocation == "1" || $crLocation == "2") : $looseRankingPosition = "1"; // Loose ranking YES endif; return $looseRankingPosition; }; // Checks the current status of the courier regarding to the last (successful) locating function checkLocatingState ($cr_id) { global $db, $PHP_SELF; $initNewLocating = "1"; $retArray = array($initNewLocating, "", "", "", ""); if ($cr_id != "" && $cr_id != "0" && is_numeric($cr_id)) : $currentTime = getDateTime("0"); $sqlquery = "SELECT cr.cr_gps_time, cr.cr_gps_type, cr.cr_gps_long, cr.cr_gps_lat, cr.cr_gps_acc," . " (UNIX_TIMESTAMP('" . $currentTime . "')-UNIX_TIMESTAMP(cr.cr_gps_time)) AS intervalinseconds" . " FROM phoenix.courier AS cr" . " WHERE cr.cr_id = '" . $cr_id . "'"; $result = $db->query($sqlquery); if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage()); while ($row = $result->fetch_assoc()): // Check for current GPS type (last locating by LBS = 1, GPS = 2, Network = 3, ...) // If type == 1 (LBS) or undefined (== 0) then execute a new locating indepentent from the time else look for GPS timestamp if (substr($row["cr_gps_long"],0,3) < "100" && substr($row["cr_gps_lat"],0,3) < "100") : // Coordinates have to ok // if ($row["cr_gps_type"] != "" && $row["cr_gps_type"] >= "2") : // 05.04.2024 CA: cr_gps_type istderzeit auschließlich "0" und muss daher für die Kartendarstellung als "ok" betrachtet werden if (($row["cr_gps_type"] != "" && $row["cr_gps_type"] >= "2") || $row["cr_gps_type"] == "0") : $initNewLocating = "0"; $parSeconds = getParameterValue("0", "LOCATING_SECONDS_NEEDED_FOR_LBS_LOCATING", "0"); if ($parSeconds == "") : $parSeconds = 900; endif; // Default 15 minutes if ($row["intervalinseconds"] > $parSeconds) : $initNewLocating = "1"; endif; endif; else : $initNewLocating = "1"; endif; $retArray = array($initNewLocating, $row["cr_gps_long"], $row["cr_gps_lat"], $row["cr_gps_type"], $row["cr_gps_time"], $row["cr_gps_acc"]); endwhile; $result->free(); endif; return $retArray; } // Checks the current ranking position (zipcode) against the geo coordinates function checkRanking ($cr_id, $longitude, $latitude, $gps_type, $gps_time, $gps_acc, $jobId, $currentHqId = "", $courierSid = "", $jobStartZipcode, $doLogAndUpdate = true) { global $db, $PHP_SELF, $hq_id; $retVal = "0"; if ($currentHqId == "") : $currentHqId = $hq_id; endif; $constLocatingMode = getParameterValue("0", "LOCATING_MODE", $currentHqId); if ($constLocatingMode == "") : $constLocatingMode = "0"; endif; 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()): $zipcode = $row["srvp_plz"]; // Zipcode to be displayed endwhile; $result->free(); endif; // Per default the zipcode from coordinates (real zipcode) will be checked with the job start zipcode $comparisonZipcode = $jobStartZipcode; $logZipcodeText = "ZIP_JOB"; $constModeLocationCheckOfZipcodes = getParameterValue("0", "LOCATING_ZIPCODE_COMPARISON_MODE", $currentHqId); if ($constModeLocationCheckOfZipcodes == "") : $constModeLocationCheckOfZipcodes = getParameterValue("0", "LOCATING_ZIPCODE_COMPARISON_MODE", "0"); endif; // Get zipcode of courier data if requested or job start zipcode is empty if ($constModeLocationCheckOfZipcodes == "1" || $comparisonZipcode == "") : $comparisonZipcode = getFieldValueFromId("courier","cr_id",$cr_id,"cr_locationzipcode"); $logZipcodeText = "ZIP_FREE"; endif; // Comparison call with zipcode from the GPS coordinates(!) and with the job start zipcode OR locating zipcode $crCurrentLocation = getLocationCourier($cr_id, $zipcode, $currentHqId, $comparisonZipcode); if ($crCurrentLocation == "0") : if ($doLogAndUpdate): // Courier is outside $currentTime = getDateTime("0"); if ($courierSid == "") : $courierSid = getFieldValueFromId("courier","cr_id",$cr_id,"cr_sid"); endif; if (locatingIsPlausible($cr_id, $longitude, $latitude, $gps_type, $gps_time, $gps_acc)): updateStmt("courier", "cr_id", $cr_id, array("cr_locationzipcode", $zipcode, "cr_availabletime", $currentTime)); // Write logdata into log database writeToLogDB("28",$currentHqId,$jobId,"",$cr_id,$courierSid,"","LONG=".$longitude."|LAT=".$latitude."|ZIP_REAL=".$zipcode."|".$logZipcodeText."=".$comparisonZipcode."|LRANK=YES|LMODE=".$constLocatingMode."|AREA_STATE=".$crCurrentLocation); endif; endif; $retVal = "1"; else : if ($doLogAndUpdate): // Write logdata into log database writeToLogDB("28",$currentHqId,$jobId,"",$cr_id,$courierSid,"","LONG=".$longitude."|LAT=".$latitude."|ZIP_REAL=".$zipcode."|".$logZipcodeText."=".$comparisonZipcode."|LRANK=NO|LMODE=".$constLocatingMode."|AREA_STATE=".$crCurrentLocation); endif; endif; return $retVal; } function locatingIsPlausible($cr_id, $longitude, $latitude, $loc_type, $loc_time, $loc_acc/*, $fileHandle*/) { global $db, $PHP_SELF; $fileHandle = @fopen("../log/implausible_locatings_" . date("Ym") . ".log", 'a'); //@fwrite($fileHandle, "$cr_id, $longitude, $latitude, $loc_type, $loc_time, $loc_acc\n"); // Get accuracy and other parameters of the locating specified in $longitude, $latitude // Unfortunately the entries in 'courier' do no necessarily have corresponding ones in 'locating', so we have to take the entry in 'courier'; // the disadvantage here ist the problem, that we do not have the accuracy of the locating, which can be large when of type 3 (network); // currently, we have to live with this problem // $usr_id = $db->getOne("SELECT usr_id FROM courier WHERE cr_id = '" . $cr_id . "'"); // $cr_gps_time = $db->getOne("SELECT cr_gps_time FROM courier WHERE cr_id = '" . $cr_id . "'"); // $sqlquery = "SELECT loc_type, loc_acc, loc_time, loc_created FROM phoenix_log.locating WHERE usr_id = " . $usr_id . " AND ROUND(loc_long, 6) = ROUND(" . $longitude . ", 6) AND ROUND(loc_lat, 6) = ROUND(" . $latitude . ", 6) ORDER BY loc_created DESC LIMIT 0,1"; // $sqlquery = "SELECT cr_gps_type AS loc_type, cr_gps_time AS loc_created, '0000-00-00 00:00:00' AS loc_time, usr_id FROM courier WHERE cr_id = " . $cr_id . " AND ROUND(cr_gps_long, 6) = ROUND(" . $longitude . ", 6) AND ROUND(cr_gps_lat, 6) = ROUND(" . $latitude . ", 6)"; // $result = $db->query($sqlquery); // if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage()); // if ($row = $result->fetch_assoc()): // $loc_type = $row["loc_type"]; // if accuracy is 2 (GPS) then ok; if accuracy is 3 (Network) then check plausibility if ($loc_type == 2): @fclose($fileHandle); return true; elseif ($loc_type == 3): // $usr_id = $row["usr_id"]; // $loc_acc = $row["loc_acc"]; // $loc_time = $row["loc_time"]; // $loc_created = $row["loc_created"]; $loc_created = $loc_time; $usr_id = $db->getOne("SELECT usr_id FROM courier WHERE cr_id = '" . $cr_id . "'"); // find the last previous locating with type 2 (GPS) $sqlquery = "SELECT loc_long, loc_lat, loc_acc, loc_time, loc_created FROM phoenix_log.locating WHERE usr_id = " . $usr_id . " AND loc_type = 2 AND loc_created < '" . $loc_created . "' ORDER BY loc_created DESC LIMIT 0,1"; $result1 = $db->query($sqlquery); if (DB::isError($result1)) die ("$PHP_SELF: " . $result1->getMessage()); if ($row1 = $result1->fetch_assoc()): $loc_long_gps = $row1["loc_long"]; $loc_lat_gps = $row1["loc_lat"]; $loc_acc_gps = $row1["loc_acc"]; $loc_time_gps = $row1["loc_time"]; $loc_created_gps = $row1["loc_created"]; if ($loc_time_gps == "0000-00-00 00:00:00") $loc_time_gps = $loc_created_gps; // calculate the velocity needed to get from the point of type "GPS" to the point of type "network" $hq_id = $db->getOne("SELECT hq_id FROM courier WHERE cr_id = '" . $cr_id . "'"); $geo_earth_radius = getParameterValue("0", "GEO_EARTH_RADIUS", $hq_id); $distKm = acos(sin(deg2rad($latitude)) * sin(deg2rad($loc_lat_gps)) + cos(deg2rad($latitude)) * cos(deg2rad($loc_lat_gps)) * cos(deg2rad($loc_long_gps) - deg2rad($longitude))) * $geo_earth_radius; if (!is_null ($loc_acc) && trim($loc_acc) != "") $distKm = $distKm - ($loc_acc / 1000) - ($loc_acc_gps / 1000); // else // @fwrite($fileHandle, "loc_acc is empty\n"); $velocity = round(($distKm / (strtotime($loc_time) - strtotime($loc_time_gps))) * 3600); $velocity_threshold = getParameterValue("0", "LOCATING_PLAUSIBLE_VELOCITY", "0"); if (abs($velocity) <= $velocity_threshold): // log for test only $log_text = "\n[" . date("Y-m-d H:i:s") . "] velocity under threshold: \$distKm = $distKm, difference in time: " . (strtotime($loc_time) - strtotime($loc_time_gps)) . " seconds, \$velocity = $velocity, \$velocity_threshold = $velocity_threshold\n"; $log_text .= "this locating (\$loc_type = $loc_type) is plausible: \$latitude = $latitude, \$longitude = $longitude," . " \$loc_time = $loc_time, \$loc_acc = $loc_acc, \$cr_id = $cr_id, \$usr_id = $usr_id, \$hq_id = $hq_id\n"; $log_text .= "in relation to the latest earlier locating of type GPS (\$loc_type = 2): \$loc_lat_gps = $loc_lat_gps, \$loc_long_gps = $loc_long_gps, \$loc_time_gps = $loc_time_gps, \$loc_acc_gps = $loc_acc_gps\n"; @fwrite($fileHandle, $log_text); @fclose($fileHandle); return true; endif; // log it if a locating is considered implausible $log_text = "\n[" . date("Y-m-d H:i:s") . "] velocity over threshold: \$distKm = $distKm, difference in time: " . (strtotime($loc_time) - strtotime($loc_time_gps)) . " seconds, \$velocity = $velocity, \$velocity_threshold = $velocity_threshold\n"; $log_text .= "this locating (\$loc_type = $loc_type) is implausible: \$latitude = $latitude, \$longitude = $longitude," . " \$loc_time = $loc_time, \$loc_acc = $loc_acc, \$cr_id = $cr_id, \$usr_id = $usr_id, \$hq_id = $hq_id\n"; $log_text .= "in relation to the latest earlier locating of type GPS (\$loc_type = 2): \$loc_lat_gps = $loc_lat_gps, \$loc_long_gps = $loc_long_gps, \$loc_time_gps = $loc_time_gps, \$loc_acc_gps = $loc_acc_gps\n"; @fwrite($fileHandle, $log_text); else: $log_text = "\n[" . date("Y-m-d H:i:s") . "] locating of type GPS not found: [" . $sqlquery . "]\n"; $log_text .= "\$latitude = $latitude, \$longitude = $longitude," . " \$loc_time = $loc_time, \$loc_type = $loc_type, \$cr_id = $cr_id, \$usr_id = $usr_id\n"; @fwrite($fileHandle, $log_text); endif; $result1->free(); else: $log_text = "\n[" . date("Y-m-d H:i:s") . "] loc_type is neither 2 nor 3\n"; $log_text .= "\$latitude = $latitude, \$longitude = $longitude," . " \$loc_time = $loc_time, \$loc_type = $loc_type, \$cr_id = $cr_id\n"; @fwrite($fileHandle, $log_text); return true; endif; // $result->free(); // else: // @fwrite($fileHandle, "[" . date("Y-m-d H:i:s") . "]\n entry in table 'courier' not found: [" . $sqlquery . "]\n\n"); // endif; @fclose($fileHandle); return false; } ?>