add flutter
This commit is contained in:
Regular → Executable
+104
-18
@@ -269,19 +269,45 @@ class Pelanggan_model extends CI_model
|
||||
return true;
|
||||
}
|
||||
|
||||
public function get_driver_ride($lat, $lng, $fitur)
|
||||
/**
|
||||
* Get nearby drivers for ride: purely by GPS distance, no region/wilayah.
|
||||
* Uses config_driver (driver's real-time lat/long from app) and user (lat, lng).
|
||||
* Optional $radius_km (1–100): when set, used as search radius; else fitur.jarak_minimum with min 10 km.
|
||||
* Optimized: bounding-box pre-filter + Haversine + LIMIT 50.
|
||||
*/
|
||||
public function get_driver_ride($lat, $lng, $fitur, $radius_km = null)
|
||||
{
|
||||
$url_foto = base_url() . 'images/fotodriver/';
|
||||
$lat = (float) $lat;
|
||||
$lng = (float) $lng;
|
||||
$fitur = (int) $fitur;
|
||||
|
||||
if ($radius_km !== null && $radius_km > 0) {
|
||||
$radius_km = max(1, min(100, (float) $radius_km));
|
||||
}
|
||||
|
||||
$box_km = isset($radius_km) ? $radius_km : 50;
|
||||
$delta_lat = $box_km / 111.0;
|
||||
$cos_lat = max(0.01, cos(deg2rad($lat)));
|
||||
$delta_lng = $box_km / (111.0 * $cos_lat);
|
||||
$lat_min = $lat - $delta_lat;
|
||||
$lat_max = $lat + $delta_lat;
|
||||
$lng_min = $lng - $delta_lng;
|
||||
$lng_max = $lng + $delta_lng;
|
||||
|
||||
$having_radius = isset($radius_km)
|
||||
? (float) $radius_km
|
||||
: 'GREATEST(COALESCE(f.jarak_minimum, 10), 10)';
|
||||
|
||||
$result = $this->db->query("
|
||||
SELECT f.jarak_minimum, f.wallet_minimum, d.id as id, d.nama_driver, ld.latitude, ld.longitude, ld.bearing, ld.update_at,
|
||||
k.merek, k.nomor_kendaraan, k.warna, k.tipe, s.saldo,
|
||||
d.no_telepon, CONCAT('$url_foto', d.foto, '') as foto, d.reg_id, dj.driver_job,
|
||||
(6371 * acos(cos(radians($lat)) * cos(radians( ld.latitude ))"
|
||||
. " * cos(radians(ld.longitude) - radians($lng))"
|
||||
. " + sin(radians($lat)) * sin( radians(ld.latitude)))) AS distance
|
||||
FROM config_driver ld, driver d, driver_job dj, kendaraan k, saldo s,fitur f
|
||||
WHERE ld.id_driver = d.id
|
||||
(6371 * acos(cos(radians($lat)) * cos(radians(ld.latitude))
|
||||
* cos(radians(ld.longitude) - radians($lng))
|
||||
+ sin(radians($lat)) * sin(radians(ld.latitude)))) AS distance
|
||||
FROM config_driver ld, driver d, driver_job dj, kendaraan k, saldo s, fitur f
|
||||
WHERE ld.id_driver = d.id
|
||||
AND f.id_fitur = $fitur
|
||||
AND ld.status = '1'
|
||||
AND dj.id = d.job
|
||||
@@ -290,35 +316,88 @@ class Pelanggan_model extends CI_model
|
||||
AND k.id_k = d.kendaraan
|
||||
AND s.id_user = d.id
|
||||
AND s.saldo > f.wallet_minimum
|
||||
HAVING distance <= f.jarak_minimum
|
||||
ORDER BY distance ASC");
|
||||
AND ld.latitude BETWEEN $lat_min AND $lat_max
|
||||
AND ld.longitude BETWEEN $lng_min AND $lng_max
|
||||
HAVING distance <= $having_radius
|
||||
ORDER BY distance ASC
|
||||
LIMIT 50");
|
||||
$count = $result->num_rows();
|
||||
log_message('debug', 'get_driver_ride: fitur=' . $fitur . ' lat=' . $lat . ' lng=' . $lng . ' drivers_found=' . $count);
|
||||
if ($count === 0) {
|
||||
$this->log_driver_diagnostic('ride', $lat, $lng, $fitur, $lat_min, $lat_max, $lng_min, $lng_max, $radius_km);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function get_driver_car($lat, $lng, $fitur)
|
||||
/**
|
||||
* Diagnostic logging when 0 drivers found: counts online drivers, in-box, by job, etc.
|
||||
*/
|
||||
private function log_driver_diagnostic($type, $lat, $lng, $fitur, $lat_min, $lat_max, $lng_min, $lng_max, $radius_km)
|
||||
{
|
||||
$r_online = $this->db->query("SELECT COUNT(*) as c FROM config_driver WHERE status='1'")->row();
|
||||
$cnt_online = $r_online ? (int) $r_online->c : 0;
|
||||
$r_box = $this->db->query("SELECT COUNT(*) as c FROM config_driver ld JOIN driver d ON ld.id_driver=d.id WHERE ld.status='1' AND d.status='1' AND ld.latitude BETWEEN " . (float)$lat_min . " AND " . (float)$lat_max . " AND ld.longitude BETWEEN " . (float)$lng_min . " AND " . (float)$lng_max)->row();
|
||||
$cnt_in_box = $r_box ? (int) $r_box->c : 0;
|
||||
$fitur_row = $this->db->query("SELECT driver_job, jarak_minimum, wallet_minimum FROM fitur WHERE id_fitur=" . (int)$fitur)->row();
|
||||
$driver_job = $fitur_row ? $fitur_row->driver_job : null;
|
||||
$cnt_job = 0;
|
||||
if ($driver_job !== null) {
|
||||
$r_job = $this->db->query("SELECT COUNT(*) as c FROM driver WHERE status='1' AND job=" . (int)$driver_job)->row();
|
||||
$cnt_job = $r_job ? (int) $r_job->c : 0;
|
||||
}
|
||||
$fitur_exists = $fitur_row ? 'yes' : 'NO_FITUR_NOT_FOUND';
|
||||
log_message('debug', 'get_driver_' . $type . '_diagnostic: fitur=' . $fitur . ' fitur_exists=' . $fitur_exists . ' driver_job=' . ($driver_job !== null ? $driver_job : 'n/a') . ' radius_km=' . ($radius_km !== null ? $radius_km : 'default') . ' online_drivers=' . $cnt_online . ' in_box=' . $cnt_in_box . ' with_job=' . $cnt_job);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get nearby drivers for car: purely by GPS distance, no region/wilayah.
|
||||
* Optional $radius_km (1–100); else 10 km. Optimized: bounding-box + LIMIT 50.
|
||||
*/
|
||||
public function get_driver_car($lat, $lng, $fitur, $radius_km = null)
|
||||
{
|
||||
$range = 10;
|
||||
$url_foto = base_url() . 'images/fotodriver/';
|
||||
$lat = (float) $lat;
|
||||
$lng = (float) $lng;
|
||||
$fitur = (int) $fitur;
|
||||
$range = ($radius_km !== null && $radius_km > 0)
|
||||
? max(1, min(100, (float) $radius_km))
|
||||
: 10;
|
||||
|
||||
$delta_lat = $range / 111.0;
|
||||
$cos_lat = max(0.01, cos(deg2rad($lat)));
|
||||
$delta_lng = $range / (111.0 * $cos_lat);
|
||||
$lat_min = $lat - $delta_lat;
|
||||
$lat_max = $lat + $delta_lat;
|
||||
$lng_min = $lng - $delta_lng;
|
||||
$lng_max = $lng + $delta_lng;
|
||||
|
||||
$result = $this->db->query("
|
||||
SELECT f.jarak_minimum, f.wallet_minimum, d.id as id, d.nama_driver, ld.latitude, ld.longitude, ld.bearing, ld.update_at,
|
||||
k.merek, k.nomor_kendaraan, k.warna, k.tipe, s.saldo,
|
||||
d.no_telepon, CONCAT('$url_foto', d.foto, '') as foto, d.reg_id, dj.driver_job,
|
||||
(6371 * acos(cos(radians($lat)) * cos(radians( ld.latitude ))"
|
||||
. " * cos(radians(ld.longitude) - radians($lng))"
|
||||
. " + sin(radians($lat)) * sin( radians(ld.latitude)))) AS distance
|
||||
FROM config_driver ld, driver d, driver_job dj, kendaraan k, saldo s,fitur f
|
||||
WHERE ld.id_driver = d.id
|
||||
(6371 * acos(cos(radians($lat)) * cos(radians(ld.latitude))
|
||||
* cos(radians(ld.longitude) - radians($lng))
|
||||
+ sin(radians($lat)) * sin(radians(ld.latitude)))) AS distance
|
||||
FROM config_driver ld, driver d, driver_job dj, kendaraan k, saldo s, fitur f
|
||||
WHERE ld.id_driver = d.id
|
||||
AND f.id_fitur = $fitur
|
||||
AND ld.status = '1'
|
||||
AND dj.id = d.job
|
||||
AND d.job = '2'
|
||||
AND d.job = f.driver_job
|
||||
AND d.status = '1'
|
||||
AND k.id_k = d.kendaraan
|
||||
AND s.id_user = d.id
|
||||
AND s.saldo > 500
|
||||
AND s.saldo > GREATEST(COALESCE(f.wallet_minimum, 0), 500)
|
||||
AND ld.latitude BETWEEN $lat_min AND $lat_max
|
||||
AND ld.longitude BETWEEN $lng_min AND $lng_max
|
||||
HAVING distance <= $range
|
||||
ORDER BY distance ASC");
|
||||
ORDER BY distance ASC
|
||||
LIMIT 50");
|
||||
$count = $result->num_rows();
|
||||
log_message('debug', 'get_driver_car: fitur=' . $fitur . ' lat=' . $lat . ' lng=' . $lng . ' drivers_found=' . $count);
|
||||
if ($count === 0) {
|
||||
$this->log_driver_diagnostic('car', $lat, $lng, $fitur, $lat_min, $lat_max, $lng_min, $lng_max, $radius_km);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -467,6 +546,7 @@ class Pelanggan_model extends CI_model
|
||||
$this->delete_transaksi($dataTrans['id_transaksi']);
|
||||
$stat = FALSE;
|
||||
}
|
||||
log_message('debug', 'check_status: id_transaksi=' . $dataTrans['id_transaksi'] . ' raw_status=' . $cek->row('status') . ' stat=' . ($stat ? 'TRUE' : 'FALSE'));
|
||||
$dataCheck = array(
|
||||
'message' => 'check status',
|
||||
'status' => $stat,
|
||||
@@ -1273,6 +1353,10 @@ class Pelanggan_model extends CI_model
|
||||
return $this->db->get('category_merchant');
|
||||
}
|
||||
|
||||
/**
|
||||
* Merchant nearby: purely by GPS (merchant lat/long vs user lat/long), no region.
|
||||
* Distance <= fitur.jarak_minimum.
|
||||
*/
|
||||
public function merchantnearby($long, $lat)
|
||||
{
|
||||
$this->db->select("merchant.id_merchant , merchant.nama_merchant , merchant.alamat_merchant , merchant.rate_merchant, merchant.latitude_merchant , merchant.longitude_merchant , merchant.jam_buka , merchant.jam_tutup ,
|
||||
@@ -1329,6 +1413,7 @@ class Pelanggan_model extends CI_model
|
||||
return $data;
|
||||
}
|
||||
|
||||
/** Merchant promo nearby: purely GPS, no region. */
|
||||
public function merchantpromo($long, $lat)
|
||||
{
|
||||
$this->db->select("merchant.id_merchant , merchant.nama_merchant , merchant.alamat_merchant , merchant.rate_merchant, merchant.latitude_merchant , merchant.longitude_merchant , merchant.jam_buka , merchant.jam_tutup ,
|
||||
@@ -1411,6 +1496,7 @@ class Pelanggan_model extends CI_model
|
||||
return $this->db->get('merchant');
|
||||
}
|
||||
|
||||
/** All merchant nearby by fitur: purely GPS (merchant lat/long vs user), no region. */
|
||||
public function allmerchantnearby($long, $lat, $fitur)
|
||||
{
|
||||
$this->db->select("merchant.id_merchant , merchant.nama_merchant , merchant.alamat_merchant , merchant.rate_merchant, merchant.latitude_merchant , merchant.longitude_merchant , merchant.jam_buka , merchant.jam_tutup ,
|
||||
|
||||
Reference in New Issue
Block a user