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(); } }