add flutter

This commit is contained in:
Ariska
2026-03-11 15:29:37 +07:00
parent c253e1a370
commit 619d758027
9490 changed files with 135801 additions and 1353 deletions
+104 -18
View File
@@ -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 (1100): 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 (1100); 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 ,