Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 188
0.00% covered (danger)
0.00%
0 / 23
CRAP
0.00% covered (danger)
0.00%
0 / 1
appRelateBase
0.00% covered (danger)
0.00%
0 / 187
0.00% covered (danger)
0.00%
0 / 23
12656
0.00% covered (danger)
0.00%
0 / 1
 __construct
n/a
0 / 0
n/a
0 / 0
1
 bread_crumps
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
110
 hoja_label
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
20
 sql_options_get
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 cache_query
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 sql_link_read
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
72
 sql_link_fields_posible
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 sql_deduce_field_index
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
132
 enum_get
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
30
 enum_getClassed
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
42
 enum_value_class
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 log
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
30
 log_tema_to_id
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 log_action_to_id
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 toLabel
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 campos_incorpora
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
30
 table_child_gridAtribute
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 childs_order
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
72
 child_hide
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 table_link_delete_allRule
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
30
 table_link_delete_rules
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 table_child_type
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
30
 table_make_child
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
132
 table_unmake_child
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3// permisos default, a menos que clase ponga el suyo propio
4define('PERMISO_POR_TIPO_TABLA',1);             // si tabla tipo es catalogo solo tipo de usuario>=power user
5define('PERMISO_POR_PERMISO_VARS',2);           // iacase->permiso_[list|insert...] sin reajustar por db
6define('PERMISO_POR_TABLE_PERMISSIONS',4);      // iacase usa permisos de db iac_table
7define('PERMISO_POR_FIELD_PERMISSIONS',8);      // hay permisos por cada campo
8define('PERMISO_POR_SECTION_PERMISSIONS',16);   // hay segregados por un campo en el registro
9define('PERMISO_POR_EDITORS',32);               // de existir campo iac_editors user debe estar ahi para editar
10define('PERMISO_POR_READRES',64);               // de existir campo iac_readers user debe estar ahi para editar
11global $PERMISOS_APP;
12$PERMISOS_APP = PERMISO_POR_TIPO_TABLA+PERMISO_POR_PERMISO_VARS+PERMISO_POR_EDITORS+PERMISO_POR_READRES;             // suma de los de arriba deseados
13
14class appRelateBase  {
15    public $tables=array();
16    public $enums=array();
17    public $links=array();
18    public $link_dont_cache=array(); // ie array('cliente_id') no traera SQL_CACHE
19    public $iac_enum_class=array(); // cache para iac_class_enum usado en enum_getClassed
20    function __construct() {
21    }
22
23/////////////////
24//APP SPECIFIC
25//////////////////
26
27/////////////////
28// CUSTOMIZIBLE
29//////////////////
30
31    public function bread_crumps($table='',$h='',$recordLabel='') {
32        $at=$this->hoja_label($table);
33        $iconoHome='';
34        if($table!='' && isset($this->tables[$table]['icono_table']) && $this->tables[$table]['icono_table']!='' )
35            $iconoTable="<img src='".$this->tables[$table]['icono_table']."' />";
36        else
37            $iconoTable='';
38
39        if($_SERVER['SCRIPT_NAME']=='index.php')
40            return "$iconoHome<a class='bcen' href='index.php'>Inicio</a>";
41        if($h=='e')
42            $haciendo='editando '.$recordLabel;
43        elseif($h=='a')
44            $haciendo='creando '.$recordLabel;
45        elseif($h=='r')
46            $haciendo='consultando '.$recordLabel;
47        elseif($h=='b')
48            $haciendo='confirmando elminar '.$recordLabel;
49        else
50            $haciendo='';
51
52        if($haciendo!='')
53            $haciendo=" <i>($haciendo)</i>";
54
55        return "$iconoHome<a href='index.php'>Inicio</a> -&gt; $iconoTable<a class=bcen href=$_SERVER[SCRIPT_NAME]>$at</a> $haciendo";
56    }
57
58    public function hoja_label($table='') {
59        if($table!='' && isset($this->tables[$table]['label_table']) && $this->tables[$table]['label_table']!='' )
60            return $this->tables[$table]['label_table'];
61        $at= basename($_SERVER['SCRIPT_NAME']);
62        $at=str_replace(array('.php','.html','.htm','_'),' ',$at);
63        return $at;
64    }
65
66    public function sql_options_get($table,$fieldName,$linkItem=null,$iacase=null,$selectedId=null,$for_edit=true,$for_read=false,$inGrid=false) {
67        if(array_key_exists($linkItem,$this->links))
68            return $this->cache_query($fieldName, $this->links[$linkItem]['options']);
69        $use=str_replace(array('_id'),array(''),$fieldName);
70        if(array_key_exists($use,$this->links))
71            return $this->cache_query($fieldName,$this->links[$use]['options']);
72        $altField = $this->sql_deduce_field_index($table,$fieldName);
73        if(array_key_exists($altField,$this->links))
74            return $this->cache_query($fieldName,$this->links[$altField]['options']);
75
76        $arr=$this->sql_link_fields_posible($table,$fieldName);
77        foreach($arr as $field)
78            if(array_key_exists($field,$this->links))
79                return $this->cache_query($fieldName, $this->links[$field]['options']);
80//echo "<h1>NOT FOUND t=$table f=$fieldName id=$id</h1>";
81//echo "<pre>links".print_r($this->links,true)."<pre>arr".print_r($arr,true);
82//die("FINITO");
83        return "SELECT '$altField','$fieldName link NOT FOUND'";
84    }
85
86    public function cache_query($fieldName,$sql) {
87        if( in_array($fieldName,$this->link_dont_cache))
88            return $sql;
89        return str_replace('xSELECT','SELECT '.SQL_CACHE, 'x'.$sql);
90    }
91
92    public function sql_link_read($table,$fieldName,$id='') {
93
94        $use=str_replace(array('_id'),array(''),$fieldName);
95        if(array_key_exists($use,$this->links))
96            return str_replace( array('%id%'), array($id), $this->links[$use]['read']);
97        $altField=$this->sql_deduce_field_index($table,$fieldName);
98        if(array_key_exists($altField,$this->links))
99            return str_replace( array('%id%'), array($id), $this->links[$altField]['read']);
100        $tmp=explode('_',$use);
101        if(array_key_exists($tmp[0],$this->links))
102            return str_replace( array('%id%'), array($id), $this->links[$tmp[0]]['read']);
103        $use=strtolower($use);
104        if(array_key_exists($use,$this->links))
105            return str_replace( array('%id%'), array($id), $this->links[$use]['read']);
106        $altField=strtolower($altField);
107        if(array_key_exists($altField,$this->links))
108            return str_replace( array('%id%'), array($id), $this->links[$altField]['read']);
109        $arr=$this->sql_link_fields_posible($table,$fieldName);
110        foreach($arr as $field)
111            if(array_key_exists($field,$this->links))
112                return str_replace( array('%id%'), array($id), $this->links[$field]['read']);
113        return "SELECT '$altField','$fieldName link NOT FOUND'";
114    }
115
116    public function sql_link_fields_posible($table,$fieldName,$linkItem=null,$for_edit=true,$for_read=false) {
117        $ret=array();
118        $ret[]=$use=str_replace(array('_id'),array(''),$fieldName);
119        $ret[]=$this->sql_deduce_field_index($table,$fieldName);
120        $tmp=explode('_',$use);
121        $ret[]=$tmp[0];
122        $arr=array();
123        foreach($ret as $k=>$d) {
124            $arr[]=$ret[$k];
125            $arr[]=strtolower($ret[$k]);
126        }
127        return $arr;
128    }
129
130    public function sql_deduce_field_index($table,$fieldName) {
131        $split=explode('_',$fieldName);
132        if(sizeof($split)<=2)
133            return $fieldName;
134        $split=array_reverse($split);
135        foreach($split as $try) if($try!='id' && $try!=$table ) { // no self joins,next loop
136            if(array_key_exists($try,$this->links)) {
137                return $try;
138            } elseif(array_key_exists(strtolower($try),$this->links))
139                return strtolower($try);
140        }
141        foreach($split as $try) if($try!='id' ) {
142            if(array_key_exists($try,$this->links)) {
143                return $try;
144            } elseif(array_key_exists(strtolower($try),$this->links))
145                return strtolower($try);
146        }
147        return $fieldName;
148    }
149
150    public function enum_get($table,$fieldName,$campos=array(),$alter='') {
151        if(!empty($alter) && array_key_exists("$table.$fieldName.$alter",$this->enums))
152            return $this->enums["$table.$fieldName.$alter"];
153        if(array_key_exists("$table.$fieldName",$this->enums))
154            return $this->enums["$table.$fieldName"];
155        if(array_key_exists($fieldName,$this->enums))
156            return $this->enums[$fieldName];
157
158        //if(array_key_exists($fieldName,$campos) && array_key_exists('options_array',$campos[$fieldName]) ) return $campos[$fieldName]['options_array'];
159        return array("$fieldName enum NOT FOUND","$fieldName enum NOT FOUND");
160    }
161
162    public function enum_getClassed($table,$fieldName) {
163        $arr=$this->enum_get($table,$fieldName);
164        if(empty($this->iac_enum_class) )
165            $this->iac_enum_class=ia_sqlArray("SELECT ".SQL_CACHE." valor_enum,class FROM iac_enum_class",'valor_enum');
166
167        foreach($arr as $k=>$v) {
168            if( array_key_exists($k,$this->iac_enum_class) ) {
169                $arr[$k]=array('id'=>$k, 'label'=>$v,'class'=>$this->iac_enum_class[$k]['class']);
170            } elseif($table=='iac_enum_class' && $fieldName=='class')
171                $arr[$k]=array('id'=>$k ,'label'=>$v,'class'=>$v);
172            else
173                 $arr[$k]=array('id'=>$k ,'label'=>$v,'class'=>'negro_blanco');
174        }
175        return $arr;
176    }
177    public function enum_value_class($table,$fieldName,$value) {
178        if(empty($this->iac_enum_class) )
179            $this->iac_enum_class=ia_sqlArray("SELECT ".SQL_CACHE." valor_enum,class FROM iac_enum_class",'valor_enum');
180        if(array_key_exists($value,$this->iac_enum_class))
181            return  $this->iac_enum_class[$value]['class'];
182        return '';
183    }
184
185    function log($action,$tema,$id,$msg,$usuario=null,$documento='') {
186        if(empty($usuario))
187            $usuario= array_key_exists('usuario',$_SESSION) ? $_SESSION['usuario'] : '?';
188        if(!is_numeric($tema))
189            $tema=$this->log_tema_to_id($tema);
190        if(!is_numeric($action))
191            $action=$this->log_action_to_id($action);
192        ia_query("INSERT INTO iac_log(fecha,usuario,iac_log_hecho_id,iac_table_id,record,documento,nota) VALUES(NOW(),".stritc($usuario).stritc($action).stritc($tema).stritc($id).stritc($documento).strit($msg).")");
193    }
194
195    function log_tema_to_id($tema) {
196        return ia_singleread("SELECT ".SQL_CACHE." iac_table_id FROM iac_table WHERE tabla=".strit($tema)." LIMIT 1","0");
197    }
198
199    function log_action_to_id($action) {
200        $to=array( 'sin permiso'=>1,'bad login'=>2
201                    ,'view'=>10,'edit'=>11,'update'=>11,'insert'=>12,'delete'=>13,'reordenar'=>14
202                    ,'list'=>20,'export'=>22,'print'=>23,'send as email'=>24,'report'=>25,'search'=>29
203                    ,'login'=>31,'logout'=>32
204                    ,'other'=>254,'Sistema'=>0
205                );
206        if(array_key_exists($action,$to))
207            return $to[$action];
208        return ia_singleread("SELECT ".SQL_CACHE." iac_log_hecho_id FROM iac_log_hecho WHERE hecho=".strit($action)." LIMIT 1","0");
209    }
210
211/////////////////
212// GENERAL
213//////////////////
214    public function toLabel($s) {
215        $s=str_replace(array('_id','_'),array('',' '),$s);
216        $s=ucwords($s);
217        return $s;
218    }
219
220
221
222    function campos_incorpora($tabla,&$campos) {
223        return $campos;
224           $iac_limits=ia_sqlArray("SELECT /* appRelateBase:campos_incorpora limites */ campo, maximo, minimo, warn_maximo, warn_minimo, label, title FROM iac_limits WHERE iac_table='$tabla'",'campo');
225        if($iac_limits)
226            foreach($iac_limits as $fieldName=>$data)
227                if(array_key_exists($fieldName,$campos))
228                    foreach($data as $k=>$v)
229                        $campos[$fieldName][$k]=$v;
230        return $campos;
231    }
232
233/////////////////
234// CHILDS / LINKS
235//////////////////
236    public function table_child_gridAtribute($tableParent,$tableChild,$childLink,$gridAtribute,$valor) {
237        $this->tables[$tableChild]['links_to'][$tableParent][$childLink][$gridAtribute]=$valor;
238    }
239
240
241    public function childs_order($tableParent,$order=array()) {
242        if(!array_key_exists($tableParent,$this->tables) || empty($order))
243            return;
244        if(array_key_exists('links_from',$this->tables[$tableParent])) {
245            $links=$this->tables[$tableParent]['links_from'];
246            $arr=array();
247            foreach($order as $child)
248            if(array_key_exists($child,$links))
249                $arr[$child]=$links[$child];
250            foreach($links as $child=>$d)
251                if(!array_key_exists($child,$arr))
252                    $arr[$child]=$d;
253            $this->tables[$tableParent]['links_from']=$arr;
254        }
255    }
256
257    public function child_hide($tableParent,$tableChild,$fieldName,$hide=true) {
258        $this->tables[$tableParent]['links_from'][$tableChild][$fieldName]['hide']=$hide;
259    }
260
261    public function table_link_delete_allRule($tableRestrict,$restrict_delete,$delete_with_parent) {
262        if(!array_key_exists($tableRestrict,$this->tables))
263            return " appRelateBase::table_link_delete_allRule no tableRestrict $tableRestrict";
264        if(!array_key_exists('links_from',$this->tables[$tableRestrict]))
265            return " appRelateBase::table_link_delete_allRule 'links_from' for table $tableRestrict";
266
267        foreach($this->tables[$tableRestrict]['links_from'] as $table_from=>$d)
268            foreach($d as $fieldName=>$v) {
269                $this->tables[$tableRestrict]['links_from'][$table_from][$fieldName]['restrict_delete']=$restrict_delete;
270                $this->tables[$tableRestrict]['links_from'][$table_from][$fieldName]['delete_with_parent']=$delete_with_parent;
271            }
272//echo "<h1>OUT $tableRestrict. </h1> <pre>".print_r($this->tables[$tableRestrict]['links_from'],true)."</pre><hr>";
273    }
274
275    public function table_link_delete_rules($tableRestrict,$tableToCheck,$fieldName,$restrict_delete=true,$delete_with_parent=false,$on_delete_set_to='0') {
276        if(!array_key_exists($tableRestrict,$this->tables))
277            return " appRelateBase::table_link_delete_rules no tableRestrict $tableRestrict";
278        if(!array_key_exists($tableToCheck,$this->tables[$tableRestrict]['links_from']))
279            return " appRelateBase::table_link_delete_rules no tableToCheck $tableToCheck";
280        if(!array_key_exists($fieldName,$this->tables[$tableRestrict]['links_from'][$tableToCheck]))
281            return " appRelateBase::table_link_delete_rules no linkField $tableToCheck.$fieldName";
282        $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['restrict_delete']=$restrict_delete;
283        $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['delete_with_parent']=$delete_with_parent;
284        $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['on_delete_set_to']=$on_delete_set_to;
285    }
286
287    public function table_child_type($parent,$child,$esChild='single_catalog',$formato='link_one_select') {
288        global $gAppRelate;
289        if(array_key_exists('links_to',$this->tables[$child]) ) {
290            if(array_key_exists($parent,$this->tables[$child]['links_to']) ) {
291                $es='';
292                foreach( $this->tables[$child]['links_to'][$parent] as $es=>$d )
293                    break;
294                if($es) {
295                    $this->tables[$child]['links_to'][$parent][$es]['es']=$esChild;
296                    $this->tables[$child]['links_to'][$parent][$es]['formato']=$formato;
297                    //$this->tables[$child]['links_to'][$parent][$es]['es']=$esParent;
298                }
299            }
300        }
301    }
302
303    public function table_make_child($parent,$child,$parent_link='',$child_link=''
304        ,$restrict_delete=false,$delete_with_parent=true,$on_delete_set_to=0,$formato='addanother',$es='child') {
305        $this->tables[$parent]['has_child']=true;
306
307        if(!array_key_exists('links_from',$this->tables[$parent]) )
308            $this->tables[$parent]['links_from']=array();
309
310        if(empty($parent_link))
311            $parent_link=$this->tables[$child]['pk_single_field'];
312        if(empty($child_link))
313            $parent_link=$this->tables[$child]['pk_single_field'];
314
315        if(array_key_exists($child,$this->tables[$parent]['links_from']) ) {
316            if($parent_link=='') {
317                foreach( $this->tables[$parent]['links_from'][$child] as $es=>$d )
318                    break;
319
320            }
321        } else {
322            $this->tables[$parent]['links_from'][$child]=array();
323        }
324
325        $this->tables[$parent]['links_from'][$child][$parent_link]=array(
326            'formato'=>$formato,
327            'campo'=>$child_link,
328            'es'=>$es,
329          'to_table' => $child,
330          'to_field' => $child_link,
331          'this_table' => $parent,
332          'this_field' => $parent_link,
333            'restrict_delete'=>$restrict_delete,
334            'delete_with_parent'=>$delete_with_parent,
335            'on_delete_set_to'=>$on_delete_set_to
336        );
337
338        if(!array_key_exists($child,$this->tables))
339            $this->tables[$child]=array();
340        if(!array_key_exists('links_to',$this->tables[$child]))
341            $this->tables[$child]['links_to']=array();
342        if(!array_key_exists($parent,$this->tables[$child]['links_to']))
343            $this->tables[$child]['links_to'][$parent]=array();
344        if(!array_key_exists($child_link,$this->tables[$child]['links_to'][$parent]))
345            $this->tables[$child]['links_to'][$parent][$child_link]=array();
346        $this->tables[$child]['links_to'][$parent][$child_link]['es']='parent';
347    }
348
349    public function table_unmake_child($parent,$child,$esParent='catalog_entry',$esChild='single_catalog',$formato='link_one_select') {
350        global $gAppRelate;
351
352        if(array_key_exists('links_from',$this->tables[$parent]) ) {
353            if(array_key_exists($child,$this->tables[$parent]['links_from']) ) {
354                $es='';
355                foreach( $this->tables[$parent]['links_from'][$child] as $es=>$d )
356                    break;
357                if($es) {
358                    $this->tables[$parent]['links_from'][$child][$es]['es']=$esChild;
359                    $this->tables[$parent]['links_from'][$child][$es]['formato']=$formato;
360                    $this->tables[$child]['links_to'][$parent][$es]['es']=$esParent;
361                }
362            }
363        }
364    }
365
366}
367?>