ソースを参照

Merge branch 'master' of biuro.biall-net.pl:plabudda/se

Conflicts:
	SE/superedit-ZLECENIE.php
Piotr Labudda 11 年 前
コミット
747bed5cc0

BIN
SE/icon/superedit-RYSUNEK_O_WSKAZNIKACH.png


+ 2 - 1
SE/index-ajax.php

@@ -9,7 +9,8 @@ define('APP_PATH_CONFIG', APP_PATH_ROOT . DS . 'config');
 //session_save_path("./tmp") ;
 session_start();
 
-date_default_timezone_set('Europe/Warsaw');// PHP 5 >= 5.1.0 required by date functions
+//date_default_timezone_set('Europe/Warsaw');// PHP 5 >= 5.1.0 required by date functions
+date_default_timezone_set('UTC');// PHP 5 >= 5.1.0 required by date functions //needed for system working sync!
 
 error_reporting(E_ALL);
 ini_set('error_reporting', E_ALL);

+ 2 - 1
SE/index.php

@@ -10,7 +10,8 @@ define('APP_PATH_SCHEMA', APP_PATH_ROOT . DS . 'schema');
 //session_save_path("./tmp") ;
 session_start();
 
-date_default_timezone_set('Europe/Warsaw');// PHP 5 >= 5.1.0 required by date functions
+//date_default_timezone_set('Europe/Warsaw');// PHP 5 >= 5.1.0 required by date functions
+date_default_timezone_set('UTC');// PHP 5 >= 5.1.0 required by date functions //needed for system working sync!
 
 $errorReportingLevel = E_ALL & ~E_NOTICE;
 error_reporting($errorReportingLevel);

+ 324 - 35
SE/se-lib/Core/Database/Mysql.php

@@ -92,8 +92,9 @@ class Core_Database_Mysql extends Core_Database {
 	function insert_id() {
 		return mysql_insert_id( $this->_conn );
 	}
-	function show_tables() {
-		$sql="show tables";
+	function show_tables($table=null) {
+		if(!empty($table)) $sql="show tables like '".$table."'";
+		else $sql="show tables";
 		$res = $this->query($sql);
 		return $res;
 	}
@@ -104,6 +105,64 @@ class Core_Database_Mysql extends Core_Database {
 		return $res;
 	}
 	
+	function describe_table_value($table) {
+		
+		$res = self::describe_table($table);
+		while($h=self::fetch($res)) {
+			$result[$h->Field]=$h;
+		}
+		return $result;
+	}
+	
+	function show_index($table,$only_primary_flag=false) {
+		$sql="show index from `".$table."`";
+		if($only_primary_flag) $sql.=" WHERE  `Key_name` =  'PRIMARY' ";
+		
+		$res=self::query($sql);
+		return $res;
+		
+	}
+	
+	function show_index_value($table) {
+		$res=self::show_index($table,true);
+		while($h=self::fetch($res)) {
+			return $h->Column_name;
+		}
+	}
+	
+	
+	function get_by_data_column($table,$date_column,$timestamp,$now,$remote_key) {
+		$structure=self::describe_table_value($table);
+		if(strlen($timestamp)==0) $timestamp='0';
+		//DEBUG_S(-3,'Struct',$structure,__FILE__,__FUNCTION__,__LINE__);
+
+		
+		$col=self::GET_DB_OBJ_cols($table);
+		$sql='select '.implode(',', $col).' from `'.$table.'` where  unix_timestamp(`'.$date_column.'`) >  '.$timestamp.'  and  unix_timestamp(`'.$date_column.'`) < '.$now.' ';
+		$sql='select '.implode(',', $col).' from `'.$table.'` where  unix_timestamp(`'.$date_column.'`) >  '.$timestamp.' '; //TODO trzeba zmienic jak piotr zmieni ze A_RECORD_UPDATE_DATE sa trzymane w UTC
+
+			//if(empty($timestamp)) 
+			$sql.=' or `'.$date_column.'` is null';
+			$sql.=' or `'.$remote_key.'` is null';		
+		
+		DEBUG_S(-3,'biore dane ',$sql,__FILE__,__FUNCTION__,__LINE__);
+		$res=self::query($sql) or die1($sql);
+		return $res;
+	}
+	
+	
+	
+	
+	function get_current_time() {
+		$sql=" select unix_timestamp(UTC_TIMESTAMP) as time ";
+		$res=self::query($sql);
+		while($h=self::fetch($res)) {
+			return $h->time;
+		}
+	}
+	
+	
+	
 	function STRUCTURE_GENERATE($TABLES,$null=null,$TABLES_STRUCTURE_DATA,$flags=array()){
    				DEBUG_S(-3,'flags',$flags,__FILE__,__FUNCTION__,__LINE__);
    				//global $this;
@@ -132,7 +191,7 @@ class Core_Database_Mysql extends Core_Database {
    					$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__']['PROCEDURE'][$h->Name]=$h_;
    					}
 	   			}
-	   				DEBUG_S(-3,'struktury funkcji: __SCHEMA_FUNCTIONS__ARRAY__ ',$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__'],__FILE__,__FUNCTION__,__LINE__)	 ;
+	   				DEBUG_S(-3,'struktury funkcji: __SCHEMA_FUNCTIONS__ARRAY__ ',array($TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__'],$TABLES),__FILE__,__FUNCTION__,__LINE__)	 ;
    				//die1('stop function during dev.');
    				
 		       		foreach($TABLES as $TABLE ){
@@ -232,13 +291,13 @@ class Core_Database_Mysql extends Core_Database {
 		            //print_r($TABLES_IMPORT);
 		           
 		           
-		           
+					if(!function_exists('func_sort_tables_import')) {
 		            function func_sort_tables_import($a,$b){
 		               if($a['Table_type']==$b['Table_type']) return 0;
 		               else if($a['Table_type']=='VIEW') return 1;
 		               else return -1;
                             }
-                           
+                     }
                            uasort($TABLES_IMPORT,'func_sort_tables_import');
 		                                                                                                                                                         
 		           DEBUG_S(-3,'Wygenerowane struktury (TABLES_IMPORT)',$TABLES_IMPORT,__FILE__,__FUNCTION__,__LINE__); 
@@ -247,6 +306,36 @@ class Core_Database_Mysql extends Core_Database {
 	
 	
 	
+	
+	function set_last_sync_date($table,$now,$remote_db_id,$local_db_id,$timestamp_column='A_RECORD_UPDATE_DATE') {
+		$sql="insert  into _SYNC_DATABASE_TABLE_STATE ( TABLE_NAME, LAST_SYNCED , DATABASE_SYNCED_ID , DATABASE_LOCAL_ID )
+		values ('".$table."' , from_unixtime('".$now."') , '".$remote_db_id."' , '".$local_db_id."')";
+		DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		self::query($sql) or die('310Problem z '.$sql);
+		$sql="update  _SYNC_DATABASE_TABLE_STATE set  LAST_SYNCED=from_unixtime('".$now."') where TABLE_NAME='".$table."' 
+			and DATABASE_SYNCED_ID='".$remote_db_id."' and DATABASE_LOCAL_ID='".$local_db_id."' ";
+	
+		$sql_c="update `".$table."` set `".$timestamp_column."`=from_unixtime('".$now."') where `".$timestamp_column."` is null ";
+	    self::query($sql_c) or die('315Problem z '.$sql_c);
+		DEBUG_S(-3,'update sync date',array($sql,$sql_c),__FILE__,__FUNCTION__,__LINE__);
+	}
+	
+	function get_last_sync_date($table,$remote_db_id,$local_db_id) {
+		$sql="select TABLE_NAME, unix_timestamp(LAST_SYNCED) as LAST_SYNCED from _SYNC_DATABASE_TABLE_STATE 
+		where DATABASE_SYNCED_ID='".$remote_db_id."' and DATABASE_LOCAL_ID='".$local_db_id."' and TABLE_NAME='".$table."'
+		order by ID desc limit 1
+		";
+		$res=DB::query($sql);
+		DEBUG_S(-3,'Get date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		while($h=DB::fetch($res)) {
+			return $h->LAST_SYNCED;
+			
+		}
+		return 0;
+	}
+	
+	
+	
 	function SHOW_TABLE_STATUS_LIKE($table) {
 		$records=$this->query("SHOW TABLE STATUS LIKE '".$table."'");
 		if ($record = $this->fetch_assoc($records)) {
@@ -256,7 +345,7 @@ class Core_Database_Mysql extends Core_Database {
 		
 	}
 	
-	function affected_rows() {
+	function affected_rows($needed_in_psql_only=null) {
 		return mysql_affected_rows( $this->_conn );
 	}
 
@@ -281,6 +370,76 @@ class Core_Database_Mysql extends Core_Database {
 		return $null;
 	}
 
+	
+	function get_searched_obj($table,$obj_filter,$obj_get=null,$obj_group=null,$obj_order=null) {
+		foreach($obj_filter as $k=>$v) {
+			$where[]='`'.$k.'` like \''.$v.'\'';
+		}
+		
+		if(!empty($obj_get)) {
+			foreach($obj_get as $k=>$v) {
+				$what[]="`".$k."`";
+			}
+		}
+		
+		if(!empty($obj_group)) {
+			foreach($obj_group as $k=>$v) {
+				$group[]="`".$k."`";
+			}
+		}
+		if(!empty($obj_order)) {
+			foreach($obj_order as $k=>$v) {
+				if($v=='DESC') $order[]="`".$k."` DESC ";
+				else $order[]="`".$k."`";
+			}
+		}
+		if(!empty($order)) $order_by=" order by ".implode(',', $order); else $order_by="  ";
+		if(!empty($what)) $select=implode(',', $what); else $select=" * ";
+		if(!empty($group)) $group_by=" group by ".implode(',', $group); else $group_by="";
+		$sql="select ".$select." from `".$table."` where ".implode(' and ', $where)." ".$group_by." ".$order_by;
+	//	DEBUG_S(-3,'Select',$sql,__FILE__,__FUNCTION__,__LINE__);
+		$result=$this->query($sql);
+		return $result;
+	}
+	
+	
+	/** Returns formated array to parse it to SQL (especialy to get GIS data to keep as WKT)
+	  *
+	  */	  
+
+	function GET_DB_OBJ_cols($table) {
+				$structure=self::describe_table_value($table);
+				foreach($structure as $Field=>$Struct) {
+						//echo $Struct->Type;
+						if(strstr($Struct->Type,"multipoint"))  $col[]=' AsWKT(`'.$Field.'`) as "'.$Field.'"';
+						else if(strstr($Struct->Type,"linestring")) $col[]=' AsWKT(`'.$Field.'`) as "'.$Field.'"';
+						else if(strstr($Struct->Type,"polygon")) $col[]=' AsWKT(`'.$Field.'`) as "'.$Field.'"';
+						else if(strstr($Struct->Type,"multipolygon")) $col[]=' AsWKT(`'.$Field.'`) as "'.$Field.'"';
+
+						else $col[]='`'.$Field.'`';
+				}	
+				return $col;
+	}
+	/** Use it before pasting obj to UPDATE_OBJ or ADD_NEW_OBJ to maintain GIS data especially
+	 *
+	 */
+	
+	function MAKE_DB_OBJ($table,$obj) {
+		$structure=self::describe_table_value($table); //todo to cache optimize
+		foreach(get_object_vars($obj) as $k=>$v) {
+			if(($structure[$k]->Type=='multipoint')||($structure[$k]->Type=='linestring')||($structure[$k]->Type=='polygon')||($structure[$k]->Type=='multipolygon')) {
+				if(empty($v)) {
+					unset($k);
+					unset($v);
+					continue;
+				}
+				else $v = "GeomFromText('".$v."')";
+			} 
+		$obj_ret->$k=$v;	
+		}
+		return $obj_ret;
+	}
+
 	/**
 	 * @returns int
 	 *   1 - changed but without add hist
@@ -293,13 +452,16 @@ class Core_Database_Mysql extends Core_Database {
 	 * TODO: sprawdzac czy w hist mozna odczytac aktualny stan, jesli nie to dodac caly rekord do HIST, jako 'procesy-fix-hist-data'
 	 */
 	public function UPDATE_OBJ($table, $sql_obj) {
-		if (!isset($sql_obj->ID) || $sql_obj->ID <= 0) {
+		$structure=self::describe_table_value($table); //todo to cache optimize
+		$primary=self::show_index_value($table); //todo to cache optimize
+
+		if (!isset($sql_obj->$primary) || $sql_obj->$primary <= 0) {
 			return -3;
 		}
-		$id = $sql_obj->ID;
+		$id = $sql_obj->$primary;
 
 		// check id record $id exists
-		if (($curr_obj = $this->get_by_id($table, $sql_obj->ID)) == null) {
+		if (($curr_obj = $this->get_by_id( $table, $sql_obj->$primary )) == null) {
 			return -2;
 		}
 
@@ -307,7 +469,7 @@ class Core_Database_Mysql extends Core_Database {
 		$changed = false;
 		$fields_to_change = get_object_vars($sql_obj);
 		foreach ($fields_to_change as $k => $v) {
-			if ($k == 'ID') continue;
+			if ($k == $primary) continue;
 			if ($v == $curr_obj->$k) {// === ?
 				unset($sql_obj->$k);
 			} else {
@@ -325,6 +487,8 @@ class Core_Database_Mysql extends Core_Database {
 		$admin_col[] = 'A_RECORD_CREATE_AUTHOR';
 		// ...
 		$sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i');
+// OFF - BUG w _HIST		$sql_obj->A_RECORD_UPDATE_DATE = "FROM_UNIXTIME(".$this->get_current_time().")";
+
 		$sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName();
 		foreach (get_object_vars($sql_obj) as $k => $v) {
 			if (strtoupper($v) == 'NOW()') {
@@ -348,8 +512,8 @@ class Core_Database_Mysql extends Core_Database {
 
 		$ret = $this->affected_rows();
 		if ($ret) {
-			$sql_obj->ID_USERS2 = $sql_obj->ID;
-			unset($sql_obj->ID);
+			$sql_obj->ID_USERS2 = $sql_obj->$primary;
+			unset($sql_obj->$primary);
 			$new_id = $this->ADD_NEW_OBJ("{$table}_HIST", $sql_obj);
 			if ($new_id) {
 				$ret += 1;
@@ -358,7 +522,11 @@ class Core_Database_Mysql extends Core_Database {
 		return $ret;
 	}
 
-	function ADD_NEW_OBJ($table, $sql_obj) {
+	function ADD_NEW_OBJ( $table, $sql_obj,$dieonerror=null ) {
+		
+		//TODO to optimize:
+		$structure=self::describe_table_value($table);
+		$primary=self::show_index_value($table);
 		$sql_arr = array();
 		// TODO: add admin columns if exists in table - search in session
 		$admin_col = array();
@@ -378,7 +546,8 @@ class Core_Database_Mysql extends Core_Database {
 		}
 
 		foreach (get_object_vars($sql_obj) as $k => $v) {
-			if (strtoupper($v) == 'NOW()') {
+			if($k==$primary) $v='0'; 
+			else if (strtoupper($v) == 'NOW()') {
 				$v = 'NOW()';
 			} else if (strtoupper($v) == 'NULL' && substr($table, -5) != '_HIST') {
 				$v = 'NULL';
@@ -391,6 +560,7 @@ class Core_Database_Mysql extends Core_Database {
 			$sql_arr ["`{$k}`"] = $v;
 		}
 		$sql = "insert into `{$table}` (".implode(",", array_keys($sql_arr)).") values (".implode(",", array_values($sql_arr))."); ";
+		//error_log($sql);
 		$this->query($sql);
 
 		if ($this->has_errors()) {
@@ -416,16 +586,24 @@ class Core_Database_Mysql extends Core_Database {
 		
 	}
 
-	function STRUCTURE_GENERATE_PARSE($config_base_structure_unserialized) {
+	function STRUCTURE_GENERATE_PARSE($config_base_structure_unserialized,$options=array()) {
 
 					foreach($config_base_structure_unserialized as $TABLE=>$ARR_TABLE) { //dla kazdej tabeli 
 					set_time_limit(36000);
 					//! if($TABLE<>'_CRM_PROCES_USER_STATS_wiev') continue; //trigger development
 					//! try to sync __SCHEMA_FUNCTIONS__ARRAY__
+					
+					
 					if($TABLE=='__SCHEMA_FUNCTIONS__ARRAY__') {	
+						if(in_array('SKIP-PROCEDURE', $options)) { 
+							DEBUG_S(-3,'SKIP-PROCEDURES option',null,__FILE__,__FUNCTION__,__LINE__);
+							continue;
+						}
+					
+													
+														//BEGIN PROCEDURE
 						DEBUG_S(-3,'Try to synchronize functions and procedures',$ARR_TABLE,__FILE__,__FUNCTION__,__LINE__);
 
-													//BEGIN PROCEDURE
 													$sql=" SHOW PROCEDURE STATUS; ;" ; //listujemy nasze procedury
 									       			DEBUG_S(-3,'Looking for PROCEDURE ',$sql,__FILE__,__FUNCTION__,__LINE__);
 									       				$result=$this->query($sql) or die1('\nProblem z '.$sql);
@@ -448,6 +626,7 @@ class Core_Database_Mysql extends Core_Database {
 								       				    }
 									       				DEBUG_S(-3,'Try to unserialize PROCEDURE and install to db:',$ARR_TABLE['PROCEDURE'],__FILE__,__FUNCTION__,__LINE__);
 								       				
+									       				
 								       				foreach($ARR_TABLE['PROCEDURE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
 										   				if(!isset($FIELDS_CHECKED['FOUNDS'][$TRIGGER_INDEX])) { $FIELDS_CHECKED['TO_CREATE'][$TRIGGER_INDEX]=$TRIGGER_OBJECT;
 										   				DEBUG_S(-3,'We have object to create '.$TRIGGER_INDEX,$TRIGGER_OBJECT,__FILE__,__FUNCTION__,__LINE__);
@@ -590,10 +769,15 @@ class Core_Database_Mysql extends Core_Database {
 		
 														 }
 		       									} else if($ARR_TABLE['Table_type']=='VIEW') {
+		       										
+		       										if(in_array('SKIP-VIEW', $options)) {
+		       										DEBUG_S(-3,"SKIP-VIEW Brak widoku: ".$TABLE." :",null,__FILE__,__FUNCTION__,__LINE__) ;
+		       										} else {
 		       										$sql=$ARR_TABLE['VIEW']->{'Create View'};
 			       									DEBUG_S(-3,"Brak widoku: ".$TABLE." dodajemy sql:",$sql,__FILE__,__FUNCTION__,__LINE__) ;
 			       									 $this->query($sql) or die1('\nProblem ze '.$sql);
 		       									}
+		       									}
 		       										
        										
        										} else {
@@ -636,6 +820,8 @@ class Core_Database_Mysql extends Core_Database {
 													DEBUG_S(-3,'SQL:describe '.$TABLE,$sql,__FILE__, __FUNCTION__, __LINE__) ;
        										       	$result=$this->query($sql) or die1('\nProblem z '.$sql);
        										       	$FIELDS_CHECKED=""; unset($FIELDS_CHECKED);
+	   											   	$PRIMARY_FIELD=self::show_index_value($TABLE);
+       										     
        										       	foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //tu robie tabelke do odhaczania z niej zmiennych
 								       					$FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'][$TST_VAL->Field]=1;
 								       					$FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_EXISTS'][$TST_VAL->Field]=1;
@@ -685,16 +871,19 @@ class Core_Database_Mysql extends Core_Database {
 								       									 $sql.=" DEFAULT ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default." ";//   (".$INDEX_OF_CONFIG_TABLE.")";
 								       									else $sql.=" DEFAULT '".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default."' ";//   (".$INDEX_OF_CONFIG_TABLE.")";
 								       									 }
+								       							    if(in_array('SKIP-PRIMARY-KEY', $options) && ($PRIMARY_FIELD==$INDEX_OF_CONFIG_TABLE))  {
+								       							    	$sql.=" null ";
+								       							    } else {
 								       							    if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null=='NO') $sql.=" not null "; else $sql.=" null ";
+								       							    }
 								       							    $sql.=" ;";
-								       								echo "\n ".$sql;
+								       								DEBUG_S(-3,'add field',$sql,__FILE__,__FUNCTION__,__LINE__);
 								       								 $this->query($sql) or  DEBUG_S(-3,'Problem z sql',$sql,__FILE__, __FUNCTION__, __LINE__)  or die1();
 
 								       								
 								       						}
 								       				} //eof dodajemy brakujace komorki
 								       				
-								       				
 								       				//Sprawdzamy czy sa zgodne typy komorek...
 								       				$sql=" describe  `".$TABLE."` ;" ;
 								       				DEBUG_S(-3,'describe '.$TABLE,$sql,__FILE__, __FUNCTION__, __LINE__) ;
@@ -717,9 +906,15 @@ class Core_Database_Mysql extends Core_Database {
 								       							//	echo "\nsprawdzamy wszystkie wlasciwosci dla db ".$TABLE." ".$FIELD_TO_CHK." col ".$INDEX_OF_CONFIG_TABLE;
 																	$CHK_TYPES_ARS=array('Type','Null','Default');
 																	$sql="";
-																//	 echo "\n if ".$VAL->Type." =? ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type ;
-																	if($VAL->Type!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) {
+																	// $val1=utf8_encode($VAL->Type);
+																	// $val2=utf8_encode($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type);
+																	// echo "\n<br> if(".(trim($VAL->Type)==trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type))." vs ".($VAL->Type==$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type).") ".var_dump($VAL->Type)." =? ".var_dump($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type)." ".gettype($VAL->Type)." ".gettype($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) ;
+
+																	if((trim($VAL->Type)!=trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type)) ) {
+
 																	 //!  aktualizujemy typy
+																	 	  DEBUG_S(-3,'VAL Type ('.$VAL->Type.')!= ARR_TABLE ('.$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type.') ',array($VAL->Type,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type),__FILE__,__FUNCTION__,__LINE__);
+																	 	  var_dump($VAL->Type);var_dump($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type);
 																	 	  $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
 
 																	      if(strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'char(')&& strstr($VAL->Type, 'char(')){
@@ -745,8 +940,9 @@ class Core_Database_Mysql extends Core_Database {
 																				  
 																			  } 
 																			  $dst_char_len="enum(".implode(",", $dst_char_len).")";
+ 																	 	     	
  																	 	      $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$dst_char_len." ; ";
-
+ 																	 		 	 $sql=str_replace("',)", "')", $sql); //Todo @2014-11 jakis chory blad implode 'WAIT',) ;
 																	          DEBUG_S(-3,'Uzupelniamy strukture o ewentualnie brakujace elementy (sql,wynik polaczenia,import.strukt.,akt_strukt.)',array($sql,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type,$VAL->Type),__FILE__, __FUNCTION__, __LINE__);
 																		   	  
 																		   	  	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die1('\nProblem z '.$sql);
@@ -768,6 +964,7 @@ class Core_Database_Mysql extends Core_Database {
 																		   	  	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die1('\nProblem z '.$sql);
 																	      
 																	      } else if(strstr($VAL->Type, 'int(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'int('  )) {
+																	         
 																	          preg_match('/^int\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
 																			  preg_match('/^int\((.*)\)$/', $VAL->Type, $dst_char_len);
 																			  if($src_char_len[1]>$dst_char_len[1]) {
@@ -775,7 +972,7 @@ class Core_Database_Mysql extends Core_Database {
 																				  DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
 																				 // 	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die1('\nProblem z '.$sql);
 																			  } else {
-																				  DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
+																				  DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,array($sql,$src_char_len,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type),__FILE__, __FUNCTION__, __LINE__);
 																			  }
 																	      
 																	      } else if( ( strstr($VAL->Type, 'char(') || strstr($VAL->Type, 'varchar(')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'text'  )
@@ -783,6 +980,12 @@ class Core_Database_Mysql extends Core_Database {
 																	      			|| ( strstr($VAL->Type, 'mediumtext')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'longblob'  )
 																	      			|| ( strstr($VAL->Type, 'decimal(42')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41'  )
 																	      			|| ( strstr($VAL->Type, 'decimal(43')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41'  )
+																	      			|| ( strstr($VAL->Type, 'multipoint')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'multipoint'  )
+																		  			|| ( strstr($VAL->Type, 'date')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'char' ) 
+																		  			|| ( strstr($VAL->Type, 'date')  ) && strstr('varchar',$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type ) 
+																		  			|| ( strstr($VAL->Type, 'datetime')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'char' ) 
+																		  			|| ( strstr($VAL->Type, 'datetime')  ) && strstr('varchar' ,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) 
+																		  			|| ( strstr($VAL->Type, 'datetime')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'date' ) 
 
 																	      			) {
 																	          
@@ -798,15 +1001,25 @@ class Core_Database_Mysql extends Core_Database {
 																		   	  	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die1('\nProblem z '.$sql);
 																		    }
 																	    }
-																	if($VAL->Null!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null) 
+																	
+																	if(trim($VAL->Null)!=trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null)) {
+																	  if(!in_array('SKIP-PRIMARY-KEY', $options)) { 
+																			 DEBUG_S(-3,'SKIP-PRIMARY-KEY option',null,__FILE__,__FUNCTION__,__LINE__);
+																		
+																		  
+																	 // echo "<br>".$VAL->Null."!=".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null;
 																	  	if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null=='YES') { 
-																		  $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NULL ; ";
+																		  $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NULL  ";
+																		    	DEBUG_S(-3,'Alter',$sql,__FILE__,__FUNCTION__,__LINE__);
 																		    	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
 																		  } else  { 
-																	     	$sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NOT NULL ; ";
+																	     	$sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NOT NULL  ";
+																	     		DEBUG_S(-3,'Alter '.$FIELD_TO_CHK,array($sql,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]),__FILE__,__FUNCTION__,__LINE__);
 																	     		$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
 
 																	       }
+																	  }
+																	 }
 																	if($VAL->Default!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default) {
 																		if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='CURRENT_TIMESTAMP')
 												 						 $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."`  ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type."  DEFAULT ".str_replace("'","",$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default)."  ; ";
@@ -817,7 +1030,11 @@ class Core_Database_Mysql extends Core_Database {
 																		
 																	}
 																	//autoincrement:
-																	if(($VAL->Extra!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra)&&$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra=='auto_increment' ) {
+																	
+																	if(in_array('SKIP-PRIMARY-KEY', $options)) { 
+																		DEBUG_S(-3,'SKIP-PRIMARY-KEY option',null,__FILE__,__FUNCTION__,__LINE__);
+																		
+																	} else if(($VAL->Extra!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra)&&$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra=='auto_increment' ) {
 																		//sprawdzmy czy nie ma w tabeli klucza z PRIMARY z ID
 																		$sql="show keys from  `".$TABLE."`";
 																		$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
@@ -833,7 +1050,7 @@ class Core_Database_Mysql extends Core_Database {
 																		 } 
 																		$sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."`  ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type."    ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra." ; ";
 																		echo "\n SQL auto_increment ".$sql ;
-																			$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
+																			$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE('die927');
 																		
 																	}
 								       								//foreach($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE] as $TST_FIELD_IND=>$TST_FIELD_VAL) {
@@ -865,6 +1082,9 @@ class Core_Database_Mysql extends Core_Database {
 													//brakujace klucze dodajemy
 													foreach($FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES'] as $FOUND_INDEX_NAME=>$FOUND_INDEX_ARR) {
 														if($FOUND_INDEX_NAME=='PRIMARY') {
+															if(in_array('SKIP-PRIMARY-KEY', $options)) { 
+																		DEBUG_S(-3,'SKIP-PRIMARY-KEY option',null,__FILE__,__FUNCTION__,__LINE__);	
+															} else {
 															$FOUND_INDEX_ARR->Column_name=str_replace('`','',$FOUND_INDEX_ARR->Column_name);
 														    $sql="ALTER TABLE  `".$TABLE."` ADD PRIMARY KEY (  `".$FOUND_INDEX_ARR->Column_name."` ) ;";
 														    echo "\n 927: ".$sql;
@@ -872,8 +1092,7 @@ class Core_Database_Mysql extends Core_Database {
 														    $sql="ALTER TABLE  `".$TABLE."` CHANGE  `".$FOUND_INDEX_ARR->Column_name."`  `".$FOUND_INDEX_ARR->Column_name."` ".$FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'][$FOUND_INDEX_ARR->Column_name]->Type." AUTO_INCREMENT ; ";
 														    echo "\n ".$sql;
 														    	$result=$this->query($sql) or  print_r($FIELDS_CHECKED) &&  die1('\nProblem z '.$sql);
-
-														    	$result=$this->query($sql) or  print_r($FIELDS_CHECKED) &&  die1('\nProblem z '.$sql);
+														    }
 														 } else if($FOUND_INDEX_ARR->Non_unique==1) {
 														    $sql="ALTER TABLE  `".$TABLE."` ADD KEY `".$FOUND_INDEX_ARR->Key_name."`  (  ".$FOUND_INDEX_ARR->Column_name." ) ;" ;
 														    echo "\n ".$sql; 
@@ -902,6 +1121,10 @@ class Core_Database_Mysql extends Core_Database {
 													
 								       				//print_r($FIELDS_CHECKED);
 								       				unset($FIELDS_CHECKED);
+								       				if(in_array('SKIP-PROCEDURE', $options)) { 
+										   				DEBUG_S(-3,'SKIP-PROCEDURES option',null,__FILE__,__FUNCTION__,__LINE__);
+										   				continue;
+												   		} else {
 								       				$sql=" show triggers like '".$TABLE."' ;" ; //listujemy nasze triggery z tej tabeli
 									       			DEBUG_S(-3,'Looking for triggers in '.$TABLE,$sql,__FILE__,__FUNCTION__,__LINE__);
 									       				$result=$this->query($sql) or die1('\nProblem z '.$sql);
@@ -947,7 +1170,12 @@ class Core_Database_Mysql extends Core_Database {
 								       				
 								       				
 								       				//tworzymy brakujace procedury
+									       				
 								       				foreach ($FIELDS_CHECKED['TRIGGER_TO_CREATE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
+										       				if(in_array('SKIP-FUNCTION', $options)) { 
+												   				DEBUG_S(-3,'SKIP-FUNCTION option',null,__FILE__,__FUNCTION__,__LINE__);
+												   				continue;
+												   			}
 									       				//$sql="DROP TRIGGER IF EXISTS `{$TRIGGER_INDEX}`; ";
 									       				//DEBUG_S(-3,'Delete old trigger '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
 									       				//	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',array($sql,mysql_error() ),__FILE__, __FUNCTION__, __LINE__)  or die1(); 
@@ -958,17 +1186,15 @@ class Core_Database_Mysql extends Core_Database {
 									       				
 								       				}
 								       				
-								       			
+									   				}
 								       				
        										}
        										
        										
        				//tu bedziemy dodawac wartosci insert : 
-       				$sql="select count(*) as ilosc from `".$TABLE."` ;" ;
-
-					DEBUG_S(-3,'SQL: licze czy cos jest w tabeli ',$sql,__FILE__, __FUNCTION__, __LINE__) ;
-
-       				$result=$this->query($sql) or die1('\nProblem z '.$sql);   
+       				//$sql="select count(*) as ilosc from `".$TABLE."` ;" ;
+					//DEBUG_S(-3,'SQL: licze czy cos jest w tabeli ',$sql,__FILE__, __FUNCTION__, __LINE__) ;
+       				//$result=$this->query($sql) or die1('\nProblem z '.$sql);   
        				$ilosc=0;
        						//while($h=mysql_fetch_object($result)) {
        						//	$ilosc=$h->ilosc;
@@ -994,9 +1220,72 @@ class Core_Database_Mysql extends Core_Database {
        										
         			}
 
+
 	}
 
+	function MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table){
+	   		$sql="show tables like '".$table."';";
+	   		DEBUG_S(-3,'SQL',$sql,__FILE__,__FUNCTION__,__LINE__);
+	   			$USERS_COLUMN_INIT2['REQUEST_COLUMN']=array(
+						'ID'=>'int(11) primary key not null auto_increment',
+						'A_RECORD_CREATE_DATE'=>'datetime','A_RECORD_CREATE_AUTHOR'=>'varchar(100)','SYNC_SQIX_STATUS'=>'varchar(100) not null',
+						'A_RECORD_UPDATE_DATE'=>'datetime','A_RECORD_UPDATE_AUTHOR'=>'varchar(100) not null',
+						'L_APPOITMENT_DATE'=>'varchar(30) not null',
+						'L_APPOITMENT_USER'=>"varchar(100) not null",
+						'L_APPOITMENT_PERIOD'=>"varchar(4) not null",
+						'L_APPOITMENT_INFO'=>"varchar(255) not null",
+						'L_APPOITMENT_TYPE'=>"enum('', 'ARRANGED', 'TO_ARRANGE', 'CANCELLED', 'TO_CANCEL', 'RELATE', 'WAIT')",
+						'A_STATUS'=>"enum('WAITING', 'NORMAL', 'MONITOR', 'WARNING', 'OFF_SOFT', 'OFF_HARD', 'DELETED')",
+						'A_STATUS_INFO'=>"varchar(255) not null",
+						'A_ADM_COMPANY'=>'varchar(100) not null','A_CLASSIFIED'=>'varchar(100) not null'
+
+						);
+
+	   		
+			DEBUG_S(-3,'zapytanie',$sql,__FILE__,__FUNCTION__,__LINE__);
+       		$result=self::query($sql) or die1(' Problem ze sql '.$sql);
+					
+       			while($h=self::fetch_array($result)) {
+
+       				$sql="create  table IF NOT EXISTS `".$h[0]."_HIST` (`ID` INT( 11 ) NOT NULL AUTO_INCREMENT , 
+       					  `ID_USERS2` INT( 11 ) NOT NULL , 
+       					  `_action_time`  TIMESTAMP NOT NULL, 
+       					  `_action_type` varchar(16),
+       					  PRIMARY KEY (  `ID` ) , INDEX (  `ID_USERS2` ) )";
+       				DEBUG_S(-3,'create table hist '.$h[0],array($sql),__FILE__,__FUNCTION__,__LINE__);
+       				 self::query($sql) or die1(' Problem ze sql '.$sql);
+					
+					//kolumny z bazy istniejace
+						$sql_="describe  `".$h[0]."`";
+					    $result_=self::query($sql_) or die1(' Problem ze sql '.$sql_);
+						while($h_=self::fetch($result_)) {
+							
+
+							DEBUG_S(-3,'dane z tabeli',$h_,__FILE__,__FUNCTION__,__LINE__);
+							 $sql="\n alter ignore table `".$h[0]."_HIST` add ".$h_->Field." varchar(255) default 'N/S;'  ; " ;
+							 self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+
+						}
+					
+					
+					
+					foreach($USERS_COLUMN_INIT2['REQUEST_COLUMN'] as $tst_column=>$tst_type) {
+						 $sql="\n alter ignore table `".$h[0]."` add ".$tst_column." ".$tst_type."  ; " ;
+	       				 self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+	       				 $sql="\n alter ignore table `".$h[0]."_HIST` add ".$tst_column." varchar(255) default 'N/S;'  ; " ;
+	       				 self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+
+	}
+
+       			    $sql="\n alter ignore table `".$h[0]."_HIST` add `_action_time` TIMESTAMP NOT NULL  after `ID_USERS2` ; " ;       				
+       				 self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+       			     $sql="\n alter ignore table `".$h[0]."_HIST` add `_action_type` varchar(16)  after `_action_time` ; " ;
+	       		     self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+
 
+       			}
+	   	//! IMPORT_SORT_DESC_INFO
+	   }
 
 
 }

+ 874 - 76
SE/se-lib/Core/Database/Pgsql.php

@@ -104,38 +104,563 @@ class Core_Database_Pgsql extends Core_Database {
 	}
 
 	function show_tables($table=null) {
-		$sql="SELECT tablename as \"Tables_in_".$this->getDatabaseName()."\", 'BASE TABLE' as \"Table_type\" FROM pg_catalog.pg_tables  where schemaname='public' ";
-		if(!empty($table)) 	$sql="SELECT tablename as \"Tables_in_".$this->getDatabaseName()."\", 'BASE TABLE' as \"Table_type\" FROM pg_catalog.pg_tables  where schemaname='public' and tablename='".$table."' ";
-		echo $sql;
+		$sql="SELECT table_name as \"Tables_in_".$this->getDatabaseName()."\", table_type as \"Table_type\" FROM information_schema.tables  where table_schema NOT IN ('pg_catalog', 'information_schema'); ";
+		if(!empty($table)) 	$sql="SELECT table_name as \"Tables_in_".$this->getDatabaseName()."\", table_type as \"Table_type\" FROM  information_schema.tables  where table_schema NOT IN ('pg_catalog', 'information_schema') and table_name='".$table."' ";
+		DEBUG_S(-3,$sql,$sql,__FILE__,__FUNCTION__,__LINE__);
 		$res = $this->query($sql);
 		return $res;
 
 	}
 	
+	
+	
+	
 	function describe_table($table) {
 		$sql="select column_name as \"Field\" from INFORMATION_SCHEMA.COLUMNS where table_name = '".$table."'";
-		$res = $this->query($sql);
-		return $res;
+		$sql="SELECT  
+    f.attname AS \"Field\",  
+   
+    
+   -- pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,  
+    
+    CASE 
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'double precision' then 'double(8,2)'
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'smallint' then 'int(11)'
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'integer' then 
+       ( select cast(replace(pg_catalog.format_type(f.atttypid,f.atttypmod), 'integer', 'int(11)') as char(255)) )
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like '%character varying%'   then 
+       ( select cast(replace(pg_catalog.format_type(f.atttypid,f.atttypmod), 'character varying', 'varchar') as char(255)) )
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'timestamp without time zone' then 'datetime'
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'date' then 'date'
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'text' then 'text'
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'real' then 'double'
+
+     when pg_catalog.format_type(f.atttypid,f.atttypmod) like 'geometry(%' then
+       ( select cast( split_part( lower(replace(replace(pg_catalog.format_type(f.atttypid,f.atttypmod), 'geometry(', ''),')','')) , ',',1) as char(255)) )
+
+
+     else ( select  cast(  'enum('''||string_agg(enumlabel,''',''') || ''')' as char(255))
+		FROM pg_enum e
+		JOIN pg_type t ON e.enumtypid = t.oid
+		WHERE t.typname = replace(pg_catalog.format_type(f.atttypid,f.atttypmod ),'\"','' )  ) 
+    END as \"Type\" ,
+
+    CASE f.attnotnull
+	WHEN  't' THEN 'NO'
+	WHEN  'f' THEN 'YES'
+    END AS \"Null\",
+
+    CASE  
+        WHEN p.contype='p' THEN 'PRI'  
+        ELSE ''  
+    END AS Key,  
+   -- CASE  
+   --     WHEN p.contype = 'u' THEN 't'  
+   --     ELSE 'f'
+   -- END AS uniquekey,
+  --  CASE
+  --      WHEN p.contype = 'f' THEN g.relname
+  --  END AS foreignkey,
+  --  CASE
+  --      WHEN p.contype = 'f' THEN p.confkey
+  --  END AS foreignkey_fieldnum,
+  --  CASE
+  --      WHEN p.contype = 'f' THEN g.relname
+  --  END AS foreignkey,
+  --  CASE
+  --      WHEN p.contype = 'f' THEN p.conkey
+  --  END AS foreignkey_connnum,
+   CASE
+	WHEN f.atthasdef = 'n' THEN ''
+	WHEN f.atthasdef = 't' AND d.adsrc like 'nextval(%' THEN ''
+        WHEN f.atthasdef = 't' THEN d.adsrc
+    END AS default,
+    CASE
+	
+	WHEN f.atthasdef = 't' AND d.adsrc like 'nextval(%' THEN 'auto_increment'
+       
+    END AS Extra
+FROM pg_attribute f  
+    JOIN pg_class c ON c.oid = f.attrelid  
+    JOIN pg_type t ON t.oid = f.atttypid  
+    LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
+    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
+    LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
+    LEFT JOIN pg_class AS g ON p.confrelid = g.oid   
+WHERE c.relkind = 'r'::char  
+    AND n.nspname = 'public'  -- Replace with Schema name  
+    AND c.relname = '".$table."'  -- Replace with table name  
+    AND f.attnum > 0 
+    -- ORDER BY number
+;
+";
+		
+	//	echo "<pre>".$sql."</pre>";
+		$result = $this->query($sql) or self::die1('\nProblem z '.$sql);
+		DEBUG_S(-3,'describe table '.$table,array($sql,$res,$this->num_rows),__FILE__,__FUNCTION__,__LINE__);
+		
+		return $result;
+	}
+	
+	
+	
+	function describe_table_value($table) {
+		
+		$res = self::describe_table($table);
+		while($h=self::fetch($res)) {
+			$result[$h->Field]=$h;
+		}
+		return $result;
 	}
 	
 	
+	function show_index($table,$only_primary_flag=false) {
+		$sql="select table_name  as \"Table\"  
+      ,case  string_agg( cast( indisunique as char(255) ) ,'') 
+	when 'true' then '0'
+	else '1'
+      END as \"Non_unique\"
+
+     , CASE string_agg( cast( indisprimary as char(255) ) ,'')   
+       when 'true' then 'PRIMARY'
+       else column_name
+      END as \"Key_name\"
+
+      , CASE string_agg( cast( indisprimary as char(255) ) ,'')   
+       when 'true' then 'PRIMARY'
+       -- else cast(string_agg(index_name) as char(255))
+      END
+      ,column_name as \"Column_name\"
+  
+from (
+    select
+        t.relname as table_name,
+        i.relname as index_name,
+        a.attname as column_name,
+        ix.indnatts as indnatts,
+        unnest(ix.indkey) as unn,
+        a.attnum,
+        ix.indisunique as indisunique,
+        ix.indisprimary as indisprimary
+        ,ix.indkey
+        ,a.attrelid
+        ,i.oid
+    from
+        pg_class t,
+        pg_class i,
+        pg_index ix,
+        pg_attribute a
+    where
+        t.oid = ix.indrelid
+        and i.oid = ix.indexrelid
+        and a.attrelid = t.oid
+        and a.attnum = ANY(ix.indkey)
+        and t.relkind = 'r'
+       -- and t.relnamespace = 10
+        and t.relname = '".$table."'
+        ";
+        if($only_primary_flag) $sql.=" and ix.indisprimary is true ";
+        $sql.="
+    order by
+        t.relname,
+        i.relname
+        , generate_subscripts(ix.indkey,1)) sb
+where unn = attnum
+	group by table_name,column_name
+-- group by index_name
+";
+	DEBUG_S(-3,'Show index',array($sql),__FILE__,__FUNCTION__,__LINE__);
+	$res = $this->query($sql) or self::die1('\nProblem z '.$sql);
+	return $res;
+	
+	}
+	
+	function show_index_value($table) {
+		$res=self::show_index($table,true);
+		while($h=self::fetch($res)) {
+			return $h->Column_name;
+		}
+	}
+	
+	
+	function die1($txt) {
+		DEBUG_S(-3,'Died',$txt,__FILE__,__FUNCTION__,__LINE__);
+		die();
+		
+	}
+	function show_triggers($table) {
+		$sql="SELECT 
+trigger_name as \"Trigger\"
+,event_manipulation as \"Event\"
+
+,event_object_table as \"Table\"
+
+,action_statement as \"Statement\"
+,action_timing as \"Timing\"
+FROM information_schema.triggers 
+ WHERE event_object_table='".$table."' 
+ ORDER BY event_object_table,event_manipulation";
+ 	DEBUG_S(-3,'Show triggers',array($sql),__FILE__,__FUNCTION__,__LINE__);
+	$res = $this->query($sql) or self::die1('\nProblem z '.$sql);
+	return $res;
+	
+	}
+	
+	function show_create_trigger($table,$trigger) {
+	$sql="SELECT 
+	trigger_name as \"Trigger\"
+	
+	,action_statement as \"SQL Original Statement\"
+	-- ,action_timing as \"Timing\"
+	-- character_set_client=utf8
+	-- collation_connection=utf8_general_ci
+	-- Database Collation=latin2_general_ci
+
+	FROM information_schema.triggers 
+	WHERE trigger_name='".$trigger."' and event_object_table='".$table."'
+	ORDER BY event_object_table,event_manipulation";
+ 	DEBUG_S(-3,'Show triggers',array($sql),__FILE__,__FUNCTION__,__LINE__);
+	$res = $this->query($sql) or self::die1('\nProblem z '.$sql);
+	return $res;
+
+	} 
+	
 	function from_mysql_struct($type) {
 		
 		if(strstr($type, 'int(')  ) return 'integer';
+		else if(strstr($type, 'double')  ) return 'double precision';
 		else if(strstr($type, 'varchar(')  ) return $type;
-		else if(strstr($type, 'enum(')  ) return 'text'; //todo 
+		else if(strstr($type, 'char(')  ) return $type;
+		else if(strstr($type, 'enum(')  ) return $type; //todo 
 		else if(strstr($type, 'text')  ) return $type;
+		else if(strstr($type, 'datetime')  ) return 'TIMESTAMP';
 		else if(strstr($type, 'date')  ) return 'date';
 		else if(strstr($type, 'polygon')  ) return 'geometry(Polygon)';
 		else if(strstr($type, 'linestring')  ) return 'geometry(linestring)';
 		else if(strstr($type, 'point')  ) return 'geometry(point)';
+		else if(strstr($type, 'timestamp')  ) return 'timestamp';
 
 	    else die('(TODO)Unknowns transl struct:'.$type);
 
 	}
+	//used mainly to translate enum values
+	function alter_add_struct($table,$column,$type) {
+
+
+		if(strstr($type, "enum('")) {
+			$sql="DROP TYPE IF EXISTS  \"".$table."_".$column."\"";
+			self::query($sql) or die1($sql);
+			$sql="CREATE TYPE \"".$table."_".$column."\" AS ".$type;
+			self::query($sql) or die1($sql);
+			$sql='alter table "'.$table.'" add "'.$column.'" "'.$table.'_'.$column.'"';
+			self::query($sql) or die1($sql);
+		} 	else if(strstr($type, "datetime('")) {
+			$sql='alter table "'.$table.'" add "'.$column.'" timestamp without time zone ';
+			self::query($sql) or die1($sql);
+		} else {
+			$sql='alter table "'.$table.'" add "'.$column.'" '.$type;
+			self::query($sql) or die1($sql);
+		}
+		
+		if(strstr($type, "linestring'")) {
+			$sql="SELECT UpdateGeometrySRID('".$table."','".$column."',4326);";
+			self::query($sql) or die1($sql);
+		} else  if(strstr($type, "polygon'")) {
+			$sql="SELECT UpdateGeometrySRID('".$table."','".$column."',4326);";
+			self::query($sql) or die1($sql);
+		} else  if(strstr($type, "multipoint'")) {
+			$sql="SELECT UpdateGeometrySRID('".$table."','".$column."',4326);";
+			self::query($sql) or die1($sql);
+		}
+		
+	}
+	
+	
+	/** Returns formated array to parse it to SQL (especialy to get GIS data to keep as WKT)
+	  *
+	  */	  
+
+	function GET_DB_OBJ_cols($table) {
+				$structure=self::describe_table_value($table);
+				foreach($structure as $Field=>$Struct) {
+						//echo $Struct->Type;
+						if((strstr($Struct->Type,"multipoint") )||strstr($Struct->Type,"linestring") ||strstr($Struct->Type,"polygon"))
+						 $col[]=' ST_AsText("'.$Field.'") as "'.$Field.'"';
+						else $col[]='"'.$Field.'"';
+				}	
+				return $col;
+	}
 	
 	
-	function STRUCTURE_GENERATE_PARSE($config_base_structure_unserialized) {
+	function get_by_data_column($table,$date_column,$timestamp,$now,$remote_key) {
+		$structure=self::describe_table_value($table);
+		if(strlen($timestamp)==0) $timestamp='0';
+		DEBUG_S(-3,'Struct',$structure,__FILE__,__FUNCTION__,__LINE__);
+
+					$col=self::GET_DB_OBJ_cols($table);
+				
+		$sql='Select '.implode(',', $col).' from "'.$table.'" where  extract(epoch from "'.$date_column.'") > '.$timestamp.' and extract(epoch from "'.$date_column.'") < '.$now;
+			//if(empty($timestamp)) 
+			$sql.=' or "'.$date_column.'" is null';	
+			$sql.=' or "'.$remote_key.'" < 0 ';		
+		//	$sql.=' or "'.$remote_key.'"=\'\'';		
+
+		DEBUG_S(-3,'biore dane ',$sql,__FILE__,__FUNCTION__,__LINE__);
+		$res=self::query($sql) or die1($sql);
+		return $res;
+	}
+	
+	
+	function get_current_time() {
+		self::query("set timezone to 'UTC'");
+
+		$sql=" select extract(epoch from   now() at time zone 'utc') as time"; // bo nie dziala  extract( epoch from CURRENT_TIMESTAMP  at time zone 'UTC') 
+		$res=self::query($sql);
+		while($h=self::fetch($res)) {
+			return $h->time;
+		}
+	}
+	function get_current_timestamp() {
+		self::query("set timezone to 'UTC'"); //TODO jakas glupota nie dziala extract( epoch from CURRENT_TIMESTAMP  at time zone 'UTC') 
+		$sql=" select  now() at time zone 'utc' as time ";
+		$res=self::query($sql);
+		while($h=self::fetch($res)) {
+			return $h->time;
+		}
+	}
+	
+	function set_last_sync_date($table,$now,$remote_db_id,$local_db_id,$timestamp_column='A_RECORD_UPDATE_DATE') {
+		$sql="insert  into \"_SYNC_DATABASE_TABLE_STATE\" ( \"TABLE_NAME\", \"LAST_SYNCED\" , \"DATABASE_SYNCED_ID\" , \"DATABASE_LOCAL_ID\" )
+		values ('".$table."' , TIMESTAMP  WITH TIME ZONE 'epoch' + ".$now." * INTERVAL '1 second' , '".$remote_db_id."' , '".$local_db_id."')";
+		DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		self::query($sql);
+		$sql="update  _SYNC_DATABASE_TABLE_STATE set  LAST_SYNCED=from_unixtime('".$now."') where TABLE_NAME='".$table."' 
+			and DATABASE_SYNCED_ID='".$remote_db_id."' and DATABASE_LOCAL_ID='".$local_db_id."' ";
+		$sql_c="update \"".$table."\" set \"".$timestamp_column."\"=TIMESTAMP  WITH TIME ZONE 'epoch' + ".$now." * INTERVAL '1 second' where \"".$timestamp_column."\" is null ";
+	    self::query($sql_c) or die('315Problem z '.$sql_c);
+
+		DEBUG_S(-3,'update sync date',array($sql,$sql_c),__FILE__,__FUNCTION__,__LINE__);
+	}
+	
+	function get_last_sync_date($table,$remote_db_id,$local_db_id) {
+		$sql="select \"TABLE_NAME\", extract(epoch from \"LAST_SYNCED\" at time zone 'utc') as \"LAST_SYNCED\" from \"_SYNC_DATABASE_TABLE_STATE\" 
+		where \"DATABASE_SYNCED_ID\"='".$remote_db_id."' and \"DATABASE_LOCAL_ID\"='".$local_db_id."' and \"TABLE_NAME\"='".$table."'
+		order by \"ID\" desc limit 1
+		";
+		$res=self::query($sql);
+		DEBUG_S(-3,'Get date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		while($h=self::fetch($res)) {
+			return $h->LAST_SYNCED;
+			
+		}
+		return 0;
+	}
+
+
+	/** Use it before pasting obj to UPDATE_OBJ or ADD_NEW_OBJ to maintain GIS data especially
+	 *
+	 */
+	
+	function MAKE_DB_OBJ($table,$obj) {
+		$structure=self::describe_table_value($table); //todo to cache optimize
+		
+		foreach(get_object_vars($obj) as $k=>$v) {
+			if(trim($structure[$k]->Type)=='multipoint') {
+				if(empty($v)) $v='null';
+				else $v = "ST_GeomFromText('".$v."',4326)";
+			} else  if(trim($structure[$k]->Type)=='linestring') {
+				if(empty($v)) $v='null';
+				else $v = "ST_GeomFromText('".$v."',4326)";
+			} else if(trim($structure[$k]->Type)=='polygon') {
+				if(empty($v)) $v='null';
+				else $v = "ST_GeomFromText('".$v."',4326)"; 
+			} else if(trim($structure[$k]->Type)=='multipolygon') {
+				if(empty($v)) $v='null';
+				else $v = "ST_GeomFromText('".$v."',4326)";
+			} else if(trim($structure[$k]->Type)=='datetime') {
+				if(empty($v)) continue;
+				if($v=='0000-00-00 00:00:00') continue;
+			} else if(strstr($structure[$k]->Type,'double')) {
+				if(empty($v)) continue;
+			} else if(trim($structure[$k]->Type)=='date') {
+				if(empty($v)) continue;
+				if($v=='0000-00-00') continue;
+			} else if(strstr(trim($structure[$k]->Type),'enum(')) {
+				if(empty($v)) continue;
+			}
+			
+			
+			$obj_ret->$k=$v;
+				
+		}
+		
+		DEBUG_S(-3,'objs',array($obj,$obj_ret),__FILE__,__FUNCTION__,__LINE__);
+
+		return $obj_ret;
+	}
+
+	
+		function STRUCTURE_GENERATE($TABLES,$null=null,$TABLES_STRUCTURE_DATA,$flags=array()){
+   				DEBUG_S(-3,'flags',$flags,__FILE__,__FUNCTION__,__LINE__);
+   				//global $this;
+   				//! try to create info for functions and procedures -> ['__SCHEMA_FUNCTIONS__ARRAY__']
+   			/*
+   				$sql="show function status where Db='".$this->getDatabaseName()."';";
+   					DEBUG_S(-3,'sql function detail :: ',$sql,__FILE__,__FUNCTION__,__LINE__)	 ;
+   				$result=$this->query($sql) or self::die1('\nProblem z '.$sql);       				
+   				while($h=mysql_fetch_object($result)) {	
+   					$sql_="show create function `{$h->Name}`" ;
+   					DEBUG_S(-3,'sql function detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__)	 ;
+   					$result_=$this->query($sql_) or self::die1('\nProblem z '.$sql);       			
+   					while($h_=mysql_fetch_object($result_)) {	
+   					$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__']['FUNCTION'][$h->Name]=$h_;
+   					}
+	   			}
+	   			
+	   			*/
+	   			
+	   			/*
+	   			$sql="show PROCEDURE status where Db='".$this->getDatabaseName()."';";
+   			   	DEBUG_S(-3,'sql function detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__)	 ;
+   				$result=$this->query($sql) or self::die1('\nProblem z '.$sql);       				
+   				while($h=mysql_fetch_object($result)) {	
+   					$sql_="show create PROCEDURE `{$h->Name}`" ;
+   					DEBUG_S(-3,'sql PROCEDURE detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__)	 ;
+   					$result_=$this->query($sql_) or self::die1('\nProblem z '.$sql);       			
+   					while($h_=mysql_fetch_object($result_)) {	
+   					$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__']['PROCEDURE'][$h->Name]=$h_;
+   					}
+	   			}
+	   				DEBUG_S(-3,'struktury funkcji: __SCHEMA_FUNCTIONS__ARRAY__ ',$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__'],__FILE__,__FUNCTION__,__LINE__)	 ;
+   				//self::die1('stop function during dev.');
+   				*/
+		       		foreach($TABLES as $TABLE ){
+		       				
+		       				//$sql="show tables like   '".$TABLE."' ;" ;
+		       				DEBUG_S(-3,'//! Listing possible tables to write to config',$TABLE,__FILE__,__FUNCTION__,__LINE__);
+		       				$result=$this->show_tables($TABLE) or self::die1('\nProblem z '.$sql);      
+
+		       				if($this->num_rows($result)==0) {
+
+		       				// nie ma tabeli - trzeba zapisac
+		       				DEBUG_S(-3," BRAK TABELI ".$TABLE,null,__FILE__,__FUNCTION__,__LINE__);
+		       				//self::die1();
+		       				if(isset($TABLES_IMPORT[$TABLE])) {
+			       				DEBUG_S(-3," Table already imported - problem in twice declared table ".$TABLE,null,__FILE__,__FUNCTION__,__LINE__);	
+			       				self::die1();
+		       				}
+
+
+		       				} else {
+		       				
+		       						DEBUG_S(-3,'We found rows'.$this->num_rows($result),$TABLE,__FILE__,__FUNCTION__,__LINE__);
+		       						//$sql="show full tables like   '".$TABLE."' ;" ;
+			   						//$result=$this->query($sql) or self::die1('\nProblem z '.$sql);     
+			   						$result=$this->show_tables($TABLE);
+			   						while($h=$this->fetch($result)) {		       				
+				   						$TABLES_IMPORT[$TABLE]['Table_type']=$h->{'Table_type'};
+				       					DEBUG_S(-3,'//! Reading to conf if table is WIEV or not :sql/result',$h->{'Table_type'},__FILE__,__FUNCTION__,__LINE__);
+					   				}
+					   				
+					   				$FLAG_CONTABLE=false;
+		       				
+					   				if( ($TABLES_IMPORT[$TABLE]['Table_type']=='BASE TABLE')
+					   					|| ( in_array('with_view', $flags) && $TABLES_IMPORT[$TABLE]['Table_type']=='VIEW' )
+					   				) {
+				       						$FLAG_CONTABLE=true;
+						       				//$sql=" describe  `".$TABLE."` ;" ;
+						       				//echo "\n ".$sql;
+							   				// 	$result=$this->query($sql) or self::die1('\nProblem z '.$sql);
+						       				$result=$this->describe_table($TABLE);
+						       				while($h=$this->fetch($result)) {		
+						       					//echo "found ";       				
+						       					$TABLES_IMPORT[$TABLE]['FIELDS'][]=$h;
+						       				}
+						       			    //$sql=" show index from  `".$TABLE."` ;" ;
+				       				       	//$result=$this->query($sql) or self::die1('\nProblem z '.$sql);
+				       				       	$result=self::show_index($TABLE);
+											$TMP_KEYNAME=array();
+						       						while($h=self::fetch($result)) {		
+							       						if(isset($h->Column_name)) { $h->Column_name="`".$h->Column_name."`";       				
+														if(!isset($TMP_KEYNAME[$h->Key_name])) $TMP_KEYNAME[$h->Key_name]=$h->Column_name;
+														else $TMP_KEYNAME[$h->Key_name].=",".$h->Column_name;
+														}
+														//if(isset($TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name])) {
+														//   $TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]->Column_name.=", ".$h->Column_name." ";
+														//} else {
+														//}
+														$TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]=$h;
+														$TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]->Column_name=$TMP_KEYNAME[$h->Key_name];	
+													}
+						       				if(in_array($TABLE,$TABLES_STRUCTURE_DATA)) { //bedziemy dodawac dane tej tabeli
+						       					 $sql=" select  * from  `".$TABLE."` ;" ;
+				       				       		 $result=$this->query($sql) or self::die1('\nProblem z '.$sql);
+				       				       		 while($h=self::fetch($result)) {
+						       					 	$TABLES_IMPORT[$TABLE]['VALUES'][]=$h;
+						       					 }
+						       				}
+				
+						       				DEBUG_S(-3,"Dane tabeli KOMORKI ".$TABLE." ",$TABLES_IMPORT[$TABLE]['FIELDS'],__FILE__, __FUNCTION__, __LINE__);
+						       				DEBUG_S(-3,"Dane tabeli INDEKSY ".$TABLE." ",$TABLES_IMPORT[$TABLE]['INDEX'],__FILE__, __FUNCTION__, __LINE__);
+						       				if(isset($TABLES_IMPORT[$TABLE]['VALUES'])) DEBUG_S(-3,"Dane tabeli VALUES ".$TABLE." ",$TABLES_IMPORT[$TABLE]['VALUES'],__FILE__, __FUNCTION__, __LINE__);
+							   				
+							   				//! reading triggers to conf -> $TABLES_IMPORT[$TABLE]['TRIGGERS']
+							   			    //$sql=" show triggers like '".$TABLE."' ;" ;
+				       				       	//$result=$this->query($sql) or self::die1('\nProblem z '.$sql);
+						       				$result=self::show_triggers($TABLE);
+						       				
+						       				
+						       				while($h=self::fetch($result)) {		
+						       					// $sql_="show create trigger {$h->Trigger} ;" ;
+							   					// echo $sql_;
+		    		       				        // $result_=$this->query($sql_) or self::die1('\nProblem z '.$sql_);	
+		    		       				        $result_=self::show_create_trigger($TABLE,$h->Trigger);
+		    		       				         while($h_=self::fetch($result_)) {			       					 
+							   					  DEBUG_S(-3,"Dane tabeli h_ ".$TABLE." ",$h_,__FILE__, __FUNCTION__, __LINE__);
+						       					  $TABLES_IMPORT[$TABLE]['TRIGGERS'][$h->Trigger]=$h_; 
+						       					 }
+								   			}
+								   			if(isset($TABLES_IMPORT[$TABLE]['TRIGGERS'])) DEBUG_S(-3,"Dane tabeli TRIGGERS ".$TABLE." ",$TABLES_IMPORT[$TABLE]['TRIGGERS'],__FILE__, __FUNCTION__, __LINE__);
+		
+						       			} 
+						       			if(($TABLES_IMPORT[$TABLE]['Table_type']=='VIEW')) {
+								   			 $FLAG_CONTABLE=true;
+							       			 $sql_="show create view `{$TABLE}` ;" ;
+							   					 //echo $sql_;
+		    		       				         $result_=$this->query($sql_) or self::die1('\nProblem z '.$sql_);	
+		    		       				         while($h_=self::fetch($result_)) {			       					 
+							   					  DEBUG_S(-3,"//! trying to fetch create view fom".$TABLE." sql/res",array($sql_,$h_),__FILE__, __FUNCTION__, __LINE__);
+						       					  $TABLES_IMPORT[$TABLE]['VIEW']=$h_; 
+						       					 }
+							       			
+						       			} if(!$FLAG_CONTABLE) { 
+						       			  DEBUG_S(-3,"Unknown table type ! ".$TABLE." ".$TABLES_IMPORT[$TABLE]['Table_type'],$TABLES_IMPORT[$TABLE],__FILE__, __FUNCTION__, __LINE__);
+						       			  self::die1();
+						       			}
+				       			    	
+						   			}
+		            }
+		            //print_r($TABLES_IMPORT);
+		           
+		           if(!function_exists('func_sort_tables_import')) {
+		            	function func_sort_tables_import($a,$b){
+		               	if($a['Table_type']==$b['Table_type']) return 0;
+		               	else if($a['Table_type']=='VIEW') return 1;
+		               	else return -1;
+					   }
+                     }
+		           
+		           
+                           
+                           uasort($TABLES_IMPORT,'func_sort_tables_import');
+		                                                                                                                                                         
+		           DEBUG_S(-3,'Wygenerowane struktury (TABLES_IMPORT)',$TABLES_IMPORT,__FILE__,__FUNCTION__,__LINE__); 
+		           return($TABLES_IMPORT);
+       }
+	
+	
+	
+	function STRUCTURE_GENERATE_PARSE($config_base_structure_unserialized,$options=array()) {
 		
 		
 		//budowa struktur w bazie
@@ -148,6 +673,10 @@ class Core_Database_Pgsql extends Core_Database {
 					//! try to sync __SCHEMA_FUNCTIONS__ARRAY__
 					// triggers sync disabled 
 					/* 
+					if(in_array('SKIP-PROCEDURE', $options)) { 
+							DEBUG_S(-3,'SKIP-PROCEDURES option',null,__FILE__,__FUNCTION__,__LINE__);
+							continue;
+						}
 					if($TABLE=='__SCHEMA_FUNCTIONS__ARRAY__') {	
 						DEBUG_S(-3,'Try to synchronize functions and procedures',$ARR_TABLE,__FILE__,__FUNCTION__,__LINE__);
 
@@ -307,8 +836,12 @@ class Core_Database_Pgsql extends Core_Database {
 		       										//DEBUG_S(-3,"\n BRAK TABELI  dodajemy : ".$TABLE."!!!",null,__FILE__,__FUNCTION__,__LINE__);
 		       									
 		       										// $sql="create table ".$TABLE." ( ".$ARR_TABLE['FIELDS'][0]->Field." ".$ARR_TABLE['FIELDS'][0]->Type ; //  ID int(11) NOT NULL AUTO_INCREMENT,
-													$sql="create table \"".$TABLE."\" ( \"".$ARR_TABLE['FIELDS'][0]->Field."\" ".$this->from_mysql_struct($ARR_TABLE['FIELDS'][0]->Type) ; //  ID int(11) NOT NULL AUTO_INCREMENT,
-
+													if(trim($ARR_TABLE['FIELDS'][0]->Extra)=='auto_increment') {
+														if(in_array('SKIP-PRIMARY-KEY', $options)) {
+															$sql="create table \"".$TABLE."\" ( \"id_".$options['getDB']."\" serial  
+															, CONSTRAINT \"".$TABLE."_pkey\" PRIMARY KEY (\"id_".$options['getDB']."\")" ;
+														} else	$sql="create table \"".$TABLE."\" ( \"".$ARR_TABLE['FIELDS'][0]->Field."\" serial " ; //  ID int(11) NOT NULL AUTO_INCREMENT,
+													} else $sql="create table \"".$TABLE."\" ( \"".$ARR_TABLE['FIELDS'][0]->Field."\" ".$this->from_mysql_struct($ARR_TABLE['FIELDS'][0]->Type) ; //  ID int(11) NOT NULL AUTO_INCREMENT,
 														// if($ARR_TABLE['FIELDS'][0]->Null=='NO') $sql.=" not null "; else $sql.=" null ";
 														 //if($ARR_TABLE['FIELDS'][0]->Extra=='auto_increment') $sql.=" AUTO_INCREMENT "; else $sql.="  ";
 														//$sql.=" )  DEFAULT CHARSET=latin2  ";
@@ -339,7 +872,7 @@ class Core_Database_Pgsql extends Core_Database {
 					       									$sql_="show create view `{$TABLE}` ;" ;
 						   									echo $sql_;
 						   									$result_=$this->query($sql_) or die('\nProblem z '.$sql_);	
-						   									while($h_=mysql_fetch_object($result_)) {			       					 
+						   									while($h_=self::fetch($result_)) {			       					 
 							   									DEBUG_S(-3,"//! get current view info ".$TABLE." sql/res",array($sql_,$h_),__FILE__, __FUNCTION__, __LINE__);
 							   									$FIELDS_CHECKED['VIEW']=$h_; 
 							   								}
@@ -379,7 +912,7 @@ class Core_Database_Pgsql extends Core_Database {
 								       				DEBUG_S(-3,'FIELDS_CHECKED',$FIELDS_CHECKED,__FILE__, __FUNCTION__, __LINE__) ;
 								       				$var_passed=false;
 								       				while($h=$this->fetch($result)) {	
-								       				print_r($h);	       				
+								       				
 								       					//tu sprawdzamy czy sa wszystkie kolumny i maja takie same typy
 								       					$FIELDS_CHECKED['FIELD_FROM_DB'][$h->Field]=1;
 								       						if(!isset($FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_EXISTS'][$h->Field])) {
@@ -416,17 +949,18 @@ class Core_Database_Pgsql extends Core_Database {
 								       								
 								       								// $sql="create table ".$TABLE." ( ".$ARR_TABLE['FIELDS'][0]->Field." ".$ARR_TABLE['FIELDS'][0]->Type ; //  ID int(11) NOT NULL AUTO_INCREMENT,
 																 //if($ARR_TABLE['FIELDS'][0]->Extra=='auto_increment') $sql.=" AUTO_INCREMENT "; else $sql.="  ";
-								       								$sql="alter table \"".$TABLE."\" add \"".$FIELD_TO_ADD."\" ".$this->from_mysql_struct($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type)." ";
-								       								if(($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default)) {
+								       							//*	$sql="alter table \"".$TABLE."\" add \"".$FIELD_TO_ADD."\" ".$this->from_mysql_struct($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type)." ";
+								       								self::alter_add_struct($TABLE,$FIELD_TO_ADD,$this->from_mysql_struct($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type));
+								       								//if(($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default)) {
 								       								///  if(($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='NULL')||($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='CURRENT_TIMESTAMP'))
 								       								///	 $sql.=" DEFAULT ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default." ";//   (".$INDEX_OF_CONFIG_TABLE.")";
 								       								///	else $sql.=" DEFAULT '".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default."' ";//   (".$INDEX_OF_CONFIG_TABLE.")";
-								       									 }
+								       								//	 }
 								       							    /// TODO !!! if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null=='NO') $sql.=" not null "; else $sql.=" null ";
-								       							    $sql.=" null ";
-								       							    $sql.=" ;";
-								       								echo "\n ".$sql;
-								       							 $this->query($sql) or  DEBUG_S(-3,'Problem z sql',$sql,__FILE__, __FUNCTION__, __LINE__)  or die();
+								       							//    $sql.=" null ";
+								       							//    $sql.=" ;";
+								       							//	echo "\n ".$sql;
+								       							// $this->query($sql) or  DEBUG_S(-3,'Problem z sql',$sql,__FILE__, __FUNCTION__, __LINE__)  or die();
 
 								       								
 								       						}
@@ -439,7 +973,7 @@ class Core_Database_Pgsql extends Core_Database {
 								       				$result=$this->describe_table($TABLE) or die('\nProblem z '.$sql);
 
 								       				//$result=$this->query($sql) or die('\nProblem z '.$sql);
-								       				while($h=mysql_fetch_object($result)) {		       				
+								       				while($h=self::fetch($result)) {		       				
 								       				set_time_limit(36000);       				
 														$FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'][$h->Field]=$h;
 
@@ -449,7 +983,7 @@ class Core_Database_Pgsql extends Core_Database {
 								       						foreach($FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'] as $FIELD_TO_CHK=>$VAL) {
 								       									if(isset($INDEX_OF_CONFIG_TABLE)) unset($INDEX_OF_CONFIG_TABLE);
 								       								foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //trzeba znalezc numer ID indeksu brakujacej komorki
-								       									if($TST_VAL->Field==$FIELD_TO_CHK) $INDEX_OF_CONFIG_TABLE=$TSTIND;
+								       									if(trim($TST_VAL->Field)==trim($FIELD_TO_CHK)) $INDEX_OF_CONFIG_TABLE=$TSTIND;
 								       								}
 								       								if(isset($FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_NOT_EXISTS'][$FIELD_TO_CHK])) continue; //jezeli komorki nie ma i jest tylko lokalnie - ignorujemy!
 								       								// to jakis glupi warunek ?
@@ -457,14 +991,14 @@ class Core_Database_Pgsql extends Core_Database {
 								       							//	echo "\nsprawdzamy wszystkie wlasciwosci dla db ".$TABLE." ".$FIELD_TO_CHK." col ".$INDEX_OF_CONFIG_TABLE;
 																	$CHK_TYPES_ARS=array('Type','Null','Default');
 																	$sql="";
-																//	 echo "\n if ".$VAL->Type." =? ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type ;
-																	if($VAL->Type!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) {
+																	// echo "\n if ".var_dump($VAL->Type)." =? ".var_dump($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) ;
+																	if(!strcmp(trim($VAL->Type),trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type))) {
 																	 //!  aktualizujemy typy
-																	 	  $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
+																	 	  $sql=" alter table \"".$TABLE."\" ALTER COLUMN \"".$FIELD_TO_CHK."\" ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
 
-																	      if(strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'char(')&& strstr($VAL->Type, 'char(')){
-																		      $src_char_len=ereg_replace('[^0-9]', '',$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type ); 
-																		      $dst_char_len=ereg_replace('[^0-9]', '',$VAL->Type );
+																	      if(strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'char(')&& strstr(trim($VAL->Type), 'char(')){
+																		      $src_char_len=ereg_replace('[^0-9]', '',trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) ); 
+																		      $dst_char_len=ereg_replace('[^0-9]', '',trim($VAL->Type) );
 
 																		      if($src_char_len>$dst_char_len) {  
 																		      	  DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola CHAR : CUR_CHAR_LEN ='.$src_char_len." and dest=".$dst_char_len ,$sql,__FILE__, __FUNCTION__, __LINE__);
@@ -474,10 +1008,10 @@ class Core_Database_Pgsql extends Core_Database {
 																			         DEBUG_S(-3,'celowe pominiecie - aktualizacja moze skasowac dane w bazie!!! :',$sql,__FILE__, __FUNCTION__, __LINE__);
 																					// die();  
 																		      }
-																	      } else if(strstr($VAL->Type, 'enum(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'enum('  )) { //jezeli zmienia sie ENUM na inne ENUM
+																	      } else if(strstr(trim($VAL->Type), 'enum(') && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'enum('  )) { //jezeli zmienia sie ENUM na inne ENUM
 																	      
-																		  	  preg_match('/^enum\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
-																			  preg_match('/^enum\((.*)\)$/', $VAL->Type, $dst_char_len);
+																		  	  preg_match('/^enum\((.*)\)$/', trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), $src_char_len);
+																			  preg_match('/^enum\((.*)\)$/', trim($VAL->Type), $dst_char_len);
 																			  
 																			  $src_char_len=explode(',', $src_char_len[1]);$dst_char_len=explode(',', $dst_char_len[1]);
 																			  foreach($src_char_len as $var) {
@@ -485,16 +1019,16 @@ class Core_Database_Pgsql extends Core_Database {
 																				  
 																			  } 
 																			  $dst_char_len="enum(".implode(",", $dst_char_len).")";
- 																	 	      $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$dst_char_len." ; ";
+ 																	 	      $sql=" alter table \"".$TABLE."\" CHANGE \"".$FIELD_TO_CHK."\" \"".$FIELD_TO_CHK."\" ".$dst_char_len." ; ";
 
 																	          DEBUG_S(-3,'Uzupelniamy strukture o ewentualnie brakujace elementy (sql,wynik polaczenia,import.strukt.,akt_strukt.)',array($sql,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type,$VAL->Type),__FILE__, __FUNCTION__, __LINE__);
 																		   	  
 																		   	  if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die('\nProblem z '.$sql);
 																	      
-																	      } else if(strstr($VAL->Type, 'set(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'set('  )) { //jezeli zmienia sie ENUM na inne ENUM
+																	      } else if(strstr(trim($VAL->Type), 'set(') && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'set('  )) { //jezeli zmienia sie ENUM na inne ENUM
 																	      
-																		  	  preg_match('/^set\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
-																			  preg_match('/^set\((.*)\)$/', $VAL->Type, $dst_char_len);
+																		  	  preg_match('/^set\((.*)\)$/', trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), $src_char_len);
+																			  preg_match('/^set\((.*)\)$/', trim($VAL->Type), $dst_char_len);
 																			  
 																			  $src_char_len=explode(',', $src_char_len[1]);$dst_char_len=explode(',', $dst_char_len[1]);
 																			  foreach($src_char_len as $var) {
@@ -502,31 +1036,32 @@ class Core_Database_Pgsql extends Core_Database {
 																				  
 																			  } 
 																			  $dst_char_len="set(".implode(",", $dst_char_len).")";
- 																	 	      $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$dst_char_len." ; ";
+ 																	 	      $sql=" alter table \"".$TABLE."\" CHANGE \"".$FIELD_TO_CHK."\" \"".$FIELD_TO_CHK."\" ".$dst_char_len." ; ";
 
 																	          DEBUG_S(-3,'Uzupelniamy strukture o ewentualnie brakujace elementy (sql,wynik polaczenia,import.strukt.,akt_strukt.)',array($sql,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type,$VAL->Type),__FILE__, __FUNCTION__, __LINE__);
 																		   	  if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die('\nProblem z '.$sql);
 																	      
-																	      } else if(strstr($VAL->Type, 'int(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'int('  )) {
+																	      } else if(strstr(trim($VAL->Type), 'int(') && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'int('  )) {
+																	          DEBUG_S(-3,'Te same typy INT',array($VAL->Type,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type),__FILE__,__FUNCTION__,__LINE__);
 																	          preg_match('/^int\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
 																			  preg_match('/^int\((.*)\)$/', $VAL->Type, $dst_char_len);
 																			  if($src_char_len[1]>$dst_char_len[1]) {
-																			      $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
+																			      $sql=" alter table \"".$TABLE."\" ALTER COLUMN \"".$FIELD_TO_CHK."\" type ".self::from_mysql_struct($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type)." ; ";
 																				  DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
 																				 // if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die('\nProblem z '.$sql);
 																			  } else {
 																				  DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
 																			  }
 																	      
-																	      } else if( ( strstr($VAL->Type, 'char(') || strstr($VAL->Type, 'varchar(')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'text'  )
-																	      			|| ( strstr($VAL->Type, 'bigint(')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'longblob'  )
-																	      			|| ( strstr($VAL->Type, 'mediumtext')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'longblob'  )
-																	      			|| ( strstr($VAL->Type, 'decimal(42')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41'  )
-																	      			|| ( strstr($VAL->Type, 'decimal(43')  ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41'  )
+																	      } else if( ( strstr(trim($VAL->Type), 'char(') || strstr(trim($VAL->Type), 'varchar(')  ) && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'text'  )
+																	      			|| ( strstr(trim($VAL->Type), 'bigint(')  ) && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'longblob'  )
+																	      			|| ( strstr(trim($VAL->Type), 'mediumtext')  ) && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'longblob'  )
+																	      			|| ( strstr(trim($VAL->Type), 'decimal(42')  ) && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'decimal(41'  )
+																	      			|| ( strstr(trim($VAL->Type), 'decimal(43')  ) && strstr(trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type), 'decimal(41'  )
 
 																	      			) {
 																	          
-																			      $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
+																			      $sql=" alter table \"".$TABLE."\" CHANGE \"".$FIELD_TO_CHK."\" \"".$FIELD_TO_CHK."\" ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
 																				  DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola varchar/char() do text()',$sql,__FILE__, __FUNCTION__, __LINE__);
 																				  if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die('\nProblem z '.$sql);
 																				 // DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
@@ -534,6 +1069,8 @@ class Core_Database_Pgsql extends Core_Database {
 																	      
 																	      } else {
 																		  	  DEBUG_S(-3,'Celowe zabicie z uwagi na niebezpieczenstwo zmiany typu: sql/old/new',array($sql,$VAL->Type,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type),__FILE__, __FUNCTION__, __LINE__);
+																		  	  echo "<font color=red> DO AKTAULIZACJI PHP BO TO JEST BLAD PHP!!!</font>";
+																		  	  continue;
 																		  	  die();
 																		   	  if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__)  or die('\nProblem z '.$sql);
 																		    }
@@ -557,21 +1094,25 @@ class Core_Database_Pgsql extends Core_Database {
 																		
 																	}
 																	//autoincrement:
-																	if(($VAL->Extra!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra)&&$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra=='auto_increment' ) {
+																	if(in_array('SKIP-PRIMARY-KEY', $options)) { 
+																		DEBUG_S(4,'SKIP-PRIMARY-KEY option',null,__FILE__,__FUNCTION__,__LINE__);
+																		
+																	} else if((trim($VAL->Extra)!=trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra))&&trim($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra)=='auto_increment' ) {
 																		//sprawdzmy czy nie ma w tabeli klucza z PRIMARY z ID
-																		$sql="show keys from  `".$TABLE."`";
-																		$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
+																		//$sql="show keys from  `".$TABLE."`";
+																		//$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
+																	      $result=self::show_index($TABLE);
 																		 $TEST_IF_HAS_PRIMARY=false;
-																		 while($tst=mysql_fetch_object($result)) { //dla kazdego klucza
-																		   if($tst->Column_name==$FIELD_TO_CHK) //sprawdz czy jest klucz do tej kolumny
-																		    if($tst->Key_name=='PRIMARY') $TEST_IF_HAS_PRIMARY=true; //jezeli jest primary, to flagujemy
+																		 while($tst=self::fetch($result)) { //dla kazdego klucza
+																		   if(trim($tst->Column_name)==$FIELD_TO_CHK) //sprawdz czy jest klucz do tej kolumny
+																		    if(trim($tst->Key_name)=='PRIMARY') $TEST_IF_HAS_PRIMARY=true; //jezeli jest primary, to flagujemy
 																		 }
 																		
 																		if($TEST_IF_HAS_PRIMARY==false) { //bedziemy dodawac primary key 
-																		  $sql="ALTER TABLE  `".$TABLE."` ADD PRIMARY KEY (  `".$FIELD_TO_CHK."` )";
+																		  $sql="ALTER TABLE  \"".$TABLE."\" ADD PRIMARY KEY (  \"".$FIELD_TO_CHK."\" )";
 																		  $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
 																		 } 
-																		$sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."`  ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type."    ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra." ; ";
+																		$sql=" alter table \"".$TABLE."\" ALTER COLUMN \"".$FIELD_TO_CHK."\"  TYPE  ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type."    ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra." ; ";
 																		echo "\n SQL auto_increment ".$sql ;
 																		if(!empty($CONFIRM_SQL_UPDATE))	$result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
 																		
@@ -705,7 +1246,7 @@ class Core_Database_Pgsql extends Core_Database {
        										
        				//tu bedziemy dodawac wartosci insert : 
        				   if(!strstr($TABLE, '__SCHEMA_FUNCTIONS__ARRAY__')) {
-		       				$sql="select count(\"ID\") as ilosc from \"".$TABLE."\" ;" ;
+		       				$sql="select count(*) as ilosc from \"".$TABLE."\" ;" ;
 							DEBUG_S(-3,'SQL: licze czy cos jest w tabeli ',$sql,__FILE__, __FUNCTION__, __LINE__) ;
 		       				$result=$this->query($sql) or die('\nProblem z '.$sql);   
 		       				$ilosc=0;
@@ -769,8 +1310,8 @@ class Core_Database_Pgsql extends Core_Database {
 		return $return;
 	}
 
-	function affected_rows() {
-		return pg_affected_rows( $this->_conn );
+	function affected_rows($res) {
+		return pg_affected_rows( $res );
 	}
 
 	function _( $str ) {
@@ -784,10 +1325,12 @@ class Core_Database_Pgsql extends Core_Database {
 
 
 	function get_by_id( $table, $id ) {
+		$primary=self::show_index_value($table); //TODO to optimalize cache
+
 		$null = null;
 		$sql = "select p.*
-			from `".$table."` as p
-			where p.`ID`='".$id."'
+			from \"".$table."\" as p
+			where p.\"".$primary."\"='".$id."'
 		";
 		$res = $this->query( $sql );
 		if ($r = $this->fetch( $res )) {
@@ -808,21 +1351,26 @@ class Core_Database_Pgsql extends Core_Database {
 	 * TODO: sprawdzac czy w hist mozna odczytac aktualny stan, jesli nie to dodac caly rekord do HIST, jako 'procesy-fix-hist-data'
 	 */
 	public function UPDATE_OBJ($table, $sql_obj) {
-		if (!isset($sql_obj->ID) || $sql_obj->ID <= 0) {
+		$structure=self::describe_table_value($table);
+		$primary=self::show_index_value($table);
+
+		if (!isset($sql_obj->$primary) || $sql_obj->$primary <= 0) {
 			return -3;
 		}
-		$id = $sql_obj->ID;
+		$id = $sql_obj->$primary;
 
 		// check id record $id exists
-		if (($curr_obj = $this->get_by_id( $table, $sql_obj->ID )) == null) {
+		if (($curr_obj = $this->get_by_id( $table, $sql_obj->$primary )) == null) {
 			return -2;
 		}
 
 		// check if enything changed
 		$changed = false;
 		$fields_to_change = get_object_vars($sql_obj);
+		//DEBUG_S(-3,'chk',array($fields_to_change),__FILE__,__FUNCTION__,__LINE__);
+
 		foreach ($fields_to_change as $k => $v) {
-			if ($k == 'ID') continue;
+			if ($k == $primary) continue;
 			if ($v == $curr_obj->$k) {// === ?
 				unset($sql_obj->$k);
 			} else {
@@ -839,10 +1387,18 @@ class Core_Database_Pgsql extends Core_Database {
 		$admin_col []= 'A_RECORD_CREATE_DATE';
 		$admin_col []= 'A_RECORD_CREATE_AUTHOR';
 		// ...
-		$sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i');
+//		$sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d H:i');
+		$sql_obj->A_RECORD_UPDATE_DATE = self::get_current_timestamp();
+
 		$sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName();
 		foreach (get_object_vars($sql_obj) as $k => $v) {
-			if (strtoupper($v) == 'NOW()') {
+			if($k=='A_RECORD_CREATE_DATE'&& $v=='0000-00-00 00:00:00') {
+				unset($k);
+				unset($v);
+				continue;
+			} else if (substr($v, 0, strlen('ST_GeomFromText')) == 'ST_GeomFromText') {
+				
+			} else if (strtoupper($v) == 'NOW()') {
 				$v = 'NOW()';
 			} else if (strtoupper($v) == 'NULL') {
 				$v = 'NULL';
@@ -850,19 +1406,25 @@ class Core_Database_Pgsql extends Core_Database {
 				$v = $this->_($v);
 				$v = "'{$v}'";
 			}
-			$sql_arr [] = "`{$k}`={$v}";
+			$sql_arr [] = '"'.$k.'"='.$v;
 		}
-		$sql = "update `{$table}` set ".implode(",", $sql_arr)." where `ID`='{$id}' limit 1; ";
-		$this->query($sql);
+		
+		$sql = "update \"{$table}\" set ".implode(",", $sql_arr)." where \"".$primary."\"='{$id}'  ; ";
+	//	DEBUG_S(-3,'update',array($sql),__FILE__,__FUNCTION__,__LINE__);
+	//	die();
+		$res=$this->query($sql);
 
 		if ($this->has_errors()) {
+			//DEBUG_S(-3,'errors',$this->has_errors,__FILE__,__FUNCTION__,__LINE__);
 			return -1;
 		}
 
-		$ret = $this->affected_rows();
+		$ret = $this->affected_rows($res);
+				//	DEBUG_S(-3,'affected',$ret,__FILE__,__FUNCTION__,__LINE__);
+
 		if ($ret) {
-			$sql_obj->ID_USERS2 = $sql_obj->ID;
-			unset($sql_obj->ID);
+			$sql_obj->ID_USERS2 = $sql_obj->$primary;
+			unset($sql_obj->$primary);
 			$new_id = $this->ADD_NEW_OBJ("{$table}_HIST", $sql_obj);
 			if ($new_id) {
 				$ret += 1;
@@ -871,41 +1433,62 @@ class Core_Database_Pgsql extends Core_Database {
 		return $ret;
 	}
 
-	function ADD_NEW_OBJ( $table, $sql_obj ) {
+	function ADD_NEW_OBJ( $table, $sql_obj,$dieonerror=null ) {
+		$structure=self::describe_table_value($table);
+		$primary=self::show_index_value($table);
 		$sql_arr = array();
 		// TODO: add admin columns if exists in table - search in session
 		$admin_col = array();
-		$admin_col []= 'ID';
 		$admin_col []= 'A_RECORD_CREATE_DATE';
 		$admin_col []= 'A_RECORD_CREATE_AUTHOR';
 		$admin_col []= 'A_RECORD_UPDATE_DATE';
 		$admin_col []= 'A_RECORD_UPDATE_AUTHOR';
 		// ...
-		$sql_arr["`ID`"] = "NULL";// add default value for ID, NULL in all inserts
 		if (substr($table, 0, -5) == '_HIST') {
-			$sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i');
+			$sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d H:i');
 			$sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName();
 		} else {
-			$sql_obj->A_RECORD_CREATE_DATE = date('Y-m-d-H:i');
+			$sql_obj->A_RECORD_CREATE_DATE = date('Y-m-d H:i');
 			$sql_obj->A_RECORD_CREATE_AUTHOR = User::getName();
 		}
 
 		foreach (get_object_vars($sql_obj) as $k => $v) {
-			if (strtoupper($v) == 'NOW()') {
+			if($k==$primary) {
+				unset($k);
+				unset($v);
+				continue;
+			}  else if (substr($v, 0, strlen('ST_GeomFromText')) == 'ST_GeomFromText') {
+				
+			} else if(strstr(trim($structure[$k]->Type),'int')) {
+				if(strlen($v)>0) {
+					$v=$v;
+				} else if(empty($v)) $v='null';
+				else $v = $v;
+			} else if(trim($structure[$k]->Type)=='datetime') {
+				if(empty($v)) $v='null';
+				else $v = "'".$v."'::timestamp";
+			} else if (strtoupper($v) == 'NOW()') {
 				$v = 'NOW()';
 			} else if (strtoupper($v) == 'NULL' && substr($table, -5) != '_HIST') {
 				$v = 'NULL';
+			} else if(strstr($structure[$k]->Type,'int(')) {
+				$v = $v ;
 			} else {
 				$v = $this->_($v);
 				$v = "'{$v}'";
 			}
-			$sql_arr ["`{$k}`"] = $v;
+			$sql_arr ['"'.$k.'"'] = $v;
 		}
-		$sql = "insert into `{$table}` (".implode(",", array_keys($sql_arr)).") values (".implode(",", array_values($sql_arr))."); ";
+		$sql = "insert into \"{$table}\" (".implode(",", array_keys($sql_arr)).") values (".implode(",", array_values($sql_arr))."); ";
+		//DEBUG_S(-3,' insert sql ',$sql,__FILE__,__FUNCTION__,__LINE__);
 		$this->query($sql);
 
 		if ($this->has_errors()) {
-			//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->get_errors());echo'</pre>';
+			if($dieonerror) {
+				DEBUG_S(-3,'Has errors died',$this->get_errors(),__FILE__,__FUNCTION__,__LINE__);
+				die();
+			}
+		//	echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->get_errors());print_r($sql);echo'</pre>';
 		}
 
 		$ret_id = $this->insert_id();
@@ -921,4 +1504,219 @@ class Core_Database_Pgsql extends Core_Database {
 		return $ret_id;
 	}
 
+
+	function MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table){
+	   		
+	   		$primary=self::show_index_value($table);
+
+	   		//TODO @2014-10-01 zrobic tabele z autoincrement + hist
+	   		//die('function incomplete');
+	   		   	
+	   	
+	   		//$sql="show tables like '".$table."';";
+	   		DEBUG_S(-3,'primary detected ',array($sql,$primary),__FILE__,__FUNCTION__,__LINE__);
+	   			$USERS_COLUMN_INIT2['REQUEST_COLUMN']=array(
+						'A_RECORD_CREATE_DATE'=>'datetime','A_RECORD_CREATE_AUTHOR'=>'varchar(100)','SYNC_SQIX_STATUS'=>'varchar(100) ',
+						'A_RECORD_UPDATE_DATE'=>'datetime','A_RECORD_UPDATE_AUTHOR'=>'varchar(100) ',
+						'L_APPOITMENT_DATE'=>'varchar(30) ',
+						'L_APPOITMENT_USER'=>"varchar(100) ",
+						'L_APPOITMENT_PERIOD'=>"varchar(4)  ",
+						'L_APPOITMENT_INFO'=>"varchar(255)  ",
+						'L_APPOITMENT_TYPE'=>"enum('', 'ARRANGED', 'TO_ARRANGE', 'CANCELLED', 'TO_CANCEL', 'RELATE', 'WAIT')",
+						'A_STATUS'=>"enum('WAITING', 'NORMAL', 'MONITOR', 'WARNING', 'OFF_SOFT', 'OFF_HARD', 'DELETED')",
+						'A_STATUS_INFO'=>"varchar(255)  ",
+						'A_ADM_COMPANY'=>'varchar(100)  ','A_CLASSIFIED'=>'varchar(100) '
+
+						);
+
+	   		
+			//DEBUG_S(-3,'zapytanie',$sql,__FILE__,__FUNCTION__,__LINE__);
+       		//$result=self::query($sql) or die1(' Problem ze sql '.$sql);
+			$result=self::show_tables($table);		
+       			while($h=self::fetch_array($result)) {
+
+       				$res=self::show_tables($h[0].'_HIST');
+       				if(self::num_rows($res)==0) {
+       					//$CONNLOCAL->query($sql)
+       					$sql='create  table IF NOT EXISTS "'.$h[0].'_HIST"(
+	   						"ID" SERIAL PRIMARY KEY,
+	   						"ID_USERS2" integer NOT NULL,
+	   						"_action_time"  timestamp without time zone,
+	   						"_action_type" character varying(16)  
+	   						)';
+	   					DEBUG_S(-3,'create table hist '.$h[0],array($sql),__FILE__,__FUNCTION__,__LINE__);
+       				 	$rescr=self::query($sql) or die1(' Problem ze sql '.$sql);
+	   				 	
+	   				 	
+	   				 	$sql=' CREATE  INDEX   "'.$h[0].'_ID_USERS2_index" ON "'.$h[0].'_HIST" ("ID_USERS2")';
+	   				 	$rescr=self::query($sql) or die1(' Problem ze sql '.$sql);
+
+	   				 	
+	   				 	
+					} else DEBUG_S(-3,'Histable '.$h[0].'_HIST existied',null,__FILE__,__FUNCTION__,__LINE__);
+					//kolumny z bazy istniejace
+					//	$sql_="describe  `".$h[0]."`";
+					//    $result_=self::query($sql_) or die1(' Problem ze sql '.$sql_);
+						$result_=self::describe_table($table);
+						$result__=self::describe_table($table."_HIST");
+							while($h__=self::fetch($result__)) {
+								$hist_exists[$h__->Field]=true;
+							}
+						while($h_=self::fetch($result_)) {
+							$table_exists[$h_->Field]=true;
+
+							if(empty($hist_exists[$h_->Field])) {
+								DEBUG_S(-3,'dane z tabeli',$h_,__FILE__,__FUNCTION__,__LINE__);
+							 	//$sql="\n alter  table \"".$h[0]."_HIST\" add \"".$h_->Field."\"   ; " ;
+							 	//self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+							 	self::alter_add_struct($table."_HIST",$h_->Field," text  default 'N/S;'");
+
+							 	$hist_exists[$h_->Field]=true;
+							 }
+						}
+					
+					
+					
+					foreach($USERS_COLUMN_INIT2['REQUEST_COLUMN'] as $tst_column=>$tst_type) {
+						if(empty($table_exists[$tst_column])) {
+						 	//$sql="\n alter  table \"".$h[0]."\" add \"".$tst_column."\" ".$tst_type."  ; " ;
+	       				 	//self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+	       				 	self::alter_add_struct($table,$tst_column,$tst_type);
+	       				 	
+	       				 	if(empty($hist_exists[$tst_column])) {
+	       				// 		$sql="\n alter  table \"".$h[0]."_HIST\" add \"".$tst_column."\" char(255) default 'N/S;'  ; " ;
+	       				 //		self::query($sql) or DEBUG_S(-3,' Problem ze sql '.$sql,array($sql),__FILE__,__FUNCTION__,__LINE__);
+	       					    self::alter_add_struct($table."_HIST",$tst_column,'char(255) default \'N/S;\'');
+	       				 		$hist_exists[$tst_column]=true;
+	       				 	}
+		   				 }
+					}
+       		
+       			}
+       			
+       		//Auto trigger funciton for history and edits
+       		
+       		
+      		$sql = '
+       		CREATE OR REPLACE FUNCTION "'.$table.'_HIST_func"() RETURNS TRIGGER AS $body$
+	   		DECLARE
+	   		v_old_data TEXT;
+	   		v_new_data TEXT;
+	   		v_currval INT;
+	   		BEGIN
+	   		/*  If this actually for real auditing (where you need to log EVERY action),
+	   		then you would need to use something like dblink or plperl that could log outside the transaction,
+	   		regardless of whether the transaction committed or rolled back.
+	   		*/
+ 
+	   		/* This dance with casting the NEW and OLD values to a ROW is not necessary in pg 9.0+ */
+ 
+	   		IF (TG_OP = \'UPDATE\') THEN
+	   			v_old_data := ROW(OLD.*);
+	   			v_new_data := ROW(NEW.*);
+		
+	   			INSERT INTO "'.$table.'_HIST" ("ID_USERS2","_action_time","A_RECORD_UPDATE_AUTHOR","_action_type") 
+	   			VALUES (NEW.'.$primary.',now(),session_user::TEXT,TG_OP);
+	   			v_currval := currval(\'"'.$table.'_HIST_ID_seq"\');	
+
+	   			
+
+	   		';
+	   		
+	   		foreach($hist_exists as $column=>$true) {
+	   			if($column=='ID') continue;
+	   			if($column=='ID_USERS2') continue;
+	   			if($column=='A_RECORD_UPDATE_AUTHOR') continue;
+	   			if($column=='A_RECORD_UPDATE_DATE') continue;
+	   			if($column=='A_RECORD_CREATE_DATE') continue;
+	   			if($column=='A_RECORD_CREATE_AUTHOR') continue;
+	   			if($column=='_action_time') continue;
+	   			if($column=='_action_type') continue;
+
+	   		  $sql.='
+	   			IF cast(ROW(OLD."'.$column.'")as text)!=cast(ROW(NEW."'.$column.'")as text) THEN
+	   			UPDATE "'.$table.'_HIST" set "'.$column.'"=NEW."'.$column.'" where "ID"=v_currval;
+	   			-- ELSE
+	   			--   UPDATE "'.$table.'_HIST" set "'.$column.'"=\'N/S;\' where "ID"=v_currval;
+	   			END IF;
+	   		  ';
+	   		}
+	   		
+	   		$sql.='
+
+	   		--	UPDATE  "'.$table.'" set "A_RECORD_UPDATE_DATE"=now(), "A_RECORD_UPDATE_AUTHOR"=session_user::TEXT where "'.$primary.'"=NEW."'.$primary.'";
+
+
+
+	   		RETURN NEW;
+   
+	   		ELSIF (TG_OP = \'INSERT\') THEN
+	   			v_new_data := ROW(NEW.*);
+	   			
+	   		END IF;
+	   		END;
+	   		$body$
+	   		LANGUAGE plpgsql
+	   		SECURITY DEFINER
+       		
+       		';	
+     
+       			
+       	DEBUG_S(-3,'Definied autohistory function',array($sql),__FILE__,__FUNCTION__,__LINE__);
+       	self::query($sql) or die1($sql);
+        
+
+         $res=self::show_create_trigger($table,$table.'_HIST_trigger');
+         if(self::num_rows($res)==0) {
+       		$sql='CREATE TRIGGER "'.$table.'_HIST_trigger"
+	   		AFTER UPDATE  ON "'.$table.'"
+	   		FOR EACH ROW EXECUTE PROCEDURE "'.$table.'_HIST_func"();';
+	   		DEBUG_S(-3,'Definied autohistory triggers',array($sql),__FILE__,__FUNCTION__,__LINE__);
+	   		self::query($sql) or die1($sql);
+	   	 }
+       	
+       	
+       	
+        	self::query("CREATE OR REPLACE FUNCTION update_A_RECORD_UPDATE_DATE_column()
+						RETURNS TRIGGER AS $$
+						BEGIN
+						NEW.\"A_RECORD_UPDATE_DATE\" = now() at time zone 'utc'; 
+						NEW.\"A_RECORD_UPDATE_AUTHOR\" = session_user::TEXT; 
+
+						RETURN NEW;
+						END;
+						$$ language 'plpgsql';");
+						
+						
+			$res=self::show_create_trigger($table,'update_A_RECORD_UPDATE_DATE');
+			if(self::num_rows($res)==0) {			 
+			self::query("CREATE TRIGGER \"update_A_RECORD_UPDATE_DATE\" BEFORE UPDATE
+						ON \"".$table."\" FOR EACH ROW EXECUTE PROCEDURE 
+						update_A_RECORD_UPDATE_DATE_column();");
+		    }
+		
+		
+			self::query("CREATE OR REPLACE FUNCTION create_A_RECORD_UPDATE_DATE_column()
+						RETURNS TRIGGER AS $$
+						BEGIN
+						NEW.\"A_RECORD_CREATE_DATE\" = now() at time zone 'utc'; 
+						NEW.\"A_RECORD_CREATE_AUTHOR\" = session_user::TEXT; 
+
+						RETURN NEW;
+						END;
+						$$ language 'plpgsql';");
+						
+						
+			$res=self::show_create_trigger($table,'create_A_RECORD_UPDATE_DATE');
+			if(self::num_rows($res)==0) {			 
+			self::query("CREATE TRIGGER \"create_A_RECORD_UPDATE_DATE\" BEFORE INSERT
+						ON \"".$table."\" FOR EACH ROW EXECUTE PROCEDURE 
+						create_A_RECORD_UPDATE_DATE_column();");
+		    }
+
+		
+	   	//! IMPORT_SORT_DESC_INFO
+	   }
+
+
 }

+ 563 - 356
SE/superedit-GRAPH_VIEW_PROCES.php

@@ -1,13 +1,274 @@
 <?php
 
-Lib::loadClass('ProcesHelper');
-Lib::loadClass('UsersHelper');
+class crm_proces_paser {
+
+  // var $this->get_proces_init=array();
+
+ // [proces_init]  - A
+ //    [step]      - flat 0
+ //    [step]      - flat 3 , tree 2 , cut
+ //     [step]     - flat 0 , tree 0
+ //     [step]     - flat 1 , tree 1
+ //       [step]   - flat 1 , tree 1
+ //         [step] - flat 0 , tree 0
+ //     [step]     - flat 1 , tree 1
+ //       [step]   - flat 0 , tree 0
+ 
+
+
+   
+   //funckcja do szukania proces_init
+   function get_proces_init($id_proces) {
+	$sql= "select p.`ID`,p.`DESC` from `CRM_PROCES` as p 
+	   LEFT JOIN _CRM_PROCES_INIT_STATS AS cs ON cs.ID = p.ID
+	where  p.`A_STATUS` in('WAITING','NORMAL') and p.`TYPE`='PROCES_INIT' 
+	and (cs.`path` like '%/".$id_proces."/%' or cs.`path` like '%/".$id_proces."'  or cs.`path` like '".$id_proces."/%' ) 
+	";
+//	echo $sql;
+	$res=DB::query($sql);
+		while($h=DB::fetch($res)) {
+			$this->get_proces_init[]=$h->ID;
+		}
+		return $this->get_proces_init;
+	
+   }
+
+   
+
+   function build_proces_init_tree($id_proces) {
+	  // $tree->Childs[$id_proces]=true;
+	   $tree->Childs[$id_proces]->PARENT=0;
+	   $tree->Childs[$id_proces]->SOURCE='build_tree_for_proces';
+
+	   $tree->Parents[0]->CHILD[$id_proces]=$id_proces;
+	   $obj=DB::get_by_id('CRM_PROCES',$id_proces);
+	   $tree->Childs[$id_proces]->TYPE=$obj->TYPE;
+	//   echo "here for ".$id_proces;
+	   self::build_tree_for_proces($tree,$id_proces,$id_proces);
+	   return $tree;
+   }
+   
+      function build_tree_for_proces(&$tree,$cursor,$init_once=null) {
+		  	   if(!empty($init_once)) $sql_or=" or cp.ID={$init_once} "; else $sql_or="";
+	      	   $sql="select cp.`ID`,cp.`IF_TRUE_GOTO`,cp.`IF_TRUE_GOTO_FLAG` , cp.`TYPE` from `CRM_PROCES` as cp 
+	      	   		
+	      	   where ( cp.PARENT_ID={$cursor} {$sql_or} ) and  cp.`A_STATUS` in ('WAITING','NORMAL')";
+		  	  // echo "<br>sql: ".$sql;
+	      	   $res=DB::query($sql);
+	      	   	      	   while ($h=DB::fetch($res)) {
+	      	   	 if(empty($init_once))  $tree->Childs[$h->ID]->PARENT=$cursor; //wyzwolenie tylko pozniejsze
+	      	   	  if(empty($init_once))  $tree->Parents[$cursor]->CHILD[$h->ID]=$h->ID;
+		  	   	   $tree->Childs[$h->ID]->TYPE=$h->TYPE;
+		  	   	   $tree->Childs[$h->ID]->SOURCE='build_tree_for_proces';
+
+
+	      	   	   if($h->IF_TRUE_GOTO>0) { 
+	      	   	      $tree->Childs[$h->ID]->GOTO_FLAG=$h->IF_TRUE_GOTO_FLAG;
+	      	   	      $tree->Childs[$h->ID]->IF_TRUE_GOTO=$h->IF_TRUE_GOTO;
+	      	   	      $tree->Childs[$h->IF_TRUE_GOTO]->IS_EXECUTED_BY[$h->ID]=$h->ID;
+	      	   	   }
+		      	   self::build_tree_for_proces($tree,$h->ID,null);
+	      	   }
+      }
+
+	  function get_resources_by_proceses_id($id_proces_obj,$id_proces,$filter_zasob) {
+		 $filter="";
+		 if( is_array($filter_zasob) ) $filter=" and cz.ID in (".implode(',', $filter_zasob).") " ;
+		 else if(!empty($filter_zasob)) $filter=" and cz.ID=".$filter_zasob ;
+		 
+		  $sql="select cz.ID,cz.PARENT_ID, cz.`DESC`,cz.`TYPE`	,	czp.`DESC` as DESC_czp, czp.`TYPE` as TYPE_czp
+		  	from CRM_WSKAZNIK as cw 
+		  		left join CRM_LISTA_ZASOBOW as cz on cz.ID=cw.ID_ZASOB 
+		  			left join CRM_LISTA_ZASOBOW as czp on czp.ID=cz.PARENT_ID
+		  		where cw.ID_PROCES in (".implode(',', array_keys($id_proces_obj)).") and cw.A_STATUS in ('NORMAL','WAITING')
+		  		and czp.`TYPE` in ('TABELA') ".$filter." ";
+		  $res=DB::query($sql);
+		  		while($h=DB::fetch($res)) {
+			  		$found['ID'][$h->ID]['PARENT_ID']=$h->PARENT_ID;
+			  		$found['ID'][$h->ID]['DESC']=$h->DESC;
+			  		$found['PARENT_ID'][$h->PARENT_ID]=$h->DESC_czp;
+			  		
+		  		}
+		  		
+//		  $this->get_resources_by_proceses_id->$id_proces=$found;
+	//	  DEBUG_S(-3,'Found resources',$found,__FILE__,__FUNCTION__,__LINE__);
+		  return $found;
+
+		  
+	  }
+
+
+      function build_tree_flat_info(&$tree,$flat) {
+		  /* >> zbudowanie ile ma dzieci <<
+			  $tree->Childs[3208] => stdClass Object
+			  (
+            [PARENT] => 3123
+            [CHILD] => Array
+                (
+             >>       [3219] => 1 <<
+             >>       [3237] => 0 <<
+             >>       [3209] => 0 <<
+                 
+			 */
+	      foreach($tree->Childs as $id=>$obj) {
+			  //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
+		      foreach($tree->Parents[$id]->CHILD as $child) {
+			      $tree->Childs[$id]->CHILD[$child]=count($tree->Parents[$child]->CHILD);     
+		      }
+	      }    
+      }
+      
+      
+      function detect_tree_where_to_detail_cut(&$tree,$flag_not_to_cut=null) {
+	       foreach($tree->Childs as $id=>$obj) {
+			  //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
+			  $control=0;
+		      foreach($obj->CHILD as $child) {
+			      if($child>0) $control++;   
+		      }
+		      if(empty($flag_not_to_cut)) {
+		       
+		       if($control>1) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;  //przeciecie jezeli jest wiecej wyjsc niz jedno z zaglebieniami
+		        //przeciecie, jezeli jest wyjscie z kroku procesu do innego 
+		        if(isset($tree->Childs[$id]->GOTO_FLAG)) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
+		        //trzeba zbadac tez czy nie jest do niego dowiazywany w jakims miejscu proces
+		         if(isset($tree->Childs[$id]->IS_EXECUTED_BY)) { $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
+		         //echo "<br> Is executed by CUT!";
+		         }
+
+		       } else $tree->Childs[$id]->NO_CUT_FLAG=true;
+	      }       
+      }
+      function search_parent_ids_till_cut(&$tree,$init,&$find) {
+      //szukam lancuchow do optymalizacji do miejsca flagi CUT, kojarzac od razu linki
+	     	if(isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
+		    	//if(!empty($find))
+		    	//if($init==2444)
+		    	  self::zoom_process_links($tree,$init,$init); 
+			}
+//			$tree->Viev_Zpc_Parent_cut[$init]=$find[0];
+	        if(!isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
+				  
+	      		  $find[]=$init;
+		  		  self::zoom_process_links($tree,$init,$find[0]);
+		      foreach($tree->Childs[$init]->CHILD as $id=>$count) {
+			      self::search_parent_ids_till_cut($tree,$id,$find);
+		      }
+	      } //else
+	     // return $find;
+      }
+      
+      function zoom_process_links($tree,$id,$root_id) {
+      	//dobudowuje znaczniki dotyczace LINKOW oraz brakujace ID z tym zwiazane
+	      //echo "<br>testuje zoom dla ".$id." root:".$root_id;
+
+	      if(isset($tree->Childs[$id]->GOTO_FLAG)) {
+					  	if(isset( $tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO])) {
+						  	//adding internal link to the same process
+						  	//TODO trzeba przemyslec, czy dowiazywac linki do zagregowanych krokow, czy trzeba robic cut w tych miejscach - na ten moment domyslnie CUT
+//						  	if(empty($tree->Childs[$id]->NO_CUT_FLAG)) //tylko linki zewnetrzne jak flaga NOCUT!
+						  	//echo "... dodaje 218:  ".$tree->Childs[$id]->IF_TRUE_GOTO;
+						  	if(isset($tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO]->SOURCE)) {
+						  		$tree->Viev_Zpc[$root_id]->INTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
+						  		//echo "dodalem Linka dla ".$root_id;
+						  	} else { //echo "To jest link external - bo referencyjny ID{$tree->Childs[$id]->IF_TRUE_GOTO}nie byl w procesie";
+
+						  		$tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
+						  	}
+						  	
+					  	} else { //echo "<br>Links zewnetrzny do ".$id." - ".$tree->Childs[$id]->IF_TRUE_GOTO;
+					  		$tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
+					  		//$tree->Viev_Zpc_found[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO; //zeby tego rekordu nie przetwarzal ? TODO ?
+					  		$obj=DB::get_by_id('CRM_PROCES',$tree->Childs[$id]->IF_TRUE_GOTO);
+					  		$tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->DESC="{".$obj->ID."}".substr($obj->DESC,0,50);
+					  		if($tree->Childs[$id]->GOTO_FLAG=='GOTO_AND_RETURN') {	 //dodanie zwrotnej strzalki TODO dac inny typ strzalki!!
+					  		 $tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->EXTERNAL_LINK[$root_id]=$root_id;
+					  		 //echo "<br> GOTO_AND_RETURN!!!".$tree->Childs[$id]->IF_TRUE_GOTO." -- ".$root_id;
+					  		}
+					  		
+					  	}
+				  	} 
+
+	      
+      }
+      
+      function build_path_zoom_proces_cut(&$tree,$init,$path_zpc=array()) {
+	      //funkcja do pokazania procesow wyplaszczonych, z wypunktowanymi rozgalezieniami - buduje drzewo w sposob inteligentny
+		  //szukam rekordow z gory do pierwszego CUT
+		  foreach($tree->Childs as $id=>$obj) {
+		  		if(!isset($tree->Viev_Zpc_found[$id])) {
+			  		//echo "<br>szukam parentow dla ".$id;
+				  	self::search_parent_ids_till_cut($tree,$id,$find);
+			//	  	echo "<br>find:238 for id {$id} ".implode(',', $find)." EOL. ";
+				  	if(empty($find))  { //echo " - Find empty for ".$id."  adding ".$tree->Childs[$id]->PARENT;
+					  	//trzeba przeskanowac w find jest dany parent -> Viev_Zpc_found
+					  	//	if(isset($tree->Childs[$id]->PARENT))
+					  	//		$tree->Viev_Zpc_Parent[$id]=$tree->Childs[$id]->PARENT;
+				  	}
+				  	foreach($find as $find_id) {
+				  		$tree->Viev_Zpc_found[$find_id]=$find[0];
+				  		if($find_id<>$find[0]) $tree->Viev_Zpc_Parent[$find_id]=$find[0]; //todo moze byc to z bledem jak nadrzedny bedzie zbitym ciagiem
+				  		else $tree->Viev_Zpc_Parent[$find_id]=$tree->Childs[$find_id]->PARENT;
+				  	}
+				  	$tree->Viev_Zpc[$id]->PATH=$find;
+				  	//wykrycie parenta polega na znalezieniu jego naturalnego parenta i poszukaniu w ktorej jest grupie
+				  	//$tree->Viev_Zpc[$id]->PARENT=$tree->Viev_Zpc_Parent[$tree->Childs[$id]->PARENT]  ;
+				  	$obj=DB::get_by_id('CRM_PROCES',$id);
+				  	$tree->Viev_Zpc[$id]->DESC="{".$id."}".substr($obj->DESC,0,50)."...";
+				  					  	unset($find);
+			  	}
+			  	
+		  	
+		  }
+		  		//parenty trzeba zrobic za drugim rzutem
+			  	foreach($tree->Viev_Zpc as $id=>$obj) {
+			 // 		echo "<br>256 wykrywam parenta dla {$id}";
+				  				    {
+					  	//skanujemy wszystkie rekordy w Viev_Zpc w celu znalezienia czy danego ID parent nie jest w ktoryms z ID - tego szukamy
+					  if(!isset($obj->PARENT)) //tylko dla tych ktore nie maja parentow
+					  	foreach($tree->Viev_Zpc as $id_=>$obj_) {
+						  	if(isset($tree->Childs[$id_]->SOURCE))
+						  	if(in_array($tree->Childs[$id]->PARENT, $obj_->PATH)) {
+						  	//	echo "<br>206 Skanuje dla brakujacego parenta dla ".$id." i znalazlem".$id_;
+						  		$tree->Viev_Zpc[$id]->PARENT=$id_;
+						  	} //else  echo "<br>&nbsp;&nbsp;   199: nie znalazlem w ".$id_." path:".implode(',', $obj_->PATH);
+					  	}
+					  	
+					  if(!isset($tree->Viev_Zpc[$id]->PARENT)) { //jezeli nie znaleziono ta metoda to znaczy ze parent jest naturalny
+						  $tree->Viev_Zpc[$id]->PARENT=$tree->Childs[$id]->PARENT;
+						//  echo " - 204 ustawilem ostatecznie ".$tree->Childs[$id]->PARENT;
+					  }
+					  	
+				  	}
+				  	
+			  	}
+		  
+		  	      
+      }
+      
+      
+}	 
+
 
 function GRAPH_VIEW_PROCES() {
+
+
 	$id_proces = V::get('id_proces', '', $_REQUEST, 'int');
 	$id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
 
+//	$id_proces = $_REQUEST['id_proces'];
+	//TOOD bug funkcji V nie mozna dac INT=0!!!
+//	if (empty($id_proces)) {
+//		echo'<p class="err box box-red">'."Wrong ID".'</p>';
+//		return;
+//	}
+
 	$db = DB::getDB();
+	//$proces = $db->get_by_id('CRM_PROCES', $id_proces);
+	//if (empty($proces)) {
+	//	echo'<p class="err box box-red">'."Process {$id_proces} not exists".'</p>';
+	//	return;
+	//}
 
 	$ajaxTask = V::get('ajaxTask', '', $_REQUEST);
 	if ($ajaxTask == 'getInfo') {
@@ -15,48 +276,47 @@ function GRAPH_VIEW_PROCES() {
 		$id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
 
 		if ($id > 0) {
+			//TODO najlepiej wyslac to od razu w jsonie i przekazac jakos do uzycia do wykresu!
 			$step = $db->get_by_id('CRM_PROCES', $id);
-			$cp = new GraphViewProcessParser();
-			$tree = $cp->build_proces_init_tree($id);
-			$cp->build_tree_flat_info($tree, null);
-			$cp->detect_tree_where_to_detail_cut($tree);
-			$cp->build_path_zoom_proces_cut($tree, $id);
+						 $cp=new crm_proces_paser;
+						 $tree=$cp->build_proces_init_tree($id);
+						 $cp->build_tree_flat_info($tree,null);
+						 $cp->detect_tree_where_to_detail_cut($tree);
+						 $cp->build_path_zoom_proces_cut($tree,$id);
+
 
+
+			//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($step);echo'</pre>';
 			?>
-			<?php if ($step->TYPE == 'PROCES_INIT') : ?>
-				<a href="?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $step->PARENT_ID; ?>&PROCES_INIT_SCAN=1">Widok mapy <?php echo $step->PARENT_ID; ?></a>
-			<?php endif; ?>
-			<?php if (empty($_REQUEST['RESOURCES'])) : ?>
-				<a href="?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $step->PARENT_ID; ?>&PROCES_INIT_SCAN=1&RESOURCES=1&id_zasob=<?php echo $id_zasob; ?>"> | mapa z zasobami</a>
-			<?php endif; ?>
-			<p>
-				<span style="color:red">
-					<a href="?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $id; ?>"><?php echo $step->ID; ?></a>
-					- <?php echo $step->DESC; ?> <?php echo $step->DESC; ?>
-				</span>
-				| <a href="?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $id; ?>&RESOURCES=1&id_zasob=<?php echo $id_zasob; ?>"> widok procesu z zasobami </a>
+			<?php if($step->TYPE=='PROCES_INIT') echo "<a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$step->PARENT_ID}&PROCES_INIT_SCAN=1>Widok mapy {$step->PARENT_ID}</a>"; ?>
+			<?php if(empty($_REQUEST['RESOURCES'])) echo "<a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$step->PARENT_ID}&PROCES_INIT_SCAN=1&RESOURCES=1&id_zasob={$id_zasob}> | mapa z zasobami</a>"; ?>
+			<p> <?php echo "<font color=red><a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$id}>".$step->ID."</a> - ".$step->DESC; ?>  <?php echo $step->DESC; ?></font>
+				<?php echo "| <a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$id}&RESOURCES=1&id_zasob={$id_zasob}> widok procesu z zasobami </a> ";?>
 			</p>
 			<p><?php echo $step->OPIS; ?></p>
-				<?php foreach ($tree->Viev_Zpc[$id]->PATH as $ind=>$id_include) : ?>
-					<?php if ($ind == 0) continue; //pierwszy wiersz wyswietlony wyzej ?>
-					<?php $step = $db->get_by_id('CRM_PROCES', $id_include); ?>
-					<p><b><?php echo $step->ID; ?></a> - <?php echo $step->DESC; ?></b> <font size="-3"><?php echo $step->OPIS; ?></font></p>
-				<?php endforeach; ?>
+			 	<?php foreach ($tree->Viev_Zpc[$id]->PATH as $ind=>$id_include) {
+			 					if($ind==0) continue; //pierwszy wiersz wyswietlony wyzej
+				 				$step = $db->get_by_id('CRM_PROCES', $id_include);
+				 			    echo "<p><b>".$step->ID."</a> - ".$step->DESC."</b> <font size=-3>".$step->OPIS."</font></p>";
+				 			 } ?>
 			<?php
-		}
-		else {//zasob
+		} else { //zasob
 			$id = V::get('id', 0, $_REQUEST);
-			if ($id[0] == 'Z') {
-				$zasob = ProcesHelper::getZasobInfo(4975);
-				echo "Zasob: [".$zasob->ID."], Typ: ".$zasob->TYPE.", Nazwa: ".$zasob->DESC." (".$zasob->DESC_PL.")<br>".$zasob->OPIS;
-				echo "<hr> Nadrzędny: Zasob: [".$zasob->P__ID."] , Typ: ".$zasob->P__TYPE.", Nazwa: ".$zasob->P__DESC." (".$zasob->P__DESC_PL.")<br>".$zasob->P__OPIS;
-			}
+				if($id[0]=='Z') {
+					Lib::loadClass('ProcesHelper');
+					$zasob=ProcesHelper::getZasobInfo(4975);
+					
+					echo "Zasob: [".$zasob->ID."], Typ: ".$zasob->TYPE.", Nazwa: ".$zasob->DESC." (".$zasob->DESC_PL.")<br>".$zasob->OPIS;
+					echo "<hr> Nadrzędny: Zasob: [".$zasob->P__ID."] , Typ: ".$zasob->P__TYPE.", Nazwa: ".$zasob->P__DESC." (".$zasob->P__DESC_PL.")<br>".$zasob->P__OPIS;
+				}
+
+			
 		}
 		exit;
 	}
 
 	$graph = new stdClass();
-	$graph->htmlID = "graph_proces_id_{$id_proces}";
+	$graph->htmlID = 'graph_proces_id_' . $id_proces;
 	$graph->procesTreeFlat = array();
 	$graph->procesTreeGoto = array();
 	$graph->treeItems = array();
@@ -64,134 +324,292 @@ function GRAPH_VIEW_PROCES() {
 	$graph->elements = new stdClass();
 	$graph->elements->nodes = array();
 	$graph->elements->edges = array();
-
-	function graph__addNodeID($id, &$graph, $name = null, $path, $parent = null, $type, $once = null) {
-		if (!array_key_exists($id, $graph->treeItems)) {
-			$graph->treeItems[$id] = true;
-			if (empty($name)) $name = $id;
-			if (!empty($path)) {
-				$name = $name . " " . implode(',', $path);
-			}
-			$type_init = null;
-			if ($type == 'PROCES_INIT') $type_init = 'procesInit';
-			else if($type == 'RESOURCE') $type_init = 'RESOURCE';
-
-			$graph->elements->nodes[] = array('data' => array('id' => "{$id}", 'name' => $name, 'type' => $type_init));
-		}
-		if (!empty($parent)) {
-			if (isset($once)) {
-				if (!isset($graph->used_elements[$parent][$id]) && !isset($graph->used_elements[$id][$parent])) {
-					$graph->elements->edges[] = array('data' => array('source' => $parent, 'target' => $id));
+	/*	elements: {
+				nodes: [
+					{ data: { id: 'j', name: 'Jerry' } },
+					{ data: { id: 'e', name: 'Elaine' } },
+					{ data: { id: 'k', name: 'Kramer' } },
+					{ data: { id: 'g', name: 'George' } }
+				],
+				edges: [
+					{ data: { source: 'j', target: 'e' } },
+					{ data: { source: 'j', target: 'k' } },
+					{ data: { source: 'j', target: 'g' } },
+					{ data: { source: 'e', target: 'j' } },
+					{ data: { source: 'e', target: 'k' } },
+					{ data: { source: 'k', target: 'j' } },
+					{ data: { source: 'k', target: 'e' } },
+					{ data: { source: 'k', target: 'g' } },
+					{ data: { source: 'g', target: 'j' } }
+				]
+			},
+	 */
+
+			function graph__addNodeID($id, &$graph,$name=null,$path,$parent=null,$type,$once=null) {
+				if (!array_key_exists($id, $graph->treeItems)) {
+					$graph->treeItems[$id]= true;
+					if(empty($name)) $name=$id;
+					if(!empty($path))  { $name=$name." ".implode(',', $path);// $path=array(); 
+					}
+					//DEBUG_S(-3,'added id,name,path,parent',array($id,$name,$path,$parent),__FILE__,__FUNCTION__,__LINE__);
+		
+					if($type=='PROCES_INIT') $type_init='procesInit'; 
+					else if($type=='RESOURCE') $type_init=$type;
+					else $type_init=null;
+				//	echo "<br>".$type_init." ".$id." ".$name;
+					
+					
+				//	$name=str_replace(array('ś','ż',"ś"), array('s','z',"xxx"), $name);
+
+					
+					$graph->elements->nodes[] = array('data'=>array('id'=>"".$id."", 'name'=>$name , 'type'=>$type_init));
+					
+	
+					//echo "<br> w AddNode:ID".$id." parent".$parent;
 				}
-			} else {
-				$graph->elements->edges[] = array('data' => array('source' => $parent, 'target' => $id));
+				   if(!empty($parent)) {
+					   if(isset($once)) {
+						   if(!isset($graph->used_elements[$parent][$id]) && !isset($graph->used_elements[$id][$parent])) {
+						   		$graph->elements->edges[] = array('data'=>array('source'=>$parent, 'target'=>$id  ));
+						   	}
+					   } else {
+						   		$graph->elements->edges[] = array('data'=>array('source'=>$parent, 'target'=>$id  ));
+					   }
+					   
+						$graph->used_elements[$parent][$id]=1;
+						$graph->used_elements[$id][$parent]=1;
+						
+
+				   }
+		
 			}
-			$graph->used_elements[$parent][$id] = 1;
-			$graph->used_elements[$id][$parent] = 1;
+		 
+	 
+	 
+	 
+	 
+	$id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');	
+
+	 $PROCES_INIT_SCAN = V::get('PROCES_INIT_SCAN', '', $_REQUEST, 'int');
+	if(!empty($PROCES_INIT_SCAN))	 {
+	     //mapa procesow
+	
+		$cp=new crm_proces_paser;
+
+	$PROCES_INIT_SCAN_STANOWISKO = V::get('PROCES_INIT_SCAN_STANOWISKO', '', $_REQUEST, 'int');		
+	$PROCES_INIT_SCAN_USER = V::get('PROCES_INIT_SCAN_USER', '', $_REQUEST, 'int');		
+	
+	if(!empty($PROCES_INIT_SCAN_STANOWISKO))  {
+		Lib::loadClass('ProcesHelper');
+		$proces_list_obj = ProcesHelper::get_procesy_by_stanowiska( array($PROCES_INIT_SCAN_STANOWISKO) );
+		foreach($proces_list_obj as $obj) {
+			$init[$obj->ID]=$obj->ID;
+		}
+    } else if(!empty($PROCES_INIT_SCAN_USER))  {
+		Lib::loadClass('UsersHelper');
+		$proces_list_obj = UsersHelper::get_group_by_user($PROCES_INIT_SCAN_USER,array('SHOW_IN_PERIOD_MARK'=>'YES'));
+		
+		foreach($proces_list_obj as $obj) {
+			$init[$obj->ID]=$obj->ID;
 		}
+    } else if(!empty($id_zasob)) {
+		Lib::LoadClass('ProcesHelper');
+	    $init=ProcesHelper::get_proces_init_by_zasob_id($id_zasob);
+    } else  {
+	    $init=$cp->get_proces_init($id_proces);
 	}
 
-	$id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
 
-	$PROCES_INIT_SCAN = V::get('PROCES_INIT_SCAN', '', $_REQUEST, 'int');
-	if (!empty($PROCES_INIT_SCAN)) {
-		$cp = new GraphViewProcessParser();
+	DEBUG_S(3,'lista procesow init',$init,__FILE__,__FUNCTION__,__LINE__);
+		foreach($init as $id_proces) {
+
+			 $tree=$cp->build_proces_init_tree($id_proces);
+
+			 $cp->build_tree_flat_info($tree,null);
+		     $cp->detect_tree_where_to_detail_cut($tree,'nocut');
+			 $cp->build_path_zoom_proces_cut($tree,$id_proces);
+			
+			
+			 DEBUG_S(3,'get_proces_init',$init);
+			 DEBUG_S(3,'tree->childs',$tree->Childs);
+			 DEBUG_S(3,'tree->Parents',$tree->Parents);
+			 DEBUG_S(3,'tree->Viev_Zpc',$tree->Viev_Zpc);
+			 DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
+			 DEBUG_S(3,'tree->get_resources_by_proceses_id',$tree->get_resources_by_proceses_id);
+
+		
+			 	  graph__addNodeID(0, $graph,$name=null,$path,null);
+			 foreach($tree->Viev_Zpc as $id=>$obj) {
+				  graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
+				//  foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, &$graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
+				  foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
+			 }
+		
+		
+			 if(!empty($_REQUEST['RESOURCES'])) {
+			 
+			 $resources=$cp->get_resources_by_proceses_id($tree->Childs,$id_proces,$id_zasob);
+				 foreach($resources['PARENT_ID'] as $ID=>$DESC) {
+					  graph__addNodeID("Z_".$ID, $graph,$DESC,null,null,'RESOURCE');
+				  }
+				  foreach($resources['ID'] as $ID=>$DESC) {
+					  graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,$id_proces,'RESOURCE');
+					  graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,"Z_".$DESC['PARENT_ID'],'RESOURCE','once');
+				  }
+			 }
+
+
+			 
+			 unset($tree);
+		}
+		
+		
+	}else {
+
+		 //dokladnie 1 proces
+		 $cp=new crm_proces_paser;
+
+		 $tree=$cp->build_proces_init_tree($id_proces);
+		 $cp->build_tree_flat_info($tree,null);
+	     $cp->detect_tree_where_to_detail_cut($tree);
+		 $cp->build_path_zoom_proces_cut($tree,$id_proces);
+		 DEBUG_S(3,'get_proces_init',$init);
+		 DEBUG_S(3,'tree->childs',$tree->Childs);
+		 DEBUG_S(3,'tree->Parents',$tree->Parents);
+		 DEBUG_S(-3,'tree->Viev_Zpc',$tree->Viev_Zpc);
+		 DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
+		 DEBUG_S(3,'tree->Viev_Zpc_Parent_cut',$tree->Viev_Zpc_Parent_cut);
+		 DEBUG_S(3,'tree->Viev_Zpc_found',$tree->Viev_Zpc_found);	
+		 	  graph__addNodeID(0, $graph,$name=null,$path,null);
+		 foreach($tree->Viev_Zpc as $id=>$obj) {
+		 			    //echo "<br> tst edg:".$id." / ".$tree->Childs[$id]->PARENT;
+		 			   // : $tree->Viev_Zpc[$tree->Childs[$id]->PARENT])
+			  graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
+			  foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, $graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
+			  foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
+	
+		 }
+		  if(!empty($_REQUEST['RESOURCES'])) {
+			 $resources=$cp->get_resources_by_proceses_id($tree->Childs,$id_proces,$id_zasob);
+				 foreach($resources['PARENT_ID'] as $ID=>$DESC) {
+					  graph__addNodeID("Z_".$ID, $graph,$DESC,null,null,'RESOURCE');
+				  }
+				  foreach($resources['ID'] as $ID=>$DESC) {
+					  graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,$id_proces,'RESOURCE');
+					  graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,"Z_".$DESC['PARENT_ID'],'RESOURCE');
+				  }
+			 }
+
+		 
+		 
+		 
+		 
+	 }
+	 
+	 
+ 
+	 
+/*
+	$db = DB::getDB();
+	
+	$sql= "select p.`ID`,`DESC` from `CRM_PROCES` as p where  p.`A_STATUS` in('WAITING','NORMAL') and p.`TYPE`='PROCES_INIT' and ID=994 limit 1";
+	$res=DB::query($sql);
+	while($h=DB::fetch($res)) {
+		SearchParentsWithExits($h->ID,$h->ID,$graph,'Proces '.$h->ID,0);
+		//graph__addNodeID($h->ID, $graph);
+		graph__addNodeID('1', $graph,'1');
 
-		$PROCES_INIT_SCAN_STANOWISKO = V::get('PROCES_INIT_SCAN_STANOWISKO', '', $_REQUEST, 'int');
-		$PROCES_INIT_SCAN_USER = V::get('PROCES_INIT_SCAN_USER', '', $_REQUEST, 'int');
+	//	graph__addNodeID($h->ID, $graph,$h->ID);
+//		graph__addNodeID('100', $graph,'100');
+		//$graph->treeItems[$h->ID] = true;
+		//$graph->treeItems[101] = true;
 
-		if (!empty($PROCES_INIT_SCAN_STANOWISKO)) {
-			$PROCES_INIT_SCAN_STANOWISKA = array($PROCES_INIT_SCAN_STANOWISKO);
-			$proces_list_obj = ProcesHelper::get_procesy_by_stanowiska($PROCES_INIT_SCAN_STANOWISKA);
-			foreach ($proces_list_obj as $obj) {
-				$init[$obj->ID] = $obj->ID;
-			}
-		} else if(!empty($PROCES_INIT_SCAN_USER))  {
-			$proces_list_obj = UsersHelper::get_group_by_user($PROCES_INIT_SCAN_USER, array('SHOW_IN_PERIOD_MARK' => 'YES'));
-			foreach ($proces_list_obj as $obj) {
-				$init[$obj->ID] = $obj->ID;
-			}
-		} else if(!empty($id_zasob)) {
-			$init = ProcesHelper::get_proces_init_by_zasob_id($id_zasob);
+//		$graph->elements->nodes[] = array('data'=>array('id'=>$h->ID, 'name'=>$h->ID , 'type'=>'procesInit'));
+//		$graph->elements->nodes[] = array('data'=>array('id'=>101, 'name'=>101 , 'type'=>'procesInit'));
+//		$graph->elements->edges[] = array('data'=>array('source'=>994, 'target'=>101));
+
+
+	}
+*/
+	foreach($graph->elements->nodes as $var) {
+	//	echo "<br>\n NODE".$var[data][id];
+		$nodes[$var[data][id]]=$var[data][id];
+	}
+	foreach($graph->elements->edges as $var) {
+		//echo "<br>\n".$var[data][source]." ".$var[data][target]." ";
+		if(!isset($nodes[$var[data][source]]))  echo "<br>FAIL1 ".$var[data][source];
+		if(!isset($nodes[$var[data][target]]))  echo "<br>FAIL2 ".$var[data][target];
+	}
+
+	DEBUG_S(3,'nodes',$graph->elements->nodes);
+	DEBUG_S(3,'edges',$graph->elements->edges);
+/*		
+	$sql = "select p.`ID`, p.`PARENT_ID`
+			from `CRM_PROCES` as p
+			where p.`A_STATUS` in('WAITING','NORMAL')
+	";
+	$res = $db->query($sql);
+	while ($r = $db->fetch($res)) {
+		$graph->procesTreeFlat[$r->PARENT_ID] []= $r->ID;
+	}
+
+	$sql = "select p.`IF_TRUE_GOTO` as ID, p.`ID` as PARENT_ID
+			from `CRM_PROCES` as p
+			where p.`A_STATUS` in('WAITING','NORMAL')
+				and p.IF_TRUE_GOTO>0
+		--		and p.IF_TRUE_GOTO_FLAG='GOTO_AND_RETURN'
+	";
+	
+	$res = $db->query($sql);
+	while ($r = $db->fetch($res)) {
+		$graph->procesTreeGoto[$r->PARENT_ID] []= $r->ID;
+	}
+
+
+	function createGraphRec($id, $tree, &$graph, $lvl = 0) {
+		$graph->treeItems[$id] = true;
+		settype($id, 'string');
+		if ($id == 3122) {
+			$graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'type'=>'procesInit', 'lvl'=>$lvl));
 		} else {
-			$init = $cp->get_proces_init($id_proces);
+			$graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'lvl'=>$lvl));
 		}
-		DEBUG_S(3,'lista procesow init',$init,__FILE__,__FUNCTION__,__LINE__);
-		foreach ($init as $id_proces) {
-			$tree = $cp->build_proces_init_tree($id_proces);
-			$cp->build_tree_flat_info($tree, null);
-			$cp->detect_tree_where_to_detail_cut($tree, 'nocut');
-			$cp->build_path_zoom_proces_cut($tree, $id_proces);
-			DEBUG_S(3,'get_proces_init',$init);
-			DEBUG_S(3,'tree->childs',$tree->Childs);
-			DEBUG_S(3,'tree->Parents',$tree->Parents);
-			DEBUG_S(3,'tree->Viev_Zpc',$tree->Viev_Zpc);
-			DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
-			DEBUG_S(3,'tree->get_resources_by_proceses_id',$tree->get_resources_by_proceses_id);
-			graph__addNodeID(0, $graph, $name = null, $path, null);
-			foreach ($tree->Viev_Zpc as $id => $obj) {
-				graph__addNodeID($id, $graph, $obj->DESC, null, ((isset($obj->PARENT))? $obj->PARENT : null), $tree->Childs[$id]->TYPE);
-				foreach ($obj->EXTERNAL_LINK as $link) {
-					graph__addNodeID($link, $graph, $tree->Viev_Zpc[$link]->DESC, null, $id, 'PROCES_INIT');
-				}
-			}
-			if (!empty($_REQUEST['RESOURCES'])) {
-				$resources = $cp->get_resources_by_proceses_id($tree->Childs, $id_proces, $id_zasob);
-				foreach ($resources['PARENT_ID'] as $ID => $DESC) {
-					graph__addNodeID("Z_{$ID}", $graph, $DESC, null, null, 'RESOURCE');
-				}
-				foreach ($resources['ID'] as $ID => $DESC) {
-					graph__addNodeID("Z_{$ID}", $graph, $DESC['DESC'], null, $id_proces, 'RESOURCE');
-					graph__addNodeID("Z_{$ID}", $graph, $DESC['DESC'], null, "Z_{$DESC['PARENT_ID']}", 'RESOURCE', 'once');
-				}
-			}
-			unset($tree);
+
+		if ($lvl > 1) {
+		//	return;
 		}
-	}
-	else {
-		$cp = new GraphViewProcessParser();
-		$tree = $cp->build_proces_init_tree($id_proces);
-		$cp->build_tree_flat_info($tree, null);
-		$cp->detect_tree_where_to_detail_cut($tree);
-		$cp->build_path_zoom_proces_cut($tree, $id_proces);
-		DEBUG_S(3,'get_proces_init',$init);
-		DEBUG_S(3,'tree->childs',$tree->Childs);
-		DEBUG_S(3,'tree->Parents',$tree->Parents);
-		DEBUG_S(-3,'tree->Viev_Zpc',$tree->Viev_Zpc);
-		DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
-		DEBUG_S(3,'tree->Viev_Zpc_Parent_cut',$tree->Viev_Zpc_Parent_cut);
-		DEBUG_S(3,'tree->Viev_Zpc_found',$tree->Viev_Zpc_found);
-		graph__addNodeID(0, $graph, $name = null, $path, null);
-		foreach ($tree->Viev_Zpc as $id => $obj) {
-			graph__addNodeID($id, $graph, $obj->DESC, null, ((isset($obj->PARENT))? $obj->PARENT : null), $tree->Childs[$id]->TYPE);
-			foreach ($obj->INTERNAL_LINK as $link) {
-				graph__addNodeID($id, $graph, $tree->Viev_Zpc[$link]->DESC, null, $link, null);
-			}
-			foreach ($obj->EXTERNAL_LINK as $link) {
-				graph__addNodeID($link, $graph, $tree->Viev_Zpc[$link]->DESC, null, $id, 'PROCES_INIT');
+
+		if (!empty($tree[$id])) {
+			foreach ($tree[$id] as $vChildID) {
+				$graph->elements->edges[] = array('data'=>array('source'=>$id, 'target'=>$vChildID));
+				createGraphRec($vChildID, $tree, $graph, $lvl + 1);
 			}
 		}
-		if (!empty($_REQUEST['RESOURCES'])) {
-			$resources = $cp->get_resources_by_proceses_id($tree->Childs, $id_proces, $id_zasob);
-			foreach ($resources['PARENT_ID'] as $ID => $DESC) {
-				graph__addNodeID("Z_{$ID}", $graph, $DESC, null, null, 'RESOURCE');
+	}
+
+	createGraphRec($id_proces, $graph->procesTreeFlat, $graph);
+
+*/
+/*
+	// addGraphGoto
+	foreach ($graph->procesTreeGoto as $kID => $vGotoIds) {
+		//$graph->treeItems[$id] = true;
+		if (array_key_exists($kID, $graph->treeItems)) {
+			foreach ($vGotoIds as $vGotoID) {
+				graph__addNodeID($vGotoID, $graph);
+				$graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
 			}
-			foreach ($resources['ID'] as $ID => $DESC) {
-				graph__addNodeID("Z_{$ID}", $graph, $DESC['DESC'], null, $id_proces, 'RESOURCE');
-				graph__addNodeID("Z_{$ID}", $graph, $DESC['DESC'], null, "Z_{$DESC['PARENT_ID']}", 'RESOURCE');
+		} else {
+			foreach ($vGotoIds as $vGotoID) {
+				if (array_key_exists($vGotoID, $graph->treeItems)) {
+//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("TODO: add node ($kID); add edge from $kID to $vGotoID");echo'</pre>';
+					graph__addNodeID($kID, $graph);
+					//$graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
+				}
 			}
 		}
 	}
-
-	foreach($graph->elements->nodes as $var) {
-		$nodes[$var['data']['id']] = $var['data']['id'];
-	}
-	foreach($graph->elements->edges as $var) {
-		if (!isset($nodes[$var['data']['source']])) echo "<br>FAIL1 ".$var['data']['source'];
-		if (!isset($nodes[$var['data']['target']])) echo "<br>FAIL2 ".$var['data']['target'];
-	}
-	DEBUG_S(3,'nodes',$graph->elements->nodes);
-	DEBUG_S(3,'edges',$graph->elements->edges);
+*/
 ?>
 <style type="text/css">
 #<?php echo $graph->htmlID; ?>_wrap {
@@ -209,7 +627,9 @@ function GRAPH_VIEW_PROCES() {
 }
 #<?php echo $graph->htmlID; ?>_wrap .actions { position:absolute; top:20px; left:-40px; margin:0; padding:0; list-style:none; }
 #<?php echo $graph->htmlID; ?>_wrap .actions button { border-radius:0; background:#fff; border:1px solid #ccc; }
+
 </style>
+
 <script src="./stuff/cytoscape.js/arbor.js"></script>
 <script src="./stuff/cytoscape.js/cytoscape.js"></script>
 <script>
@@ -356,216 +776,3 @@ jQuery(document).ready(function(){
 
 <?php
 }
-
-class GraphViewProcessParser {
-
-// var $this->get_proces_init=array();
-// [proces_init]  - A
-//    [step]      - flat 0
-//    [step]      - flat 3 , tree 2 , cut
-//     [step]     - flat 0 , tree 0
-//     [step]     - flat 1 , tree 1
-//       [step]   - flat 1 , tree 1
-//         [step] - flat 0 , tree 0
-//     [step]     - flat 1 , tree 1
-//       [step]   - flat 0 , tree 0
-
-	public function get_proces_init($id_proces) {
-		$db = DB::getDB();
-		$sql = "select
-				p.`ID`
-				, p.`DESC`
-			from `CRM_PROCES` as p
-				left join `_CRM_PROCES_INIT_STATS` as cs on(cs.`ID` = p.`ID`)
-			where
-				p.`A_STATUS` in('WAITING','NORMAL')
-				and p.`TYPE`='PROCES_INIT'
-				and (cs.`path` like '%/{$id_proces}/%' or cs.`path` like '%/{$id_proces}'  or cs.`path` like '{$id_proces}/%')
-		";
-		$res = $db->query($sql);
-		while ($h = $db->fetch($res)) {
-			$this->get_proces_init[] = $h->ID;
-		}
-		return $this->get_proces_init;
-	}
-
-	public function build_proces_init_tree($id_proces) {
-		$db = DB::getDB();
-		$tree->Childs[$id_proces]->PARENT = 0;
-		$tree->Childs[$id_proces]->SOURCE = 'build_tree_for_proces';
-		$tree->Parents[0]->CHILD[$id_proces] = $id_proces;
-		$obj = $db->get_by_id('CRM_PROCES', $id_proces);
-		$tree->Childs[$id_proces]->TYPE = $obj->TYPE;
-		$this->build_tree_for_proces($tree, $id_proces, $id_proces);
-		return $tree;
-	}
-
-	public function build_tree_for_proces(&$tree, $cursor, $init_once = null) {
-		$db = DB::getDB();
-		$sqlOr = (!empty($init_once))? " or cp.ID={$init_once} " : "";
-		$sql = "select
-			cp.`ID`
-			, cp.`IF_TRUE_GOTO`
-			, cp.`IF_TRUE_GOTO_FLAG`
-			, cp.`TYPE`
-		from `CRM_PROCES` as cp
-		where
-			(cp.PARENT_ID={$cursor} {$sqlOr})
-			and  cp.`A_STATUS` in('WAITING','NORMAL')
-		";
-		$res = $db->query($sql);
-		while ($h = $db->fetch($res)) {
-			if (empty($init_once)) $tree->Childs[$h->ID]->PARENT = $cursor;
-			if (empty($init_once)) $tree->Parents[$cursor]->CHILD[$h->ID] = $h->ID;
-			$tree->Childs[$h->ID]->TYPE = $h->TYPE;
-			$tree->Childs[$h->ID]->SOURCE = 'build_tree_for_proces';
-			if ($h->IF_TRUE_GOTO > 0) {
-				$tree->Childs[$h->ID]->GOTO_FLAG = $h->IF_TRUE_GOTO_FLAG;
-				$tree->Childs[$h->ID]->IF_TRUE_GOTO = $h->IF_TRUE_GOTO;
-				$tree->Childs[$h->IF_TRUE_GOTO]->IS_EXECUTED_BY[$h->ID] = $h->ID;
-			}
-			$this->build_tree_for_proces($tree, $h->ID, null);
-		}
-	}
-
-	public function get_resources_by_proceses_id($id_proces_obj, $id_proces, $filter_zasob) {
-		$db = DB::getDB();
-		$filter = "";
-		if (is_array($filter_zasob)) {
-			$filter = " and cz.ID in (".implode(',', $filter_zasob).") ";
-		}
-		else if (!empty($filter_zasob)) {
-			$filter = " and cz.ID={$filter_zasob}";
-		}
-		$sql = "select
-				cz.ID
-				, cz.PARENT_ID
-				, cz.`DESC`
-				, cz.`TYPE`
-				, czp.`DESC` as DESC_czp
-				, czp.`TYPE` as TYPE_czp
-			from CRM_WSKAZNIK as cw
-				left join CRM_LISTA_ZASOBOW as cz on(cz.ID=cw.ID_ZASOB)
-				left join CRM_LISTA_ZASOBOW as czp on(czp.ID=cz.PARENT_ID)
-			where cw.ID_PROCES in(".implode(',', array_keys($id_proces_obj)).")
-				and cw.A_STATUS in ('NORMAL','WAITING')
-				and czp.`TYPE` in ('TABELA')
-				{$filter}
-		";
-		$res = $db->query($sql);
-		while ($h = $db->fetch($res)) {
-			$found['ID'][$h->ID]['PARENT_ID'] = $h->PARENT_ID;
-			$found['ID'][$h->ID]['DESC'] = $h->DESC;
-			$found['PARENT_ID'][$h->PARENT_ID] = $h->DESC_czp;
-		}
-		return $found;
-	}
-
-	public function build_tree_flat_info(&$tree, $flat) {
-		foreach ($tree->Childs as $id => $obj) {
-			//sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
-			foreach ($tree->Parents[$id]->CHILD as $child) {
-				$tree->Childs[$id]->CHILD[$child] = count($tree->Parents[$child]->CHILD);
-			}
-		}
-	}
-
-	public function detect_tree_where_to_detail_cut(&$tree, $flag_not_to_cut = null) {
-		foreach ($tree->Childs as $id => $obj) {
-			//sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
-			$control = 0;
-			foreach ($obj->CHILD as $child) {
-				if ($child > 0) $control++;
-			}
-			if (empty($flag_not_to_cut)) {
-				if ($control > 1) {
-					//przeciecie jezeli jest wiecej wyjsc niz jedno z zaglebieniami
-					$tree->Childs[$id]->TO_DETAIL_CUT_FLAG = true;
-				}
-				if (isset($tree->Childs[$id]->GOTO_FLAG)) {
-					//przeciecie, jezeli jest wyjscie z kroku procesu do innego 
-					$tree->Childs[$id]->TO_DETAIL_CUT_FLAG = true;
-				}
-				if (isset($tree->Childs[$id]->IS_EXECUTED_BY)) {
-					//trzeba zbadac tez czy nie jest do niego dowiazywany w jakims miejscu proces
-					$tree->Childs[$id]->TO_DETAIL_CUT_FLAG = true;
-				}
-			} else {
-				$tree->Childs[$id]->NO_CUT_FLAG = true;
-			}
-		}
-	}
-
-	public function search_parent_ids_till_cut(&$tree, $init, &$find) {
-		//szukam lancuchow do optymalizacji do miejsca flagi CUT, kojarzac od razu linki
-		if (isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
-			$this->zoom_process_links($tree, $init, $init);
-		}
-		if (!isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
-			$find[] = $init;
-			$this->zoom_process_links($tree, $init, $find[0]);
-			foreach($tree->Childs[$init]->CHILD as $id => $count) {
-				$this->search_parent_ids_till_cut($tree, $id, $find);
-			}
-		}
-	}
-
-	public function zoom_process_links($tree, $id, $root_id) {
-		$db = DB::getDB();
-		if (isset($tree->Childs[$id]->GOTO_FLAG)) {
-			if (isset($tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO])) {
-				if (isset($tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO]->SOURCE)) {
-					$tree->Viev_Zpc[$root_id]->INTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO] = $tree->Childs[$id]->IF_TRUE_GOTO;
-				} else {
-					$tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO] = $tree->Childs[$id]->IF_TRUE_GOTO;
-				}
-			} else {
-				$tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO] = $tree->Childs[$id]->IF_TRUE_GOTO;
-				$obj = $db->get_by_id('CRM_PROCES',$tree->Childs[$id]->IF_TRUE_GOTO);
-				$tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->DESC = "{" . $obj->ID . "}" . V::strShortUtf8($obj->DESC, 50);
-				if ($tree->Childs[$id]->GOTO_FLAG == 'GOTO_AND_RETURN') {
-					$tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->EXTERNAL_LINK[$root_id] = $root_id;
-				}
-			}
-		}
-	}
-
-	public function build_path_zoom_proces_cut(&$tree, $init, $path_zpc = array()) {
-		$db = DB::getDB();
-		foreach ($tree->Childs as $id => $obj) {
-			if (!isset($tree->Viev_Zpc_found[$id])) {
-				$find = array();
-				$this->search_parent_ids_till_cut($tree, $id, $find);
-				foreach ($find as $find_id) {
-					$tree->Viev_Zpc_found[$find_id] = $find[0];
-					if ($find_id != $find[0]) {
-						$tree->Viev_Zpc_Parent[$find_id] = $find[0];// TODO: moze byc to z bledem jak nadrzedny bedzie zbitym ciagiem
-					}
-					else {
-						$tree->Viev_Zpc_Parent[$find_id] = $tree->Childs[$find_id]->PARENT;
-					}
-				}
-				$tree->Viev_Zpc[$id]->PATH = $find;
-				$obj = $db->get_by_id('CRM_PROCES', $id);
-				$tree->Viev_Zpc[$id]->DESC = "{" . $id . "}" . V::strShortUtf8($obj->DESC, 50, '...');
-			}
-		}
-
-		foreach($tree->Viev_Zpc as $id => $obj) {
-			if (!isset($obj->PARENT)) {
-				foreach($tree->Viev_Zpc as $id_=>$obj_) {
-					if (isset($tree->Childs[$id_]->SOURCE)) {
-						if (in_array($tree->Childs[$id]->PARENT, $obj_->PATH)) {
-							$tree->Viev_Zpc[$id]->PARENT = $id_;
-						}
-					}
-				}
-			}
-
-			if (!isset($tree->Viev_Zpc[$id]->PARENT)) {
-				$tree->Viev_Zpc[$id]->PARENT = $tree->Childs[$id]->PARENT;
-			}
-		}
-	}
-
-}

ファイルの差分が大きいため隠しています
+ 681 - 626
SE/superedit-SQIX_STRUCTURE_DB_SYNC.php


+ 222 - 0
SE/superedit-SYNC_DATABASES.php

@@ -0,0 +1,222 @@
+<?php
+//
+// synchronizacja do serwera postgres GIS
+//
+
+include_once('se-lib/DB_Dump.php');
+include_once('se-lib/UsersHelper.php');
+include_once('se-lib/Data_Source.php');
+
+
+
+class SYNC_DATABASES {
+	//plan
+	// jakie tabele
+	// synchronizujemy struktury - pierw nasze do gis, potem z gis do nas
+	// dodajemy triggery do remote dla A_RECORD_UPDATE_DATE i A_RECORD_UPDATE_AUTHOR i CREATE_DATE i CREATE_AUTHOR + do HISTA? potem
+	// ewentualnie do tabeli mowiacej o stanie synchronizacji 	_SYNC_DATABASE_TABLE_STATE
+	// todo
+	
+	
+	function set_table_to_sync($table) {
+		$this->set_table_to_sync[]=$table;
+	}
+	
+	
+	function set_local_db_id($id) {
+		$this->local_db_id=$id;
+		$this->db = DB::getDB($id);
+
+	}
+	
+	function set_remote_db_id($id) {
+		$this->remote_db_id=$id;
+		$this->gdb = DB::getDB($id);
+	}
+		
+		
+		
+		
+	function get_last_sync_date($table) {
+		$sql="select TABLE_NAME, unix_timestamp(LAST_SYNCED) as LAST_SYNCED from _SYNC_DATABASE_TABLE_STATE 
+		where DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' and TABLE_NAME='".$table."'
+		order by ID desc limit 1
+		";
+		$res=DB::query($sql);
+		DEBUG_S(-3,'Get date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		while($h=DB::fetch($res)) {
+			return $h->LAST_SYNCED;
+			
+		}
+		return 0;
+	}
+	
+	
+	function set_last_sync_date($table,$now) {
+		$sql="insert  into _SYNC_DATABASE_TABLE_STATE ( TABLE_NAME, LAST_SYNCED , DATABASE_SYNCED_ID , DATABASE_LOCAL_ID )
+		values ('".$table."' , from_unixtime('".$now."') , '".$this->remote_db_id."' , '".$this->local_db_id."')";
+		DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
+		DB::query($sql);
+		$sql="update  _SYNC_DATABASE_TABLE_STATE set  LAST_SYNCED=from_unixtime('".$now."') where TABLE_NAME='".$table."' 
+			and DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' ";
+		DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
+
+
+
+
+	}
+	function sync_struct() {
+		
+			$struct_rem=$this->gdb->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
+			DEBUG_S(-3,'Structure rem',$struct_rem,__FILE__,__FUNCTION__,__LINE__);
+			$this->db->STRUCTURE_GENERATE_PARSE($struct_rem,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW','SKIP-PRIMARY-KEY','getDB'=>$this->local_db_id));
+		
+
+			$struct_loc=$this->db->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
+			DEBUG_S(-3,'Structure local',$struct_loc,__FILE__,__FUNCTION__,__LINE__);
+			$this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW','SKIP-PRIMARY-KEY','getDB'=>$this->remote_db_id));
+		foreach($this->set_table_to_sync as $table) {
+			$this->db->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);
+			$this->gdb->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);			
+		}
+		
+			
+	}
+	
+	
+	function get_current_time() {
+		$this->currtime_loc=$this->db->get_current_time();
+		$this->currtime_rem=$this->gdb->get_current_time();
+		DEBUG_S(-3,'Times curr',array($this->currtime_loc,$this->currtime_rem),__FILE__,__FUNCTION__,__LINE__);
+	}
+	
+	
+	function sync_data() {
+
+		//	$struct_loc=$this->db->STRUCTURE_GENERATE(array('_SYNC_DATABASE_TABLE_STATE'),null,null);
+		//	$this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW'));
+
+		
+
+
+			foreach($this->set_table_to_sync as $table) {
+			unset($this->ids_rem);
+			unset($this->ids_loc);
+			//Przegrywamy danych ktorych nie ma
+			//Synchronizujemy zmiany
+			 //Zaznaczmy poczatkowa zakresu synchronizacji (wszystko co potem, bedzie znowu musialo isc do synchronizacji)
+			 //To samo po stronie lokalnej i zdalnej 
+			 //Wez dane z jednej i drugiej strony po dacie i wrzuc na druga strone zawsze (lecimy po historii)
+			  	//$LAST_SYNCED=$this->db->get_last_sync_date($table);
+			  	$LAST_SYNCED_loc=$this->db->get_last_sync_date($table,$this->remote_db_id,$this->local_db_id);
+			  	$LAST_SYNCED_rem=$this->gdb->get_last_sync_date($table,$this->local_db_id,$this->remote_db_id);
+
+
+			  	self::get_current_time();
+			  	$loc_key=$this->db->show_index_value($table);
+			  	$rem_key=$this->gdb->show_index_value($table);
+			  	DEBUG_S(-3,'Last synced for '.$table,array($LAST_SYNCED_loc,$LAST_SYNCED_rem),__FILE__,__FUNCTION__,__LINE__);
+			  	$ids_rem=$this->gdb->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_rem,$this->currtime_rem,$loc_key);
+			  	while($h=$this->gdb->fetch($ids_rem)) {
+				  	$this->ids_rem[$h->$rem_key]=$h;
+			  	}
+			  	$ids_loc=$this->db->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_loc,$this->currtime_loc,$rem_key);
+			  	while($h=$this->db->fetch($ids_loc)) {
+				  	$this->ids_loc[$h->$loc_key]=$h;
+			  	}
+			 // 	DEBUG_S(-3,'this->ids_rem',$this->ids_rem,__FILE__,__FUNCTION__,__LINE__);
+			 // 	DEBUG_S(-3,'this->ids_loc',$this->ids_loc,__FILE__,__FUNCTION__,__LINE__);
+			  	DEBUG_S(-3,'structure',$this->db->describe_table_value($table),__FILE__,__FUNCTION__,__LINE__);
+
+
+			  //	$ds_loc = new Data_Source($this->local_db_id);
+			  //	$ds_loc->setTable($table);
+
+			  	//1) insert new data (data without remote primary key) and vice_versa
+			  
+			  	DEBUG_S(-3,'Jade z REM do LOCAL',null,__FILE__,__FUNCTION__,__LINE__);
+			  	foreach($this->ids_rem as $ind=>$val) {
+				  	if(empty($val->$loc_key)) {
+				  		//nowe rekordy ze zdalnego 
+				  	//	echo "<br> Adding to ".$table." ".print_r($val);
+				  		//DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
+					  	$last_id=$this->db->ADD_NEW_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val)) or die('Blad dodania: '.$sql);
+						  	$sql='update "'.$table.'" set "'.$loc_key.'"=\''.$last_id.'\' where "'.$rem_key.'"='.$val->$rem_key;
+						  	DEBUG_S(-3,'notified new obj to rem',$sql,__FILE__,__FUNCTION__,__LINE__);
+						  	$this->gdb->query($sql);
+					  //	echo "<br>";
+					  	
+					  	
+				  	} else {
+				  		if(empty($this->ids_loc[$val->$loc_key]))  {
+				  			DEBUG_S(-3,"Brak klucza w loc ".$loc_key." (".$val->$loc_key.") - robie UPDATE w LOC ",$val,__FILE__,__FUNCTION__,__LINE__);
+				  			$res=$this->db->UPDATE_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val)) ;
+				  			DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
+
+				  		}
+					  	
+				  	}
+			  	}
+			  	DEBUG_S(-3,'Jade z LOCAL do REM',null,__FILE__,__FUNCTION__,__LINE__);
+			  	//insert lokalnych nowych do zdalnego
+			  	foreach($this->ids_loc as $ind=>$val) {
+				  	if(!($val->$rem_key)) {
+				  		//nowe rekordy ze zdalnego 
+				  		$val_loc_key=$val->$loc_key;
+				  		//echo "<br> Adding to ".$table." local key of(".$loc_key.") is ".$val->$loc_key." " .print_r($val);
+					  	//DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
+					  	$last_id=$this->gdb->ADD_NEW_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val),'dieonerror');
+						  	$sql='update `'.$table.'` set `'.$rem_key.'`=\''.$last_id.'\' where `'.$loc_key.'`='.$val_loc_key;
+						  	DEBUG_S(-3,'notified new obj to rem',array($sql,$last_id),__FILE__,__FUNCTION__,__LINE__);
+						  	$this->db->query($sql);
+					  //	echo "<br>";
+					  	
+					  	
+				  	} else {
+				  		if(empty($this->ids_rem[$val->$rem_key]))  {
+				  			DEBUG_S(-3,"Brak klucza w rem ".$rem_key." (".$val->$rem_key.") - robie UPDATE w REM",array($val,$this->gdb->MAKE_DB_OBJ($table,$val)),__FILE__,__FUNCTION__,__LINE__);
+				  			
+				  			$res=$this->gdb->UPDATE_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val)) ;
+				  			DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
+
+				  		}					  	
+					  	
+				  	}
+			  	}
+			  	
+			  	
+			  	//self::set_last_sync_date($table,$this->currtime_loc);
+			  	$this->db->set_last_sync_date($table,$this->currtime_loc,$this->remote_db_id,$this->local_db_id);
+			  	$this->gdb->set_last_sync_date($table,$this->currtime_rem,$this->local_db_id,$this->remote_db_id);
+
+
+			}
+
+	}
+	
+	
+	
+}
+
+
+
+$sd = new SYNC_DATABASES;
+$sd->set_local_db_id(36);
+$sd->set_remote_db_id(13102);
+$sd->set_table_to_sync('Rozdzielcza_PionyKablowe');
+$sd->set_table_to_sync('Rozdzielcza_Mikrokanalizacja_do_klienta');
+$sd->set_table_to_sync('BUILDINGS');
+
+$sd->set_table_to_sync('IN7_MK_BAZA_DYSTRYBUCJI');
+$sd->set_table_to_sync('TELBOXES');
+$sd->set_table_to_sync('Rozdzielcza_rurociag_wsg84');
+$sd->set_table_to_sync('MK_Rewiry');
+
+//$sd->sync_struct();
+$sd->sync_data();
+
+
+die('Temporary die at line 19 call bindera');
+
+
+

+ 31 - 15
SE/superedit-SYNC_GIS_GEOPORTAL_IMPORT.php

@@ -11,11 +11,23 @@ include_once('se-lib/UsersHelper.php');
 function get_data($url) {
 	$ch = curl_init();
 	$timeout = 5;
+	
+	$User_Agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
+
+	$request_headers = array();
+	$request_headers[] = 'User-Agent: '. $User_Agent;
+	$request_headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
+	curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
+	
 	curl_setopt($ch, CURLOPT_URL, $url);
 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 	$data = curl_exec($ch);
+	$error=curl_error ( $ch);
+	
+	echo $error;
 	curl_close($ch);
+	
 	return $data;
 }
 
@@ -56,12 +68,12 @@ $step_x=0.01;
 
 
 //dla gdanska
-$bbox_y0=54.29; //dol
-$bbox_x0=18.43; //lewo
-$bbox_y1=54.50; //gora
-$bbox_x1=19.00;//prawo
-$step_y=0.05;
-$step_x=0.05;
+$bbox_x0=23.32; //lewo
+$bbox_y0=50.39; //dol
+$bbox_x1=23.43;//prawo
+$bbox_y1=50.52; //gora
+$step_y=0.01;
+$step_x=0.01;
 
 
 /*
@@ -141,7 +153,7 @@ echo "<br> bede jechac ".$url_get;
 			
 			//var_dump($result);
 			
-			//DEBUG_S(-3,'x',array($url_get,$xml_,$xml,$element,$result,$ind,$count,$exp),__FILE__,__FUNCTION__,__LINE__);
+			DEBUG_S(-3,'x',array($url_get,$xml_,$xml,$element,$result,$ind,$count,$exp),__FILE__,__FUNCTION__,__LINE__);
 			
 			
 			
@@ -164,15 +176,19 @@ echo "<br> bede jechac ".$url_get;
 				$WKT=implode(",", $WKT_);
 				//print_r($WKT);
 				
-				$sql='delete from  "'.$tbl_dest.'" where "REM_SYSTEM"=\''.$url.'\' and "REM_ID"=\''.$exp_['ID'].'\'';
-				$gdb->query($sql);
-			
+				//$sql='delete from  "'.$tbl_dest.'" where "REM_SYSTEM"=\''.$url.'\' and "REM_ID"=\''.$exp_['ID'].'\'';
+				//$gdb->query($sql);
+				//nie kasujemy istniejaych obiektow - TODO 
+				$sql='select "REM_ID" from "'.$tbl_dest.'" where "REM_SYSTEM"=\''.$url.'\' and "REM_ID"=\''.$exp_['ID'].'\' ';
+				$res=$gdb->query($sql);
+				if($gdb->count($res)<1) {
 				
-				$sql='insert  into "'.$tbl_dest.'" ( "REM_SYSTEM","REM_ID","IDENTYFIKATOR","POWIERZCHNIA","posList","A_RECORD_CREATE_DATE" ) values 
-				(\''.$url.'\',\''.$exp_['ID'].'\',\''.$exp_['IDENTYFIKATOR'].'\' , \''.$exp_['POWIERZCHNIA'].'\',ST_GeomFromEWKT(\'SRID=4326;POLYGON(('.$WKT.'))\') ,now() ) 
-				';
-				echo "\n<br>".$sql;	
-				$gdb->query($sql);
+					$sql='insert  into "'.$tbl_dest.'" ( "REM_SYSTEM","REM_ID","IDENTYFIKATOR","POWIERZCHNIA","posList","A_RECORD_CREATE_DATE" ) values 
+					(\''.$url.'\',\''.$exp_['ID'].'\',\''.$exp_['IDENTYFIKATOR'].'\' , \''.$exp_['POWIERZCHNIA'].'\',ST_GeomFromEWKT(\'SRID=4326;POLYGON(('.$WKT.'))\') ,now() ) 
+					';
+					echo "\n<br>".$sql;	
+					$gdb->query($sql);
+				} else echo " | Obj ".$exp_['ID']." already exists in DB";
 			}
 			
 			unset($exp);

+ 433 - 47
SE/superedit-SYNC_GIS_TABLES.php

@@ -20,6 +20,8 @@ function SYNC_GIS_TABLES() {
 	
 	
 	
+	
+	
 	DEBUG_S(-3,'db',$db);
 		DEBUG_S(-3,'gis',$gdb);
 		
@@ -56,13 +58,42 @@ function SYNC_GIS_TABLES() {
 			
 			echo "<br> aktualziacja relacji obiektow do paszportyzacji optycznej";
 			
-		 function gis_opto_relations($table_to_set,$field_index,$field_to_set,$table_from,$field_from,$ST_Relate='******F**',$filter_sql='') {
+			
+		 function gis_opto_intersect($table_to_set,$field_index,$field_to_set,$table_from,$field_from,$filter_table_from='') {
+			global $gdb;
+
+			 $sql='drop table if exists gis_opto_relations;
+			 	-- gis_opto_intersect
+			 	select t1."'.$field_index.'" as "field_index", t2."'.$field_from.'" as "field_from"
+			 	, 1
+			 	as if_true , t2.*
+			 	into temporary table gis_opto_relations 
+			 	FROM "'.$table_to_set.'" as t1 
+			 	INNER JOIN "'.$table_from.'"  as t2 ON ST_Intersects(t1.the_geom, t2.the_geom) '.$filter_table_from.' ;
+			 	
+			 	 CREATE  INDEX myfield ON gis_opto_relations ("field_from");
+			 	
+			 	update "'.$table_to_set.'"  t1
+			 	set "'.$field_to_set.'"=t2.field_from 
+			 	
+			 	from  gis_opto_relations t2
+			 	where   t1."'.$field_index.'"=t2.field_index and t2.if_true=1
+			 	 '.$filter_sql.'
+			 	;
+			 	
+			    drop table gis_opto_relations;';
+			 DEBUG_S(-3,"Zapytanie sql aktualizujace ".$table_to_set,$sql,__FILE__,__FUNCTION__,__LINE__);
+			 $gdb->query($sql);
+
+		 }
+			
+		 function gis_opto_relations($table_to_set,$field_index,$field_to_set,$table_from,$field_from,$ST_Relate='******F**',$filter_sql='',$filter_table_from=' on 1=1 ') {
 			 global $gdb;
 			 $sql='
-			 
+			 	-- gis_opto_relations
 			 	drop table if exists gis_opto_relations;
 
-			 	select t1.'.$field_index.' as "field_index", t2."'.$field_from.'" as "field_from"
+			 	select t1."'.$field_index.'" as "field_index", t2."'.$field_from.'" as "field_from"
 			 	
 			 	, case ST_Relate(t1."the_geom",t2."the_geom",\''.$ST_Relate.'\') when true then
 			 	1
@@ -70,7 +101,7 @@ function SYNC_GIS_TABLES() {
 			 	as if_true , t2.*
 			 	into temporary table gis_opto_relations 
 			 	FROM "'.$table_to_set.'" as t1 
-			 	CROSS JOIN "'.$table_from.'"  as t2;
+			 	LEFT JOIN "'.$table_from.'"  as t2 '.$filter_table_from.' ;
 			 	
 			 	 CREATE  INDEX myfield ON gis_opto_relations (field_from);
 			 	
@@ -94,14 +125,36 @@ function SYNC_GIS_TABLES() {
 		 
 		 
 		 
-		 function gis_opto_calculations($table_to_set,$field_index,$field_to_set,$table_from,$field_from_geom,$ST_Relate='******F**',$filter_sql='') {
+		 function gis_opto_calculations($table_to_set,$field_index,$field_to_set,$table_from,$field_from_geom,$ST_Relate='******F**',$filter_sql='',$price_column='',$lenght_column='') {
 			 			 global $gdb;
+			 			 $sql_select='';$sql_price='';
+			 			 if(is_array($field_index)) {
+				 			 $field_index_t1=$field_index[0];
+				 			 $field_index_t2=$field_index[1];
+			 			 } else {
+				 			 $field_index_t1=$field_index;
+				 			 $field_index_t2=$field_index;
+			 			 }
+			 			 
+			 			 if(strlen($price_column)>0) { $sql_select=', t2."'.$price_column.'"';
+				 			 						   $sql_price='*t2."'.$price_column.'"';
+			 			 }
+			 			// if(!empty($filter_sql)) {
+				 		//	 $ST_Relate=" 1=1 ";
+				 		//	 $ST_Intersects=" 1=1 ";
+			 			// } else {
+				 			 $ST_Relate='ST_Relate(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'",\''.$ST_Relate.'\')';
+				 			 $ST_Intersects='ST_Intersects(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'")';
+			 			// }
+
+
 
 			 $sql='
+			 -- gis_opto_calculations
 			 drop table if exists "'.$table_from.'_AGR" ;
-			 select t1.'.$field_index.'  , t2.'.$field_index.' as gid_t2
-				, ST_Intersects(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'")
-				, case ST_Relate(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'",\''.$ST_Relate.'\') when true then
+			 select t1."'.$field_index_t1.'" as field_index '.$sql_select.'
+				, '.$ST_Intersects.'
+				, case '.$ST_Relate.' '.$filter_sql.' when true then
 				 ST_Length_Spheroid(t2."'.$field_from_geom.'",\'SPHEROID["WGS 84",6378137,298.257223563]\')
 				 else \'0\' end
 				as length
@@ -109,28 +162,50 @@ function SYNC_GIS_TABLES() {
 				 FROM "'.$table_to_set.'" as t1 
 				CROSS JOIN "'.$table_from.'"  as t2
 				;
-				
+				CREATE INDEX ON "'.$table_from.'_AGR" ("field_index");
+
 				update  "'.$table_to_set.'"  t1
 				set "'.$field_to_set.'"=(
 				select 
-				 round(sum(t2.length)) 
-				 from "'.$table_from.'_AGR" as t2 where t2.'.$field_index.'=t1.'.$field_index.'
+				 round(sum(t2.length'.$sql_price.')) 
+				 from "'.$table_from.'_AGR" as t2 where t2."field_index"=t1."'.$field_index_t1.'"
 				)
 				
 				;';
 				
-				echo "<br>sql to :  ".$sql;
+				if(!empty($lenght_column)) { //wylicamy dlugosc
+					
+					
+					
+				}
+				
+
+				
+				DEBUG_S(-3,'Zapyt gis_opt '.$table_to_set,$sql,__FILE__,__FUNCTION__,__LINE__);
+				flush();
 				$gdb->query($sql);
 		 }
 		 
-		 function gis_opto_calculations_count($table_to_set,$field_index,$field_to_set,$table_from,$field_from_geom,$ST_Relate='******F**',$filter_sql='') {
+		 function gis_opto_calculations_count($table_to_set,$field_index,$field_to_set,$table_from,$field_from_geom,$ST_Relate='******F**',$filter_sql='',$price_column='') {
 			 			 global $gdb;
+			 			 $sql_select='';$sql_price='';
+			 			 if(strlen($price_column)>0) { $sql_select=', t2."'.$price_column.'"';
+				 			 						   $sql_price='*t2."'.$price_column.'"';
+			 			 }
+			 			 if(is_array($field_index)) {
+				 			 $field_index_t1=$field_index[0];
+				 			 $field_index_t2=$field_index[1];
+			 			 } else {
+				 			 $field_index_t1=$field_index;
+				 			 $field_index_t2=$field_index;
+			 			 }
 
 			 $sql='
+			 -- gis_opto_calculations_count
 			 drop table if exists "'.$table_from.'_AGR" ;
-			 select t1.'.$field_index.' 
+			 select t1."'.$field_index_t1.'" as field_index '.$sql_select.'
 				, ST_Intersects(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'")
-				, case ST_Relate(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'",\''.$ST_Relate.'\') when true then
+				, case ST_Relate(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'",\''.$ST_Relate.'\') '.$filter_sql.' when true then
 				 1
 				 else 0 end
 				as length
@@ -139,50 +214,368 @@ function SYNC_GIS_TABLES() {
 				CROSS JOIN "'.$table_from.'"  as t2
 				;
 				
+				CREATE INDEX ON "'.$table_from.'_AGR" ("field_index");
+
+				update  "'.$table_to_set.'"  t1
+				set "'.$field_to_set.'"=(
+				select 
+				 sum(t2.length'.$sql_price.')
+				 from "'.$table_from.'_AGR" as t2 where t2."field_index"=t1."'.$field_index_t1.'"
+				)
+				
+				;';
+				
+				DEBUG_S(-3,'sql',array($sql,debug_backtrace()),__FILE__,__FUNCTION__,__LINE__);
+				
+				$gdb->query($sql);
+		 }
+		 
+		 
+		 	 function gis_opto_calculations_sum($table_to_set,$field_index,$field_to_set,$table_from,$field_from_geom,$ST_Relate='******F**',$filter_sql='',$field_to_sum) {
+			 			 global $gdb;
+			 			 if(is_array($field_index)) {
+				 			 $field_index_t1=$field_index[0];
+				 			 $field_index_t2=$field_index[1];
+			 			 } else {
+				 			 $field_index_t1=$field_index;
+				 			 $field_index_t2=$field_index;
+			 			 }
+
+			 $sql='
+			 -- gis_opto_calculations_sum
+			 drop table if exists "'.$table_from.'_AGR" ;
+			 select t1."'.$field_index_t1.'" as field_index
+				, ST_Intersects(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'")
+				, case ST_Relate(t1."'.$field_from_geom.'",t2."'.$field_from_geom.'",\''.$ST_Relate.'\') '.$filter_sql.' when true then
+				 t2."'.$field_to_sum.'"
+				 else 0 end
+				as length
+				 into  temporary table "'.$table_from.'_AGR" 
+				 FROM "'.$table_to_set.'" as t1 
+				CROSS JOIN "'.$table_from.'"  as t2
+				;
+				
+				CREATE INDEX ON "'.$table_from.'_AGR" ("field_index");
+
 				
 				update  "'.$table_to_set.'"  t1
 				set "'.$field_to_set.'"=(
 				select 
 				 sum(t2.length)
-				 from "'.$table_from.'_AGR" as t2 where t2.'.$field_index.'=t1.'.$field_index.'
+				 from "'.$table_from.'_AGR" as t2 where t2."field_index"=t1."'.$field_index_t1.'"
 				)
 				
 				;';
 				
-				echo "<br>sql to :  ".$sql;
+				DEBUG_S(-3,'sql calc_sum '.$table_to_set,$sql,__FILE__,__FUNCTION__,__LINE__);
 				$gdb->query($sql);
 		 }
 		 
-		gis_opto_calculations('Inwestycje_Planowane','gid','Agr_metrow_mikrorurek_5szt','Rozdzielcza_Pakiet5MikrorurekMagistrala_WSG84','the_geom','T********');
-		gis_opto_calculations('Inwestycje_Planowane','gid','Agr_metrow_mikrorurek','Rozdzielcza_Mikrokanalizacja_do_klienta','the_geom','T********');
-		gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_wykopu','Rozdzielcza_Wykop_przedmiar_na_mikrorurki','the_geom','******F**');
-		gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_przeciskow','Rozdzielcza_Przeciski_110mm','the_geom','******F**');
-		gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_zabrukow','Rozdzielcza_Zabruki','the_geom','******F**');
-		gis_opto_calculations_count('Inwestycje_Planowane','gid','Agr_ilosc_domow','MK_Mieszkania','the_geom','******F**');
-
-	    $sql_cena='update "Inwestycje_Planowane" set	"Agr_metrow_mikrorurek_5szt"=0 where "Agr_metrow_mikrorurek_5szt" is null;'; 
- 
+		 
+		 		function gis_opto_calculations_set_lenght($table_to_set,$field_to_set) {
+			 		global $gdb;
+			 		$sql='
+			 		-- gis_opto_calculations_set_lenght
+			 		update "'.$table_to_set.'" set "'.$field_to_set.'"=round(ST_Length_Spheroid("the_geom",\'SPHEROID["WGS 84",6378137,298.257223563]\')) ';
+			 		DEBUG_S(-3,'sql set_lenght '.$table_to_set,$sql,__FILE__,__FUNCTION__,__LINE__);
+			 		$gdb->query($sql);
+		 		}
+		 
+		 		function USERS2_MARKETING_OVERWIEV_to_MK_Budynki(){
+			 			global $db,$gdb;
+			 			  $sql='select t1.* ,  t2.A_STATUS as BUILDING_STATUS , t2.geoportal_gml_punkty_adr_gml_id  from USERS2_MARKETING_OVERWIEV  t1 inner join
+			 			  	    BUILDINGS as t2 on t2.S_ADDRESS_STREET=t1.T_TELBOX_BUILDING_IN where t2.geoportal_gml_punkty_adr_gml_id!=\'\' or S_ADDRESS_STREET!=\'\'';
+			 			  $res=$db->query($sql);
+			 			 
+			 			 echo "<br> To update USERS2_MARKETING_OVERWIEV use ?FUNCTION_INIT=STATYSTYKA_TABELE ".$sql;
+			 			 
+			 			 $row=0;
+			 			 
+			 			  while($h=$db->fetch($res)) {
+				 			  if($row==0) { //add columns
+					 			  foreach($h as $col=>$val) {
+						 			 $sql="SELECT column_name FROM information_schema.columns WHERE table_name='MK_Budynki' and column_name='".$col."'";
+						 			 $res2=$gdb->query($sql);
+						 			 if($gdb->count($res2)==0) {
+						 			 
+						 			  $sql='alter table "MK_Budynki" add "'.$col.'" char(255) not null default \'\' '; echo "<br> ".$sql; flush();
+						 			  $gdb->query($sql);
+						 			  } else echo " Field ".$col." exists. ";
+					 			  }
+				 			  }
+				 			  $set=array();
+				 			  foreach($h as $col=>$val) {
+					 			  $set[]="\"".$col."\"='".$val."'";
+				 			  }
+				 			  
+				 			  $sql='update "MK_Budynki" set '.implode(',', $set).' where ( geoportal_gml_punkty_adr_gml_id=\''.$h->geoportal_gml_punkty_adr_gml_id.'\' and geoportal_gml_punkty_adr_gml_id!=\'\' ) or ( "T_TELBOX_BUILDING_IN"=\''.$h->T_TELBOX_BUILDING_IN.'\' and (  geoportal_gml_punkty_adr_gml_id=\'\' or geoportal_gml_punkty_adr_gml_id is null ) )';
+				 			  echo "<br> ".$sql;
+				 			  $gdb->query($sql);
+
+				 			  $row++;
+				 			  
+			 			  }
+
+			 		
+		 		}
+		 
+		 
+		 		 	function PROCESY5_to_GIS($p5_table,$p5_key,$gis_table,$gis_key,$p5_what_extra='',$p5_join='',$p5_limit=''){
+			 			global $db,$gdb;
+			 			
+			 			//! pierw trigger
+			 			$trigger_psql_do_timestamp="CREATE OR REPLACE FUNCTION update_A_RECORD_UPDATE_DATE_column()
+								RETURNS TRIGGER AS $$
+								BEGIN
+								NEW.\"A_RECORD_UPDATE_DATE\" = now(); 
+								RETURN NEW;
+								END;
+								$$ language 'plpgsql';";
+								$gdb->query($sql);
+
+			 			  $sql='select t1.* '.$p5_what.' from '.$p5_table.' as t1 
+			 			  where t1.'.$p5_key.'!=\'\' or t1.'.$p5_key.' is not null ';
+			 			  $res=$db->query($sql);
+			 			 
+			 			 echo "<br> f.PROCESY5_to_GIS use  ".$sql;
+			 			 
+			 			 $row=0;
+			 			 
+			 			  while($h=$db->fetch($res)) {
+				 			  if($row==0) { //add columns
+					 			  foreach($h as $col=>$val) {
+						 			 $sql="SELECT column_name FROM information_schema.columns WHERE table_name='".$gis_table."' and column_name='".$col."'";
+						 			 $res2=$gdb->query($sql);
+						 			 if($gdb->count($res2)==0) {
+						 			 
+						 			  $sql='alter table "'.$gis_table.'" add "'.$col.'" char(255) not null default \'\' '; echo "<br> ".$sql; flush();
+						 			  $gdb->query($sql);
+						 			  
+						 			  if($col=='A_RECORD_UPDATE_DATE') {
+							 			  $gdb->query("CREATE TRIGGER update_A_RECORD_UPDATE_DATE BEFORE UPDATE
+							 			 			 ON \"".$gis_table."\" FOR EACH ROW EXECUTE PROCEDURE 
+							 			 			 update_A_RECORD_UPDATE_DATE_column();");
+						 			  }
+						 			  
+						 			  
+						 			  } else echo " Field ".$col." exists. ";
+					 			  }
+				 			  }
+				 			  $set=array();
+				 			  $insert=array();
+				 			  foreach($h as $col=>$val) {
+					 			  if($col=='the_geom') continue; //todo GEOM tez kopiowac trzeba ale inaczej
+					 			  if($col==$gis_key) continue;
+					 			  $set[]="\"".$col."\"='".$gdb->_($val)."'";
+					 			  $insert['row'][]='"'.$col.'"';
+					 			  $insert['vals'][]="'".$gdb->_($val)."'";
+				 			  }
+				 			  
+				 			  $sql='update "'.$gis_table.'" set '.implode(',', $set).' where ( "'.$gis_key.'"=\''.$h->$p5_key.'\' and "'.$gis_key.'"!=\'\'  )
+				 			  ';
+				 			 //			 			   --  and "A_RECORD_UPDATE_DATE"<\''.$h->A_RECORD_UPDATE_DATE.'\''; //Jak poprawi Piotr aktualizacje GIS to bedzie OK. 
+				 			//  echo "<br> ".$sql;
+
+				 			  $gdb->query($sql);
+
+				 			  if(!empty($h->the_geom)) { //new record dodajemy jak jest oznaczona geometria
+				 			  	$sql='insert into "'.$his_table.'" ( '.implode(',', $insert['row']).' values ( '.implode(',',$insert['vals']).' )';
+					 			// echo "<br> ".$sql;	  
+				 			  }
+
+				 			  $row++;
+				 			  
+			 			  }
+
+
+			 			  { //! teraz aktualizujemy po timestampie w prawo
+				 			  
+	  
+			 			  }
+			 			  
+			 		
+		 		}
+		 
+		 function POSTGIS_to_MYSQL_Tables($local_table_mysql,$local_key,$remote_table_postgis,$remote_key){
+			 	global $db,$gdb;
+			 		$sql='select "'.$remote_key.'", ST_AsText(the_geom) as the_geom from "'.$remote_table_postgis.'" where "'.$remote_key.'"!=\'\' and "'.$remote_key.'" is not null and the_geom!=\'\' and the_geom is not null ';
+			 		$res=$gdb->query($sql);
+			 		while($h=$gdb->fetch($res)) {
+				 		$sql2="update `".$local_table_mysql."` set `the_geom`=GeomFromText('".$h->the_geom."') where `".$local_key."`='".trim($h->$remote_key)."' and `".$local_key."`!='' and `".$local_key."` is not null
+				 		  and ( the_geom='' or the_geom is null )";
+				 		echo "<br> ".$sql2;
+				 		$db->query($sql2) or die('Problem with sql 228: '.$sql);
+			 		}
+  
+		 }
+
+		 
+		 		
+		
+		
+		
+		 gis_opto_calculations_set_lenght('Rozdzielcza_rurociag_wsg84','dlugosc');
+		 gis_opto_calculations_set_lenght('Rozdzielcza_Kabel_Swiatlowodowy_wsg84','Dlugosc');
+
+
+		
+		 gis_opto_intersect('geoportal_gml_punkty_adr','id_0','Mk_Rewir_set','MK_Rewiry','gid');
+		 gis_opto_intersect('Rozdzielcza_rurociag_wsg84','gid','Mk_Rewir_set','MK_Rewiry','gid');
+
+
+		 gis_opto_intersect('MK_Budynki','gid','geoportal_gml_punkty_adr_gml_id','geoportal_gml_punkty_adr','gml_id',' and t2."Mk_Rewir_set">0 ');
+
+//	gis_opto_intersect('Rozdzielcza_Wykop_przedmiar_na_mikrorurki','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+		 gis_opto_intersect('Rozdzielcza_Wykop_przedmiar_na_mikrorurki','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_Mikrokanalizacja_do_klienta','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+		 gis_opto_intersect('Rozdzielcza_Mikrokanalizacja_do_klienta','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+		
+//	 gis_opto_intersect('Rozdzielcza_Pakiet5MikrorurekMagistrala_WSG84','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_Pakiet5MikrorurekMagistrala_WSG84','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+//	 gis_opto_intersect('Rozdzielcza_Przeciski_110mm','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_Przeciski_110mm','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_Zabruki','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_Zabruki','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_koszty_dodatkowe_wsg84','id_0','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_koszty_dodatkowe_wsg84','id_0','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_rurociag_wsg84','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_rurociag_wsg84','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID','  and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_wezly','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	   gis_opto_intersect('Rozdzielcza_wezly','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('Rozdzielcza_Kabel_Swiatlowodowy_wsg84','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	  gis_opto_intersect('Rozdzielcza_Kabel_Swiatlowodowy_wsg84','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//	gis_opto_intersect('MK_Budynki','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	  gis_opto_intersect('MK_Budynki','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+//	gis_opto_intersect('MK_Mieszkania','gid','ID_PROJECT','Inwestycje_Planowane','ID_PROJECT',' and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+	  gis_opto_intersect('MK_Mieszkania','gid','ID_PROJECT','IN7_MK_BAZA_DYSTRYBUCJI','ID',' and t2."ID"!=0 and (  t1."ID_PROJECT"=\'0\' or t1."ID_PROJECT"=\'\' or t1."ID_PROJECT" is  null ) ');
+
+//		 gis_opto_intersect('MK_Budynki','gid','geoportal_gml_punkty_adr_gml_id','geoportal_gml_punkty_adr','gml_id','');
+	
+		 //gis_opto_relations('MK_Budynki','gid','geoportal_gml_punkty_adr_gml_id','geoportal_gml_punkty_adr','gml_id','T********',''," on t2.\"Mk_Rewir_set\" > 0 ");
+		
+
+		// die('celowe 228');
+
+
+		DEBUG_S(-3,'Agr rurociag',null,__FILE__,__FUNCTION__,__LINE__);
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_Rozdzielcza_rurociag_wsg84','Rozdzielcza_rurociag_wsg84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI','ID','Agr_Rozdzielcza_rurociag_wsg84','Rozdzielcza_rurociag_wsg84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0 ');
+//	die('431');
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_Rozdzielcza_rurociag_wsg84_koszt','Rozdzielcza_rurociag_wsg84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ','cena_jedn');
+   		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI','ID','Agr_Rozdzielcza_rurociag_wsg84_koszt','Rozdzielcza_rurociag_wsg84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0 ','cena_jedn');
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84','Rozdzielcza_Kabel_Swiatlowodowy_wsg84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+	    gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84','Rozdzielcza_Kabel_Swiatlowodowy_wsg84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_koszt','Rozdzielcza_Kabel_Swiatlowodowy_wsg84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ','koszt_jedn');
+		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_koszt','Rozdzielcza_Kabel_Swiatlowodowy_wsg84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0','koszt_jedn');
+	
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_metrow_mikrorurek_5szt','Rozdzielcza_Pakiet5MikrorurekMagistrala_WSG84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+	    gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_metrow_mikrorurek_5szt','Rozdzielcza_Pakiet5MikrorurekMagistrala_WSG84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+DEBUG_S(-3,'CheckPoint',null,__FILE__,__FUNCTION__,__LINE__);
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_metrow_mikrorurek','Rozdzielcza_Mikrokanalizacja_do_klienta','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+	    gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_metrow_mikrorurek','Rozdzielcza_Mikrokanalizacja_do_klienta','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_wykopu','Rozdzielcza_Wykop_przedmiar_na_mikrorurki','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_wykopu','Rozdzielcza_Wykop_przedmiar_na_mikrorurki','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+DEBUG_S(-3,'CheckPoint Wykop prev',null,__FILE__,__FUNCTION__,__LINE__);
+	
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_przeciskow','Rozdzielcza_Przeciski_110mm','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_przeciskow','Rozdzielcza_Przeciski_110mm','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+
+//	gis_opto_calculations('Inwestycje_Planowane','gid','Agr_ilosc_zabrukow','Rozdzielcza_Zabruki','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_zabrukow','Rozdzielcza_Zabruki','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+DEBUG_S(-3,'CheckPoint',null,__FILE__,__FUNCTION__,__LINE__);
+//	gis_opto_calculations_count('Inwestycje_Planowane','gid','Agr_ilosc_domow','MK_Mieszkania','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations_count('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_domow','MK_Mieszkania','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+
+//	gis_opto_calculations_count('Inwestycje_Planowane','gid','Agr_ilosc_wezlow','Rozdzielcza_wezly','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ');
+		gis_opto_calculations_count('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_wezlow','Rozdzielcza_wezly','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0');
+
+//	gis_opto_calculations_count('Inwestycje_Planowane','gid','Agr_ilosc_wezlow_koszt','Rozdzielcza_wezly','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT" ','koszt_jedn');
+		gis_opto_calculations_count('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_ilosc_wezlow_koszt','Rozdzielcza_wezly','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0','koszt_jedn');
+	
+//	gis_opto_calculations_sum('Inwestycje_Planowane','gid','Agr_Rozdzielcza_koszty_dodatkowe_wsg84','Rozdzielcza_koszty_dodatkowe_wsg84','the_geom','******F**','and t1."ID_PROJECT"=t2."ID_PROJECT"','Wartosc_kosztu');
+		gis_opto_calculations_sum('IN7_MK_BAZA_DYSTRYBUCJI',array('ID','gid'),'Agr_Rozdzielcza_koszty_dodatkowe_wsg84','Rozdzielcza_koszty_dodatkowe_wsg84','the_geom','******F**','and t1."ID"::int=t2."ID_PROJECT"::int and t1."ID"!=0','Wartosc_kosztu');	
+		 
+		// PROCESY5_to_GIS('TELBOXES','ID','Rozdzielcza_lokalizacje','ID_TELBOXES');		
+		// PROCESY5_to_GIS('IN7_MK_BAZA_DYSTRYBUCJI','ID','Inwestycje_Planowane','ID_PROJECT');		
+	
+		// POSTGIS_to_MYSQL_Tables('BUILDINGS','geoportal_gml_punkty_adr_gml_id','MK_Budynki','geoportal_gml_punkty_adr_gml_id');
+		// POSTGIS_to_MYSQL_Tables('IN7_MK_BAZA_DYSTRYBUCJI','ID','Inwestycje_Planowane','ID_PROJECT');
+
+		// USERS2_MARKETING_OVERWIEV_to_MK_Budynki();
+	
+		
+
+//	  $sql_cena='update "Inwestycje_Planowane" set	"Agr_metrow_mikrorurek_5szt"=0 where "Agr_metrow_mikrorurek_5szt" is null;'; 
+//	  $gdb->query($sql_cena);
+
+	    $sql_cena='update "IN7_MK_BAZA_DYSTRYBUCJI" set	"Agr_metrow_mikrorurek_5szt"=0 where "Agr_metrow_mikrorurek_5szt" is null;'; 
 		$gdb->query($sql_cena);
-	    $sql_cena='update "Inwestycje_Planowane" set "Agr_ilosc_zabrukow"=0 where "Agr_ilosc_zabrukow" is null;';
+
+//	  $sql_cena='update "Inwestycje_Planowane" set "Agr_ilosc_zabrukow"=0 where "Agr_ilosc_zabrukow" is null;';
+//	  $gdb->query($sql_cena);
+
+		$sql_cena='update "IN7_MK_BAZA_DYSTRYBUCJI" set "Agr_ilosc_zabrukow"=0 where "Agr_ilosc_zabrukow" is null;';
 		$gdb->query($sql_cena);
 
-		$sql_cena='update "Inwestycje_Planowane" set 
-					koszt_wspolny="Agr_ilosc_wykopu"*10
-					+"Agr_metrow_mikrorurek"*3
-					+"Agr_metrow_mikrorurek_5szt"*7
-					+"Agr_ilosc_przeciskow"*80
-					+"Agr_ilosc_zabrukow"*40 
-					
+
+/*		$sql_cena='update "Inwestycje_Planowane" set 
+					koszt_wspolny="Agr_ilosc_wykopu"*"Agr_ilosc_wykopu_cena"
+					+"Agr_metrow_mikrorurek"*"Agr_metrow_mikrorurek_cena"
+					+"Agr_metrow_mikrorurek_5szt"*"Agr_metrow_mikrorurek_5szt_cena"
+					+"Agr_ilosc_przeciskow"*"Agr_ilosc_przeciskow_cena"
+					+"Agr_ilosc_zabrukow"*"Agr_ilosc_zabrukow_cena"
+					+"Agr_ilosc_wezlow_koszt"
+					+"Agr_Rozdzielcza_koszty_dodatkowe_wsg84"
+					+"Agr_Rozdzielcza_rurociag_wsg84_koszt"
+					+"Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_koszt"
+					+"Agr_ilosc_domow"*"Agr_MK_Mieszkania_cena_jedn"
 					;'; //"Agr_metrow_w_tpsa*3 +Agr_metrow_kabel*
-					//+ studnia +
+					////+ studnia1300 z pioh+ mufa 300 + spliter 200 = 1800 PLN za wezel 
+		 $gdb->query($sql_cena);
+*/
+		 $sql_cena='update "IN7_MK_BAZA_DYSTRYBUCJI" set 
+					koszt_wspolny="Agr_ilosc_wykopu"*"Agr_ilosc_wykopu_cena"
+					+"Agr_metrow_mikrorurek"*"Agr_metrow_mikrorurek_cena"
+					+"Agr_metrow_mikrorurek_5szt"*"Agr_metrow_mikrorurek_5szt_cena"
+					+"Agr_ilosc_przeciskow"*"Agr_ilosc_przeciskow_cena"
+					+"Agr_ilosc_zabrukow"*"Agr_ilosc_zabrukow_cena"
+					+"Agr_ilosc_wezlow_koszt"
+					+"Agr_Rozdzielcza_koszty_dodatkowe_wsg84"
+					+"Agr_Rozdzielcza_rurociag_wsg84_koszt"
+					+"Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_koszt"
+					+"Agr_ilosc_domow"*"Agr_MK_Mieszkania_cena_jedn"
+					;'; //"Agr_metrow_w_tpsa*3 +Agr_metrow_kabel*
+					////+ studnia1300 z pioh+ mufa 300 + spliter 200 = 1800 PLN za wezel 
+		  $gdb->query($sql_cena);
+
 		 
+//		 $sql_cena='update "Inwestycje_Planowane" set "Agr_MK_Mieszkania_koszt"=round("Agr_MK_Mieszkania_cena_jedn"*"Agr_ilosc_domow") where "Agr_ilosc_domow">0 '  ;
+//		 $gdb->query($sql_cena);
+//		 $sql_cena='update "Inwestycje_Planowane" set "koszt_na_dom"=round("koszt_wspolny"/"Agr_ilosc_domow") where "Agr_ilosc_domow">0 '  ;
+//		 $gdb->query($sql_cena);
+
+
+		 $sql_cena='update "IN7_MK_BAZA_DYSTRYBUCJI" set "Agr_MK_Mieszkania_koszt"=round("Agr_MK_Mieszkania_cena_jedn"*"Agr_ilosc_domow") where "Agr_ilosc_domow">0 '  ;
 		 $gdb->query($sql_cena);
-		$sql_cena='update "Inwestycje_Planowane" set "koszt_na_dom"=round("koszt_wspolny"/"Agr_ilosc_domow") where "Agr_ilosc_domow">0 '  ;
+		 $sql_cena='update "IN7_MK_BAZA_DYSTRYBUCJI" set "koszt_na_dom"=round("koszt_wspolny"/"Agr_ilosc_domow") where "Agr_ilosc_domow">0 '  ;
 		 $gdb->query($sql_cena);
 
-		 
-		 
-		 
+		 ///  	
+
+			 die("celowe zabicie zapytanie: ");
+	 
 		 
 		 gis_opto_relations('opt_tacki','id_0','id_przelac','opt_przelacznice_mufy','id_0','T********');
 		 gis_opto_relations('opt_spawy','id_0','id_tacka','opt_tacki','id_0','T********');
@@ -204,7 +597,6 @@ function SYNC_GIS_TABLES() {
 
 
 		
-		 die("zapytanie: ".$sql);
 //	add_pg_roles();
 	//dodanie wszystkich uzytkownikow z haslem
 //	public static function &get_users_list( $params = array(), $limit = 10, $limit_start = 0, $order_by = '', $order_dir = '' ) {
@@ -376,13 +768,7 @@ function SYNC_GIS_TABLES() {
 	
 	
 	
-		$trigger_psql_do_timestamp="CREATE OR REPLACE FUNCTION update_modified_column()
-			RETURNS TRIGGER AS $$
-			BEGIN
-			NEW.modified = now(); 
-			RETURN NEW;
-			END;";
-		
+				
 		
 		
 		

+ 84 - 6
SE/superedit-USER_OCENA_PRACOWNIKA.php

@@ -3,7 +3,16 @@
 /**
  * @see procesy5.php?task=USER_EDIT&_user_id=4865&_p=0
  */
+
+include_once('se-lib/Data_Source.php');
+
+Lib::loadClass('DB');
+
 function USER_OCENA_PRACOWNIKA() {
+	$db = DB::getDB();
+	Lib::loadClass('ProcesHelper');
+	$tblCRM_PROCES_USER_OCENA_OKRESId = ProcesHelper::getZasobTableID('CRM_PROCES_USER_OCENA_OKRES');
+
 
 	$usrLogin = V::get('usrLogin', '', $_GET);
 	$_print = ('1' == V::get('_print', '', $_GET));
@@ -28,7 +37,29 @@ function USER_OCENA_PRACOWNIKA() {
 		return;
 	}
 
-	Lib::loadClass('ProcesHelper');
+	/*
+	$obj_search->L_APPOITMENT_USER=$usrLogin;
+	$obj_search->ID='%';	
+	$obj_search->DATE=V::get('DATE','',$_GET);	
+	$obj_search->CW_ID='%';	
+	$obj_search->ID_PROCES='%';	
+	$obj_search->DESC='%';	
+	$obj_search->FUNCTION='%';	
+	$obj_search->OPIS_ZASOB='%';	
+	$obj_search->OCENA_PRACOWNIK='%';	
+	$obj_search->OCENA_KIEROWNIK='%';	
+	$obj_search->UWAGI_KIEROWNIK='%';	
+	$obj_search->OCENA_SDJ='%';			
+	$obj_search->UWAGI_SDJ='%';			
+	$obj_search->OCENA_PREZESA='%';			
+	$obj_search->UWAGI_PREZESA='%';			
+	$obj_search->OCENA_SDJ='%';			
+	$obj_search->OCENA_SDJ='%';			
+
+	$procesy_list=$db->get_searched_obj('CRM_PROCES_USER_OCENA_OKRES',$obj_search,$obj_search,null,(object)'DATE'=>'DESC'); 
+	unset($obj_search);
+*/
+/*	Lib::loadClass('ProcesHelper');
 	$procesy_list = ProcesHelper::get_procesy_by_stanowiska( array_keys($stanowiska) );
 	// update proces_list data
 	foreach ($procesy_list as $k => $p) {
@@ -37,25 +68,72 @@ function USER_OCENA_PRACOWNIKA() {
 			$procesy_list[$k]->stanowisko = $stanowiska[$p->z__ID]->DESC;
 		}
 	}
-
+*/
 	// TODO: _task=EXPORT  exit;
 
 
+
 	echo '<h3>';
 		echo $user->ADM_NAME;
+		//echo '<span style="float:right">' . "data: " . date("Y-m-d") . '</span>';
+		    echo " </h3>";
+		    //! Javascript CRM_PROCES_USER_OCENA_OKRES_select_date
+		
+		/*
+			Lib::loadClass('TableAcl');
+
+			Lib::loadClass('ViewAjax');
+		   	Lib::loadClass('TableAjax');
+		   	Lib::loadClass('TreeAjax');
+
+		   //	=new TableAcl(12859);
+		   	$TableAcl=TableAcl::getInstance(12859);
+		   //	print_r($TableAcl);
+		   	$ta=new TreeAjax($TableAcl);
+
+		   */
+		    echo "Wybierz okres oceny:
+		    <form action='index.php' method='get'>
+		    <input type='hidden' name='MENU_INIT' value='VIEWTABLE_AJAX'>
+		    <input type='hidden' name='ff_L_APPOITMENT_USER' value='".V::get('usrLogin','',$_GET)."'>
+		    <input type='hidden' name='ZASOB_ID' value='".$tblCRM_PROCES_USER_OCENA_OKRESId."'>
+
+		    <input type='hidden' name='_hash' value='".rand(0,9999999)."'>
+		    <select name='f_DATE' id='ff_DATE' onChange=this.form.submit()>
+		    <option value=' '>---</option>";
+			
+		$obj_search->L_APPOITMENT_USER=$usrLogin;
+		$obj_search->DATE='%';
+		$obj_order->DATE='DESC';
+		$res= $db->get_searched_obj('CRM_PROCES_USER_OCENA_OKRES',$obj_search,$obj_search,$obj_search,$obj_order); 
+		unset($obj_search,$obj_order);
+		while($h=$db->fetch($res)) {
+			echo "\n<option value='".$h->DATE."'" ;
+			if(V::get('DATE','',$_GET)==$h->DATE) echo " selected=1 ";
+			echo ">".$h->DATE."</option>";
+			
+		}
+		    echo "</select></form><h3>";		
+
 		echo '<span style="float:right">' . "data: " . date("Y-m-d") . '</span>';
-	echo '</h3>';
+	echo '</h3>
+	<a href="procesy5.php?task=TEST_SORT" target="_blank">Ustal kolejność testów</a>
+
+	
+	';
+		DIE('');
+		
 
 	if (!$_print) {
 		?>
 		<a href="index.php?MENU_INIT=USER_OCENA_PRACOWNIKA&usrLogin=<?php echo $usrLogin; ?>&_print=1&HIDE_PANEL=1" target="_blank">Drukuj <img src="icon/print.gif" height="16" alt="Drukuj"></a>
 		|
 		<a href="index.php?MENU_INIT=USER_OCENA_PRACOWNIKA&usrLogin=<?php echo $usrLogin; ?>&_task=EXPORT&HIDE_PANEL=1" target="_blank">Export <img src="icon/excel.gif" height="16" alt="Export"></a>
-		|
-		<a href="procesy5.php?task=TEST_SORT" target="_blank">Ustal kolejność testów</a>
+		
 		<?php
 	}
 
+
 	echo '<table cellspacing="0" cellpadding="0" border="1" class="tbl-view">';
 	echo '<thead>';
 	echo '<tr>';
@@ -65,7 +143,7 @@ function USER_OCENA_PRACOWNIKA() {
 		echo '<th colspan="2">' . "ocena pracownika" . '</th>';
 		echo '<th colspan="2">' . "ocena kierownika" . '</th>';
 		echo '<th colspan="2">' . "ocena specjalisty ds. jakości" . '</th>';
-		echo '<th colspan="2">' . "ocena prezesa" . '</th>';
+		echo '<th colspan="2">' . "ocena kierownika jednostki" . '</th>';
 	echo '</tr>';
 	echo '<tr>';
 		echo '<th>' . "%" . '</th>';

+ 6 - 5
SE/superedit-view_L_APPOITMENT_OVERWIEV.php

@@ -24,6 +24,7 @@ $trans['A_PROBLEM_DESC']='A_PROBLEM_DESC';
 $trans['L_APPOITMENT_USER']='L_APPOITMENT_USER';
 $trans['L_APPOITMENT_DATE']='L_APPOITMENT_DATE';
 $trans['L_APPOITMENT_PERIOD']='L_APPOITMENT_PERIOD';
+$trans['L_APPOITMENT_INFO']='L_APPOITMENT_INFO';
 $trans['L_APPOITMENT_TYPE']='L_APPOITMENT_TYPE';
 $trans['A_ADM_COMPANY']='A_ADM_COMPANY';
 $trans['A_CLASSIFIED']='A_CLASSIFIED';
@@ -74,11 +75,11 @@ foreach($tbls as $tbl) {
 			foreach($trans as $fld=>$as) {
 			 $sql_[]="`".$fld."` as `".$as."`";
 			}
-			$sql[]=" ( select  `ID`, '".$tbl."' as `TABLE`,".implode(',', $sql_).$transform_." from `".$tbl."` where ( L_APPOITMENT_DATE!='' and unix_timestamp(L_APPOITMENT_DATE>unix_timestamp(now()-62000000)) )  order by A_RECORD_UPDATE_DATE DESC limit 100 ) ";
+			$sql[]=" ( select  `ID`, '".$tbl."' as `TABLE`,".implode(',', $sql_).$transform_." from `".$tbl."` where ( L_APPOITMENT_DATE!='' )   order by A_RECORD_UPDATE_DATE DESC  ) ";
 			
 			
 			$msc=microtime(true);
-			$conn->query("select  `ID`, '".$tbl."' as `TABLE`,".implode(',', $sql_).$transform_." from `".$tbl."` where L_APPOITMENT_DATE!=''   order by A_RECORD_UPDATE_DATE DESC limit 100 ");
+			$conn->query("select  `ID`, '".$tbl."' as `TABLE`,".implode(',', $sql_).$transform_." from `".$tbl."` where L_APPOITMENT_DATE!=''   order by A_RECORD_UPDATE_DATE DESC   ");
 			$msc=microtime(true)-$msc;
 			$czas[]="Czas ".$msc." dla tabeli ".$tbl;
 			
@@ -92,13 +93,13 @@ foreach($tbls as $tbl) {
 
 
 
-		DEBUG_S(-3,'sql',$sql,__FILE__,__FUNCTION__,__LINE__);
+		DEBUG_S(3,'sql',$sql,__FILE__,__FUNCTION__,__LINE__);
 
 		$sql_alter=$sql_drop." ".$sql_create." ".implode(" ", $sql);
 		DEBUG_S(-3,'sql_alter',$sql_alter,__FILE__,__FUNCTION__,__LINE__);
 		DEBUG_S(-3,'czasy',$czas,__FILE__,__FUNCTION__,__LINE__);
-
-
+		$res=$conn->query($sql_alter);
+		DEBUG_S(-3,'res',$res);
 //$struct=$conn->STRUCTURE_GENERATE($tbls);
 
 

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません