kantor.php 11.2 KB
<?php
class SimTaxonomyImporter {
    const JNS_KANTOR_KANWIL_KHUSUS_BESAR = 21;
    const JNS_KANTOR_KPP_MADYA = 22;
    const JNS_KANTOR_KANWIL = 23;
    const JNS_KANTOR_KPP_PRATAMA = 24;
    const JNS_KANTOR_KP2KP = 25;

    var $filename = "";
    var $vocabulary = array();

    var $check_duplicate_nm_kantor = FALSE;
    var $check_duplicate_kd_kantor = TRUE;

    var $nm_kantor_list = array();
    var $kd_kantor_list = array();

    function __construct($filename) {
        $this->filename = $filename;

        if (function_exists('drush_main')) {
                $this->__construct_drush($filename);
        }
    }

    function __construct_drush($filename) {
        $this->filename = "adhisimon/kantor/$filename";

        $this->vocabulary = taxonomy_vocabulary_machine_name_load('kantor');
    }

    function get_term_by_field_value($field_name, $value, $vid = NULL) {
        $query = new EntityFieldQuery();
        $query->entityCondition('entity_type', 'taxonomy_term')
            ->fieldCondition($field_name, 'value', $value);

        if (!$vid) {
            $vid = $this->vocabulary->vid;
        }

        if ($vid) {
            $query->propertyCondition('vid', $vid);
        }

        $result = $query->execute();
        $term_ids = array_keys($result['taxonomy_term']);

        $terms = taxonomy_term_load_multiple($term_ids);
        if (count($terms) != 1) {
            return null;

        }
        return array_shift($terms);
    }

    function error($message) {
        if (function_exists('drush_set_error')) {
            return drush_set_error($message);
        } else {
            echo "$message\n";
        }

        return;
    }

    function fatal_error($message) {
        $this->error($message);

        if (function_exists("drush_die")) {
            drush_die($message);
        } else {
            die($message);
        }
    }

    function parse_file($callback = "callback_update") {
        $header_row = true;
        $field_names = array();

        $handle = fopen($this->filename, "r");
        if (!$handle) {
            return $this->fatal_error("gagal buka file!");
        }
        while ($cols = fgetcsv($handle)) {

            if ($header_row) {
                $field_names = array_flip($cols);
                $header_row = false;
                continue;
            }

            $data = array();
            foreach($field_names as $field_name => $field_idx) {
                if (!isset($cols[$field_idx])) {
                    return $this->fatal_error("error $field_name $field_idx");

                }
                $value = $cols[$field_idx];
                $value = preg_replace("/_x000D_/", " ", $value);
                $value = preg_replace('/\s+/', " ", $value);
                $data[$field_name] = trim($value);
            }

            call_user_func(array($this, $callback), $data);
        }
    }

    function callback_insert($data) {
        static $counter = 1;

        echo "$counter - Inserting " . $data['NM_KANTOR'] . "\n";
        $counter++;

        $term->vid = $this->vocabulary->vid;
        $term->name = $data['NM_KANTOR'];
        $term->field_alamat["und"][0]['value'] = $data['ALAMAT'];
        $term->field_kode_jenis_kantor["und"][0]['value'] = $data['JNS_KANTOR'];
        $term->field_kd_kantor["und"][0]['value'] = $data['KD_KANTOR'];
        $term->field_kd_kanwil["und"][0]['value'] = $data['KD_KANWIL'];
        $term->field_kd_kpp["und"][0]['value'] = $data['KD_KPP'];

        $result = taxonomy_term_save($term);
        if ($result != SAVED_NEW) {
            $this->fatal_error("callback_insert: Something wrong when inserting data: $result");
        }
    }

    function callback_update($data) {
        static $counter = 1;

        $modified = false;

        if (!empty($data['TGL_END'])) {
            return;
        }

        # check duplicate nm_kantor
        if ($this->check_duplicate_nm_kantor) {
            if (in_array($data['NM_KANTOR'], $this->nm_kantor_list)) {
                return $this->fatal_error("Duplicate NM_KANTOR " . $data['NM_KANTOR']);
            }

            $this->nm_kantor_list[] = $data['NM_KANTOR'];
        }

        # check duplicate kd_kantor
        if ($this->check_duplicate_kd_kantor) {
            if (in_array($data['KD_KANTOR'], $this->kd_kantor_list)) {
                return $this->fatal_error("Duplicate NM_KANTOR " . $data['KD_KANTOR']);
            }

            $this->kd_kantor_list[] = $data['KD_KANTOR'];
        }


        if (!function_exists('drush_main')) {
            return;
        }

        $term->vid = $this->vocabulary->vid;
        $term->name = $data['NM_KANTOR'];
        $term->field_alamat["und"][0]['value'] = $data['ALAMAT'];

        $term_original = $this->get_term_by_field_value('field_kd_kantor', $data['KD_KANTOR']);
        $term->tid = $term_original->tid;

        if (!$term_original) {
            $this->fatal_error($data['KD_KANTOR'] . " does not exist!");
        }


        echo "$counter - " . $term_original->tid . " " . $data['NM_KANTOR'];
        $counter++;
        echo "\n";

        $parent_kantor = $this->get_parent_kantor($data);
        if ($parent_kantor) {
            $modified = TRUE;

            $term->parent = $parent_kantor->tid;

            if (
                in_array(
                    $data['JNS_KANTOR'],
                    array(self::JNS_KANTOR_KPP_MADYA, self::JNS_KANTOR_KPP_PRATAMA, self::JNS_KANTOR_KP2KP)
                )
            ) {

                $term_kanwil = $this->get_term_kanwil($data['KD_KANWIL']);
                if (!$term_kanwil) {
                    $this->fatal_error("Term kanwil tidak terdefinisi.");
                }
                $term->field_taxonomy_kanwil["und"][0]['tid'] = $term_kanwil->tid;
            }

            if (
                in_array(
                    $data['JNS_KANTOR'],
                    array(self::JNS_KANTOR_KP2KP)
                )
            ) {

                $term_kpp = $this->get_term_kpp($data['KD_KPP']);
                if (!$term_kpp) {
                    $this->fatal_error("Term KPP tidak terdefinisi.");
                }
                $term->field_taxonomy_kpp["und"][0]['tid'] = $term_kpp->tid;
            }

        }

        $jenis_kantor_tid = $this->get_jenis_kantor_tid($data['JNS_KANTOR']);
        if (
            $jenis_kantor_tid &&
            ($term_original->field_taxonomy_jenis_kantor["und"][0]['tid'] != $jenis_kantor_tid)
        ) {
            $modified = TRUE;
            $term->field_taxonomy_jenis_kantor["und"][0]['tid'] = $jenis_kantor_tid;
        }

        if ($modified) {
            $result = taxonomy_term_save($term);
            if ($result != SAVED_UPDATED) {
                $this->fatal_error("Something wrong when updating data: $result");
            }
        }
    }

    function drush() {
        return function_exists('drush_main');
    }

    function callback_blackhole($data) {
        return;
    }

    function update_taxonomy_jenis_kantor($term, $data) {
        if (!$data['JNS_KANTOR']) {
            return $term;
        }

        $jenis_kantor_tid = $this->get_jenis_kantor_tid($data['JNS_KANTOR']);
        $term->field_taxonomy_jenis_kantor["und"][0]['tid'] = $jenis_kantor_tid;

        return $term;
    }

    function get_term_by_jnskantor_kdkpp($jns_kantor, $kd_kpp) {
        $query = new EntityFieldQuery();
        $query->entityCondition('entity_type', 'taxonomy_term')
            ->propertyCondition('vid', $this->vocabulary->vid)
            ->fieldCondition("field_kode_jenis_kantor", 'value', $jns_kantor)
            ->fieldCondition("field_kd_kpp", 'value', $kd_kpp);

        $result = $query->execute();
        if (!$result) {
            return;
        }

        $term_ids = array_keys($result['taxonomy_term']);

        $terms = taxonomy_term_load_multiple($term_ids);
        if (count($terms) != 1) {
            return null;

        }
        return array_shift($terms);
    }

    function get_term_kanwil($kd_kanwil) {
        $query = new EntityFieldQuery();
        $query->entityCondition('entity_type', 'taxonomy_term')
            ->propertyCondition('vid', $this->vocabulary->vid)
            ->fieldCondition("field_kd_kpp", 'value', $kd_kanwil)
            ->fieldCondition("field_kd_kanwil", 'value', $kd_kanwil)
            ;

        $result = $query->execute();
        if (!$result) {
            return;
        }

        $term_ids = array_keys($result['taxonomy_term']);

        $terms = taxonomy_term_load_multiple($term_ids);
        if (count($terms) != 1) {
            return null;

        }
        return array_shift($terms);
    }

    function get_term_kpp($kd_kpp) {
        $query = new EntityFieldQuery();
        $query->entityCondition('entity_type', 'taxonomy_term')
            ->propertyCondition('vid', $this->vocabulary->vid)
            ->fieldCondition("field_kode_jenis_kantor", 'value', self::JNS_KANTOR_KPP_PRATAMA)
            ->fieldCondition("field_kd_kpp", 'value', $kd_kpp)
            ;

        $result = $query->execute();
        if (!$result) {
            return;
        }

        $term_ids = array_keys($result['taxonomy_term']);

        $terms = taxonomy_term_load_multiple($term_ids);
        if (count($terms) != 1) {
            return null;

        }
        return array_shift($terms);
    }

    function get_parent_kantor($data) {

        if (!$this->drush()) {
            return;
        }

        $p = null;
        if ($data['KD_KPP'] == $data['KD_KANWIL']) {
            return;
        }

        if (in_array($data['JNS_KANTOR'], array(self::JNS_KANTOR_KPP_MADYA, self::JNS_KANTOR_KPP_PRATAMA))) {
            $p = $this->get_term_by_jnskantor_kdkpp(self::JNS_KANTOR_KANWIL, $data['KD_KANWIL']);

            if (!$p) {
                $this->get_term_by_jnskantor_kdkpp(self::JNS_KANTOR_KANWIL_KHUSUS_BESAR, $data['KD_KANWIL']);
            }
        }

        if ($data['JNS_KANTOR'] == self::JNS_KANTOR_KP2KP) {
            $p = $this->get_term_by_jnskantor_kdkpp(self::JNS_KANTOR_KPP_PRATAMA, $data['KD_KPP']);
        }

        return $p;
    }

    function get_jenis_kantor_tid($jns_kantor) {
        $vocabulary = taxonomy_vocabulary_machine_name_load("jenis_kantor");
        $term = $this->get_term_by_field_value('field_kode_jenis_kantor', $jns_kantor, $vocabulary->vid);

        if (!$term) {
            return;
        }

        return $term->tid;
    }

    function delete_all() {
        if (!$this->drush()) {
            return;
        }

        $query = new EntityFieldQuery();
        $query->entityCondition('entity_type', 'taxonomy_term');

        $vid = $this->vocabulary->vid;

        if (!$vid) {
            $this->fatal_error("Unknown vid");
        }

        $query->propertyCondition('vid', $vid);
        $result = $query->execute();
        if (!$result) {
            return;
        }

        foreach ($result['taxonomy_term'] as $term) {
            echo "Deleting ";
            echo $term->tid;
            //$term = taxonomy_term_load($term->tid);
            //echo "Deleting " . $term->name . ": ";
            echo "-> ";
            echo taxonomy_term_delete($term->tid);
            echo "\n";
        }

    }
}

$t = new SimTaxonomyImporter("kantor-clean.csv");
$t->delete_all();
$t->parse_file("callback_insert");
$t->parse_file();