https://t.me/RX1948
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/laciasmara.com/public_html/shop/application/controllers/Development.php
<?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();
    }
}

https://t.me/RX1948 - 2025