SHARE
TWEET

demo1-componente

christiansalazarh Aug 29th, 2013 49 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. /***
  3.         install as component:
  4.                
  5.         protected/config/main.php
  6.         ..
  7.         'components'=>array(
  8.                 'dsx'=>array(
  9.                         'class'=>'ext.datasourcecampanametro.DataSourceCampanaMetro',
  10.                         'datasource'=>'vpn',
  11.                         'vpn_view_name'=>'nombre_de_la_vista_que_el_cliente_da',
  12.                         'vpn_db'=>array(
  13.                                 'connectionString' => 'mysql:host=localhost;dbname=vpndbname',
  14.                                 'emulatePrepare' => true,
  15.                                 'username' => 'bla',
  16.                                 'password' => 'xxblaxx',
  17.                                 'charset' => 'utf8',
  18.                         ),
  19.                 ),
  20.         ),
  21.  
  22.  * @author Christian Salazar H. <christiansalazarh@gmail.com>
  23. */
  24. class DataSourceCampanaMetro
  25.         extends CApplicationComponent
  26.         implements IDataSourceCampana {
  27.        
  28.         public $datasource; // "vpn" or "csv"
  29.         public $vpn_db; // db settings. required when datasource is "vpn"
  30.         public $vpn_view_name;
  31.         private $_db;
  32.         private $_last_key;
  33.         private $_last_record;
  34.                
  35.         public function leerCliente($cedula){
  36.                 if($this->_last_key == $cedula)
  37.                         return $this->_last_record;//LAZY
  38.                 if($this->_last_record = $this->getDb()->select()->from($this->_Tablename())   
  39.                         ->where("cedula=:c",array(":c"=>$cedula))->queryRow()){
  40.                         return $this->_last_record;
  41.                 }else{
  42.                         $this->_last_record = null;
  43.                         return null;
  44.                 }
  45.         }
  46.         public function listarContratos($cedula){
  47.                 if($row = $this->leerCliente($cedula)){
  48.                         $contracts = array();
  49.                         foreach($this->decodeQuotes($row['cuotas']) as $quote){
  50.                                 list($qn, $contract, $val1, $val2, $date) = $quote;
  51.                                 if(!in_array($contract, $contracts))
  52.                                         $contracts[] = $contract;
  53.                         }
  54.                         return $contracts;
  55.                 }else
  56.                 return array();
  57.         }
  58.         public function listarCuotas($cedula, $numero_contrato){
  59.                 if($row = $this->leerCliente($cedula)){
  60.                         $quotes = array();
  61.                         foreach($this->decodeQuotes($row['cuotas']) as $quote){
  62.                                 list($qn, $contract, $val1, $val2, $date) = $quote;
  63.                                 if($contract == $numero_contrato)
  64.                                         $quotes[] = $quote;
  65.                         }
  66.                         return $quotes;
  67.                 }else
  68.                 return array();
  69.         }
  70.         public function importarCsv($filename){
  71.                 if(!is_file($filename))
  72.                         return "ERR_NOT_A_FILE";
  73.                 // force db connection to be "CSV" when importing data
  74.                 $this->_db = null;
  75.                 $this->datasource = "csv";
  76.                 $this->getDb()->createCommand()->delete($this->_Tablename());
  77.                 $f = fopen($filename,"r");
  78.                 while($data = fgetcsv($f, 0, ",")){
  79.                         list($ced, $nom, $dir, $tel, $fec, $cuotas)=$data;
  80.                         $this->getDb()->createCommand()->insert($this->_Tablename(),
  81.                                 array(
  82.                                         "cedula"=>$ced,
  83.                                         "nombres"=>$nom,
  84.                                         "direccion"=>$dir,
  85.                                         "telefono"=>$tel,
  86.                                         "fecha_act"=>$fec,
  87.                                         "cuotas"=>$cuotas
  88.                                 ));
  89.                 }
  90.                 fclose($f);
  91.                 return "OK";
  92.         }
  93.  
  94.         private function getDb(){
  95.                 if($this->_db == null){
  96.                         if($this->datasource == "csv"){
  97.                                 $this->_db = Yii::app()->db;
  98.                         }else{
  99.                                 // build a db connection.
  100.                                 $this->_db = new CDbConnection(
  101.                                         $this->vpn_db['connectionString'],
  102.                                                 $this->vpn_db['username'],$this->vpn_db['password']);
  103.                                 if(isset($this->vpn_db['charset']))
  104.                                         $this->_db->charset = $this->vpn_db['charset'];
  105.                                 if(isset($this->vpn_db['emulatePrepare']))
  106.                                         $this->_db->emulatePrepare = $this->vpn_db['emulatePrepare'];
  107.                                 $this->_db->active = true;
  108.                         }
  109.                 }
  110.                 if($this->_db == null)
  111.                         throw new Exception("invalid database connection");
  112.                 return $this->_db;
  113.         }
  114.         private function _Tablename(){
  115.                 if($this->datasource=="csv")
  116.                         return "dscampanametro";
  117.                 if($this->datasource=="vpn")
  118.                         return $this->vpn_view_name;
  119.                 return "";
  120.         }
  121.         private function decodeQuotes($quotes){
  122.                 $out=array();
  123.                 foreach(explode(";",$quotes) as $quote){
  124.                         if($quote != ""){
  125.                         list($qn,$items) = explode("=",$quote);
  126.                         list($contract, $val1, $val2, $date) = explode(",",$items);
  127.                         $dt=explode("/",$date);
  128.                         $out[] = array($qn,$contract, $val1, $val2,
  129.                                 date("Y-m-d",strtotime(sprintf("%s-%s-%s",$dt[2],$dt[1],$dt[0]))));
  130.                         }
  131.                 }
  132.                 return $out;
  133.         }
  134.         private function _sampleRecord(){
  135.                 $quotes =
  136.                          "Q1=021546,75.12,84.1344,26/12/2004;"
  137.                         ."Q2=021546,88.17,98.7504,26/12/2005;"
  138.                         ."Q3=021546,102,114.24,26/12/2006;"
  139.                         ."Q4=021546,117,131.04,26/12/2007;"
  140.                         ."Q5=021546,143.13,160.306,26/12/2008;"
  141.                         ."Q6=021546,189.9,212.688,26/12/2009;"
  142.                         ."Q1=021547,241.08,270.01,26/12/2010;"
  143.                         ."Q2=021547,308.04,345.005,26/12/2011;"
  144.                         ."Q1=021548,388.41,435.019,26/12/2012;"
  145.                         ."Q2=021548,575.88,644.986,26/12/2013;";
  146.                 return array(
  147.                         "cedula"=>'TEST',
  148.                         "nombres"=>'PORCUPINE TREE',
  149.                         "direccion"=>'ARRIVING SOMEWHERE, BUT NOT HERE',
  150.                         "telefono"=>'555-9-123456;555-8-876543',
  151.                         "fecha_act"=>'2013-08-20',
  152.                         "cuotas"=>$quotes
  153.                 );
  154.         }
  155.         public function test($vpn_db){
  156.                 // called by consolecommand to test features
  157.                 $this->_db = null;
  158.                 $this->datasource = "csv";
  159.                 printf("tableName is: %s\n",$this->_Tablename());
  160.                 printf("getDb call when datasource is: %s...",$this->datasource);
  161.                 $this->getDb();
  162.                 printf("OK\n");
  163.  
  164.                 $this->_db = null;
  165.                 $this->vpn_db = $vpn_db;
  166.                 $this->datasource = "vpn";
  167.                 printf("viewName is: %s\n",$this->_Tablename());
  168.                 printf("getDb call when datasource is: %s...",$this->datasource);
  169.                 $this->getDb();
  170.                 printf("OK\n");
  171.  
  172.                 $this->_last_key = 'TEST';
  173.                 $this->_last_record = $this->_sampleRecord();
  174.  
  175.                 $quotes = $this->_last_record['cuotas'];
  176.                 printf("testing quote object decode:\n%s\ninto:\n",$quotes);
  177.                 foreach($this->decodeQuotes($quotes) as $quote=>$fields){
  178.                         list($contract, $val1, $val2, $date)=$fields;
  179.                         printf("%s = %s, %s, %s, %s\n",$quote,$contract, $val1, $val2, $date);
  180.                 }
  181.                 printf("\ndone\n");
  182.  
  183.                 printf("test leerCliente()\n%s\nOK\n",json_encode($this->leerCliente('TEST')));
  184.                 printf("test listarContratos()\n%s\nOK\n",json_encode($this->listarContratos('TEST')));
  185.                 printf("test listarCuotas(test,021546)\n%s\nOK\n",json_encode($this->listarCuotas('TEST','021546')));  
  186.                 printf("test listarCuotas(test,021547)\n%s\nOK\n",json_encode($this->listarCuotas('TEST','021547')));  
  187.                 printf("test listarCuotas(test,021548)\n%s\nOK\n",json_encode($this->listarCuotas('TEST','021548')));  
  188.  
  189.         }
  190. }
RAW Paste Data
Top