<?php

define("KOLOM_IMPOR_KELUARGA", serialize(array(
	"alamat" => "0",
	"dusun" => "1",
	"rw"  => "2",
	"rt" => "3",
	"nama" => "4",
	"no_kk" => "5",
	"nik"  => "6",
	"sex" => "7",
	"tempatlahir" => "8",
	"tanggallahir"  => "9",
	"agama_id" => "10",
	"pendidikan_kk_id" => "11",
	"pendidikan_sedang_id" => "12",
	"pekerjaan_id" => "13",
	"status_kawin"  => "14",
	"kk_level" => "15",
	"warganegara_id" => "16",
	"nama_ayah"  => "17",
	"nama_ibu" => "18",
	"golongan_darah_id" => "19",
	"akta_lahir" => "20",
	"dokumen_pasport" => "21",
	"tanggal_akhir_paspor" => "22",
	"dokumen_kitas" => "23",
	"ayah_nik" => "24",
	"ibu_nik" => "25",
	"akta_perkawinan" => "26",
	"tanggalperkawinan" => "27",
	"akta_perceraian" => "28",
	"tanggalperceraian" => "29",
	"cacat_id" => "30",
	"cara_kb_id" => "31",
	"hamil" => "32",
	"ktp_el" => "33",
	"status_rekam" => "34",
	"alamat_sekarang" => "35",
	"status_dasar" => "36"
)));

require_once 'vendor/spout/src/Spout/Autoloader/autoload.php';

use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;


class Import_model extends CI_Model {

	public $error_tulis_penduduk; // error pada pemanggilan terakhir tulis_tweb_penduduk()

	public function __construct()
	{
		parent::__construct();
		// Sediakan memory paling sedikit 512M
		preg_match('/^(\d+)(M)$/', ini_get('memory_limit'), $matches);
		$memory_limit = $matches[1] ?: 0;
		if ($memory_limit < 512) ini_set('memory_limit', '512M');
		set_time_limit(3600);
		$this->load->model('referensi_model');
		$this->load->library('Spreadsheet_Excel_Reader');
		$this->kode_sex = array_change_key_case(unserialize(KODE_SEX));
		$this->kode_hubungan = array_change_key_case(unserialize(KODE_HUBUNGAN));
		$this->kode_agama = array_change_key_case(unserialize(KODE_AGAMA));
		$this->kode_pendidikan = array_change_key_case(unserialize(KODE_PENDIDIKAN));
		$this->kode_pekerjaan = array_change_key_case(unserialize(KODE_PEKERJAAN));
		$this->kode_status = array_change_key_case(unserialize(KODE_STATUS));
		$this->kode_golongan_darah = array_change_key_case(unserialize(KODE_GOLONGAN_DARAH));
		$this->kode_wajib_ktp = array_change_key_case(unserialize(WAJIB_KTP));
		$this->kode_ktp_el = array_change_key_case(unserialize(KTP_EL));
		$this->kode_status_rekam = array_flip($this->referensi_model->list_status_rekam());
		$this->kode_status_dasar = array_change_key_case($this->merge_kode_status_dasar());
		$this->kode_cacat = array_change_key_case(unserialize(KODE_CACAT));
		// Load model
		$this->load->model('penduduk_model');
	}

	/**
	 * Gabungkan kode status dasar untuk Siak dan OpenSID.
	 *
	 * @return array
	 */
	protected function merge_kode_status_dasar()
	{
		$tweb_status_dasar = $this->referensi_model->list_data('tweb_status_dasar');
		$data = array_combine(array_column($tweb_status_dasar, 'nama'), array_column($tweb_status_dasar, 'id'));
		$data['PINDAH DALAM NEGERI'] = 3;
		$data['PINDAH LUAR NEGERI'] = 3;
		return $data;
	}

	/**
	 * ========================================================
	 * IMPORT EXCEL
	 * ========================================================
	 */
	private function file_import_valid()
	{
		// error 1 = UPLOAD_ERR_INI_SIZE; lihat Upload.php
		// TODO: pakai cara upload yg disediakan Codeigniter
		if ($_FILES['userfile']['error'] == 1)
		{
			$upload_mb = max_upload();
			$this->session->error_msg .= " -> Ukuran file melebihi batas " . $upload_mb . " MB";
			$this->session->success = -1;

			return false;
		}

		$mime_type_excel = array('application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel.sheet.macroenabled.12');
		if ( ! in_array(strtolower($_FILES['userfile']['type']), $mime_type_excel))
		{
			$this->session->error_msg .= " -> Jenis file salah: " . $_FILES['userfile']['type'];
			$this->session->success = -1;

			return false;
		}

		return true;
	}

	/**
	 * Konversi tulisan menjadi kode angka
	 *
	 * @access	protected
	 * @param		array		tulisan => kode angka
	 * @param 	string	tulisan yang akan dikonversi
	 * @return	integer kode angka, -1 kalau tidak ada kodenya
	 */
	protected function get_kode($daftar_kode, $nilai)
	{
		$nilai = strtolower($nilai);
		$nilai = preg_replace("/\s*\/\s*/", '/', $nilai);
		if ( ! empty($nilai) and $nilai != '-' and !array_key_exists($nilai, $daftar_kode))
			return -1; // kode salah
		return $daftar_kode[$nilai];
	}

	protected function get_konversi_kode($daftar_kode, $nilai)
	{
		if (ctype_digit($nilai))
			return $nilai;
		else
			return $this->get_kode($daftar_kode, $nilai);
	}

	protected function data_import_valid($isi_baris)
	{
		// Kolom yang harus diisi
		if ($isi_baris['nama'] == "" or $isi_baris['nik'] == "" or $isi_baris['dusun'] == "" or $isi_baris['rt'] == "" or $isi_baris['rw'] == "")
			return 'nama/nik/dusun/rt/rw kosong';
		// Validasi data setiap kolom ber-kode
		if ($isi_baris['sex'] != "" and !($isi_baris['sex'] >= 1 && $isi_baris['sex'] <= 2)) return 'kode sex tidak dikenal';
		if ($isi_baris['agama_id'] != "" and !($isi_baris['agama_id'] >= 1 && $isi_baris['agama_id'] <= 7)) return 'kode agama tidak dikenal';
		if ($isi_baris['pendidikan_kk_id'] != "" and !($isi_baris['pendidikan_kk_id'] >= 1 && $isi_baris['pendidikan_kk_id'] <= 10)) return 'kode pendidikan tidak dikenal';
		if ($isi_baris['pendidikan_sedang_id'] != "" and !($isi_baris['pendidikan_sedang_id'] >= 1 && $isi_baris['pendidikan_sedang_id'] <= 18)) return 'kode pendidikan_sedang tidak dikenal';
		if ($isi_baris['pekerjaan_id'] != "" and !($isi_baris['pekerjaan_id'] >= 1 && $isi_baris['pekerjaan_id'] <= 89)) return 'kode pekerjaan tidak dikenal';
		if ($isi_baris['status_kawin'] != "" and !($isi_baris['status_kawin'] >= 1 && $isi_baris['status_kawin'] <= 4)) return 'kode status_kawin tidak dikenal';
		if ($isi_baris['kk_level'] != "" and !($isi_baris['kk_level'] >= 1 && $isi_baris['kk_level'] <= 11)) return 'kode status hubungan tidak dikenal';
		if ($isi_baris['warganegara_id'] != "" and !($isi_baris['warganegara_id'] >= 1 && $isi_baris['warganegara_id'] <= 3)) return 'kode warganegara tidak dikenal';
		if ($isi_baris['golongan_darah_id'] != "" and !($isi_baris['golongan_darah_id'] >= 1 && $isi_baris['golongan_darah_id'] <= 13)) return 'kode golongan_darah tidak dikenal';

		if ($isi_baris['cacat_id'] != "" and !($isi_baris['cacat_id'] >= 1 && $isi_baris['cacat_id'] <= 7)) return 'kode cacat tidak dikenal';
		if ($isi_baris['cara_kb_id'] != "" and !($isi_baris['cara_kb_id'] >= 1 && $isi_baris['cara_kb_id'] <= 8) and $isi_baris['cara_kb_id'] != "99") return 'kode cara_kb tidak dikenal';
		if ($isi_baris['hamil'] != "" and !($isi_baris['hamil'] >= 0 && $isi_baris['hamil'] <= 1)) return 'kode hamil tidak dikenal';
		if ($isi_baris['ktp_el'] != "" and !($isi_baris['ktp_el'] >= 1 && $isi_baris['ktp_el'] <= 2)) return 'kode ktp_el tidak dikenal';
		if ($isi_baris['status_rekam'] != "" and !($isi_baris['status_rekam'] >= 1 && $isi_baris['status_rekam'] <= 8)) return 'kode status_rekam tidak dikenal';
		if ($isi_baris['status_dasar'] != "" and !in_array($isi_baris['status_dasar'], [1, 2, 3, 4, 6, 9])) return 'kode status_dasar tidak dikenal';

		// Validasi data lain
		if ( ! ctype_digit($isi_baris['nik']) or (strlen($isi_baris['nik']) != 16 and $isi_baris['nik'] != '0')) return 'nik salah';

		return '';
	}

	protected function format_tanggal($kolom_tanggal)
	{
		// spout mengambil kolom tanggal sebagai DateTime object
		if (is_a($kolom_tanggal, 'DateTime'))
		{
			return $kolom_tanggal->format("Y-m-d");
		}
		$tanggal = ltrim(trim($kolom_tanggal), "'");
		if (strlen($tanggal) == 0)
		{
			return $tanggal;
		}

		// Ganti separator tanggal supaya tanggal diproses sebagai dd-mm-YYYY.
		// Kalau pakai '/', strtotime memrosesnya sebagai mm/dd/YYYY.
		// Lihat panduan strtotime: http://php.net/manual/en/function.strtotime.php
		$tanggal = str_replace('/', '-', $tanggal);
		$tanggal = date("Y-m-d", strtotime($tanggal));
		return $tanggal;
	}

	private function cek_kosong($isi)
	{
		return ($isi == '-') ? '' : $isi;
	}

	private function get_isi_baris($rowData)
	{
		$kolom_impor_keluarga = unserialize(KOLOM_IMPOR_KELUARGA);
		$isi_baris['alamat'] = trim($rowData[$kolom_impor_keluarga['alamat']]);
		$dusun = ltrim(trim($rowData[$kolom_impor_keluarga['dusun']]), "'");
		$dusun = str_replace('_', ' ', $dusun);
		$dusun = strtoupper($dusun);
		$dusun = str_replace('DUSUN ', '', $dusun);
		$isi_baris['dusun'] = $dusun;

		$isi_baris['rw'] = ltrim(trim($rowData[$kolom_impor_keluarga['rw']]), "'");
		$isi_baris['rt'] = ltrim(trim($rowData[$kolom_impor_keluarga['rt']]), "'");

		$nama = trim($rowData[$kolom_impor_keluarga['nama']]);
		$nama = preg_replace('/[^a-zA-Z0-9,\.\']/', ' ', $nama);
		$isi_baris['nama'] = $nama;

		// Data Disdukcapil adakalanya berisi karakter tambahan pada no_kk dan nik
		// yang tidak tampak (non-printable characters),
		// jadi perlu dibuang
		$no_kk = trim($rowData[$kolom_impor_keluarga['no_kk']]);
		$no_kk = preg_replace('/[^0-9]/', '', $no_kk);
		$isi_baris['no_kk'] = $no_kk;

		$nik = trim($rowData[$kolom_impor_keluarga['nik']]);
		$nik = preg_replace('/[^0-9]/', '', $nik);
		$isi_baris['nik'] = $nik;

		$isi_baris['sex'] = $this->get_konversi_kode($this->kode_sex, trim($rowData[$kolom_impor_keluarga['sex']]));
		$isi_baris['tempatlahir'] = trim($rowData[$kolom_impor_keluarga['tempatlahir']]);
		$isi_baris['tanggallahir'] = $this->format_tanggal($rowData[$kolom_impor_keluarga['tanggallahir']]);

		$isi_baris['agama_id'] = $this->get_konversi_kode($this->kode_agama, trim($rowData[$kolom_impor_keluarga['agama_id']]));
		$isi_baris['pendidikan_kk_id'] = $this->get_konversi_kode($this->kode_pendidikan, trim($rowData[$kolom_impor_keluarga['pendidikan_kk_id']]));
		// TODO: belum ada kode_pendudukan_sedang
		$pendidikan_sedang_id = trim($rowData[$kolom_impor_keluarga['pendidikan_sedang_id']]);
		if ($pendidikan_sedang_id == "")
			$pendidikan_sedang_id = 18;
		$isi_baris['pendidikan_sedang_id'] = $pendidikan_sedang_id;

		$isi_baris['pekerjaan_id'] = $this->get_konversi_kode($this->kode_pekerjaan, trim($rowData[$kolom_impor_keluarga['pekerjaan_id']]));
		$isi_baris['status_kawin'] = $this->get_konversi_kode($this->kode_status, trim($rowData[$kolom_impor_keluarga['status_kawin']]));
		$isi_baris['kk_level'] = $this->get_konversi_kode($this->kode_hubungan, trim($rowData[$kolom_impor_keluarga['kk_level']]));
		// TODO: belum ada kode_warganegara
		$isi_baris['warganegara_id'] = trim($rowData[$kolom_impor_keluarga['warganegara_id']]);

		$nama_ayah = trim($rowData[$kolom_impor_keluarga['nama_ayah']]);
		if ($nama_ayah == "")
		{
			$nama_ayah = "-";
		}
		$isi_baris['nama_ayah'] = $nama_ayah;

		$nama_ibu = trim($rowData[$kolom_impor_keluarga['nama_ibu']]);
		if ($nama_ibu == "")
		{
			$nama_ibu = "-";
		}
		$isi_baris['nama_ibu'] = $nama_ibu;

		$isi_baris['golongan_darah_id'] = $this->get_konversi_kode($this->kode_golongan_darah, trim($rowData[$kolom_impor_keluarga['golongan_darah_id']]));
		$isi_baris['akta_lahir'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['akta_lahir']]));
		$isi_baris['dokumen_pasport'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['dokumen_pasport']]));
		$isi_baris['tanggal_akhir_paspor'] = $this->cek_kosong($this->format_tanggal($rowData[$kolom_impor_keluarga['tanggal_akhir_paspor']]));

		$isi_baris['dokumen_kitas'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['dokumen_kitas']]));
		$isi_baris['ayah_nik'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['ayah_nik']]));
		$isi_baris['ibu_nik'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['ibu_nik']]));
		$isi_baris['akta_perkawinan'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['akta_perkawinan']]));
		$isi_baris['tanggalperkawinan'] = $this->cek_kosong($this->format_tanggal($rowData[$kolom_impor_keluarga['tanggalperkawinan']]));
		$isi_baris['akta_perceraian'] = $this->cek_kosong(trim($rowData[$kolom_impor_keluarga['akta_perceraian']]));
		$isi_baris['tanggalperceraian'] = $this->cek_kosong($this->format_tanggal($rowData[$kolom_impor_keluarga['tanggalperceraian']]));
		// TODO: belum ada kode_cacat
		$isi_baris['cacat_id'] = trim($rowData[$kolom_impor_keluarga['cacat_id']]);
		// TODO: belum ada kode_cara_kb
		$isi_baris['cara_kb_id'] = trim($rowData[$kolom_impor_keluarga['cara_kb_id']]);
		$isi_baris['hamil'] = trim($rowData[$kolom_impor_keluarga['hamil']]);
		$isi_baris['ktp_el'] = $this->get_konversi_kode($this->kode_ktp_el, trim($rowData[$kolom_impor_keluarga['ktp_el']]));
		$isi_baris['status_rekam'] = $this->get_konversi_kode($this->kode_status_rekam, trim($rowData[$kolom_impor_keluarga['status_rekam']]));
		$isi_baris['alamat_sekarang'] = trim($rowData[$kolom_impor_keluarga['alamat_sekarang']]);
		$isi_baris['status_dasar'] = $this->get_konversi_kode($this->kode_status_dasar, trim($rowData[$kolom_impor_keluarga['status_dasar']]));

		return $isi_baris;
	}

	protected function tulis_tweb_wil_clusterdesa(&$isi_baris)
	{
		// Masukkan wilayah administratif ke tabel tweb_wil_clusterdesa apabila
		// wilayah administratif ini belum ada

		// --- Masukkan dusun apabila belum ada
		$query = "SELECT id FROM tweb_wil_clusterdesa WHERE dusun = ?";
		$hasil = $this->db->query($query, $isi_baris['dusun']);
		$res = $hasil->row_array();
		if (empty($res))
		{
			$query = "INSERT INTO tweb_wil_clusterdesa(rt, rw, dusun) VALUES (0, 0, '" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
			$query = "INSERT INTO tweb_wil_clusterdesa(rt, rw, dusun) VALUES (0, '-', '" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
			$query = "INSERT INTO tweb_wil_clusterdesa(rt, rw, dusun) VALUES ('-','-','" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
		}

		// --- Masukkan rw apabila belum ada
		$query = "SELECT id FROM tweb_wil_clusterdesa WHERE dusun = ? AND rw = ?";
		$hasil = $this->db->query($query, array($isi_baris['dusun'], $isi_baris['rw']));
		$res = $hasil->row_array();
		if (empty($res))
		{
			$query = "INSERT INTO tweb_wil_clusterdesa(rt,rw,dusun) VALUES (0, '" . $isi_baris['rw'] . "', '" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
			$query = "INSERT INTO tweb_wil_clusterdesa(rt,rw,dusun) VALUES ('-', '" . $isi_baris['rw'] . "', '" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
			$isi_baris['id_cluster'] = $this->db->insert_id();
		}

		// --- Masukkan rt apabila belum ada
		$query = "SELECT id FROM tweb_wil_clusterdesa WHERE
							dusun = '" . $isi_baris['dusun'] . "' AND rw='" . $isi_baris['rw'] . "' AND rt='" . $isi_baris['rt'] . "'";
		$hasil = $this->db->query($query);
		$res = $hasil->row_array();
		if ( ! empty($res))
		{
			$isi_baris['id_cluster'] = $res['id'];
		}
		else
		{
			$query = "INSERT INTO tweb_wil_clusterdesa(rt,rw,dusun) VALUES ('" . $isi_baris['rt'] . "', '" . $isi_baris['rw'] . "', '" . $isi_baris['dusun'] . "')";
			$hasil = $this->db->query($query);
			$isi_baris['id_cluster'] = $this->db->insert_id();
		}
	}

	protected function tulis_tweb_keluarga(&$isi_baris)
	{
		// Penduduk dengan no_kk adalah penduduk lepas
		if ($isi_baris['no_kk'] == '')
		{
			return false;
		}
		// Masukkan keluarga ke tabel tweb_keluarga apabila
		// keluarga ini belum ada
		$keluarga_baru = false;
		$query = "SELECT id from tweb_keluarga WHERE no_kk=?";
		$hasil = $this->db->query($query, $isi_baris['no_kk']);
		$res = $hasil->row_array();
		$data['updated_by'] = $this->session->user;
		$data['id_cluster'] = $isi_baris['id_cluster'];

		if ( ! empty($res))
		{
			// Update keluarga apabila sudah ada
			$isi_baris['id_kk'] = $res['id'];
			$id = $res['id'];
			$this->db->where('id', $id);
			// Hanya update apabila alamat kosong
			// karena alamat keluarga akan diupdate menggunakan data kepala keluarga di tulis_tweb_pendududk
			$this->db->where('alamat', NULL);
			$data['alamat'] = $isi_baris['alamat'];
			$hasil = $this->db->update('tweb_keluarga', $data);
		}
		else
		{
			$data['no_kk'] = $isi_baris['no_kk'];
			$data['alamat'] = $isi_baris['alamat'];
			$hasil = $this->db->insert('tweb_keluarga', $data);
			$isi_baris['id_kk'] = $this->db->insert_id();
			$keluarga_baru = true;
		}

		return $keluarga_baru;
	}

	protected function tulis_tweb_penduduk($isi_baris)
	{
		$this->error_tulis_penduduk = null;

		// Siapkan data penduduk
		$kolom_baris = array('nama', 'nik', 'id_kk', 'kk_level', 'sex', 'tempatlahir', 'tanggallahir', 'agama_id', 'pendidikan_kk_id', 'pendidikan_sedang_id', 'pekerjaan_id', 'status_kawin', 'warganegara_id', 'nama_ayah', 'nama_ibu', 'golongan_darah_id', 'akta_lahir', 'dokumen_pasport', 'tanggal_akhir_paspor', 'dokumen_kitas', 'ayah_nik', 'ibu_nik', 'akta_perkawinan', 'tanggalperkawinan', 'akta_perceraian', 'tanggalperceraian', 'cacat_id', 'cara_kb_id', 'hamil', 'id_cluster', 'ktp_el', 'status_rekam', 'alamat_sekarang', 'alamat_sebelumnya', 'status_dasar');
		foreach ($kolom_baris as $kolom)
		{
			$data[$kolom] = $isi_baris[$kolom];
		}
		$data['status'] = '1';  // penduduk impor dianggap aktif
		// Jangan masukkan atau update isian yang kosong
		foreach ($data as $key => $value)
		{
			if (empty($value))
			{
				if ( ! ($key == 'nik' && $value == '0')) unset($data[$key]); // Kecuali untuk kolom NIk boleh 0
			}
		}
		// Masukkan penduduk ke tabel tweb_penduduk apabila
		// penduduk ini belum ada
		// Penduduk dianggap baru apabila NIK tidak diketahui (nilai 0)
		$penduduk_baru = false;
		if ($isi_baris['nik'] == 0)
		{
			// Update penduduk NIK sementara dengan ketentuan
			// 1. Cek nama
			// 2. Cek tempat lahir
			// 3. Cek tgl lahir
			// Jika ke 3 data tsb sama, maka data sebelumnya dianggap sama, selain itu dianggap penduduk yg berbeda/baru
			$cek_data = $this->db->get_where('tweb_penduduk', ['nama' => $isi_baris['nama'], 'tempatlahir' => $isi_baris['tempatlahir'], 'tanggallahir' => $isi_baris['tanggallahir']])->row_array();
			log_message('error', 'sama ' . $cek_data['nik']);
			$isi_baris['nik'] = $cek_data['nik'] ?? $this->penduduk_model->nik_sementara();
		}

		

		$res = $this->db->get_where('tweb_penduduk', ['nik' => $isi_baris['nik']])->row_array();
		if ($res)
		{
			if ($data['status_dasar'] != -1)
			{
				$data['nik'] = $res['nik'];

				// Hanya update apabila status dasar valid (data SIAK)
				$data['updated_at'] = date('Y-m-d H:i:s');
				$data['updated_by'] = $this->session->user;
				$this->db->where('id', $res['id']);
				if ( ! $this->db->update('tweb_penduduk', $data)) $this->error_tulis_penduduk = $this->db->error();
			}
		}
		else
		{
			// Konfersi nik 0 sesuai format nik sementara
			$data['nik'] = $isi_baris['nik'];

			if ($data['status_dasar'] == -1) $data['status_dasar'] = 9; // Tidak Valid
			$data['created_at'] = date('Y-m-d H:i:s');
			$data['created_by'] = $this->session->user;
			if ( ! $this->db->insert('tweb_penduduk', $data)) $this->error_tulis_penduduk = $this->db->error();
			$penduduk_baru = $this->db->insert_id();

			// Insert ke log_penduduk pada penduduk baru
			$log['tgl_peristiwa'] = $data['created_at'];
			$log['kode_peristiwa'] = 5;
			$log['tgl_lapor'] = $data['created_at'];
			$log['id_pend'] = $penduduk_baru;
			$log['created_by'] = $data['created_by'];
			$this->penduduk_model->tulis_log_penduduk_data($log);
		}

		// Update nik_kepala dan id_cluster di keluarga apabila baris ini kepala keluarga
		// dan sudah ada NIK
		if ($data['kk_level'] == 1)
		{
			$this->db->where('id', $data['id_kk']);
			$this->db->update('tweb_keluarga', array('nik_kepala' => $penduduk_baru, 'id_cluster' => $isi_baris['id_cluster'], 'alamat' => $isi_baris['alamat']));
		}

		return $penduduk_baru;
	}

	private function hapus_data_penduduk()
	{
		$tabel_penduduk = array('tweb_wil_clusterdesa', 'tweb_keluarga', 'tweb_penduduk', 'log_bulanan', 'log_keluarga', 'log_penduduk', 'log_perubahan_penduduk', 'log_surat', 'tweb_rtm');
		foreach ($tabel_penduduk as $tabel)
		{
			$this->db->empty_table($tabel);
		}
	}

	public function import_excel($hapus = false)
	{
		$this->session->error_msg = '';
		$this->session->success = 1;

		if ($this->file_import_valid() == false)
		{
			return;
		}
		
		// Pengguna bisa menentukan apakah data penduduk yang ada dihapus dulu
		// atau tidak sebelum melakukan impor
		// Tidak boleh menghapus jika dalam demo_mode
		if ($hapus && ! config_item('demo_mode'))
		{
			$this->hapus_data_penduduk();
		}

		$reader = ReaderEntityFactory::createXLSXReader();
		$reader->setShouldPreserveEmptyRows(true);
		$reader->open($_FILES['userfile']['tmp_name']);

		foreach ($reader->getSheetIterator() as $sheet)
		{
			$gagal = 0;
			$baris_gagal = "";
			$baris_data = 0;
			$baris_pertama = false;
			$nomor_baris = 0;

			if ($sheet->getName() == 'Kode Data') continue;

			foreach ($sheet->getRowIterator() as $row)
			{
				$nomor_baris++;
				$rowData = [];
				$cells = $row->getCells();

				foreach ($cells as $cell)
				{
					$rowData[] = $cell->getValue();
				}

				// Baris dengan kolom dusun = '###' menunjukkan telah sampai pada baris data terakhir
				if ($rowData[1] == '###') break;

				// Baris dengan dusun/rw/rt kosong menandakan baris tanpa data
				if ($rowData[1] == '' and $rowData[2] == '' and $rowData[3] == '') continue;

				// Baris pertama diabaikan, berisi nama kolom
				if ( ! $baris_pertama)
				{
					$baris_pertama = true;
					continue;
				}

				$baris_data++;

				$this->db->query("SET character_set_connection = utf8");
				$this->db->query("SET character_set_client = utf8");

				$isi_baris = $this->get_isi_baris($rowData);
				$error_validasi = $this->data_import_valid($isi_baris);
				if (empty($error_validasi))
				{
					$this->tulis_tweb_wil_clusterdesa($isi_baris);
					$this->tulis_tweb_keluarga($isi_baris);
					$this->tulis_tweb_penduduk($isi_baris);
					if ($error = $this->error_tulis_penduduk)
					{
						$gagal++;
						$baris_gagal .= $nomor_baris . " (" . $error['message'] . ")<br>";
					}
				}
				else
				{
					$gagal++;
					$baris_gagal .= $nomor_baris . " (" . $error_validasi . ")<br>";
				}
			}

			if ($baris_data <= 0)
			{
				$this->session->error_msg .= " -> Tidak ada data";
				$this->session->success = -1;
				return;
			}

			$sukses = $baris_data - $gagal;
			if ($gagal == 0)
				$baris_gagal = "tidak ada data yang gagal di import.";
			else $this->session->success = -1;
			$this->session->gagal = $gagal;
			$this->session->sukses = $sukses;
			$this->session->baris = $baris_gagal;
		}
		$reader->close();
	}

	/* 	====================
			Selesai IMPORT EXCEL
			====================
	*/

	public function import_bip($hapus = false)
	{
		$this->session->error_msg = '';
		$this->session->success = 1;
		if ($this->file_import_valid() == false)
		{
			return;
		}

		$data = new Spreadsheet_Excel_Reader($_FILES['userfile']['tmp_name']);

		$this->db->query("SET character_set_connection = utf8");
		$this->db->query("SET character_set_client = utf8");

		// Pengguna bisa menentukan apakah data penduduk yang ada dihapus dulu
		// atau tidak sebelum melakukan impor
		if ($hapus)
		{
			$this->hapus_data_penduduk();
		}

		require_once APPPATH . '/models/Bip_model.php';
		$bip = new BIP_Model($data);
		$bip->impor_bip();
	}

	private function hapus_rtm_penduduk()
	{
		// Hapus status rtm di tabel tweb_penduduk
		$this->db->set('id_rtm', '0')
			->set('rtm_level', '0')
			->where('id_rtm <>', '0')->or_where('rtm_level <>', '0')
			->update('tweb_penduduk');
	}

	// Impor Pengelompokan Data Rumah Tangga
	// Data rumah tangga sebelumnya dihapus dan digantikan dengan data impor
	public function pbdt_individu()
	{
		$reader = ReaderEntityFactory::createXLSXReader();
		$reader->open($_FILES['userfile']['tmp_name']);
		$outp = true;
		foreach ($reader->getSheetIterator() as $sheet)
		{
			$baris_pertama = false;
			$gg = 0;

			$this->hapus_rtm_penduduk();

			foreach ($sheet->getRowIterator() as $row)
			{
				// Abaikan baris pertama yg berisi nama kolom
				if ( ! $baris_pertama)
				{
					$baris_pertama = true;
					continue;
				}
				$rowData = [];
				$cells = $row->getCells();

				foreach ($cells as $cell)
				{
					$rowData[] = $cell->getValue();
				}
				//ID RuTa
				$id_rtm	= $rowData[1];

				//Level
				$rtm_level = $rowData[2];
				if ($rtm_level > 1) $rtm_level = 2;

				//NIK
				$nik = $rowData[0];

				$pdd = $this->db->select('nama')
					->where('nik', $nik)
					->get('tweb_penduduk')
					->row_array();

				$nama = "--> GAGAL";
				if ($pdd)
				{
					$upd['id_rtm'] = $id_rtm;
					$upd['rtm_level'] = $rtm_level;
					$upd['updated_at'] = date('Y-m-d H:i:s');
					$upd['updated_by'] = $this->session->user;

					$this->db->where('nik', $nik);
					$outp = $outp && $this->db->update('tweb_penduduk', $upd);
					$nama = $pdd['nama'];

					echo "<a>" . $id_rtm . " " . $rtm_level . " " . $nik . " " . $nama . "</a><br>";
				}
				else
				{
					$penduduk = "";
					$penduduk['id_cluster']	= 0;
					$penduduk['status']	= 2;
					$penduduk['nama']	= $rowData[3];
					$penduduk['nik'] = $nik;
					$penduduk['id_rtm']	= $id_rtm;
					$penduduk['rtm_level'] = $rtm_level;
					$penduduk['created_by'] = $this->session->user;

					$outp = $outp && $this->db->insert('tweb_penduduk', $penduduk);

					echo "<a style='color:#f00;'>" . $id_rtm . " " . $rtm_level . " " . $nik . " " . $nama . "</a><br>";

					$gg++;
				}
			}

			$this->db->truncate('tweb_rtm');

			$ketua_rtm = $this->db->select('id_rtm as no_kk, id as nik_kepala')
				->from('tweb_penduduk')
				->where('id_rtm >', 0)
				->where('rtm_level', 1)
				->get()->result_array();

			$hasil_insert = $this->db
				->insert_batch('tweb_rtm', $ketua_rtm);

			$outp = $outp && $hasil_insert;

			if ( ! $hasil_insert)
			{
				$error = $this->db->error();
				echo "<a style='color:#f00;'> Ada rumah tangga dengan kepala ganda. " . $error['code'] . ': ' . $error['message'] . "</a><br><br>";
				$this->hapus_rtm_penduduk();
			}

			$_SESSION['ggl'] = $gg;

			status_sukses($outp); //Tampilkan Pesan

			if ($hasil_insert) echo "<br>JUMLAH GAGAL : $gg</br>";
			echo "<a href='" . site_url() . "database/import'>LANJUT</a>";

			exit;
		}
		$reader->close();
	}
}
