|
Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, Directory : /var/www/laciasmara.com/public_html/shop/application/controllers/ |
Upload File : |
<?php defined('BASEPATH') or exit('No direct script access allowed');
class Development extends Public_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('customer_m');
if (!$this->session->userdata('customer')) {
redirect('login');
}
}
public function maps()
{
$this->load->view('development/google_maps');
}
public function save_address()
{
// Validate required fields
$this->form_validation->set_rules('label', 'Label', 'required');
$this->form_validation->set_rules('recipient_name', 'Nama Penerima', 'required');
$this->form_validation->set_rules('phone', 'Telepon', 'required');
$this->form_validation->set_rules('address', 'Alamat', 'required');
$this->form_validation->set_rules('latitude', 'Latitude', 'required');
$this->form_validation->set_rules('longitude', 'Longitude', 'required');
if ($this->form_validation->run() === FALSE) {
echo json_encode([
'success' => false,
'message' => validation_errors()
]);
return;
}
$data = [
'customer_id' => $this->session->userdata('customer_id'),
'label' => $this->input->post('label'),
'recipient_name' => $this->input->post('recipient_name'),
'phone' => $this->input->post('phone'),
'address' => $this->input->post('address'),
'latitude' => $this->input->post('latitude'),
'longitude' => $this->input->post('longitude'),
'province' => $this->input->post('province'),
'city' => $this->input->post('city'),
'district' => $this->input->post('district'),
'subdistrict' => $this->input->post('subdistrict'),
'postal_code' => $this->input->post('postal_code'),
'is_default' => $this->input->post('is_default') ? 1 : 0
];
try {
$result = $this->Customer_address_model->save_address($data);
echo json_encode([
'success' => $result,
'message' => $result ? 'Alamat berhasil disimpan' : 'Gagal menyimpan alamat'
]);
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
]);
}
}
public function get_addresses()
{
try {
$customer_id = $this->session->userdata('customer_id');
$addresses = $this->customer_m->get_customer_addresses($customer_id);
echo json_encode([
'success' => true,
'addresses' => $addresses
]);
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => 'Gagal memuat alamat: ' . $e->getMessage()
]);
}
}
public function delete_address($id)
{
try {
$customer_id = $this->session->userdata('customer_id');
// Verify ownership
$address = $this->Customer_address_model->get_address($id, $customer_id);
if (!$address) {
echo json_encode([
'success' => false,
'message' => 'Alamat tidak ditemukan'
]);
return;
}
$result = $this->Customer_address_model->delete_address($id, $customer_id);
echo json_encode([
'success' => $result,
'message' => $result ? 'Alamat berhasil dihapus' : 'Gagal menghapus alamat'
]);
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
]);
}
}
public function update_rajaongkir_province()
{
$apiKey = 'kifHvZPG51d5728d418a77bdsvd98iCS'; // Ganti dengan API Key asli dari Komerce
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://rajaongkir.komerce.id/api/v1/destination/province",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"key: $apiKey"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
return;
}
$result = json_decode($response, true);
if (!empty($result['data'])) {
foreach ($result['data'] as $item) {
$province_id = $item['id'];
$province_name = $item['name'];
// Cek duplikasi sebelum insert
$exists = $this->db->get_where('indonesia_provinces', [
'rajaongkir_province_id' => $province_id
])->row();
if (!$exists) {
$this->db->insert('indonesia_provinces', [
'rajaongkir_province_id' => $province_id,
'province' => $province_name
]);
}
}
echo "Data provinsi berhasil diupdate.";
} else {
echo "Tidak ada data provinsi ditemukan.";
}
}
public function update_all_cities()
{
ob_start();
$api_key = 'kifHvZPG51d5728d418a77bdsvd98iCS';
$base_url = "https://rajaongkir.komerce.id/api/v1/destination/city";
echo "🗑️ Mengosongkan tabel indonesia_cities...<br>";
ob_flush();
flush();
$this->db->empty_table('indonesia_cities');
echo "✅ Tabel indonesia_cities berhasil dikosongkan<br><br>";
ob_flush();
flush();
// Ambil semua province_id dari DB lokal
$provinces = $this->db->get('indonesia_provinces')->result();
if (empty($provinces)) {
echo "❌ Tidak ada data provinsi di tabel indonesia_provinces<br>";
ob_flush();
flush();
ob_end_flush();
return;
}
$inserted = 0;
$batch_data = [];
foreach ($provinces as $province) {
$province_id = $province->rajaongkir_province_id;
$url = $base_url . '/' . $province_id;
// Request API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'Key: ' . $api_key
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!$response || $http_code !== 200) {
echo "❌ Gagal mengambil data kota untuk provinsi ID $province_id (HTTP $http_code)<br>";
ob_flush();
flush();
continue;
}
$result = json_decode($response, true);
if (!isset($result['data'])) {
echo "⚠️ Format data tidak sesuai untuk provinsi ID $province_id<br>";
ob_flush();
flush();
continue;
}
foreach ($result['data'] as $city) {
$batch_data[] = [
'rajaongkir_city_id' => $city['id'],
'city_name' => $city['name'],
'indonesia_id_province' => $province_id,
];
$inserted++;
}
echo "✅ Berhasil ambil data dari provinsi ID $province_id<br>";
ob_flush();
flush();
sleep(1); // delay untuk menghindari limit API
}
if (!empty($batch_data)) {
$this->db->insert_batch('indonesia_cities', $batch_data);
}
echo "<br>🎉 Total $inserted kota berhasil dimasukkan ke indonesia_cities<br>";
ob_flush();
flush();
ob_end_flush();
}
public function update_all_districts()
{
ob_start();
$api_key = 'kifHvZPG51d5728d418a77bdsvd98iCS';
$base_url = "https://rajaongkir.komerce.id/api/v1/destination/district/";
echo "🗑️ Mengosongkan tabel indonesia_districts...<br>";
ob_flush();
flush();
$this->db->empty_table('indonesia_districts');
echo "✅ Tabel berhasil dikosongkan<br><br>";
ob_flush();
flush();
// Ambil semua kota dari tabel indonesia_cities
$cities = $this->db
->select('id_indonesia_cities, rajaongkir_city_id')
->from('indonesia_cities')
->where('rajaongkir_city_id IS NOT NULL', null, false)
->get()
->result();
$total_cities = count($cities);
$current_city = 0;
$total_districts = 0;
echo "📋 Memproses total $total_cities kota dari tabel indonesia_cities...<br><br>";
ob_flush();
flush();
foreach ($cities as $city) {
$current_city++;
$city_id = $city->rajaongkir_city_id;
echo "⏳ [$current_city/$total_cities] Mengambil district dari city ID: $city_id...<br>";
ob_flush();
flush();
$url = $base_url . $city_id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'Key: ' . $api_key
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!$response || $http_code !== 200) {
echo "❌ Gagal ambil data untuk city ID: $city_id (HTTP $http_code)<br>";
ob_flush();
flush();
sleep(1);
continue;
}
$result = json_decode($response, true);
if (!isset($result['data'])) {
echo "❌ Format tidak valid untuk city ID: $city_id<br>";
ob_flush();
flush();
sleep(1);
continue;
}
$districts = $result['data'];
$batch_data = [];
$count = 0;
foreach ($districts as $district) {
$batch_data[] = [
'rajaongkir_id_district' => $district['id'],
'district' => $district['name'],
'indonesia_id_city' => $city->rajaongkir_city_id,
];
$count++;
}
if (!empty($batch_data)) {
$this->db->insert_batch('indonesia_districts', $batch_data);
}
$total_districts += $count;
echo "✅ City ID $city_id: Berhasil insert $count district<br>";
ob_flush();
flush();
sleep(1);
}
echo "<br>🎉 DONE! Total $total_districts district berhasil dimasukkan<br>";
echo "📊 Dari $total_cities kota yang diproses<br>";
ob_flush();
flush();
ob_end_flush();
}
public function update_all_subdistricts()
{
ob_start();
$api_key = 'kifHvZPG51d5728d418a77bdsvd98iCS';
$base_url = "https://rajaongkir.komerce.id/api/v1/destination/sub-district/";
echo "🔍 Mencari district yang perlu diupdate...<br>";
ob_flush();
flush();
// Query untuk mendapatkan district yang belum punya subdistrict atau belum lengkap
$districts = $this->db
->select('d.id_indonesia_districts, d.rajaongkir_id_district')
->from('indonesia_districts d')
->join('indonesia_subdistricts s', 'd.rajaongkir_id_district = s.indonesia_id_district', 'left')
->where('d.rajaongkir_id_district IS NOT NULL', null, false)
->group_by('d.id_indonesia_districts, d.rajaongkir_id_district')
->having('COUNT(s.id_indonesia_subdistricts) = 0') // District yang belum punya subdistrict sama sekali
->get()
->result();
$total_districts = count($districts);
$current_district = 0;
$total_subdistricts = 0;
if ($total_districts == 0) {
echo "✅ Semua district sudah memiliki subdistrict. Tidak ada yang perlu diupdate!<br>";
ob_end_flush();
return;
}
echo "📋 Total district yang perlu diproses: $total_districts<br><br>";
ob_flush();
flush();
foreach ($districts as $district) {
$current_district++;
$id_city = $district->rajaongkir_id_district;
$local_district_id = $district->rajaongkir_id_district;
echo "⏳ Memproses district $current_district/$total_districts - City ID: $id_city<br>";
ob_flush();
flush();
// Cek apakah district ini sudah punya subdistrict (double check)
$existing_count = $this->db
->where('indonesia_id_district', $local_district_id)
->count_all_results('indonesia_subdistricts');
if ($existing_count > 0) {
echo "⚠️ District ID $id_city sudah memiliki $existing_count subdistrict. Skip...<br>";
ob_flush();
flush();
continue;
}
$url = $base_url . $id_city;
$retry = 0;
$max_retries = 5;
do {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'Key: ' . $api_key
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 429) {
$retry++;
echo "🚫 Terkena limit (HTTP 429). Menunggu 10 detik sebelum mencoba lagi (percobaan ke-$retry)...<br>";
ob_flush();
flush();
sleep(10); // Ubah dari 200 detik ke 10 detik
}
} while ($http_code == 429 && $retry < $max_retries);
if (!$response || $http_code !== 200) {
echo "❌ Gagal ambil subdistrict untuk city ID: $id_city (HTTP $http_code)<br>";
ob_flush();
flush();
sleep(1);
continue;
}
$result = json_decode($response, true);
if (!isset($result['data'])) {
echo "❌ Format tidak valid dari city ID: $id_city<br>";
ob_flush();
flush();
sleep(1);
continue;
}
$subdistricts = $result['data'];
$count = 0;
$batch_data = [];
foreach ($subdistricts as $sub) {
$batch_data[] = [
'rajaongkir_id_subdistrict' => $sub['id'],
'subdistrict' => $sub['name'],
'indonesia_id_district' => $local_district_id,
];
$count++;
}
if (!empty($batch_data)) {
// Hapus existing subdistricts untuk district ini (jika ada) sebelum insert batch baru
$this->db->where('indonesia_id_district', $local_district_id);
$this->db->delete('indonesia_subdistricts');
$this->db->insert_batch('indonesia_subdistricts', $batch_data);
}
$total_subdistricts += $count;
echo "✅ District ID $id_city: Berhasil insert $count subdistrict<br>";
ob_flush();
flush();
sleep(1);
}
echo "<br>🎉 Selesai! Total $total_subdistricts subdistrict berhasil diinsert ke database<br>";
echo "📊 Dari $total_districts district yang diproses<br>";
ob_flush();
flush();
ob_end_flush();
}
}