· 7 years ago · Oct 24, 2018, 01:54 PM
1<?php
2/****************************************************************************
3
4 This library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
8
9 You should have received a copy of the GNU General Public License
10 along with this program; if not, write to the Free Software Foundation,
11 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
12
13 CREATED BY: cvillaronga at gmail dot com
14 COMMENTS: use the force, read the source.
15 VERSION 1.1 (development)
16
17//*****************************************************************************/
18namespace emperor\Model;
19use emperor\Model\util as util;
20use emperor\languages\i18n as i18n;
21
22// ADAPTADOR ADODBPHP
23include_once(__DIR__.'/adodb5/adodb.inc.php');
24// ADODB Active Record
25include_once(__DIR__.'/adodb5/adodb-active-record.inc.php');
26// Funciones para Exportar datos
27include_once(__DIR__.'/adodb5/toexport.inc.php');
28// Gestión de
29// include_once(__DIR__."/adodb5/adodb-exceptions.inc.php");
30
31
32/*
33 * En esta sección de código se establece un enlace de datos,
34 * considere que cada acción ejecutada creará un vinculo con la BD.
35 **/
36class Database {
37
38 /**
39 * @var object $_connection Enlace de Datos Actual
40 * @var object $_instance Instancia Única de Acceso
41 * @var string $_host IP del Servidor de Base de datos
42 * @var string $_username Usuario de Acceso al servidor
43 * @var string $_password Contraseña de Acceso
44 * @var string $_database Nombre de la Base de datos
45 */
46
47 private $_connection;
48 private static $_instance; //The single instance
49 private $_host = '192.168.1.1';
50 private $_username = 'postgres';
51 private $_password = 'postgres';
52 private $_database = 'emperordb';
53 /**
54 Get an instance of the Database
55 @return Instance
56 **/
57 public static function getInstance() {
58 if(!self::$_instance) { // If no instance then make one
59 self::$_instance = new self();
60 }
61 return self::$_instance;
62 }
63 // Constructor
64 private function __construct() {
65
66 try{
67 //DATOS DE ACCESO
68 $db_acceso = NewADOConnection('postgres9');
69 $db_acceso->Connect($this->_host, $this->_username, $this->_password, $this->_database);
70 $db_acceso->debug=0;
71 // Considerar el uso de los nombres de los atributos en las operaciones
72 $db_acceso->SetFetchMode(ADODB_FETCH_ASSOC);
73 // Establecer una relación entre el active record y el adaptador
74 \ADOdb_Active_Record::SetDatabaseAdapter($db_acceso,"acceso");
75 // $GLOBALS['db_acceso'] = $db_acceso;
76 $this->_connection = $db_acceso;
77 } catch (exception $e) {
78 adodb_backtrace($e->gettrace());
79 }
80
81 }
82
83 /**
84 *Destrucción del objeto
85 *Es necesario cerrar la actividad con la base de datos
86 **/
87 public function __destruct(){
88 $this->_connection->close();
89 }
90
91 // Magic method clone is empty to prevent duplication of connection
92 private function __clone() { }
93 // Get database
94 public function getConnection() {
95 return $this->_connection;
96 }
97}
98/**
99 * @var object $db Instacia de datos General
100 **/
101$db = Database::getInstance();
102
103/*
104 * Esta es la clase principal del modelo de datos,
105 * todas las entidadas de datos la heredan.
106 **/
107class ownModel extends \ADODB_Active_Record {
108
109 /**
110 * @var array $response Respuesta por defecto.
111 **/
112 protected $response = array('success'=>true,'msg'=>'No se ha culminado la operación con Éxito');
113
114 /**
115 *Establecer un filtro SQL del tipo LIKE sobre los atributos indicados
116 *@author Carlos Villaronga <cvillaronga at gmail.com>
117 *@param array $fields Arreglo con los campos SQL del filtro
118 *@param string $value Valor a filtrar
119 *@return string Cadena WHERE SQL LIKE
120 **/
121 public function createFilterQuery($fields,$value){
122
123 if((count($fields)==0)||($value=='')){ return ''; }
124
125 $exitStr ='';
126 $first = true;
127 foreach($fields as $field){
128 $exitStr.= (!$first)?' OR ':'';
129 $exitStr.= " ( ".$field." ILIKE '%".$value."%' ) ";
130 $first = false;
131 }
132
133 return $exitStr;
134 }
135
136 /**
137 *Crear un arreglo asociativo con valores a ser filtrados por una consulta SQL
138 *@author Carlos Villaronga <cvillaronga at gmail.com>
139 *@param array $filter arreglo que contiene los filtros existentes
140 *@param string $fields nombre del campo que será incluido en el filtro
141 *@param string $value valor esperado
142 *@param string $comparation Comparación que debe ser usada 'ne','eq','lt','gt'
143 *@param string $type tipo de campo 'string','list','boolean','numeric','date'
144 *@return array Arreglo de filtros
145 **/
146 public static function addFilter($filter,$field,$value,$comparation='eq',$type='numeric'){
147 //TODO Mejorar para que no duplique el filtro.
148 $fLen = count($filter);
149 $filter[$fLen]['data']['comparison']= $comparation;
150 $filter[$fLen]['data']['type'] = $type;
151 $filter[$fLen]['data']['value'] = $value;
152 $filter[$fLen]['field'] = $field;
153 return $filter;
154 }
155
156 /**
157 *Recuperar todos los registros de la entidad que cumplan con las condiciones del filtro
158 *@author Carlos Villaronga <cvillaronga at gmail.com>
159 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
160 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
161 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
162 *@param int $start Registro inicial, 0 por defecto.
163 *@param int $limit Cantidad de registros, 50 por defecto.
164 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
165 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
166 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
167 *@return json Retorna una cadena json con los registros encontrados.
168 *@uses util::rs2json para transformar el recordset en una respuesta json
169 **/
170 public function getAll($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
171 //$db= $this->DB();
172 //$db->debug=true;
173 $recordSet = self::getData($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
174
175 if(!$recordSet){
176 $error = array('success'=>true,'msg'=>$db->ErrorMsg());
177 return json_encode($error);
178 }
179 return util::rs2json($recordSet,$limit,$start);
180
181 }
182
183 /**
184 *Recuperar todos los registros de la entidad que cumplan con las condiciones del filtro
185 *@author Carlos Villaronga <cvillaronga at gmail.com>
186 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
187 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
188 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
189 *@param int $start Registro inicial, 0 por defecto.
190 *@param int $limit Cantidad de registros, 50 por defecto.
191 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
192 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
193 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
194 *@return string Retorna una cadena HTML con los registros encontrados.
195 *@uses util::rs2html para transformar el recordset en una cadena html
196 **/
197 public function getAllHTML($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
198
199 $recordSet = self::getData($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
200
201 if(!$recordSet){
202 $error = array('success'=>true,'msg'=>$db->ErrorMsg());
203 return json_encode($error);
204 }
205 return util::rs2html($recordSet,$limit,$start,get_class($this));
206 }
207
208 /**
209 *Recuperar todos los registros de la entidad que cumplan con las condiciones del filtro
210 *@author Carlos Villaronga <cvillaronga at gmail.com>
211 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
212 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
213 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
214 *@param int $start Registro inicial, 0 por defecto.
215 *@param int $limit Cantidad de registros, 50 por defecto.
216 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
217 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
218 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
219 *@return json Retorna Un archivo PDF
220 *@uses util::rs2pdf para transformar el recordset en un Archivo PDF
221 **/
222 public function getAllPDF($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
223
224 $recordSet = self::getData($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
225
226 if(!$recordSet){
227 $error = array('success'=>true,'msg'=>$db->ErrorMsg());
228 return json_encode($error);
229 }
230 return util::rs2pdf($recordSet,$limit,$start,get_class($this));
231 }
232
233 /**
234 *Recuperar todos los registros de la vista de datos de la entidad que cumplan con las condiciones del filtro
235 *@author Carlos Villaronga <cvillaronga at gmail.com>
236 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
237 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
238 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
239 *@param int $start Registro inicial, 0 por defecto.
240 *@param int $limit Cantidad de registros, 50 por defecto.
241 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
242 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
243 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
244 *@return json Retorna una cadena json con los registros encontrados.
245 *@uses util::rs2json para transformar el recordset en una respuesta json
246 **/
247 public function getAllView($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
248 $db= $this->DB();
249 //$db->debug = true;
250 $recordSet = self::getDataView($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
251
252 if(!$recordSet){
253 $error = array('success'=>false,'msg'=>$db->ErrorMsg());
254 return json_encode($error);
255 }
256 return util::rs2json($recordSet,$limit,$start,get_class($this));
257
258 }
259
260 /**
261 *Recuperar todos los registros de la vista de datos de la entidad que cumplan con las condiciones del filtro
262 *@author Carlos Villaronga <cvillaronga at gmail.com>
263 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
264 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
265 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
266 *@param int $start Registro inicial, 0 por defecto.
267 *@param int $limit Cantidad de registros, 50 por defecto.
268 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
269 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
270 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
271 *@return string Retorna una cadena HTML con los registros encontrados.
272 *@uses util::rs2html para transformar el recordset en una cadena html
273 **/
274 public function getAllViewHTML($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
275
276 $recordSet = self::getDataView($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
277
278 if(!$recordSet){
279 $error = array('success'=>false,'msg'=>$db->ErrorMsg());
280 return json_encode($error);
281 }
282 return util::rs2html($recordSet,$limit,$start,get_class($this));
283
284 }
285
286 /**
287 *Recuperar todos los registros de la vista de datos de la entidad que cumplan con las condiciones del filtro
288 *@author Carlos Villaronga <cvillaronga at gmail.com>
289 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
290 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
291 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
292 *@param int $start Registro inicial, 0 por defecto.
293 *@param int $limit Cantidad de registros, 50 por defecto.
294 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
295 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
296 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
297 *@return json Retorna Un archivo PDF
298 *@uses util::rs2pdf para transformar el recordset en un Archivo PDF
299 **/
300 public function getAllViewPDF($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
301
302 $recordSet = self::getDataView($order,$dir,$listfields,$start,$limit,$filter,$fields,$query);
303
304 if(!$recordSet){
305 $error = array('success'=>false,'msg'=>$db->ErrorMsg());
306 return json_encode($error);
307 }
308 return util::rs2pdf($recordSet,$limit,$start,get_class($this));
309
310 }
311
312 /**
313 *Recuperar un recorset con todos los registros de la entidad que cumplan con las condiciones del filtro
314 *@author Carlos Villaronga <cvillaronga at gmail.com>
315 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
316 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
317 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
318 *@param int $start Registro inicial, 0 por defecto.
319 *@param int $limit Cantidad de registros, 50 por defecto.
320 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
321 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
322 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
323 *@return adodbrecordset Retorna una cadena json con los registros encontrados.
324 *@throws Exception Si un argumento solicitado no existe
325 **/
326 protected function getData($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
327 $db= $this->DB();
328
329 $baseQuery = "SELECT * FROM ".$this->_table." %s %s";
330 //$db->debug=true;
331 if(is_array($listfields)){
332 foreach($listfields as $fieldName){
333 if(!self::validateAttribute($fieldName)){
334 throw new \Exception("El atributo ".$fieldName." NO EXISTE en la entidad ".$this->_table." ");
335 }
336 }
337 $baseQuery = str_replace("*", implode(',',$listfields),$baseQuery);
338 }
339
340 $orderStr = "";
341 if($order!=""){
342 $orderStr = sprintf('order by %s %s',$order,$dir);
343 }
344
345 $filtro = " WHERE ".util::createFilterSTR($filter);
346 $qrystr = $this->createFilterQuery($fields,$query);
347 $filtro.= ($qrystr!='')?" AND ( $qrystr )":"";
348
349 if(self::validateAttribute('deleted_at')){
350 $filtro.= "and deleted_at is null";
351 }
352
353 $recordSet=null;
354
355 $query = vsprintf( $baseQuery , array($filtro , $orderStr) );
356 $recordSet = $db->Execute($query);
357
358 if(!$recordSet){
359 $error = array('success'=>false,'msg'=>$db->ErrorMsg());
360 return false;
361 }
362
363 return $recordSet;
364
365 }
366
367 /**
368 *Recuperar un recordset con todos los registros de la vista de datos de la entidad que cumplan con las condiciones del filtro
369 *@author Carlos Villaronga <cvillaronga at gmail.com>
370 *@param mixed $order Orden de la sentencia equivale a ORDER SQL. por defecto será el primer atributo.
371 *@param mixed $dir Dirección del orden, por default es ASC, si requiere ordenart por varios atributos deje este valor vacio ''
372 *@param mixed $listfields lista de atributos a mostrar * por default array('campo1','campo2','campo3')
373 *@param int $start Registro inicial, 0 por defecto.
374 *@param int $limit Cantidad de registros, 50 por defecto.
375 *@param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
376 *@param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
377 *@param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
378 *@return adodbrecordset Retorna una cadena json con los registros encontrados.
379 *@throws Exception Si un argumento solicitado no existe
380 **/
381 protected function getDataView($order="1",$dir='ASC',$listfields="*",$start=0,$limit=50,$filter=array(),$fields=array(),$query=''){
382 $db= $this->DB();
383
384 $baseQuery = "SELECT * FROM ".$this->_table_view." %s %s";
385
386 if(is_array($listfields)){
387 $baseQuery = str_replace("*", implode(',',$listfields),$baseQuery);
388 }
389
390 //$db->debug = true;
391 $orderStr = "";
392 if($order!=""){
393 $orderStr = sprintf('order by %s %s',$order,$dir);
394 }
395
396 $filtro = " WHERE ".util::createFilterSTR($filter);
397 $qrystr = $this->createFilterQuery($fields,$query);
398 $filtro.= ($qrystr!='')?" AND ( $qrystr )":"";
399
400 if(self::validateAttribute('deleted_at')){
401 $filtro.= " and deleted_at is null";
402 }
403
404 $recordSet=null;
405
406 $query = vsprintf( $baseQuery , array($filtro , $orderStr) );
407 $recordSet = $db->Execute($query);
408 //var_dump($query);
409 if(!$recordSet){
410 $error = array('success'=>false,'msg'=>$db->ErrorMsg());
411 return false;
412 }
413
414 return $recordSet;
415
416 }
417
418 /**
419 *Buscar un registro en la entidad que cumpla con la relación $key=$value
420 *@author Carlos Villaronga <cvillaronga at gmail.com>
421 *@param string $key nombre del campo
422 *@param mixed $value valor buscado
423 *@return json Retorna una cadena json con el registro encontrado / falso si se produce un error
424 **/
425 public function getOne($key,$value){
426 $db= $this->DB();
427
428 $baseQuery = "SELECT * FROM ".$this->_table." WHERE %s = %s ";
429 $query = vsprintf( $baseQuery , array($key,$value) );
430
431 $recordSet = $db->Execute($query);
432
433 if(!$recordSet){ return false; }
434
435 return util::rs2json($recordSet,1,0,false,'data');
436 }
437
438 /**
439 *Buscar un registro en la vista de datos de la entidad que cumpla con la relación $key=$value
440 *@author Carlos Villaronga <cvillaronga at gmail.com>
441 *@param string $key nombre del campo
442 *@param mixed $value valor buscado
443 *@return json Retorna una cadena json con el registro encontrado / falso si se produce un error
444 **/
445 public function getOneView($key,$value){
446 $db= $this->DB();
447
448 $baseQuery = "SELECT * FROM ".$this->_table_view." WHERE %s = %s ";
449 $query = vsprintf( $baseQuery , array($key,$value) );
450
451 $recordSet = $db->Execute($query);
452
453 if(!$recordSet){ return false; }
454
455 return util::rs2json($recordSet,1,0,false,'data');
456
457 }
458
459 /**
460 * Crear una cadena recursiva JSON
461 * @param string $nameField name of text (description) field
462 * @param mixed $orderField Orden de la sentencia equivale a ORDER SQL. por defecto la lista siempre será ASC.
463 * @param string $parentStart Indice del nodo de inicio
464 * @param boolean $deepSearch Indica si se realiza una búsqueda recursiva de nodos.
465 * @param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
466 * @param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
467 * @param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
468 * @throws Exception Si un argumento $parentField no existe
469 */
470 public function getTree($nameField,$orderField="",$parentStart=0,$deepSearch=true,$filter=array(),$fields=array(),$query='',$parentField = 'parent_id'){
471
472 $tableName = $this->_table;
473
474 if((!self::validateAttribute($parentField)) and ($parentField == 'parent_id')){
475 throw new \Exception("La entidad ".$this->_table." no tiene relación recursiva (".$parentField.")");
476 }
477
478 $db= $this->DB();
479 //$db->debug=true;
480 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
481 $filtroDeleted = (self::validateAttribute('deleted_at'))?" and deleted_at is null ":"";
482
483 $filtro = " AND ".util::createFilterSTR($filter).$filtroDeleted;
484 $qrystr = $this->createFilterQuery($fields,$query);
485 $filtro.= ($qrystr!='')?" AND ( $qrystr )":"";
486
487 $orderField = ($orderField=="")?"":" ORDER BY $orderField ASC;";
488 $result = array();
489 $deep = 0;
490
491 function getLevelFromDB($dataLink, $idField, $nameField, $parentField, $parentId, $tableName, $orderField, $deepSearch, $deep, $filtro){
492
493 if(is_array($nameField)){
494 $tmpFields = join(",",$nameField);
495 $sql = "SELECT $idField,$tmpFields FROM $tableName a where $parentField=? $filtro ".$orderField;
496 }else{
497 $sql = "SELECT $idField,$nameField FROM $tableName a where $parentField=? $filtro ".$orderField;
498 }
499
500 $preparedSQL= $dataLink->Prepare($sql);
501 $query = $dataLink->Execute($sql,array($parentId));
502
503 $exitArray=array();
504
505 if($query->rowcount()>0){
506 $rowItem= array();
507 while(!$query->EOF){
508 $row=$query->GetRowAssoc(false);
509 $rowItem[$idField]=$row[$idField];
510 if(is_array($nameField)){
511 foreach ($nameField as $nField) {
512 $rowItem[$nField]=$row[$nField];
513 }
514 }else{
515 $rowItem[$nameField]=$row[$nameField];
516 }
517 $childrenItem = getLevelFromDB($dataLink,$idField, $nameField, $parentField, $row[$idField], $tableName, $orderField, $deepSearch, ++$deep, $filtro);
518 if(count($childrenItem)){
519 $rowItem['leaf']=false;
520 }else{
521 $rowItem['leaf']=true;
522 }
523 if($deepSearch){
524 $rowItem['children']=$childrenItem;
525 }
526 $exitArray[]=$rowItem;
527 $query->MoveNext();
528 }
529 }
530
531 return $exitArray;
532 }
533
534 $db->SetFetchMode(ADODB_FETCH_NUM);
535 $result =getLevelFromDB($db, $this->getIndex(), $nameField, $parentField, $parentStart, $tableName, $orderField, $deepSearch, $deep, $filtro);
536 $db->SetFetchMode(ADODB_FETCH_ASSOC);
537 return json_encode($result);
538
539 }
540
541 /**
542 * Crear una cadena recursiva JSON
543 * @param string $nameField name of text (description) field
544 * @param mixed $orderField Orden de la sentencia equivale a ORDER SQL. por defecto la lista siempre será ASC.
545 * @param string $parentStart Indice del nodo de inicio
546 * @param boolean $deepSearch Indica si se realiza una búsqueda recursiva de nodos.
547 * @param array $filter Arreglo de filtros que serán aplicados a la consulta, utilice la función addFilter
548 * @param array $fields Arreglo de atributos que serán utilizados para filtrar con el $query
549 * @param string $query filtro adicional de registros que cumplan con un valor. LIKE AS no es válido para fechas/números
550 * @throws Exception Si un argumento $parentField no existe
551 */
552 public function getTreeView($nameField,$orderField="",$parentStart=0,$deepSearch=true,$filter=array(),$fields=array(),$query='',$parentField = 'parent_id'){
553 $tableName = $this->_table;
554 $this->_table = $this->_table_view;
555 $rString = self::getTree($nameField,$orderField,$parentStart,$deepSearch,$filter,$fields,$query,$parentField);
556 $this->_table = $tableName;
557 return $rString;
558 }
559
560
561 /**
562 * Elimina uno o mas registros de la entidad que cumplan con la relación $key=$value
563 * @author Carlos Villaronga <cvillaronga at gmail.com>
564 * @param string $key nombre del campo
565 * @param mixed $value valor buscado
566 * @return array resultado de la operación
567 * @throws Exception Si un argumento no existe
568 **/
569 public function deleteValues($key,$value){
570 $db= $this->DB();
571 if(self::validateAttribute($key)){
572 try{
573 if(self::validateAttribute('deleted_at')){
574 $countQry = "SELECT count(*) as total FROM ".$this->_table." WHERE $key = $value AND deleted_at is null";
575 $baseQuery = "UPDATE ".$this->_table." set deleted_at='".date('Y-m-d g:i:s')."' WHERE $key = %s AND deleted_at is null";
576 }else{
577 $countQry = "SELECT count(*) as total FROM ".$this->_table." WHERE $key = $value ";
578 $baseQuery = "DELETE FROM ".$this->_table." WHERE $key = %s ";
579 }
580 $query = vsprintf( $baseQuery, array($value) );
581 $rs = $db->GetRow($countQry);
582 $ok = $db->Execute($query);
583 if(!$ok){
584 $result = array('success'=>false,'msg'=>$db->ErrorMsg());
585 } else {
586 $result = array('success'=>true,'results'=>$rs['total'], 'msg'=>'Eliminado');
587 }
588 return $result;
589 } catch (exception $e) {
590 return array('success'=>false,'msg'=>"No fue posible completar la operación".$e->getmessage());
591 }
592 }else{
593 throw new \Exception("Field ". $key." not exist in ".$this->_table );
594 }
595 }
596
597 /**
598 *Elimina uno o mas registros de la entidad que cumplan con la relación $key=$value
599 *@author Carlos Villaronga <cvillaronga at gmail.com>
600 *@param string $key nombre del campo
601 *@param mixed $value valor buscado
602 *@return array resultado de la operación
603 **/
604 public function delete($key,$value){
605
606 try{
607 if(is_numeric($value)) {
608 if(!$this->load("$key = ".$value)){
609 $result = array('success'=>false, 'msg'=>"No es posible Cargar el Registro o ha sido eliminado" , 'elementid'=> "$key = $value" );
610 return $result;
611 };
612
613 if((self::validateAttribute('deleted_at')) and (!empty($this->deleted_at))){
614 return array("success"=>true,'msg'=>"El registro no existe");
615 }
616 }
617
618 if(self::validateAttribute('deleted_at')){
619 $this->deleted_at = date('Y-m-d g:i:s');
620 $this->save();
621 }else{
622 parent::delete();
623 }
624 return array('success'=>true,'msg'=>"Eliminado");
625 } catch (exception $e) {
626 return array('success'=>false,'msg'=>"No fue posible completar la operación".$e->getmessage());
627 }
628
629 }
630
631 /**
632 *Iniciar una transacción SQL
633 *@author Carlos Villaronga <cvillaronga at gmail.com>
634 **/
635 protected function BeginTrans(){
636 $db= $this->DB();
637 $db->BeginTrans();
638 }
639
640 /**
641 *Finalizar una transacción SQL
642 *@author Carlos Villaronga <cvillaronga at gmail.com>
643 **/
644 protected function CommitTrans(){
645 $db= $this->DB();
646 $db->CommitTrans();
647 }
648
649 /**
650 *Ejecutar una operación arbitraria SQL
651 *@author Carlos Villaronga <cvillaronga at gmail.com>
652 *@param string $query consulta a ejecutar
653 *@param boolean $json indica si la respuesta esperada es json
654 *@return mixed resultado de la operación
655 **/
656 protected function execute($query,$json=true){
657
658 try{
659 $db= $this->DB();
660 $ok = $db->Execute($query);
661 if(!$ok){
662 $result = array('success'=>false,'msg'=>$db->ErrorMsg());
663 } else {
664 $result = array('success'=>true, 'msg'=>'Registros Procesados');
665 }
666 return ($json)?json_encode($result):$ok;
667 } catch (exception $e) {
668 return array('success'=>false,'msg'=>"No fue posible completar la operación".$e->getmessage());
669 }
670
671 }
672
673 /**
674 *Recibe un arreglo asociativo con los valores que serán almacenados
675 *@author Carlos Villaronga <cvillaronga at gmail.com>
676 *@param array $data Arreglo asociativo con los valores del registro.
677 *@return array Resultado de la operación
678 **/
679 protected function addNew($data) {
680 $db= $this->DB();
681
682 if(self::validateAttribute('created_at')){ $this->created_at = date('Y-m-d g:i:s'); }
683 if(self::validateAttribute('created_by')){ $this->created_by = strtoupper($_SESSION['userid']); }
684 if(self::validateAttribute('updated_at')){ $this->updated_at = date('Y-m-d g:i:s'); }
685 if(self::validateAttribute('updated_by')){ $this->updated_by = strtoupper($_SESSION['userid']); }
686
687 unset($data[$this->_index]);
688
689 foreach($data as $fkey => $value){
690 if(self::validateAttribute($fkey)){
691 $this->$fkey = $value;
692 }
693 }
694
695 $ok = $this->save(); // 0=failure, 1=update, 2=insert
696 if(!$ok){
697 $result = array('success'=>true, 'msg'=>$this->ErrorMsg());
698 } else {
699 $lastInsertID = $db->Insert_ID();
700 $result = array('success'=>true, 'msg'=>"Registro Insertado" , 'elementid'=> $lastInsertID );
701 }
702
703 return $result;
704 }
705
706
707 /**
708 *Actualiza los datos de un registro $key / Recibe un arreglo asociativo con los valores que serán almacenados
709 *@author Carlos Villaronga <cvillaronga at gmail.com>
710 *@param string $key indice del registro a ser actualizado
711 *@param array $data Arreglo asociativo con los valores del registro.
712 *@return array Resultado de la operación
713 **/
714 protected function saveEdit($key,$data){
715
716 $db= $this->DB();
717 $text = "Insertado";
718 // $db->debug=true;
719 if(@is_numeric($data[$key])){
720 $text = "Actualizado";
721 if(!$this->load("$key = ".$data[$key])){
722 $result = array('success'=>false, 'msg'=>"No es posible Cargar el Registro o ha sido eliminado" , 'elementid'=> "$key = ".$data[$key] );
723 return $result;
724 };
725
726 if(self::validateAttribute('updated_at')){ $this->updated_at = date('Y-m-d g:i:s'); }
727 if(self::validateAttribute('updated_by') and !key_exists('updated_by',$data))
728 { $this->updated_by = strtoupper($_SESSION['userid']); }
729 }else{
730 if(self::validateAttribute('created_at')){ $this->created_at = date('Y-m-d g:i:s'); }
731 if(self::validateAttribute('created_by') and !key_exists('created_by',$data))
732 { $this->created_by = strtoupper($_SESSION['userid']); }
733
734 if(self::validateAttribute('updated_at')){ $this->updated_at = date('Y-m-d g:i:s'); }
735 if(self::validateAttribute('updated_by') and !key_exists('updated_by',$data))
736 { $this->updated_by = strtoupper($_SESSION['userid']); }
737 }
738
739 unset($data[$key]);
740 // self::textMessage($this->id);
741
742 foreach($data as $fkey => $value){
743 if(self::validateAttribute($fkey)){
744 $this->$fkey = $value;
745 }
746 }
747
748 $ok = $this->save(); // 0=failure, 1=update, 2=insert
749 $db->debug= false;
750 if(!$ok){
751 $err = $this->ErrorMsg();
752
753 $result = array('success'=>false, 'msg'=>$err);
754 } else {
755
756 if($ok==2){
757 $lastInsertID = $db->Insert_ID(); }
758 else {
759 $fld = $this->_index;
760 $lastInsertID = $this->$fld;
761 }
762
763 $result = array('success'=>true, 'msg'=>"Registro $text" , 'elementid'=> $lastInsertID );
764 }
765
766 return $result;
767
768 }
769
770 /**
771 *Valida la existencia de un atributo en la tabla
772 *@author Carlos Villaronga <cvillaronga at gmail.com>
773 *@param string $name nombre del atributo a ser validado.
774 *@return mixed Nombre del atributo o false si no existe.
775 **/
776 public function validateAttribute($name) {
777 $table = $this->TableInfo();
778
779 if (array_key_exists($name,$table->flds)) {
780 return $name;
781 } else return false;
782 }
783
784 /**
785 *Buscar un registro en la vista de datos de la entidad que cumpla con la relación $key=$value
786 *@author Carlos Villaronga <cvillaronga at gmail.com>
787 *@param string $key nombre del campo
788 *@param mixed $value valor buscado
789 *@return json Retorna una cadena json con el registro encontrado / falso si se produce un error
790 **/
791 public function getFields($lang='es'){
792 $fieldsName = new i18n(get_class($this) ,'es');
793 return $fieldsName->getFields();
794 }
795
796 protected function textMessage($data){
797 file_put_contents(__DIR__.'/tempLog.txt',date('Y-m-d g:i:s')." -> ".json_encode($data)."\n",FILE_APPEND);
798 }
799
800}
801?>