<?php
require_once GTFWConfiguration::GetValue( 'application', 'docroot') .'module/pembuatan_nim/business/AppPembuatanNim.class.php';
require_once GTFWConfiguration::GetValue( 'application', 'docroot') .'module/pembuatan_nim/business/AppPembuatanNimToFinansi.class.php';
require_once GTFWConfiguration::GetValue( 'application', 'docroot') .'module/pembuatan_nim/business/AppMahasiswa.class.php';
require_once GTFWConfiguration::GetValue( 'application', 'docroot') .'module/pembuatan_nim/business/AppMahasiswaToSia.class.php';

class ProcessPembuatanNim{
   var $_POST;
   var $Obj;
   var $pageView;
   var $cssDone = "notebox-done";
   var $cssFail = "notebox-warning";
   var $cssInfo = "notebox-info";
   var $cssAlert = "notebox-alert";
   var $return;
   var $decId;
   var $encId;
   
   var $tahunMasuk;
   var $semesterMasuk;
   var $prodiKode;
   var $nim;
   var $bypassPembayaran;

   function __construct() {
      $this->Obj = new AppPembuatanNim();
      $this->finansiObj = new AppPembuatanNimToFinansi();
      $this->mhsObj = new AppMahasiswa();
      $this->siaObj = new AppMahasiswaToSia();
      $this->_POST = $_POST->AsArray();
      $this->decId = Dispatcher::Instance()->Decrypt($_REQUEST['dataId']);
      $this->encId = Dispatcher::Instance()->Encrypt($this->decId);
      $this->pageView = Dispatcher::Instance()->GetUrl('pembuatan_nim', 'pembuatanNim', 'view', 'html');
      
      $this->bypassPembayaran = $this->Obj->getSettPembayaran();            
   }
   
   function SendToSia(){
      $dataMhs=$this->mhsObj->GetDataMahasiswaById($this->decId);      
      $dataOrtu=$this->mhsObj->GetDataOrtuById($this->decId);
      //print_r($dataMhs);exit;
      $this->tahunMasuk = $dataMhs[0]['mhs_thn_masuk'];
      if (empty($dataMhs[0]['mhs_sem_masuk']))
         $dataMhs[0]['mhs_sem_masuk'] = '1';
      $this->semesterMasuk = $dataMhs[0]['mhs_sem_masuk'];
      $this->prodiKode = $dataMhs[0]['mhs_prodi_kode'];
      $this->nim = $dataMhs[0]['mhs_niu'];
      $this->nama = $dataMhs[0]['mhs_nama'];
      
      $dataMhs[0]['mhs_nama'] = addslashes($dataMhs[0]['mhs_nama']);
      $dataMhs[0]['mhs_tempat_lahir'] = addslashes($dataMhs[0]['mhs_tempat_lahir']);
      $dataMhs[0]['mhs_alamat'] = addslashes($dataMhs[0]['mhs_alamat']);
      $dataMhs[0]['mhs_alamat_smta'] = addslashes($dataMhs[0]['mhs_alamat_smta']);
      $dataMhs[0]['mhs_almt_tempat_kerja'] = addslashes($dataMhs[0]['mhs_almt_tempat_kerja']);
      $dataMhs[0]['mhs_hobi'] = addslashes($dataMhs[0]['mhs_hobi']);
      $arrDataMhs=$dataMhs[0];
      foreach($dataMhs[0] as $k => $v){
         $arrDataMhs[$k.'_2'] = $dataMhs[0][$k];
      }

      $dataOrtu[0]['ortu_nama_ayah'] = addslashes($dataOrtu[0]['ortu_nama_ayah']);
      $dataOrtu[0]['ortu_nama_ibu'] = addslashes($dataOrtu[0]['ortu_nama_ibu']);
      $dataOrtu[0]['ortu_nama_wali'] = addslashes($dataOrtu[0]['ortu_nama_wali']);
      $dataOrtu[0]['ortu_alamat'] = addslashes($dataOrtu[0]['ortu_alamat']);
      $arrDataOrtu=$dataOrtu[0];
      $arrDataOrtu['ortu_mhs_id'] = $arrDataMhs['mhs_niu']; // di sia relasi mhs_ortu dengan mhs menggunakan nim
      foreach($dataOrtu[0] as $k => $v){
         $arrDataOrtu[$k.'_2'] = $dataOrtu[0][$k];
      }
      
      $addMhsToSia=$this->siaObj->DoAddMahasiswaToSia($arrDataMhs);
      $addOrtuToSia=$this->siaObj->DoAddOrangTuaMahasiswaToSia($arrDataOrtu);   

      $addData = $addMhsToSia && $addOrtuToSia;
      
      /**
      var_dump($addMhsToSia);
      var_dump($addOrtuToSia);
      var_dump($addData);
      exit;
      **/
      
      return $addData;
   }
   /*
   function BuatNim() {
      $nim_formula = $this->Obj->GetNimFormula();
      
      $nim_formula_detil = explode('&', $nim_formula[0]['nimfFormulaFormat']);
      
      $nim = '';
      $sub_mulai = 0; // posisi no urut yg akan dicari nilai max-nya
      $sub_jumlah = 0; // jumlah digit yg akan dicari nilai max-nya
      
      foreach($nim_formula_detil as $komponen) {
         if (substr($komponen,0,1) == '[') {
            $komponen_detil = explode(':', $komponen);
            $komponen_kode = str_replace(array('[',']'),array('',''),$komponen_detil[0]);
            $komponen_format = $komponen_detil[1];
            $komponen_table = $this->Obj->GetNimKomponenByKode($komponen_kode);
            
            $sub_jumlah = substr($komponen_format,0,1);
            
            $params = array();
            switch($komponen_kode) {
               case '002':
                  $params = array($this->decId);
                  $prodi_label_nim = $this->Obj->GetDataFromQuery($komponen_table['nimkValue'], $params);
                  $sub_jumlah = strlen($prodi_label_nim);
                  $sub_mulai += $sub_jumlah;
                  break;
               case '003':
                  $params = array($sub_mulai + 1, $sub_jumlah);
                  break;
               case '004':
                  $fak_kode = $this->Obj->GetFakultasByMhsid($this->decId);
                  // jika jenjang berbeda, maka no urut di-reset (perlu dikembangkan agar bisa digunakan utk kasus yg berbeda)
                  // sementara ini setiap jenjang yg berbeda akan di-reset
                  $jenjang_kode = $this->Obj->GetJenjangByMhsid($this->decId);
                  $params = array($sub_mulai + 1, $sub_jumlah, $fak_kode, $jenjang_kode);
                  //print_r($params);
                  break;
               case '005':
                  $params = array();
                  break;
               case '006':
                  $prodi_kode = $this->Obj->GetProdiByMhsid($this->decId);
                  $params = array($sub_mulai + 1, $sub_jumlah, $prodi_kode);
                  break;
               case '007':
                  $params = array();
                  break;
               case '008':
                  // tidak membutuhkan parameter
                  $params = array();
                  break;
               case '009':
                  $params = array();
                  break;
               case '010':
                  $params = array($this->decId);
                  $jenjang_label_nim = $this->Obj->GetDataFromQuery($komponen_table['nimkValue'], $params);
                  $sub_jumlah = strlen($jenjang_label_nim);
                  $sub_mulai += $sub_jumlah;
                  break;
            }
            //echo $komponen_table['nimkValue'];
            //print_r($params);
            $value = $this->Obj->GetDataFromQuery($komponen_table['nimkValue'], $params);
            //echo $value.'<br />';
            $format = str_replace(array('[$v]','[$f]'), array($value,$komponen_format), $komponen_table['nimkRumus']);
            eval($format);
            //echo $output.'<br />';
            
            $sub_mulai += substr($komponen_format,0,1);
            $nim .= $output;
         } else {
            $nim .= $komponen;
            $sub_mulai += strlen($komponen);
         }
      }
      //echo $nim;
      //exit;
      return $nim;
   }*/
   
   function BuatNim(){
      //pengganti fungsi BuatNim sebelumnya dengan menggunakan fungsi SQL
      //print_r($this->decId);exit();
      $nim_formula = $this->Obj->GetNimFormula();
      $nim=$this->Obj->DoCreateNim($this->decId,$nim_formula[0]['nimfFormulaFormat']);
      /*var_dump($nim_formula);
      var_dump($nim);exit;*/
      return $nim;
   }
   
   function SendAlert($alert, $sub_modul, $css='') {
      Messenger::Instance()->Send('pembuatan_nim', $sub_modul, 'view', 'html', array($this->_POST, $alert, $css),Messenger::NextRequest);
   }
   
   function UpdateNim() {   		
   	  $bypassPembayaran = $this->bypassPembayaran;
   	  	
      // buat nim
      $nim_baru = $this->BuatNim();      
      
      // update nim ke admisi dan finansi
      if (!empty($nim_baru)){
         $this->Obj->StartTrans();
         $this->finansiObj->StartTrans();
               
         $updateNimToAdmisi = $this->Obj->DoUpdateNim($nim_baru, $this->decId);
         $updateNimToFinansi = $this->finansiObj->DoUpdateNim($nim_baru, $this->decId);
         
         /**
         var_dump($updateNimToAdmisi);
         var_dump($updateNimToFinansi);exit();
         **/
         
         $updateNim=$updateNimToAdmisi && $updateNimToFinansi;
          
         $this->Obj->EndTrans($updateNim);
         $this->finansiObj->EndTrans($updateNim);
      } else {
         $updateNim = false;
      }
      
      //var_dump($updateNim);exit();
      
      if ($updateNim === true) {
		//ambil data mahasiswa status bayar
		$dataMhsStatusBayar = $this->mhsObj->GetDataStatusBayarById($this->decId);
			
         //cek apakah sudah diverifikasi
         $no_verifikasi = false;
         $cek_verifikasi = $this->Obj->GetCekVerifikasi($this->decId);
         		
         	
         if ($cek_verifikasi == 1) {
         	
            $this->Obj->StartTrans();
            $this->siaObj->StartTrans();
            $send_to_sia = $this->SendToSia();
            
            if ($send_to_sia) {
               $update_is_sent = $this->Obj->DoUpdateIsSent($this->decId);
               $insert_registrasi = $this->InsertRegistrasi();
               $insert_status_bayar = $this->InsertStatusBayar();
            }
            
            
            //cek apakah bypass pembayaran dalam keadaan aktif
            if($bypassPembayaran == 0){
            	
            	if(!empty($dataMhsStatusBayar)){
					$sent_data = $send_to_sia && $update_is_sent && $insert_registrasi && $insert_status_bayar;
				}else{
					$no_status_bayar = true;
				}
					
            }else if($bypassPembayaran == 1){
            	
            	$sent_data = $send_to_sia && $update_is_sent && $insert_registrasi && $insert_status_bayar;            	
            	$no_status_bayar = false;
            }
            			
   			
            /**
            var_dump($send_to_sia);
            var_dump($update_is_sent);
            var_dump($insert_registrasi);
            var_dump($insert_status_bayar);
            var_dump($sent_data);
            exit;
            **/
				
            // end trans: DoUpdateIsSent
            $this->Obj->EndTrans($sent_data);
            // end trans: SendToSia, InsertRegistrasi, InsertStatusBayar
            $this->siaObj->EndTrans($sent_data);
         } else {
            $no_verifikasi = true;
         }
      }
      
      $arr_pesan = array();
      $arr_css = array();
      
      if ($updateNim === true) {
         $arr_pesan[] = array('Pembuatan NIM Berhasil');
         $arr_css[] = array($this->cssDone);
      } else {
         $arr_pesan[] = array('Pembuatan NIM Gagal');
         $arr_css[] = array($this->cssFail);
      }
      
      $aplikasi = 'Sistem Informasi Akademik';
      if ($sent_data === true) {
         $arr_pesan[] = array("Data mahasiswa dengan NIM \"$nim_baru\" berhasil disimpan ke $aplikasi");
         $arr_css[] = array($this->cssDone);
      } else {
		if ($no_status_bayar === true){		//tambahan cek status bayar
				$arr_pesan[] = array("Data mahasiswa dengan nama \"$this->nama\" gagal disimpan ke $aplikasi karena data status bayar masih kosong");
				$arr_css[] = array($this->cssFail);
			}elseif ($no_verifikasi === true) {
            $arr_pesan[] = array("Data mahasiswa dengan NIM \"$nim_baru\" belum dapat disimpan ke $aplikasi karena belum diverifikasi");
            $arr_css[] = array($this->cssInfo);
         } else {
            $arr_pesan[] = array("Data mahasiswa dengan NIM \"$nim_baru\" gagal disimpan ke $aplikasi");
            $arr_css[] = array($this->cssFail);
         }
      }
      
      $this->SendAlert($arr_pesan, 'pembuatanNim', $arr_css);

      return $this->pageView;
   }
   
   
   function SendToSiaMassal($mhsId){
   	
   		$dataMhs=$this->mhsObj->GetDataMahasiswaById($mhsId);      
		$dataOrtu=$this->mhsObj->GetDataOrtuById($mhsId);
		
		$this->tahunMasuk = $dataMhs[0]['mhs_thn_masuk'];
		if (empty($dataMhs[0]['mhs_sem_masuk']))
		 $dataMhs[0]['mhs_sem_masuk'] = '1';
		$this->semesterMasuk = $dataMhs[0]['mhs_sem_masuk'];
		$this->prodiKode = $dataMhs[0]['mhs_prodi_kode'];
		$this->nim = $dataMhs[0]['mhs_niu'];
		$this->nama = $dataMhs[0]['mhs_nama'];
		
		$arrDataMhs=$dataMhs[0];
		foreach($dataMhs[0] as $k => $v){
		 $arrDataMhs[$k.'_2'] = $dataMhs[0][$k];
		}
		
		$arrDataOrtu=$dataOrtu[0];
		$arrDataOrtu['ortu_mhs_id'] = $arrDataMhs['mhs_niu']; // di sia relasi mhs_ortu dengan mhs menggunakan nim
		foreach($dataOrtu[0] as $k => $v){
		 $arrDataOrtu[$k.'_2'] = $dataOrtu[0][$k];
		}
		
		$addMhsToSia=$this->siaObj->DoAddMahasiswaToSia($arrDataMhs);
		$addOrtuToSia=$this->siaObj->DoAddOrangTuaMahasiswaToSia($arrDataOrtu);   
		
		$addData = $addMhsToSia && $addOrtuToSia;
		
		/**
		var_dump($addMhsToSia);
		var_dump($addOrtuToSia);
		var_dump($addData);
		exit;
		**/
		
		return $addData;	   	
   }    
   
   function UpdateNimMassal(){   		   		
   		$arrMhsId = $this->_POST['mhsId'];
   		$nim_formula = $this->Obj->GetNimFormula();
   		$psnNamaUpdateNimSukses = array();
   		$psnNamaUpdateNimGagal = array();
   		$psnNamaSendSiaSukses = array();
   		$psnNamaSendSiaInfo = array();
   		$psnNamaSendSiaGagal = array();   		   		
   		
   		for ($z=0; $z < count($arrMhsId); $z++) { 
   			$namaMhs = $this->mhsObj->getMhsNamaById($arrMhsId[$z]);
   			   			
   			//MULAI BUAT NIM
   			   			
   			// buat nim   			
			$nim = $this->Obj->DoCreateNim($arrMhsId[$z],$nim_formula[0]['nimfFormulaFormat']);		
      		$nim_baru = $nim;
   			
      		// update nim ke admisi dan finansi
      		if (!empty($nim_baru)){
			 $this->Obj->StartTrans();
			 $this->finansiObj->StartTrans();
			       
			 $updateNimToAdmisi = $this->Obj->DoUpdateNim($nim_baru, $arrMhsId[$z]);
			 $updateNimToFinansi = $this->finansiObj->DoUpdateNim($nim_baru, $arrMhsId[$z]);
			 
			 /**
			 var_dump($updateNimToAdmisi);
			 var_dump($updateNimToFinansi);exit();
			 **/
			 
			 $updateNim=$updateNimToAdmisi && $updateNimToFinansi;
			  
			 $this->Obj->EndTrans($updateNim);
			 $this->finansiObj->EndTrans($updateNim);
			} else {
			 $updateNim = false;
			}
			
			if ($updateNim === true) {
				
				//ambil data mahasiswa status bayar
				$dataMhsStatusBayar = $this->mhsObj->GetDataStatusBayarById($arrMhsId[$z]);
			
				//cek apakah sudah diverifikasi
				$no_verifikasi = false;
				$cek_verifikasi = $this->Obj->GetCekVerifikasi($arrMhsId[$z]);
				
				if ($cek_verifikasi == 1) {
         			
					$this->Obj->StartTrans();
					$this->siaObj->StartTrans();
					$send_to_sia = $this->SendToSiaMassal($arrMhsId[$z]);
					
					if ($send_to_sia) {
					   $update_is_sent = $this->Obj->DoUpdateIsSent($arrMhsId[$z]);
					   $insert_registrasi = $this->InsertRegistrasiMassal($arrMhsId[$z]);
					   $insert_status_bayar = $this->InsertStatusBayarMassal($arrMhsId[$z]);
					}
					
					
					
					//cek apakah bypass pembayaran dalam keadaan aktif
					if($bypassPembayaran == 0){
						
						if(!empty($dataMhsStatusBayar)){
							$sent_data = $send_to_sia && $update_is_sent && $insert_registrasi && $insert_status_bayar;
						}else{
							$no_status_bayar = true;
						}
							
					}else if($bypassPembayaran == 1){
						
						/*BAGIAN INI BELUM DIPAKE*/
						$sent_data = $send_to_sia && $update_is_sent && $insert_registrasi && $insert_status_bayar;            	
						$no_status_bayar = false;
					}
								
						
					/**
					var_dump($send_to_sia);
					var_dump($update_is_sent);
					var_dump($insert_registrasi);
					var_dump($insert_status_bayar);
					var_dump($sent_data);
					exit;
					**/
						
					// end trans: DoUpdateIsSent
					$this->Obj->EndTrans($sent_data);
					// end trans: SendToSia, InsertRegistrasi, InsertStatusBayar
					$this->siaObj->EndTrans($sent_data);
				} else {					
					$no_verifikasi = true;
					$sent_data = false;
				}
			}												
						
			//================ BAGIAN PESAN KONFIRMASI ======== //      
			if ($updateNim === true) {
			 $psnNamaUpdateNimSukses[] = 'Pembuatan NIM untuk '.$namaMhs.' Berhasil';			 
			} else {
			 $psnNamaUpdateNimGagal[] = 'Pembuatan NIM untuk '.$namaMhs.' Gagal';
			}
			
			$aplikasi = 'SIA';
			if ($sent_data === true) {			 
			 $psnNamaSendSiaSukses[] = "Data NIM ".$namaMhs." berhasil disimpan ke $aplikasi";
			} else {
				if ($no_status_bayar === true){		//tambahan cek status bayar					
					$psnNamaSendSiaGagal[] = "Data mahasiswa ".$namaMhs." gagal disimpan ke $aplikasi karena data status bayar masih kosong";	
				}elseif ($no_verifikasi === true) {				    
				    $psnNamaSendSiaInfo[] = "Data mahasiswa ".$namaMhs." belum dapat disimpan ke $aplikasi karena belum diverifikasi";
				} else {				    
				    $psnNamaSendSiaGagal[] = "Data mahasiswa ".$namaMhs." gagal disimpan ke $aplikasi";
				} 
			}			
   		}   	   		   		   		
   		
   		$this->SendAlertMassal($psnNamaUpdateNimSukses,$psnNamaUpdateNimGagal,$psnNamaSendSiaSukses,$psnNamaSendSiaInfo,$psnNamaSendSiaGagal);
   		return $this->pageView;
   }
   
   function SendAlertMassal($psnNamaUpdateNimSukses,$psnNamaUpdateNimGagal,$psnNamaSendSiaSukses,$psnNamaSendSiaInfo,$psnNamaSendSiaGagal){	
   		$arr_pesan[0] = $psnNamaUpdateNimSukses;   		
   		$arr_css[0] = array($this->cssDone);
   		
   		$arr_pesan[1] = $psnNamaUpdateNimGagal;   		
   		$arr_css[1] = array($this->cssFail);
   		
   		$arr_pesan[2] = $psnNamaSendSiaSukses;   		
   		$arr_css[2] = array($this->cssDone);
   		
   		$arr_pesan[3] = $psnNamaSendSiaInfo;   		
   		$arr_css[3] = array($this->cssInfo);
   		
   		$arr_pesan[4] = $psnNamaSendSiaGagal;   		
   		$arr_css[4] = array($this->cssFail);
   		
   		Messenger::Instance()->Send('pembuatan_nim', 'pembuatanNim', 'view', 'html', array($this->_POST, '', '',$arr_pesan,$arr_css),Messenger::NextRequest);
   }
   
   function InsertRegistrasi() {   	  
      //--untuk insert tambahan field registrasi ke sia--//
      $dataMhsReg = $this->mhsObj->GetDataMhsRegById($this->decId);      
      $kuitansi = $dataMhsReg[0]['mhs_reg_kuitansi'];
      $jml_bayar = $dataMhsReg[0]['mhs_reg_jml_bayar'];
      $tgl_bayar = $dataMhsReg[0]['mhs_reg_tgl_bayar'];
      //--end tambahan--//
      
      $sem_id = $this->tahunMasuk . $this->semesterMasuk;
      $prodi_kode = $this->prodiKode;
      // cek apakah semester prodi sudah dibuat
      $semester_prodi = $this->siaObj->GetCekSemesterProdi(array($sem_id, $prodi_kode));
      // jika sudah ada, insert jatah sks
      if (!empty($semester_prodi))
         $insert_jatah = $this->siaObj->DoInsertJatahSks(array($this->nim, $sem_id, $prodi_kode));
      // insert registrasi
      $insert_registrasi = $this->siaObj->DoInsertRegistrasi(array($this->nim, $kuitansi, $sem_id, $jml_bayar, $tgl_bayar));
      
      return $insert_registrasi;
   }
   
   function InsertRegistrasiMassal($mhsId){
   	  //--untuk insert tambahan field registrasi ke sia--//
      $dataMhsReg = $this->mhsObj->GetDataMhsRegById($mhsId);
      $kuitansi = $dataMhsReg[0]['mhs_reg_kuitansi'];
      $jml_bayar = $dataMhsReg[0]['mhs_reg_jml_bayar'];
      $tgl_bayar = $dataMhsReg[0]['mhs_reg_tgl_bayar'];
      //--end tambahan--//
      
      $sem_id = $this->tahunMasuk . $this->semesterMasuk;
      $prodi_kode = $this->prodiKode;
      // cek apakah semester prodi sudah dibuat
      $semester_prodi = $this->siaObj->GetCekSemesterProdi(array($sem_id, $prodi_kode));
      // jika sudah ada, insert jatah sks
      if (!empty($semester_prodi))
         $insert_jatah = $this->siaObj->DoInsertJatahSks(array($this->nim, $sem_id, $prodi_kode));
      // insert registrasi
      $insert_registrasi = $this->siaObj->DoInsertRegistrasi(array($this->nim, $kuitansi, $sem_id, $jml_bayar, $tgl_bayar));
      
      return $insert_registrasi;
   }
   
   function InsertStatusBayar(){
      
      //-- untuk insert data mhs ke mahasiswa_status_bayar ke SIA --//
      $dataMhsStatusBayar = $this->mhsObj->GetDataStatusBayarById($this->decId);
      $idBayar = $dataMhsStatusBayar[0]['mhs_id_pembayaran'];
      $jnsBayar = $dataMhsStatusBayar[0]['mhs_jenis_pembayaran'];
      $isLunas = $dataMhsStatusBayar[0]['mhs_is_lunas'];
      
      $sem_id = $this->tahunMasuk . $this->semesterMasuk;
      
      //insert ke mahasiswa status bayar
      $insert_status_bayar = $this->siaObj->DoInsertStatusBayar(array($this->nim, $sem_id, $idBayar, $jnsBayar, $isLunas));
      
      return $insert_status_bayar;
   }
   
   function InsertStatusBayarMassal($mhsId){
   	  //-- untuk insert data mhs ke mahasiswa_status_bayar ke SIA --//
      $dataMhsStatusBayar = $this->mhsObj->GetDataStatusBayarById($mhsId);
      $idBayar = $dataMhsStatusBayar[0]['mhs_id_pembayaran'];
      $jnsBayar = $dataMhsStatusBayar[0]['mhs_jenis_pembayaran'];
      $isLunas = $dataMhsStatusBayar[0]['mhs_is_lunas'];
      
      $sem_id = $this->tahunMasuk . $this->semesterMasuk;
      
      //insert ke mahasiswa status bayar
      $insert_status_bayar = $this->siaObj->DoInsertStatusBayar(array($this->nim, $sem_id, $idBayar, $jnsBayar, $isLunas));
      
      return $insert_status_bayar;
   }
   
}
?>
