Ver Fonte

Merge branch 'master' of bn.git:plabudda/se

Piotr Labudda há 9 anos atrás
pai
commit
f1907feced

+ 0 - 329
SE/dev/php-cli/biale_plamy-find_ways.php

@@ -1,329 +0,0 @@
-<?php
-$_SERVER['SERVER_NAME'] = 'biuro.biall-net.pl';
-
-
-//when used in /Library/Server/Web/Data/Sites/bzyk-biale-plamy-php-temp/SE/dev on biuro.biall-net.pl
-if( file_exists ( "../../se-lib/bootstrap.php"))
-require("../../se-lib/bootstrap.php");
-//when used in  in native SE
-else require("../../../../SE-production-git/SE/se-lib/bootstrap.php");
-
-Lib::loadClass("Vendor_Geophp");
-
-
-
-function init_sh_check() {
-    //check if run from bash
-    if(isset($_SERVER["argv"])) {
-        if(@$_SERVER["argv"][1]=='--help') {
-            echo "
-                Options are:
-                php ".$_SERVER["argv"][0]." --check   - control if we have needed tables/data
-                
-                .EOF
-            ";
-        } else if(@$_SERVER["argv"][1]=='--check') { 
-            check();
-        } else echo " bad option, try:
-            php ".$_SERVER["argv"][0]." --help
-            
-            .EOF
-            ";
-    } else {
-        echo "<br> this script could be run from bash e.g. php biale_plamy.php --help <br>" ;
-        check();
-    }
-}
-
-
-
-function check() {
-	echo "<br>\n i run check()";
-    //todo to set arguments to rebuild tables etc:
-    $check_tbls=array('Rozdzielcza_test_bzyk_drogi','Rozdzielcza_test_bzyk_joins','Rozdzielcza_test_bzyk_przylacza_HIST',
-                    'Rozdzielcza_test_bzyk_przylacza','Rozdzielcza_test_bzyk_punkty_adresowe','Rozdzielcza_test_bzyk_ways');
-
-    //$tables =  DB::getPDO()->list_tables();
-    foreach($check_tbls as $tbl) {
-        $query = "select ID from ".$tbl." limit 1 ";
-        echo "<br>\nresult chk for tbl:".$tbl." ;";
-        
-        try{
-            $result = DB::getPDO()->fetchall($query);
-        } catch(Exception $exception) {
-            // return $exception;
-            echo "<br>\n jest blad z tbl:".$tbl." i get sample table structure with data from ../sql/".$tbl.".sql  - it should be manually replaced by correct/newer!";
-            $sql = file_get_contents('../sql/'.$tbl.'.sql');
-            
-            try{
-                $result = DB::getPDO()->fetchall($sql);
-            } catch(Exception $exception2) {
-                echo "<br>\n jest blad dump dla tbl:".$tbl;
-            }
-        } 
-        //	print_r($exception);
-        print_r($result);
-    }
-}
-
-init_sh_check();   
-
-$ways2joins = unserialize(file_get_contents('/tmp/save_ways2joins.txt'));
-$joins2ways = unserialize(file_get_contents('/tmp/save_joins2ways.txt'));
-$points2joins = unserialize(file_get_contents('/tmp/save_points2joins.txt'));
-$joins_asText = unserialize(file_get_contents('/tmp/save_joins_asText.txt'));
-$ways_asText = unserialize(file_get_contents('/tmp/save_ways_asText.txt'));
-$points_asText = unserialize(file_get_contents('/tmp/save_points_asText.txt'));
-
-$edge_joins=simplexml_load_file("edge_joins.xml");
-$edge_joins->registerXPathNamespace('bp', 'https://procesy5.pl/biale_plamy-schema.xsd');
-
-//print_r($edge_joins);
-foreach($edge_joins->children() as $child)  {
- // echo "\n<br>";
-	   //$attrs=$child->attributes("ID_Way");
-
-	   foreach($child->attributes() as $a=>$b) {
-		   //	echo "#87Child";print_r($b[0]);
-		   $ID_Way=$b[0];
-	   }
-	  //echo $child->getName() . ": " . " ID_Way: ".$ID_Way. " : ";
-	
-	   $id_j=0; 
-	   settype($ID_Way, "integer");
-	   //$ID_Way=var_dump($ID_Way);
-	   
-	 //  echo "#88Child:"; print_r($ID_Way);
-	   //$edge_joins_path['ID_Way'][$attrs['ID_Way']]=array();
-	   foreach($child->children('https://procesy5.pl/biale_plamy-schema.xsd') as $edge_joins_xml)  {
-		   $id_j++;
-		   $attrs_join=$edge_joins_xml->attributes();
-		   //echo " #93 ID_Join ".$attrs_join["Joins"]." ";
-		   $Join=$attrs_join["Joins"][0];
-		   settype($Join, "integer");
-		   $edge_joins_path[$ID_Way][$id_j]=$attrs_join["Joins"][0];
-	   }
-}
-
-//print_r($edge_joins_path);
-
-
-
-function joins2lineString($joins_keys) {
-	global $joins_asText;
-	if ($joins_keys) {
-		foreach ($joins_keys as $join_key) {
-			$points[] = Vendor_Geophp::load($joins_asText[$join_key], 'wkt');
-		}
-		return new LineString($points);
-	} else return null;
-}
-
-function findWay($joinA, $joinB, $path = array()) {
-	global $ways2joins, $joins2ways, $points2joins, $ways_asText, $points_asText;
-	if ($joinA == $joinB) {
-		$joinsPath = array($joinB);
-		foreach (array_reverse($path) as $way_key) {
-			array_unshift($joinsPath, $ways2joins[$way_key][1 - array_search($joinsPath[0], $ways2joins[$way_key])]);
-		}
-		return $joinsPath;
-	} else {
-		$subPaths = array();
-		foreach ($joins2ways[$joinA] as $way_key) {
-			if (!in_array($way_key, $path)) {
-				$new_join = $ways2joins[$way_key][1 - array_search($joinA,  $ways2joins[$way_key])];
-				if ($subPath = findWay($new_join, $joinB, array_merge($path,array($way_key)))) $subPaths[] = $subPath;
-			}
-		}
-		if ($subPaths) {
-			if (count($subPaths) == 1) return $subPaths[0];
-			else {
-				$shortestKey = 0;
-				foreach ($subPaths as $key => $subPath) {
-					$distance_cur = 0;
-					foreach ($subPath as $way_key) {
-						$way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt');
-						if ($way) $distance_cur += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->length();
-						else $distance_cur += 999;
-					}
-					if (!$shortestKey || ($shortestKey && $distance_cur < $distance)) {
-						$shortestKey = $key;
-						$distance = $distance_cur;
-					}
-				}
-				return $subPaths[$key];
-			}
-		}
-		else {
-			return null;
-		}
-	}
-}
-
-function findJoinInDB($id) {
-	global $joins_asText;
-	$join = DB::getPDO()->fetchValue("select astext(the_geom) from Rozdzielcza_test_bzyk_joins where ID='{$id}'");
-	if ($join) {
-		$join = Vendor_Geophp::load($join, 'wkt')->asText();
-		$key = array_search($join, $joins_asText);
-		if ($key) return $key;
-		else return null;
-	} else return null;
-}
-
-
-
-function array_to_xml( $data, &$xml_data ) {
-    foreach( $data as $key => $value ) {
-        $key_="";
-        
-        if( is_numeric($key) ){
-            $key_ = 'item';
-        }
-        
-        if( is_array($value) ) {
-            $subnode = $xml_data->addChild($key_);
-			$subnode->addAttribute('id', $key);
-            array_to_xml($value, $subnode);
-        } else {
-	       // $test_expl=explode(" ", $value);
-					//preg_match('/[a-zA-Z]/', $value[0])
-	        //if($key_=="" and !isset($test_expl[1])  )  $key_=htmlspecialchars("$value");
-	        //czy nie jest jeden element array
-	        if($key_=="" and  count($data[$key]==1)) {
-		   		 $subnode=$xml_data->addChild("$key",htmlspecialchars("$value"));
-		    } else  
-            $subnode=$xml_data->addChild("$key_",htmlspecialchars("$value"));
-            if( is_numeric($key) ){
-	            $subnode->addAttribute('id', $key);
-	        }
-        }
-     }
-}
-
-#echo joins2lineString($res = findWay(100,110))->asText();
-#echo joins2lineString($res = findWay(25690,20134))->asText();
-#$path = joins2lineString(findWay(25690,23039));
-
-
-
-//$path = joins2lineString(findWay(findJoinInDB(49),findJoinInDB(50)));
-
-
-//generujemy path do $edge_joins_filled_paths
- DB::getPDO()->query("truncate table Rozdzielcza_test_bzyk_paths");
-
-unset($ID_Way);
-
-$edge_joins_filled_paths=array();
-foreach($edge_joins_path as $ID_Way=>$Joins_arr) {
-	settype($ID_Way, "integer");
-	$edge_joins_filled_paths[$ID_Way]['tried']=1;
-	if(isset($Joins_arr[1]) and isset($Joins_arr[2]))  {
-			   $pkt_A=$Joins_arr[1];$pkt_B=$Joins_arr[2];
-			   settype($pkt_A, "integer"); settype($pkt_B, "integer");
-
-		echo "\n<br> Generuje dla ID_Way:".$ID_Way." i joins ".$pkt_A." , ".$pkt_B." ";
-		unset($res);unset($path);
-		$res = findWay($pkt_A,$pkt_B);
-		$path = joins2lineString($res)->asText();
-		//   joins2lineString(findWay(389,404));
-		settype($path, "string");
-		$edge_joins_filled_paths[$ID_Way]['asText'] = $path;
-			$distance = 0;
-				foreach ($res as $way_key) {
-					if(isset($ways_asText[$way_key]))
-					$distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength();
-				}
-		$edge_joins_filled_paths[$ID_Way]['distance'] = $distance;
-		//joins2lineString(findWay($Joins_arr[1],$Joins_arr[2]));
-		//joins2lineString($res = findWay($joinAB['A'],$joinAB['B']))->asText();
-		$sql_insert_path="insert into Rozdzielcza_test_bzyk_paths (the_geom,ID_Way, A_RECORD_CREATE_DATE )
-		     values (ST_GeomFromText('".$edge_joins_filled_paths[$ID_Way]['asText']."'),'".$ID_Way."' , now()   )   ";
-		    echo "#216Query path ins:: ".$sql_insert_path." , distance:".$distance." ";
-		    if(strlen($edge_joins_filled_paths[$ID_Way]['asText'])>2)
-		      DB::getPDO()->query($sql_insert_path);
-		    else echo "#296 path nie wygenerowalo sie !! dla ".$ID_Way." i pkt ".$pkt_A." , ".$pkt_B." \n";
-
-	} else echo "\n#220 droga nie ma koncow ID_Way::".$ID_Way;
-}
-
-
-echo "<br>\n edge_joins_filled_paths:";
-print_r($edge_joins_filled_paths);
-
-
-//save
- 	unset($xml_data);
-
-file_put_contents('edge_joins_filled_paths.txt',serialize($edge_joins_filled_paths));
- 	ob_start();print_r($edge_joins_filled_paths); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('edge_joins_filled_paths_print_r.txt',$contents);
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><edge_joins_filled_paths></edge_joins_filled_paths>');
- 	array_to_xml($edge_joins_filled_paths,$xml_data);
- 	print $xml_data->asXML("edge_joins_filled_paths.xml");
- 	unset($xml_data);
-  
-
-
-//test
- 	$timeStart = microtime();
- 	$res = findWay(389,404);
- 	$path=joins2lineString($res)->asText();
-	$timeEnd = microtime();
-		
-		if ($path) {
-			echo $path."\n";
-		} else echo "Brak drogi";
-		
-		list($usecStart, $secStart) = explode(" ", $timeStart);
-		list($usecEnd, $secEnd) = explode(" ", $timeEnd);
-		$diff = $secEnd - $secStart + $usecEnd - $usecStart;
-		echo "\n\nCzas liczenia: ".$diff." s\n";
-		
-		  	
-		$distance = 0;
-		foreach ($res as $way_key) {
-			$distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength();
-		}
-		print_r($res);
-		echo "Distance: ".$distance."m\n";
-//eof test
-echo "\n<br>test2";
-
-
-
-
-//test
- 	$timeStart = microtime();
- 	$res = findWay(389,404);
- 	$path=joins2lineString($res)->asText();
-	$timeEnd = microtime();
-		
-		if ($path) {
-			
-						echo $path."\n";
-		} else echo "Brak drogi";
-		
-		list($usecStart, $secStart) = explode(" ", $timeStart);
-		list($usecEnd, $secEnd) = explode(" ", $timeEnd);
-		$diff = $secEnd - $secStart + $usecEnd - $usecStart;
-		echo "\n\nCzas liczenia: ".$diff." s\n";
-		
-		  	
-		$distance = 0;
-		foreach ($res as $way_key) {
-			$distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength();
-		}
-		print_r($res);
-		echo "Distance: ".$distance."m\n";
-//eof test
-
-
-
-//$distance = 0;
-//foreach ($res as $way_key) {
-//	$distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength();
-//}
-//print_r($res);
-//echo "Distance: ".$distance."m\n";

+ 0 - 361
SE/dev/php-cli/biale_plamy-generate_data.php

@@ -1,361 +0,0 @@
-<?php
-	
-	ini_set('display_errors', 'On');
-error_reporting(E_ALL);
-
-
-$_SERVER['SERVER_NAME'] = 'biuro.biall-net.pl';
-//when used in /Library/Server/Web/Data/Sites/bzyk-biale-plamy-php-temp/SE/dev on biuro.biall-net.pl
-if( file_exists ( "../../se-lib/bootstrap.php"))
-require("../../se-lib/bootstrap.php");
-//when used in  in native SE
-else require("../../../../SE-production-git/SE/se-lib/bootstrap.php");
-
-Lib::loadClass("Vendor_Geophp");
-
-
-
-function init_sh_check() {
-    //check if run from bash
-    if(isset($_SERVER["argv"])) {
-        if(@$_SERVER["argv"][1]=='--help') {
-            echo "
-                Options are:
-                php ".$_SERVER["argv"][0]." --check   - control if we have needed tables/data
-                
-                .EOF
-            ";
-        } else if(@$_SERVER["argv"][1]=='--check') { 
-            check();
-        } else echo " bad option, try:
-            php ".$_SERVER["argv"][0]." --help
-            
-            .EOF
-            ";
-    } else {
-        echo "<br> this script could be run from bash e.g. php biale_plamy.php --help <br>" ;
-        check();
-    }
-}
-
-
-
-function check() {
-	echo "<br>\n i run check()";
-    //todo to set arguments to rebuild tables etc:
-    $check_tbls=array('Rozdzielcza_test_bzyk_drogi','Rozdzielcza_test_bzyk_joins','Rozdzielcza_test_bzyk_przylacza_HIST',
-                    'Rozdzielcza_test_bzyk_przylacza','Rozdzielcza_test_bzyk_punkty_adresowe','Rozdzielcza_test_bzyk_ways');
-
-    //$tables =  DB::getPDO()->list_tables();
-    foreach($check_tbls as $tbl) {
-        $query = "select ID from ".$tbl." limit 1 ";
-        echo "<br>\nresult chk for tbl:".$tbl." ;";
-        
-        try{
-            $result = DB::getPDO()->fetchall($query);
-        } catch(Exception $exception) {
-            // return $exception;
-            echo "<br>\n jest blad z tbl:".$tbl." i get sample table structure with data from ../sql/".$tbl.".sql  - it should be manually replaced by correct/newer!";
-            $sql = file_get_contents('../sql/'.$tbl.'.sql');
-            
-            try{
-                $result = DB::getPDO()->fetchall($sql);
-            } catch(Exception $exception2) {
-                echo "<br>\n jest blad dump dla tbl:".$tbl;
-            }
-        } 
-        //	print_r($exception);
-        print_r($result);
-    }
-}
-
-init_sh_check();   
-
-$query = "select astext(the_geom) as multiway ,ID as ID_Way from Rozdzielcza_test_bzyk_drogi where numpoints(the_geom)>1";
-$result = DB::getPDO()->fetchall($query);
-$joins_asText = array();
-foreach ($result as $row) {
-	$multiway = Vendor_Geophp::load($row['multiway'], 'wkt');
-//echo $multiway->length();
-	for ($i = 1; $i < $n = $multiway->numPoints(); $i++) {
-		$way = new LineString(array($multiway->pointN($i), $multiway->pointN($i+1)));
-		$ways_asText[] = $way->asText();
-		$ways_2ID_Way[]=$row['ID_Way'];
-		if (!in_array($multiway->pointN($i)->asText(), $joins_asText)) $joins_asText[] = $multiway->pointN($i)->asText();
-	}
-	if (!in_array($multiway->pointN($n)->asText(), $joins_asText)) $joins_asText[] = $multiway->pointN($n)->asText();
-}
-
-$query = "select ID, astext(the_geom) as point, astext(the_geom_nearest_way) as way, astext(the_geom_xpoint) as xpoint, ID_Way from Rozdzielcza_test_bzyk_punkty_adresowe";
-$result = DB::getPDO()->fetchall($query);
-$xpoints = array();
-foreach ($result as $row) {
-        $points[$row['ID']] = Vendor_Geophp::load($row['point'], 'wkt');
-        $points2ID_Way[$row['ID']] = $row['ID_Way'] ;
-	$points_asText[$row['ID']] = $points[$row['ID']]->asText();
-        $xpoint = Vendor_Geophp::load($row['xpoint'], 'wkt');
-     //blad dziwny sqix
-     if($xpoints) {
-		if (!($key = array_search($xpoint->asText(), $xpoints))) $key = array_push($xpoints, $xpoint->asText())-1;
-			$xpoints2points[$key][] = $row['ID'];
-			$points2xpoints[$row['ID']] = $key;
-		
-		        $way = Vendor_Geophp::load($row['way'], 'wkt');
-		}
-		//errory sieje z die
-	if($xpoint) {
-		if (!(in_array($xpoint->asText(), $joins_asText))) {
-			if (@!in_array($key, $ways2cut[array_search($way->asText(), $ways_asText)])) {
-				$ways2cut[array_search($way->asText(), $ways_asText)][] = array('key'=>$key,'ID_Way'=>$row['ID_Way']);
-			} else echo ".";
-		};
-	}
-}
-
-function pointsDistance($a, $b) {
-	$line = new LineString(array($a, $b));
-	return $line->length();
-}
-
-foreach ($ways2cut as $way_key => $xpoint_keys) {
-	$distances = array();
-	//$xpoint_keys=$value_arr['key'];
-	$way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt');
-	foreach ($xpoint_keys as $xpoint_key_arr) {
-	
-	if($joins_asText   ) {
-		$xpoint_key=$xpoint_key_arr['key'];
-		$ID_Way=$xpoint_key_arr['ID_Way'];
-		if($xpoints[$xpoint_key]) //error sypie
-		$xpoint = Vendor_Geophp::load($xpoints[$xpoint_key], 'wkt');
-		if($xpoint) { ///sypie errorem
-			$key = array_push($joins_asText, $xpoint->asText())-1; //blad
-			foreach ($xpoints2points[$xpoint_key] as $point_key) {
-				$points2joins[$point_key] = $key;
-			}
-		}
-		$distances[$xpoint_key] = pointsDistance($way->startPoint(), $xpoint);
-	}
-	}
-	asort($distances);
-
-	$sub_xpoints = array();
-	foreach (array_keys($distances) as $xpoint_key) {
-		if($xpoints[$xpoint_key]) // if sypie errorami
-		$sub_xpoints[] = Vendor_Geophp::load($xpoints[$xpoint_key]);
-	}
-
-	$startPoint = $way->startPoint();
-	$endPoint = $way->endPoint();
-	if($sub_xpoints[0] and $startPoint) { // sypie erorrami
-		$way = new LineString(array($startPoint, $sub_xpoints[0]));
-		$ways_asText[$way_key] = $way->asText();
-		$ways_2ID_Way[$way_key]=$ID_Way;
-	}
-	
-	for ($i = 0; $i < $n = count($sub_xpoints) - 1; $i++) {
-		$way = new LineString(array($sub_xpoints[$i], $sub_xpoints[$i+1]));
-		$ways_asText[] = $way->asText();
-		$ways_2ID_Way[]=$ID_Way;
-	}
-	if($sub_xpoints[$n] and $endPoint) {
-		$way = new LineString(array($sub_xpoints[$n], $endPoint));
-		$ways_asText[] = $way->asText();
-		$ways_2ID_Way[]=$ID_Way;
-	}
-}
-
-foreach (array_keys($ways_asText) as $way_key) {
-	$way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt');
-	$ways_lenghts[$way_key] = $way->length();
-	for ($i = 1; $i <= 2; $i++) {
-		$join = $way->pointN($i)->asText();
-		$join_key = array_search($join, $joins_asText);
-//if (!$join_key) echo ".";
-		$ways2joins[$way_key][] = $join_key;
-		$joins2ways[$join_key][] = $way_key;
-	}
-}
-/*
-// $val=array(A=>asd,B=>cos) ---
-// <xml>
-//  <A>cos</A>
-	<B>cos></B>
-   </xml>
-   array(0=asd,1=asd)
-   <xml>
-    <item id=0>asd</>
-    <item id=2>asd</>
-   
-   array(A=>asd,B=>array(0=>asd,1=>asd))
-   <xml>
-     <A>asd</>
-     <B><item id=0>asd</>
-        <item id=1>asd</>
-
-// $pozA[1]=dupa
-// $pozA[2]=jasiu
-*/
-// function defination to convert array to xml
-function array_to_xml( $data, &$xml_data ) {
-    foreach( $data as $key => $value ) {
-        $key_="";
-        
-        if( is_numeric($key) ){
-            $key_ = 'item';
-        }
-        
-        if( is_array($value) ) {
-            $subnode = $xml_data->addChild($key_);
-			$subnode->addAttribute('id', $key);
-            array_to_xml($value, $subnode);
-        } else {
-            $subnode=$xml_data->addChild("$key_",htmlspecialchars("$value"));
-            if( is_numeric($key) ){
-	            $subnode->addAttribute('id', $key);
-	        }
-        }
-     }
-}
-
-
-
-
-
-
-file_put_contents('points2ID_Way.txt',serialize($points2ID_Way));
-//for better debug to see variables in editor i make also print_r 
- 	ob_start();print_r($points2ID_Way); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('points2ID_Way_print_r.txt',$contents);
- 
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><points2ID_Way></points2ID_Way>');
- 	array_to_xml($points2ID_Way,$xml_data);
- 	print $xml_data->asXML("points2ID_Way.xml");
- 	unset($xml_data);
-  
-  
-  
-
-file_put_contents('ways_2ID_Way.txt',serialize($ways_2ID_Way));
-//for better debug to see variables in editor i make also print_r 
- 	ob_start();print_r($ways_2ID_Way); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('ways_2ID_Way_print_r.txt',$contents);
- 
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><ways_2ID_Way></ways_2ID_Way>');
- 	array_to_xml($ways_2ID_Way,$xml_data);
- 	print $xml_data->asXML("ways_2ID_Way.xml");
- 	unset($xml_data);
-  
-
-
-
-
-
-
-
-file_put_contents('ways2joins.txt',serialize($ways2joins));
-//for better debug to see variables in editor i make also print_r 
- 	ob_start();print_r($ways2joins); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('ways2joins_print_r.txt',$contents);
- 
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><ways2joins></ways2joins>');
- 	array_to_xml($ways2joins,$xml_data);
- 	print $xml_data->asXML("ways2joins.xml");
- 	unset($xml_data);
-  
-  
-  
-  
-
-file_put_contents('joins2ways.txt',serialize($joins2ways));
- 	ob_start();print_r($joins2ways); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('joins2ways_print_r.txt',$contents);
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><joins2ways></joins2ways>');
- 	array_to_xml($joins2ways,$xml_data);
- 	print $xml_data->asXML("joins2ways.xml");
- 	unset($xml_data);
-  
- 	
-
-file_put_contents('points2joins.txt',serialize($points2joins));
-	ob_start();print_r($points2joins); $contents = ob_get_contents();ob_end_clean();  
-	file_put_contents('points2joins_print_r.txt',$contents);
-	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><points2joins></points2joins>');
- 	array_to_xml($points2joins,$xml_data);
- 	print $xml_data->asXML("points2joins.xml");
- 	unset($xml_data);
-
-file_put_contents('joins_asText.txt',serialize($joins_asText));
-	ob_start();print_r($joins_asText); $contents = ob_get_contents();ob_end_clean();  
-	file_put_contents('joins_asText_print_r.txt',$contents);
-	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><joins_asText></joins_asText>');
- 	array_to_xml($joins_asText,$xml_data);
- 	print $xml_data->asXML("joins_asText.xml");
- 	unset($xml_data);
-
-
-file_put_contents('ways_asText.txt',serialize($ways_asText));
-	ob_start();print_r($ways_asText); $contents = ob_get_contents();ob_end_clean();  
-	file_put_contents('ways_asText_print_r.txt',$contents);
-	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><ways_asText></ways_asText>');
- 	array_to_xml($ways_asText,$xml_data);
- 	print $xml_data->asXML("ways_asText.xml");
- 	unset($xml_data);
-
-
-file_put_contents('points_asText.txt',serialize($points_asText));
-	ob_start();print_r($points_asText); $contents = ob_get_contents();ob_end_clean();  
-	file_put_contents('points_asText_print_r.txt',$contents);
-	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><points_asText></points_asText>');
- 	array_to_xml($points_asText,$xml_data);
- 	print $xml_data->asXML("points_asText.xml");
- 	unset($xml_data);
-
-
-
-/*
-function findWay($join_key, $point_key, $path = array()) {
-	global $ways2joins, $joins2ways, $points2joins, $ways_asText, $joins2ways, $points, $points2xpoints, $xpoints2joins, $ways_lengths, $res;
-//echo implode('->',$path)."\n\n";
-	if ($join_key == $points2joins[$point_key]) $res[] = $path;
-	else {
-		foreach ($joins2ways[$join_key] as $way_key) {
-			if (!in_array($way_key, $path)) {
-//				$joins = $ways2joins[$way_key];
-//				$back_join_subkey = array_search($join_key, $joins);
-//				$new_join_subkey = 1 - $back_join_subkey;
-//				$new_join = $joins[$new_join_subkey];
-				$new_join = $ways2joins[$way_key][1 - array_search($join_key,  $ways2joins[$way_key])];
-				findWay($new_join, $point_key, array_merge($path,array($way_key)));
-			}
-		}
-	}
-}
-*/
-//print_r($ways2joins);
-//for ($i = 0; $i < count($points); $i++) {
-//	if (isset($res)) unset($res);
-//	findWay(2000, $i);
-//	print_r($res);
-//}
-//print_r($ways);
-
-echo "ways count: ".count($ways_asText)."\n";
-
-
-$db = DB::getDB();
-$db->query("truncate table Rozdzielcza_test_bzyk_ways");
-$db->query("truncate table Rozdzielcza_test_bzyk_joins");
-
-
-foreach ($ways_asText as $way) {
-	$query = "insert into Rozdzielcza_test_bzyk_ways (the_geom) values (linefromtext('".$way."'))";
-	$db->query($query);
-	//echo $query."\n";
-}
-
-foreach ($joins_asText as $join) {
-	$query = "insert into Rozdzielcza_test_bzyk_joins (the_geom) values (pointfromtext('".$join."'))";
-	$db->query($query);
-}
-

+ 2 - 1
SE/dev/php-cli/biale_plamy-prepare_sql_data.php

@@ -13,7 +13,7 @@ Lib::loadClass("Vendor_Geophp");
 
 
 $db = DB::getDB();
-$sql="create temporary table Rozdzielcza_test_bzyk_punkty_adresowe_temp select * from Rozdzielcza_test_bzyk_punkty_adresowe;
+/*$sql="create temporary table Rozdzielcza_test_bzyk_punkty_adresowe_temp select * from Rozdzielcza_test_bzyk_punkty_adresowe;
 
 -- 1 Dorobiona funkcja do pokazywania ID_Way
 update Rozdzielcza_test_bzyk_punkty_adresowe_temp t1 set t1.the_geom_nearest_way=test_find_nearest_way(t1.ID);
@@ -35,6 +35,7 @@ insert into Rozdzielcza_test_bzyk_przylacza (the_geom,ID_Way) select
  linefromtext(concat('linestring(',x(the_geom),' ',y(the_geom),',',x(the_geom_xpoint),' ',y(the_geom_xpoint),')')) , 
  ID from Rozdzielcza_test_bzyk_punkty_adresowe;
  ";
+ */
 
  $result = DB::getPDO()->fetchall($sql);
  

+ 0 - 198
SE/dev/php-cli/biale_plamy.php

@@ -1,198 +0,0 @@
-<?php
-$_SERVER['SERVER_NAME'] = 'biuro.biall-net.pl';
-require("../../se-lib/bootstrap.php");
-Lib::loadClass("Vendor_Geophp");
-
-
- 
-function init_sh_check() {
-    //check if run from bash
-    if(isset($_SERVER["argv"])) {
-        if(@$_SERVER["argv"][1]=='--help') {
-            echo "
-                Options are:
-                php ".$_SERVER["argv"][0]." --check   - control if we have needed tables/data
-                
-                .EOF
-            ";
-        } else if(@$_SERVER["argv"][1]=='--check') { 
-            check();
-        } else echo " bad option, try:
-            php ".$_SERVER["argv"][0]." --help
-            
-            .EOF
-            ";
-    } else {
-        echo "<br> this script could be run from bash e.g. php biale_plamy.php --help <br>" ;
-        check();
-    }
-}
-
-
-
-function check() {
-	echo "<br>\n i run check()";
-    //todo to set arguments to rebuild tables etc:
-    $check_tbls=array('Rozdzielcza_test_bzyk_drogi','Rozdzielcza_test_bzyk_joins',
-                    'Rozdzielcza_test_bzyk_przylacza','Rozdzielcza_test_bzyk_punkty_adresowe','Rozdzielcza_test_bzyk_ways',
-                    'Rozdzielcza_test_bzyk_joins_HIST','Rozdzielcza_test_bzyk_przylacza_HIST',
-                    'Rozdzielcza_test_bzyk_przylacza_HIST','Rozdzielcza_test_bzyk_punkty_adresowe_HIST','Rozdzielcza_test_bzyk_ways_HIST');
-
-    //$tables =  DB::getPDO()->list_tables();
-    foreach($check_tbls as $tbl) {
-        $query = "select ID from ".$tbl." limit 1 ";
-        echo "<br>\nresult chk for tbl:".$tbl." ;";
-        
-        try{
-            $result = DB::getPDO()->fetchall($query);
-        } catch(Exception $exception) {
-            // return $exception;
-            echo "<br>\n Ajest blad z tbl:".$tbl." i get sample table structure with data from ../sql/".$tbl.".sql  - it should be manually replaced by correct/newer!";
-            $sql = file_get_contents('../sql/'.$tbl.'.sql');
-            
-            echo "<br> w get som content ".strlen($sql) ;
-			unset($result);
-             //return $exception;
-            try{
-                $result2 = DB::getPDO()->fetchall('select 1+1;');
-                //mam blad dziwny na mac pro :  Call to a member function fetchall() on null??? dpiero za drugim razem?
-            } catch(Exception $exception2) {
-                echo "<br>\n jest blad dump dla tbl:".$tbl;
-            }
-        } 
-        //	print_r($exception);
-        echo "<br> 64";
-        print_r($result2);
-    }
-}
-
-init_sh_check();   
-
-$query = "select astext(the_geom) as multiway from Rozdzielcza_test_bzyk_drogi where numpoints(the_geom)>1";
-$result = DB::getPDO()->fetchall($query);
-$joins_asText = array();
-foreach ($result as $row) {
-	$multiway = Vendor_Geophp::load($row['multiway'], 'wkt');
-//echo $multiway->length();
-	for ($i = 1; $i < $n = $multiway->numPoints(); $i++) {
-		$way = new LineString(array($multiway->pointN($i), $multiway->pointN($i+1)));
-		$ways_asText[] = $way->asText();
-		if (!in_array($multiway->pointN($i)->asText(), $joins_asText)) $joins_asText[] = $multiway->pointN($i)->asText();
-	}
-	if (!in_array($multiway->pointN($n)->asText(), $joins_asText)) $joins_asText[] = $multiway->pointN($n)->asText();
-}
-
-$query = "select ID, astext(the_geom) as point, astext(the_geom_nearest_way) as way, astext(the_geom_xpoint) as xpoint from Rozdzielcza_test_bzyk_punkty_adresowe limit 100";
-$result = DB::getPDO()->fetchall($query);
-$xpoints = array();
-foreach ($result as $row) {
-        $points[$row['ID']] = Vendor_Geophp::load($row['point'], 'wkt');
-
-        $xpoint = Vendor_Geophp::load($row['xpoint'], 'wkt');
-	if (!($key = array_search($xpoint->asText(), $xpoints))) $key = array_push($xpoints, $xpoint->asText())-1;
-	$xpoints2points[$key][] = $row['ID'];
-	$points2xpoints[$row['ID']] = $key;
-
-        $way = Vendor_Geophp::load($row['way'], 'wkt');
-
-	if (!(in_array($xpoint->asText(), $joins_asText))) {
-		if (@!in_array($key, $ways2cut[array_search($way->asText(), $ways_asText)])) {
-			$ways2cut[array_search($way->asText(), $ways_asText)][] = $key;
-		} else echo ".";
-	};
-}
-
-function pointsDistance($a, $b) {
-	$line = new LineString(array($a, $b));
-	return $line->length();
-}
-
-foreach ($ways2cut as $way_key => $xpoint_keys) {
-	$distances = array();
-	$way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt');
-	foreach ($xpoint_keys as $xpoint_key) {
-		$xpoint = Vendor_Geophp::load($xpoints[$xpoint_key], 'wkt');
-		$key = array_push($joins_asText, $xpoint->asText())-1;
-		foreach ($xpoints2points[$xpoint_key] as $point_key) {
-			$points2joins[$point_key] = $key;
-		}
-		$distances[$xpoint_key] = pointsDistance($way->startPoint(), $xpoint);
-	}
-	asort($distances);
-
-	$sub_xpoints = array();
-	foreach (array_keys($distances) as $xpoint_key) {
-		$sub_xpoints[] = Vendor_Geophp::load($xpoints[$xpoint_key]);
-	}
-
-	$startPoint = $way->startPoint();
-	$endPoint = $way->endPoint();
-	$way = new LineString(array($startPoint, $sub_xpoints[0]));
-	$ways_asText[$way_key] = $way->asText();
-	for ($i = 0; $i < $n = count($sub_xpoints) - 1; $i++) {
-		$way = new LineString(array($sub_xpoints[$i], $sub_xpoints[$i+1]));
-		$ways_asText[] = $way->asText();
-	}
-	$way = new LineString(array($sub_xpoints[$n], $endPoint));
-	$ways_asText[] = $way->asText();
-}
-echo "\n";
-foreach (array_keys($ways_asText) as $way_key) {
-	$way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt');
-	$ways_lenghts[$way_key] = $way->length();
-	for ($i = 1; $i <= 2; $i++) {
-		$join = $way->pointN($i)->asText();
-		$join_key = array_search($join, $joins_asText);
-//if (!$join_key) echo ".";
-		$ways2joins[$way_key][] = $join_key;
-		$joins2ways[$join_key][] = $way_key;
-	}
-}
-
-
-function findWay($join_key, $point_key, $path = array()) {
-	global $ways2joins, $joins2ways, $points2joins, $ways_asText, $joins2ways, $points, $points2xpoints, $xpoints2joins, $ways_lengths, $res;
-//echo implode('->',$path)."\n\n";
-	if ($join_key == $points2joins[$point_key]) $res[] = $path;
-	else {
-		foreach ($joins2ways[$join_key] as $way_key) {
-			if (!in_array($way_key, $path)) {
-//				$joins = $ways2joins[$way_key];
-//				$back_join_subkey = array_search($join_key, $joins);
-//				$new_join_subkey = 1 - $back_join_subkey;
-//				$new_join = $joins[$new_join_subkey];
-				$new_join = $ways2joins[$way_key][1 - array_search($join_key,  $ways2joins[$way_key])];
-				findWay($new_join, $point_key, array_merge($path,array($way_key)));
-			}
-		}
-	}
-}
-
-//print_r($ways2joins);
-for ($i = 0; $i < count($points); $i++) {
-//	$res = array();
-	if (isset($res)) unset($res);
-	findWay(2000, $i);
-	print_r($res);
-}
-//print_r($ways);
-
-echo "ways count: ".count($ways_asText)."\n";
-
-/*
-$db = DB::getDB();
-$db->query("truncate table Rozdzielcza_test_bzyk_ways");
-$db->query("truncate table Rozdzielcza_test_bzyk_joins");
-
-
-foreach ($ways_asText as $way) {
-	$query = "insert into Rozdzielcza_test_bzyk_ways (the_geom) values (linefromtext('".$way."'))";
-	$db->query($query);
-	//echo $query."\n";
-}
-
-foreach ($joins_asText as $join) {
-	$query = "insert into Rozdzielcza_test_bzyk_joins (the_geom) values (pointfromtext('".$join."'))";
-	$db->query($query);
-}
-*/

+ 0 - 164
SE/dev/php-cli/biale_plamy_class_findWay.php

@@ -1,164 +0,0 @@
-<?php
-
-require("biale_plamy_class.php");
-
-
-	$test = new bialePlamy(array("pointsTable"=>"Rozdzielcza_test2_bzyk_punkty_adresowe", "origWaysTable"=>"Rozdzielcza_test2_bzyk_drogi"));
-	//$test->enableShowProgress();
-	$test->loadCache();
-	
-	
-function array_to_xml( $data, &$xml_data ) {
-    foreach( $data as $key => $value ) {
-        $key_="";
-        
-        if( is_numeric($key) ){
-            $key_ = 'item';
-        }
-        
-        if( is_array($value) ) {
-            $subnode = $xml_data->addChild($key_);
-			$subnode->addAttribute('id', $key);
-            array_to_xml($value, $subnode);
-        } else {
-	       // $test_expl=explode(" ", $value);
-					//preg_match('/[a-zA-Z]/', $value[0])
-	        //if($key_=="" and !isset($test_expl[1])  )  $key_=htmlspecialchars("$value");
-	        //czy nie jest jeden element array
-	        if($key_=="" and  count($data[$key]==1)) {
-		   		 $subnode=$xml_data->addChild("$key",htmlspecialchars("$value"));
-		    } else  
-            $subnode=$xml_data->addChild("$key_",htmlspecialchars("$value"));
-            if( is_numeric($key) ){
-	            $subnode->addAttribute('id', $key);
-	        }
-        }
-     }
-}
-
-	
-	
-	
-	
-$ways2joins = unserialize(file_get_contents('/tmp/save_ways2joins.txt'));
-$joins2ways = unserialize(file_get_contents('/tmp/save_joins2ways.txt'));
-$points2joins = unserialize(file_get_contents('/tmp/save_points2joins.txt'));
-$joins_asText = unserialize(file_get_contents('/tmp/save_joins_asText.txt'));
-$ways_asText = unserialize(file_get_contents('/tmp/save_ways_asText.txt'));
-$points_asText = unserialize(file_get_contents('/tmp/save_points_asText.txt'));
-
-$edge_joins=simplexml_load_file("edge_joins.xml");
-$edge_joins->registerXPathNamespace('bp', 'https://procesy5.pl/biale_plamy-schema.xsd');
-
-//print_r($edge_joins);
-foreach($edge_joins->children() as $child)  {
- // echo "\n<br>";
-	   //$attrs=$child->attributes("ID_Way");
-
-	   foreach($child->attributes() as $a=>$b) {
-		   //	echo "#87Child";print_r($b[0]);
-		   $ID_Way=$b[0];
-	   }
-	  //echo $child->getName() . ": " . " ID_Way: ".$ID_Way. " : ";
-	
-	   $id_j=0; 
-	   settype($ID_Way, "integer");
-	   //$ID_Way=var_dump($ID_Way);
-	   
-	 //  echo "#88Child:"; print_r($ID_Way);
-	   //$edge_joins_path['ID_Way'][$attrs['ID_Way']]=array();
-	   foreach($child->children('https://procesy5.pl/biale_plamy-schema.xsd') as $edge_joins_xml)  {
-		   $id_j++;
-		   $attrs_join=$edge_joins_xml->attributes();
-		   //echo " #93 ID_Join ".$attrs_join["Joins"]." ";
-		   $Join=$attrs_join["Joins"][0];
-		   settype($Join, "integer");
-		   $edge_joins_path[$ID_Way][$id_j]=$attrs_join["Joins"][0];
-	   }
-}
-
-	
-	
-	
-	
-	/////////
-	
-	 DB::getPDO()->query("truncate table Rozdzielcza_test_bzyk_paths");
-
-unset($ID_Way);
-
-$edge_joins_filled_paths=array();
-foreach($edge_joins_path as $ID_Way=>$Joins_arr) {
-	settype($ID_Way, "integer");
-	$edge_joins_filled_paths[$ID_Way]['tried']=1;
-	if(isset($Joins_arr[1]) and isset($Joins_arr[2]))  {
-			   $pkt_A=$Joins_arr[1];$pkt_B=$Joins_arr[2];
-			   settype($pkt_A, "integer"); settype($pkt_B, "integer");
-
-		echo "\n<br> Generuje dla ID_Way:".$ID_Way." i joins ".$pkt_A." , ".$pkt_B." ";
-		unset($res);unset($path);
-		
-		
-		
-	
-			$res = $test->findWay($pkt_A, $pkt_B);
-			$lineStringObj = $test->joins2lineString($res);
-			if($lineStringObj) {
-						$path = $lineStringObj->asText();
-					
-					
-					
-					//$res = findWay($pkt_A,$pkt_B);
-					//$path = joins2lineString($res)->asText();
-					//   joins2lineString(findWay(389,404));
-					settype($path, "string");
-					$edge_joins_filled_paths[$ID_Way]['asText'] = $path;
-						$distance = 0;
-							foreach ($res as $way_key) {
-								if(isset($ways_asText[$way_key]))
-								$distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength();
-							}
-					$edge_joins_filled_paths[$ID_Way]['distance'] = $distance;
-					//joins2lineString(findWay($Joins_arr[1],$Joins_arr[2]));
-					//joins2lineString($res = findWay($joinAB['A'],$joinAB['B']))->asText();
-					$sql_insert_path="insert into Rozdzielcza_test_bzyk_paths (the_geom,ID_Way, A_RECORD_CREATE_DATE )
-					     values (ST_GeomFromText('".$edge_joins_filled_paths[$ID_Way]['asText']."'),'".$ID_Way."' , now()   )   ";
-					    echo "#216Query path ins:: ".$sql_insert_path." , distance:".$distance." ";
-					    if(strlen($edge_joins_filled_paths[$ID_Way]['asText'])>2)
-					      DB::getPDO()->query($sql_insert_path);
-					    else echo "#296 path nie wygenerowalo sie !! dla ".$ID_Way." i pkt ".$pkt_A." , ".$pkt_B." \n";
-
-			} else { 
-				echo "ERROR 131 dla pkt: ID_WAY:".$ID_Way;
-				print_r($Joins_arr);
-			}
-
-
-	} else echo "\n#220 droga nie ma koncow ID_Way::".$ID_Way;
-}
-
-
-echo "<br>\n edge_joins_filled_paths:";
-print_r($edge_joins_filled_paths);
-
-
-//save
- 	unset($xml_data);
-
-file_put_contents('edge_joins_filled_paths.txt',serialize($edge_joins_filled_paths));
- 	ob_start();print_r($edge_joins_filled_paths); $contents = ob_get_contents();ob_end_clean();  
- 	file_put_contents('edge_joins_filled_paths_print_r.txt',$contents);
- 	$xml_data = new SimpleXMLElement('<?xml version="1.0"?><edge_joins_filled_paths></edge_joins_filled_paths>');
- 	array_to_xml($edge_joins_filled_paths,$xml_data);
- 	print $xml_data->asXML("edge_joins_filled_paths.xml");
- 	unset($xml_data);
-  
-
-
-	
-	
-	
-	
-	
-	
-	

+ 13 - 4
SE/dev/php-cli/biale_plamy_class_regenerate.php

@@ -2,7 +2,16 @@
 
 require("biale_plamy_class.php");
 
-$test = new bialePlamy(array("pointsTable"=>"Rozdzielcza_test2_bzyk_punkty_adresowe", "origWaysTable"=>"Rozdzielcza_test2_bzyk_drogi"));
+require("biale_plamy_set_from_argv.php");
+
+
+
+
+
+
+
+
+$test = new bialePlamy(array("pointsTable"=>"Rozdzielcza_".$plamy_prefix."_bzyk_punkty_adresowe", "origWaysTable"=>"Rozdzielcza_".$plamy_prefix."_bzyk_drogi"));
 //$test->enableShowProgress();
 //$test->loadCache();
 
@@ -31,6 +40,6 @@ echo "\n saveArrays complete";
 
 
 //echo $test->printArray('joins2ways');
-$test->saveWaysTable("Rozdzielcza_test2_bzyk_ways");
-$test->saveJoinsTable("Rozdzielcza_test2_bzyk_joins");
-$test->savePrzylaczaTable("Rozdzielcza_test2_bzyk_przylacza");
+$test->saveWaysTable("Rozdzielcza_".$plamy_prefix."_bzyk_ways");
+$test->saveJoinsTable("Rozdzielcza_".$plamy_prefix."_bzyk_joins");
+$test->savePrzylaczaTable("Rozdzielcza_".$plamy_prefix."_bzyk_przylacza");

+ 6 - 2
SE/dev/php-cli/biale_plamy_class_usage.php

@@ -2,7 +2,11 @@
 
 require("biale_plamy_class.php");
 
-$test = new bialePlamy(array("pointsTable"=>"Rozdzielcza_test2_bzyk_punkty_adresowe", "origWaysTable"=>"Rozdzielcza_test2_bzyk_drogi"));
+require("biale_plamy_set_from_argv.php");
+
+
+$test = new bialePlamy(array("pointsTable"=>"Rozdzielcza_".$plamy_prefix."_bzyk_punkty_adresowe",
+						     "origWaysTable"=>"Rozdzielcza_".$plamy_prefix."_bzyk_drogi"));
 $test->enableShowProgress();
 $test->loadCache("dupa");
 
@@ -23,4 +27,4 @@ $test->generateLongWays();
 //$test->saveWaysTable("Rozdzielcza_test2_bzyk_ways");
 //$test->saveJoinsTable("Rozdzielcza_test2_bzyk_joins");
 //$test->savePrzylaczaTable("Rozdzielcza_test2_bzyk_przylacza");
-$test->saveLongWaysTable("Rozdzielcza_test2_bzyk_long_ways");
+$test->saveLongWaysTable("Rozdzielcza_".$plamy_prefix."_bzyk_long_ways");

+ 4 - 2
SE/dev/php-cli/biale_plamy_joins2ways_do_paths.xsl

@@ -4,9 +4,11 @@
     exclude-result-prefixes="xs"
     xmlns:bp="https://procesy5.pl/biale_plamy-schema.xsd"
     version="2.0">
-   <!--<xsl:param name=""></xsl:param>-->
    
-    <xsl:variable name="ways2joins" select="doc('ways2joins.xml')"/>
+   
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    <xsl:variable name="ways2joins.xml" select="concat('ways2joins',$plamy_prefix,'.xml')"/>
+    <xsl:variable name="ways2joins" select="doc($ways2joins.xml)"/>
    
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

+ 139 - 29
SE/dev/php-cli/build.xml

@@ -1,15 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project
     xmlns:bp="https://procesy5.pl/biale_plamy-schema.xsd"
+    xmlns:ogc="http://www.opengis.net/ogc"
     basedir="." name="biale_plamy-generate_data" default="default">
     
     
     <tstamp><format property="TODAY_UK" pattern="yyyy-mm-dd"/></tstamp>
    
-   
+    <property name="plamy_prefix" value="" /><!-- prefiks dla danych -->
+    <property name="pointsTable" value="Rozdzielcza_test2_bzyk_punkty_adresowe" />
+    <property name="origWaysTable" value="Rozdzielcza_test2_bzyk_drogi"/>
+    
+    <property  name="username" value="a.binder"/>
+    <property  name="pass" value="set_as_param_-Dpass=pass" />
     
     <property name="bypass_errors" value="1"/><!-- to continue transform even with errors -->
-    <property name="build.log" value="build.log"/><property name="build.log.old" value="${build.log}.old"/>
+         <property name="build.log" value="build${plamy_prefix}.log"/>
+         <property name="build.log.old" value="${build.log}.old"/>
     
     <target name="build_log_exists">
         
@@ -40,47 +47,54 @@
     <property name="logic" value="grouped"/>
     <!--<xsl:param name="logic" select="'sorted'"/>--> <!-- tutaj robi grupy ale analizyje w grupie tylko wazniejsze/bardziej oblozone wezly -->
     
+    <property name="API_address" value="biuro.biall-net.pl"/>
+    <property name="API_wfst_url" value="https://${API_address}/SE/version-git/wfs-data.php/default_db/"/>
+        <property name="API_address_cert.txt" value="${API_address}_cert.txt"/>
+        <property name="API_address_cert.cert" value="${API_address}_cert.cert"/>
+        <property name="API_address_cert.installed" value="${API_address}_cert.installed"/>
+    <property name="cacert_dir" value="${java.home}/lib/security/cacerts"/>
     <property name="mail_inform" value="a.binder@biall-net.pl"/> <!-- to inform about job complete -->
-    
-    
+    <property name="gnutls-cli" value="/opt/local/bin/gnutls-cli"/>
+    <property name="Password_for_cacerts" value="changeit"/><!-- stupid thing to not change-->
     <property name="biale_plamy_class_regenerate.php" value="biale_plamy_class_regenerate.php"/>
+    <!-- parametry dla biale_plamy_class_regenerate.php  -->
     
     <property name="ways_as_Text_z_ID_xml.xsl" value="ways_as_Text_z_ID_xml.xsl"/>
-    <property name="ways_as_Text_z_ID_xml.xml" value="ways_as_Text_z_ID_xml.xml"/>
+    <property name="ways_as_Text_z_ID_xml.xml" value="ways_as_Text_z_ID_xml${plamy_prefix}.xml"/>
     
-    <property name="biale_plamy_class_findWay.php" value="biale_plamy_class_findWay.php"/><!--<property name="biale_plamy-find_ways.php" value="biale_plamy-find_ways.php"/>-->
-        <property name="joins_asText.xml" value="joins_asText.xml"/>
-        <property name="joins2ways.xml" value="joins2ways.xml"/>
-        <property name="points2ID_Way.xml" value="points2ID_Way.xml"/>
-        <property name="ways2drogi.xml" value="ways2drogi.xml"/><!--<property name="ways_2ID_Way.xml" value="ways_2ID_Way.xml"/>-->
+    <!--<property name="biale_plamy_class_findWay.php" value="biale_plamy_class_findWay.php"/>--><!-- - uzywamy wlasnej klasy php do znalezienia drog <property name="biale_plamy-find_ways.php" value="biale_plamy-find_ways.php"/>-->
+    <property name="joins_asText.xml" value="joins_asText${plamy_prefix}.xml"/>
+    <property name="joins2ways.xml" value="joins2ways${plamy_prefix}.xml"/>
+    <property name="points2ID_Way.xml" value="points2ID_Way${plamy_prefix}.xml"/>
+    <property name="ways2drogi.xml" value="ways2drogi${plamy_prefix}.xml"/><!--<property name="ways_2ID_Way.xml" value="ways_2ID_Way.xml"/>-->
         
-            <property name="points2joins.xml" value="points2joins.xml"/>
-            <property name="ways2joins.xml" value="ways2joins.xml"/>
-             <property name="ways_asText.xml" value="ways_asText.xml"/>
+    <property name="points2joins.xml" value="points2joins${plamy_prefix}.xml"/>
+    <property name="ways2joins.xml" value="ways2joins${plamy_prefix}.xml"/>
+    <property name="ways_asText.xml" value="ways_asText${plamy_prefix}.xml"/>
     
-        <property name="waysLengths.xmll" value="waysLengths.xml"/>
+    <property name="waysLengths.xml" value="waysLengths${plamy_prefix}.xml"/>
             <property name="joins2ways_z_ID_Way.xsl" value="joins2ways_z_ID_Way.xsl"/>
-             <property name="joins2ways_z_ID_Way.xml" value="joins2ways_z_ID_Way.xml"/>
-                <property name="joins2ways_z_ID_Way_tempdir" value="joins2ways_z_ID_Way"/><!-- do trzymania tempow - nie wiadomo czy potrzebne bo duzo plikow -->
+    <property name="joins2ways_z_ID_Way.xml" value="joins2ways_z_ID_Way${plamy_prefix}.xml"/>
+    <property name="joins2ways_z_ID_Way_tempdir" value="joins2ways_z_ID_Way${plamy_prefix}"/><!-- do trzymania tempow - nie wiadomo czy potrzebne bo duzo plikow -->
             <property name="biale_plamy_joins2ways_do_paths.xsl" value="biale_plamy_joins2ways_do_paths.xsl"/>
         
             <property name="edge_joins_filled_paths_make.xsl" value="edge_joins_filled_paths_make.xsl"/>
             <property name="biale_put_xml_paths_to_mysql.php" value="biale_put_xml_paths_to_mysql.php"/>
     
-        <property name="points_asText.xml" value="points_asText.xml"/>
+    <property name="points_asText.xml" value="points_asText${plamy_prefix}.xml"/>
         
-        <property name="edge_joins.xml" value="edge_joins.xml"/>
+    <property name="edge_joins.xml" value="edge_joins${plamy_prefix}.xml"/>
         
             <property name="joins_asText_xml.xsl" value="joins_asText_xml.xsl"/>
-            <property name="joins_asText_xml.xml" value="joins_asText_xml.xml"/> 
+    <property name="joins_asText_xml.xml" value="joins_asText_xml${plamy_prefix}.xml"/> 
             <!-- sciezki -->
-            <property name="edge_joins_filled_paths.xml" value="edge_joins_filled_paths.xml"/>
-             <property name="edge_joins_filled_paths" value="edge_joins_filled_paths"/> <!-- katalog do zapisywania sciezek -->
+    <property name="edge_joins_filled_paths.xml" value="edge_joins_filled_paths${plamy_prefix}.xml"/>
+    <property name="edge_joins_filled_paths" value="edge_joins_filled_paths${plamy_prefix}"/> <!-- katalog do zapisywania sciezek -->
               
               
               
           
-            <property name="build_edge_paths_with_PE_controll_loop.xml" value="build_edge_paths_with_PE_controll_loop.xml"/>
+    <property name="build_edge_paths_with_PE_controll_loop.xml" value="build_edge_paths_with_PE_controll_loop${plamy_prefix}.xml"/>
              <property name="build_edge_paths_with_PE_controll_loop.xsl" value="build_edge_paths_with_PE_controll_loop.xsl"/>
                 <property name="edge_paths_with_PE_controll_to_PE_collection.xsl" value="edge_paths_with_PE_controll_to_PE_collection.xsl"/>
     
@@ -88,22 +102,22 @@
                 <property name="edge_paths_with_PE_controll_to_PE.xsl" value="edge_paths_with_PE_controll_to_PE.xsl"/>
     
                 <property name="edge_paths_with_PE_controll.xsl" value="edge_paths_with_PE_controll.xsl"/><!-- nowy point matrix-->   
-                <property name="edge_paths_with_PE_controll_temp" value="edge_paths_with_PE_controll_temp"/>
-                <property name="edge_paths_with_PE_controll_paths_temp" value="edge_paths_with_PE_controll_paths_temp"/><!-- do oszukania silnika aby korzystac z petli i przekazywac dane do siebie -->
-                <property name="edge_paths_with_PE_controll_temp.alias" value="edge_paths_with_PE_controll_temp.alias"/>
+    <property name="edge_paths_with_PE_controll_temp" value="edge_paths_with_PE_controll_temp${plamy_prefix}"/>
+    <property name="edge_paths_with_PE_controll_paths_temp" value="edge_paths_with_PE_controll_paths_temp${plamy_prefix}"/><!-- do oszukania silnika aby korzystac z petli i przekazywac dane do siebie -->
+    <property name="edge_paths_with_PE_controll_temp.alias" value="edge_paths_with_PE_controll_temp.alias${plamy_prefix}"/>
     
-            <property name="edge_paths_with_PE_controll.xml" value="edge_paths_with_PE_controll.xml"/>  
+    <property name="edge_paths_with_PE_controll.xml" value="edge_paths_with_PE_controll${plamy_prefix}.xml"/>  
             
-            <property name="edge_paths_with_PE.xml" value="edge_paths_with_PE.xml"/><!--     biale_plamy_from_paths_php_to_place_PE-->
+    <property name="edge_paths_with_PE.xml" value="edge_paths_with_PE${plamy_prefix}.xml"/><!--     biale_plamy_from_paths_php_to_place_PE-->
          
             <property name="biale_put_PE_to_mysql.php" value="biale_put_PE_to_mysql.php"/>
             
             <property name="cables_from_joins_to_PE.xsl" value="cables_from_joins_to_PE.xsl"/>
-            <property name="cables_from_joins_to_PE.xml" value="cables_from_joins_to_PE.xml"/><!-- xml do wygenerowania  -->
+    <property name="cables_from_joins_to_PE.xml" value="cables_from_joins_to_PE${plamy_prefix}.xml"/><!-- xml do wygenerowania  -->
         
             <property name="biale_put_Cables_to_PE.php" value="biale_put_Cables_to_PE.php"/>
     
-    
+    <property name="PE_fixings.xml" value="PE_fixings${plamy_prefix}.xml"/>
     
     <!--<include file="${build_edge_paths_with_PE_controll_loop.xml}" optional=""/>-->
     
@@ -263,6 +277,9 @@
    
    
    
+   
+   
+   
     <target name="biale_plamy_class_regenerate.php">
         <!--<antcall target="install_in_file_db_query">
             <param name="sql_query" value="select 1+1;"/>
@@ -270,6 +287,7 @@
         <record name="${build.log}" loglevel="verbose" append="true"/>
         <exec executable="php" failonerror="true" dir=".">
             <arg file="${biale_plamy_class_regenerate.php}"/>
+            <arg line="plamy_prefix=${plamy_prefix}"/>
         </exec>
         <echo message="Teraz Przelec arraya joins2ways pod katem 1-elementowych subarrayow"/>
     </target> 
@@ -541,6 +559,96 @@
         <exec executable="php" failonerror="true" dir=".">
             <arg file="${biale_put_Cables_to_PE.php}"/>
         </exec>
+    </target>
+    
+    <target name="import_ssl_certificates_to_system_check" description="Sprawdzenie czy nie zostal juz prawidlowo dodany do danego systemu certyfikat">
+        <echo>Sprawdzam czy nie ma certyfikatu - czy jest plik ${API_address_cert.installed} </echo>
+        
+        <exec command="keytool" output="${API_address_cert.installed}">
+            <arg value="-list"/>
+            <arg value="-keystore"/>
+            <arg value="${cacert_dir}"/>
+            <arg value="-storepass"/>
+            <arg value="${Password_for_cacerts}"/>
+            <arg value="-noprompt"/>
+        </exec>
+        <loadfile property="API_address_cert.installed_contents" srcfile="${API_address_cert.installed}" />
+        
+        <condition  property="API_address_cert.installed_exists_ok"  taskname="import_ssl_certificates_to_system"  else="NotInstalled"  >
+            <!--<available file="${API_address_cert.installed}" filepath="."/>-->
+            <contains string="${API_address_cert.installed_contents}" substring="${API_address}"/>
+        </condition>
+        <echo message="API_address_cert.installed_exists_ok ${API_address_cert.installed_exists_ok}  .  "/>
+    </target>
+    
+    <target name="import_ssl_certificates_to_system" depends="import_ssl_certificates_to_system_check"  unless="${API_address_cert.installed_exists_ok}" description="niezbedne jest sciagniecie certyfikatow bo nie dzialaja przy requestach WFS">
+        <echo>  bedzie wgrany certyfikat do ${java.home}/ ant home: ${ant.home}  dokl do ${cacert_dir}  </echo>
+        <delete file="${API_address_cert.txt}"/>
+        <delete file="${API_address_cert.cert}"/>
+        <delete file="${API_address_cert.installed}"/>
+        
+        <echo  message="${java.home}">   $java.home  </echo>
+        <echo  message="${sun.boot.library.path}"> $sun.boot.library.path</echo>
+        <echo  message="${java.library.path}"> $java.library.path</echo>
+        <echo message="${java.security.policy}">java.security.policy</echo>
+        
+        <exec output="${API_address_cert.txt}"  executable="${gnutls-cli}" >
+            <arg line=" --print-cert ${API_address} &lt; /dev/null "/>
+        </exec>
+        <exec  input="${API_address_cert.txt}" output="${API_address_cert.cert}" executable="openssl">
+            <arg line="x509"/>
+        </exec>
+        <exec executable="keytool">
+            <arg line="-import -v -trustcacerts -alias ${API_address} -file ${API_address}.cert -keystore ${cacert_dir} -storepass ${Password_for_cacerts} -noprompt"/>
+        </exec>
+        
+        <echoproperties destfile="${API_address_cert.installed}">
+            <propertyset><propertyref name="API_address"/></propertyset>
+        </echoproperties>
+        <!--<touch file="${API_address_cert.installed}"/>-->
+        <!--<echoproperties destfile="build.settings.xml"/>-->
+    </target>
+    
+    <target name="get_PE_fixings_from_db"   description="sciagniecie zmian PE glownie usunietych aby wyliczyc ponownie kable do innych wezlow" depends="import_ssl_certificates_to_system">
+        <!--wget -\-http-user=$usr -\-password=$passwd  
+            https://biuro.biall-net.pl/SE/version-git/api.php/xml/table/default_db/_S_ADDRESS_STREETS_distincts/items -\-no-check-certificate -O _S_ADDRESS_STREETS_distincts.xml ;-->
+        <property name="WFS_VERSION" value="&amp;VERSION=1.0.0"/>
+        <property name="TYPENAME" value="&amp;TYPENAME=p5_default_db:Rozdzielcza_test_bzyk_PE"/>  
+        <!--<property name="API_wfst_url2" value="https://onet.pl"/>-->
+        <!--<property name="OGC_Filter"> 
+            &amp;Filter=
+            &lt;ogc:Filter&gt;
+            &lt;ogc:Or&gt;
+            &lt;ogc:Not&gt;
+            &lt;ogc:PropertyIsNull&gt;
+            &lt;ogc:PropertyName&gt;the_geom&lt;/ogc:PropertyName&gt;
+            &lt;/ogc:PropertyIsNull&gt;
+            &lt;/ogc:Not&gt;
+            &lt;ogc:PropertyIsEqualTo&gt;
+            &lt;ogc:PropertyName&gt;ID&lt;/ogc:PropertyName&gt;
+            &lt;ogc:Literal&gt;2&lt;/ogc:Literal&gt;
+            &lt;/ogc:PropertyIsEqualTo&gt;
+            &lt;/ogc:Or&gt;
+            &lt;/ogc:Filter&gt;</property>-->
+        <property name="OGC_Filter" value=""/>
+            
+        <property name="URL_get_PE_fixings_from_db" value="${API_wfst_url}?SERVICE=WFS${WFS_VERSION}&amp;${TYPENAME}&amp;REQUEST=GetFeature&amp;SRSNAME=EPSG:3003${OGC_Filter}"/>
+        <!--<echo output="OGC_Filter">
+           
+        </echo>-->
+        
+        <echo message="we get data from URL: ${URL_get_PE_fixings_from_db}"></echo>
+        
+        <echoproperties destfile="${API_address_cert.installed}">
+            <propertyset><propertyref name="URL_get_PE_fixings_from_db"/></propertyset>
+        </echoproperties>
+        
+        <get dest="${PE_fixings.xml}"  username="${username_p5_admin}" password="${username_p5_admin_pass}">
+            <url  url="${URL_get_PE_fixings_from_db}"/>
+        </get>
+        
+        
+        
     </target>
    
     <!--<target name="1_install_mysql_functions">
@@ -625,6 +733,8 @@
     
     <!--<property name="biale_plamy-prepare_sql_data.php" value="biale_plamy-prepare_sql_data.php"/>-->
     
+    
+    
     <target name="mail_inform">
         
         <echo message="informujemy o kompletnej pracy"/>

+ 9 - 7
SE/dev/php-cli/build_edge_paths_with_PE_controll_loop.xsl

@@ -5,13 +5,14 @@
     exclude-result-prefixes="xs"
     version="2.0">
     
-    <xsl:param name="edge_paths_with_PE_controll_temp" select="'edge_paths_with_PE_controll_temp'"/>
-    <xsl:param name="edge_paths_with_PE_controll_temp.alias" select="'edge_paths_with_PE_controll_temp.alias'"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    <xsl:param name="edge_paths_with_PE_controll_temp" select="concat('edge_paths_with_PE_controll_temp',$plamy_prefix)"/>
+    <xsl:param name="edge_paths_with_PE_controll_temp.alias" select="concat('edge_paths_with_PE_controll_temp.alias',$plamy_prefix)"/>
     <xsl:param name="edge_paths_with_PE_controll.xsl" select="'edge_paths_with_PE_controll.xsl'"/>
-    <xsl:param name="edge_paths_with_PE_controll.xml" select="'edge_paths_with_PE_controll.xml'"/>
-    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="'edge_paths_with_PE_controll_paths_temp'"/>
+    <xsl:param name="edge_paths_with_PE_controll.xml" select="concat('edge_paths_with_PE_controll.xml',$plamy_prefix)"/>
+    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="concat('edge_paths_with_PE_controll_paths_temp',$plamy_prefix)"/>
     
-    <xsl:param name="edge_joins_filled_paths" select="'edge_joins_filled_paths'"/>
+    <xsl:param name="edge_joins_filled_paths" select="concat('edge_joins_filled_paths',$plamy_prefix)"/>
     <xsl:param name="PE_Price" select="2500"/>
     <xsl:param name="Cable_Price" select="3"/>
     <xsl:param name="max_combinate_groups_elements" select="10"/> <!-- po ile wezlow mamy grupowac do wyliczania kombinacji kosztow -->
@@ -53,7 +54,7 @@
         <delete file="{$edge_paths_with_PE_controll_paths_temp}/{$edge_paths_with_PE_controll.xsl}.{@id}.xml"/>
         <xslt basedir="./" style="{$edge_paths_with_PE_controll.xsl}" 
             in="{$edge_joins_filled_paths}/{$edge_joins_filled_paths}.{@id}.xml"  destdir="./" 
-            out="{$edge_paths_with_PE_controll.xsl}.{@id}.xml" >
+            out="{$edge_paths_with_PE_controll.xsl}{$plamy_prefix}.{@id}.xml" >
             <factory name="net.sf.saxon.TransformerFactoryImpl">    
                 <attribute name="http://saxon.sf.net/feature/xinclude-aware" value="true"/>
                 <!--<attribute name="http://saxon.sf.net/feature/initialMode" value="DITA_PARSE_templ"/>-->
@@ -67,9 +68,10 @@
             <param name="max_combinate_groups_elements" expression="{$max_combinate_groups_elements}"/> <!-- po ile wezlow mamy grupowac do wyliczania kombinacji kosztow -->
             <param name="logic" expression="{$logic}"/>
             <param name="edge_paths_with_PE_controll_paths_temp" expression="{$edge_paths_with_PE_controll_paths_temp}"/>
+            <param name="plamy_prefix" expression="{$plamy_prefix}"/>
             <!--<xsl:param name="logic" select="'sorted'"/>--> <!-- tutaj robi grupy ale analizyje w grupie tylko wazniejsze/bardziej oblozone wezly --> 
         </xslt>
-        <move file="{$edge_paths_with_PE_controll.xsl}.{@id}.xml" todir="{$edge_paths_with_PE_controll_paths_temp}"/>
+        <move file="{$edge_paths_with_PE_controll.xsl}{$plamy_prefix}.{@id}.xml" todir="{$edge_paths_with_PE_controll_paths_temp}"/>
     </xsl:template>
     
 </xsl:stylesheet>

+ 4 - 3
SE/dev/php-cli/cables_from_joins_to_PE.xsl

@@ -8,11 +8,12 @@
     <xsl:strip-space elements="*"/>
     
     <xsl:include href="asText.xsl"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
     
-    <xsl:param name="edge_paths_with_PE.xml" select="'edge_paths_with_PE.xml'"/>
-    <xsl:param name="joins_asText_xml.xml" select="'joins_asText_xml.xml'"/>
+    <xsl:param name="edge_paths_with_PE.xml" select="concat('edge_paths_with_PE',$plamy_prefix,'.xml')"/>
+    <xsl:param name="joins_asText_xml.xml" select="concat('joins_asText_xml',$plamy_prefix,'.xml')"/>
     <!--<xsl:param name="edge_joins_filled_paths.xml" select="'edge_joins_filled_paths.xml'"/>-->
-    <xsl:param name="points2joins.xml" select="'points2joins.xml'"/>
+    <xsl:param name="points2joins.xml" select="concat('points2joins',$plamy_prefix,'.xml')"/>
     <xsl:param name="edge_joins_filled_paths" select="'edge_joins_filled_paths'"/>
     
     <xsl:variable name="PE_candidates_dump" select="doc($edge_paths_with_PE.xml)"/>

+ 6 - 5
SE/dev/php-cli/edge_joins_filled_paths_make.xsl

@@ -5,20 +5,21 @@
     exclude-result-prefixes="xs"
     version="2.0">
     
-    <xsl:param name="ways_as_Text_z_ID_xml.xml" select="'ways_as_Text_z_ID_xml.xml'"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    <xsl:param name="ways_as_Text_z_ID_xml.xml" select="concat('ways_as_Text_z_ID_xml',$plamy_prefix,'.xml')"/>
     <xsl:variable name="ways_asText_z_ID_xml" select="doc($ways_as_Text_z_ID_xml.xml)"/>
     
-    <xsl:param name="joins_asText_xml.xml" select="'joins_asText_xml.xml'"/>
+    <xsl:param name="joins_asText_xml.xml" select="concat('joins_asText_xml',$plamy_prefix,'.xml')"/>
     <xsl:variable name="joins_asText_xml" select="doc($joins_asText_xml.xml)"/>
     
    
-    <xsl:param name="ways2joins.xml" select="'ways2joins.xml'"/>
+    <xsl:param name="ways2joins.xml" select="concat('ways2joins',$plamy_prefix,'.xml')"/>
     <xsl:variable name="ways2joins" select="doc($ways2joins.xml)"/>
     
-    <xsl:param name="joins2ways_z_ID_Way.xml" select="'joins2ways_z_ID_Way.xml'"/>
+    <xsl:param name="joins2ways_z_ID_Way.xml" select="concat('joins2ways_z_ID_Way',$plamy_prefix,'.xml')"/>
     <xsl:variable name="joins2ways_z_ID_Way" select="doc($joins2ways_z_ID_Way.xml)"/>
     
-    <xsl:param name="edge_joins_filled_paths" select="'edge_joins_filled_paths'"/> <!-- katalog do zapisywania sciezek -->
+    <xsl:param name="edge_joins_filled_paths" select="concat('edge_joins_filled_paths',$plamy_prefix)"/> <!-- katalog do zapisywania sciezek -->
     
     <xsl:param name="debug"  select="0" /> <!-- set 1 to debug -->
     

+ 2 - 1
SE/dev/php-cli/edge_paths_with_PE.xsl

@@ -7,7 +7,8 @@
     
     <xsl:output indent="yes"/>
     <xsl:strip-space elements="*"/>
-    <xsl:param name="joins2ways_z_ID_Way.xml" select="'joins2ways_z_ID_Way.xml'"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    <xsl:param name="joins2ways_z_ID_Way.xml" select="concat('joins2ways_z_ID_Way',$plamy_prefix,'.xml')"/>
     
     <xsl:variable name="joins2ways_z_ID_Way" select="$joins2ways_z_ID_Way.xml"/>
     

+ 5 - 5
SE/dev/php-cli/edge_paths_with_PE_controll.xsl

@@ -11,7 +11,7 @@
     
     <xsl:output indent="yes"/>
     <xsl:strip-space elements="*"/>
-    
+    <xsl:param name="plamy_prefix" select="'test2'"/>
     <xsl:param name="PE_Price" select="2500"/>
     <xsl:param name="Cable_Price" select="3"/>
     <xsl:param name="max_combinate_groups_elements" select="8"/> <!-- po ile wezlow mamy grupowac do wyliczania kombinacji kosztow -->
@@ -22,10 +22,10 @@
     
     
     <!--<xsl:param name="edge_paths_with_PE.xml"/>-->
-    <xsl:param name="edge_paths_with_PE_controll_temp" select="'edge_paths_with_PE_controll_temp'"/> <!-- cache do przekazywani danych z petli-->
-    <xsl:param name="edge_paths_with_PE_controll_temp.alias" select="'edge_paths_with_PE_controll_temp.alias'" />
-    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="'edge_paths_with_PE_controll_paths_temp'"/> <!-- do przechowywania calych sciezek do PathCrossed-->
-    <xsl:param name="edge_joins_filled_paths" select="'edge_joins_filled_paths'"/>
+    <xsl:param name="edge_paths_with_PE_controll_temp" select="concat('edge_paths_with_PE_controll_temp',$plamy_prefix)"/> <!-- cache do przekazywani danych z petli-->
+    <xsl:param name="edge_paths_with_PE_controll_temp.alias" select="concat('edge_paths_with_PE_controll_temp.alias',$plamy_prefix)" />
+    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="concat('edge_paths_with_PE_controll_paths_temp',$plamy_prefix)"/> <!-- do przechowywania calych sciezek do PathCrossed-->
+    <xsl:param name="edge_joins_filled_paths" select="concat('edge_joins_filled_paths',$plamy_prefix)"/>
     <!-- bedziemy od najdluzszej drogi starac sie rozmiescic PE w oparciu o rozmieszczenie klientow oraz odleglosci  -->
     
     

+ 3 - 1
SE/dev/php-cli/edge_paths_with_PE_controll_to_PE_collection.xsl

@@ -7,10 +7,12 @@
     
     <xsl:include href="edge_paths_with_PE_controll_to_PE.xsl"/>
     
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    
     <xsl:output indent="yes"/>
     <xsl:strip-space elements="*"/>
     
-    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="'edge_paths_with_PE_controll_paths_temp'"/> <!-- katalog z PE w plikach edge_paths_with_PE_controll.xsl.312.xml -->
+    <xsl:param name="edge_paths_with_PE_controll_paths_temp" select="concat('edge_paths_with_PE_controll_paths_temp',$plamy_prefix)"/> <!-- katalog z PE w plikach edge_paths_with_PE_controll.xsl.312.xml -->
     
     <!-- jedzie po koncach sciezek i z nich przyjmuje argument ID_Way po ktorym odpytuje sie pliki z wyloczeniami punktow -->
     

+ 6 - 3
SE/dev/php-cli/joins2ways_z_ID_Way.xsl

@@ -6,9 +6,12 @@
     version="2.0">
     <xsl:output indent="yes"/>
     <xsl:strip-space elements="*"/>
-    <xsl:param name="ways2drogi.xml"  select="'ways2drogi.xml'"/>
+    
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    
+    <xsl:param name="ways2drogi.xml"  select="concat('ways2drogi',$plamy_prefix,'.xml')"/>
     <xsl:variable name="ways2drogi" select="doc($ways2drogi.xml)"/>
-    <xsl:param name="points2joins.xml"  select="'points2joins.xml'"/>
+    <xsl:param name="points2joins.xml"  select="concat('points2joins',$plamy_prefix,'.xml')"/>
     <xsl:variable name="points2joins" select="doc($points2joins.xml)"/>
     <xsl:param name="joins2ways_z_ID_Way_tempdir" select="'joins2ways_z_ID_Way'"/>
     
@@ -65,7 +68,7 @@
         </xsl:for-each-group>
         </xsl:variable>
         <xsl:copy-of select="$items_grouped"/>
-        <!--<xsl:result-document href="{$joins2ways_z_ID_Way_tempdir}/joins2ways_z_ID_Way.{@id}.{@ID_Way}.xml">
+        <!--<xsl:result-document href="{$joins2ways_z_ID_Way_tempdir}{$plamy_prefix}/joins2ways_z_ID_Way.{@id}.{@ID_Way}.xml">
             <joins2ways_z_ID_Way>
                 <xsl:attribute name="id" select="@id"/>
                 <xsl:copy-of select="$items_grouped"/>

+ 3 - 1
SE/dev/php-cli/joins_asText_xml.xsl

@@ -7,7 +7,9 @@
     
     <xsl:import href="asText.xsl"/>
     
-    <xsl:param name="points2joins.xml"  select="'points2joins.xml'"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    
+    <xsl:param name="points2joins.xml"  select="concat('points2joins',$plamy_prefix,'.xml')"/>
     <xsl:variable name="points2joins" select="doc($points2joins.xml)"/>
     
     <xsl:output indent="yes"/>

+ 4 - 2
SE/dev/php-cli/ways_as_Text_z_ID_xml.xsl

@@ -6,10 +6,12 @@
     version="2.0">
      
     <xsl:import href="asText.xsl"/>
-    <xsl:param name="ways2drogi.xml" select="'ways2drogi.xml'"/>
+    <xsl:param name="plamy_prefix" select="'test2'"/>
+    
+    <xsl:param name="ways2drogi.xml" select="concat('ways2drogi',$plamy_prefix,'.xml')"/>
     <xsl:variable name="ways2drogi" select="doc($ways2drogi.xml)"/>
     
-    <xsl:param name="waysLengths.xml" select="'waysLengths.xml'"/>
+    <xsl:param name="waysLengths.xml" select="concat('waysLengths',$plamy_prefix,'.xml')"/>
     <xsl:variable name="waysLengths" select="doc($waysLengths.xml)"/>
     
     

+ 1079 - 0
SE/se-lib/Route/UrlAction/JPK.php

@@ -0,0 +1,1079 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('ProcesHelper');
+
+class Route_UrlAction_JPK extends RouteBase {
+
+	private $REFERER, $LAST_REFERER;
+	private $JPK, $BO;
+
+	public function handleAuth() {
+		if (!User::logged()) {
+			throw new HttpException('Unauthorized', 401);
+		}
+
+		$this->LAST_REFERER = $_SERVER['HTTP_REFERER'];
+		if (($this->REFERER=V::get('REFERER','',$_POST))=='') $this->REFERER = $_SERVER['HTTP_REFERER'];
+
+		try {
+			if (!($ID_JPK = V::get('ID_JPK',0,$_GET,'int'))) throw new Exception("Błąd parametru");
+			if ($result = DB::getPDO()->fetchall("select * from JPK where ID='{$ID_JPK}'")) $this->JPK = $result[0]; 
+			else throw new Exception("Dostęp zabroniony");
+			if ($result = DB::getPDO()->fetchall("select * from BILLING_OWNER where ID='{$this->JPK['ID_BILLING_OWNER']}'")) $this->BO = $result[0];
+			else throw new Exception("Błąd spójności danych");
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger',$e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <a href="<?php echo $this->REFERER?>" class="btn btn-primary">Powrót</a>
+</div>
+<?php
+			SE_Layout::dol();
+			die();
+		}
+	}
+
+	private function initialize() {
+		SE_Layout::gora();
+		SE_Layout::menu();
+		try {
+
+			if (V::get('action','',$_POST) == 'initialize') {
+				$month = V::get('MONTH','',$_POST);
+				$purpose = V::get('PURPOSE','',$_POST);
+				if (!preg_match("/^[[:digit:]]{4}-[[:digit:]]{2}$/",$month)) throw new Exception("błędny format daty (YYYY-MM)");
+				switch ($purpose) {
+					case "1":
+						$lastMonth = DB::getPDO()->fetchValue("select max(MONTH) from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}' and PURPOSE='1'");
+						if (strtotime($month) <= strtotime($lastMonth)) throw new Exception("błędny miesiąc (deklaracja z tego okresu lub późniejszego już istnieje)");
+						break;
+					case "2":
+						$JPKexists = DB::getPDO()->fetchValue("select ID from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}' and MONTH='{$month}' and PURPOSE='1'");
+						if (!$JPKexists) throw new Exception("brak deklaracji z tego okresu - nie ma czego korygować");
+						break;
+					default:
+						throw new Exception("błędne określenie celu złożenia deklaracji");
+				}
+
+				$sqlObj = new stdClass();
+				$sqlObj->ID = $this->JPK['ID'];
+				$sqlObj->A_STATUS = 'NORMAL';
+				$sqlObj->A_STATUS_INFO = 'W trakcie tworzenia';
+				$sqlObj->MONTH = $month;
+				$sqlObj->PURPOSE = $purpose;
+
+				$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
+				if ($affected) {
+					SE_Layout::alert('success','Pomyślnie zainicjalizowano deklarację JPK.');
+?>
+<div class="container" style="text-align:center">
+  <form method="post">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Edytuj</button>
+    <a href="<?php echo $this->REFERER?>" class="btn btn-default">Powrót</a>
+  </form>
+</div>
+<?php
+				}
+				else {
+					SE_Layout::alert('warning','Wystąpił nieznany błąd podczas inicjalizowania deklaracji JPK.');
+?>
+<div class="container" style="text-align:center">
+  <a href="<?php echo $this->REFERER?>" class="btn btn-primary">Powrót</a>
+</div>
+<?php
+				}
+			} else {
+?>
+<div class="container" style="margin-top:20px">
+  <form class="form-horizontal" method="post">
+    <legend>Inicjalizacja deklaracji JPK</legend>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Operator</label>
+      <div class="col-sm-9" style="margin-top:7px;"><?php echo $this->BO['name1']?></div>
+    </div>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Typ JPK</label>
+      <div class="col-sm-9" style="margin-top:7px;"><?php echo $this->JPK['TYPE']?></div>
+    </div>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Miesiąc, którego dotyczy deklaracja</label>
+      <div class="col-sm-2">
+	<div class="input-group">
+	  <input type="text" id="MONTH" class="form-control se_type-date" name="MONTH" value="2017-01" maxlength="7"/>
+	    <span class="input-group-addon">
+	      <span class="glyphicon glyphicon-calendar"/>
+	    </span>
+	  </input>
+	</div>
+      </div>
+    </div>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Cel złożenia deklaracji za dany okres</label>
+      <div class="col-sm-3">
+	<select class="form-control" name="PURPOSE">
+	  <option value="1">Złożenie po raz pierwszy</option>
+	  <option value="2">Korekta</option>
+	</select>
+      </div>
+    </div>
+    <div class="form-group">
+      <div class="col-sm-offset-3 col-sm-9">
+        <button type="submit" class="btn btn-primary" name="action" value="initialize">Zapisz</button>
+        <a href="<?php echo $this->REFERER?>" class="btn btn-default">Anuluj</a>
+      </div>
+    </div>
+  <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+  </form>
+</div>
+<script>
+jQuery(document.getElementById('MONTH')).parent().datetimepicker({
+format: 'YYYY-MM'
+, locale: 'pl'
+, showTodayButton: false
+, minDate: '2017-01-01'
+, maxDate: '<?=date("Y-m", strtotime("-1 month"))?>-28'
+});
+</script>
+<?php
+			}
+		} catch (Exception $e) {
+			SE_Layout::alert('danger', "Wystąpił problem z inicjalizacją deklaracji JPK - " . $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <a href="<?php echo $this->REFERER?>" class="btn btn-primary">Powrót</a>
+</div>
+<?php
+		}
+		SE_Layout::dol();	
+	}
+
+	private $fieldsDescrJPK_VAT = array(
+		"KodFormularza" => "Kod formularza",
+		"WariantFormularza" => "Wariant formularza",
+		"CelZlozenia" => "Cel złożenia",
+		"DataWytworzeniaJPK" => "Data wytworzenia JPK",
+		"DataOd" => "Data od",
+		"DataDo" => "Data do",
+		"DomyslnyKodWaluty" => "Waluta",
+		"KodUrzedu" => "Kod urzędu skarbowego",
+		"PelnaNazwa" => "Nazwa podmiotu",
+		"NIP" => "NIP",
+		"REGON" => "Regon",
+		"KodKraju" => "Kod kraju",
+		"Wojewodztwo" => "Województwo",
+		"Powiat" => "Powiat",
+		"Gmina" => "Gmina",
+		"Miejscowosc" => "Miejscowość",
+		"Ulica" => "Ulica",
+		"NrDomu" => "Nr domu",
+		"NrLokalu" => "Nr lokalu",
+		"KodPocztowy" => "Kod pocztowy",
+		"Poczta" => "Poczta",
+		"LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
+		"PodatekNalezny" => "Podatek należny",
+		"LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
+		"PodatekNaliczony" => "Podatek naliczony"
+	);
+
+	private function showJPK_VAT($xml) {
+		$ns = $xml->getNamespaces(true);
+		$summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
+
+		$result['KodFormularza'] = $xml->Naglowek->KodFormularza;
+		$result['WariantFormularza'] = $xml->Naglowek->WariantFormularza;
+		$result['CelZlozenia'] = $xml->Naglowek->CelZlozenia;
+		$result['DataWytworzeniaJPK'] = date("Y-m-d H:i:s", strtotime($xml->Naglowek->DataWytworzeniaJPK));
+		$result['DataOd'] = $xml->Naglowek->DataOd;
+		$result['DataDo'] = $xml->Naglowek->DataDo;
+		$result['DomyslnyKodWaluty'] = $xml->Naglowek->DomyslnyKodWaluty;
+		$result['KodUrzedu'] = $xml->Naglowek->KodUrzedu;
+		$result['NIP'] = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP;
+		$result['PelnaNazwa'] = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
+		$result['REGON'] = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON;
+		$result['KodKraju'] = $xml->Podmiot1->AdresPodmiotu->KodKraju;
+		$result['Wojewodztwo'] = $xml->Podmiot1->AdresPodmiotu->Wojewodztwo;
+		$result['Powiat'] = $xml->Podmiot1->AdresPodmiotu->Powiat;
+		$result['Gmina'] = $xml->Podmiot1->AdresPodmiotu->Gmina;
+		$result['Ulica'] = $xml->Podmiot1->AdresPodmiotu->Ulica;
+		$result['NrDomu'] = $xml->Podmiot1->AdresPodmiotu->NrDomu;
+		$result['NrLokalu'] = $xml->Podmiot1->AdresPodmiotu->NrLokalu;
+		$result['Miejscowosc'] = $xml->Podmiot1->AdresPodmiotu->Miejscowosc;
+		$result['KodPocztowy'] = $xml->Podmiot1->AdresPodmiotu->KodPocztowy;
+		$result['Poczta'] = $xml->Podmiot1->AdresPodmiotu->Poczta;
+		$result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? $summaryJPK_VAT['LiczbaWierszySprzedazy'] : "";
+		$result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
+		$result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? $summaryJPK_VAT['LiczbaWierszyZakupow'] : "";
+		$result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
+
+		return $result;
+	}
+
+	private function showTable() {
+?>
+    <div class="form-group">
+      <div class="col-sm-12">
+         <table class="table table-bordered table-hover table-striped">
+           <thead>
+              <tr style="text-align:center; background-color:lightgray"><td width="19%"></td><td witdh="27%">Insert</td><td width="27%">L1</td><td width="27%">Dane wynikowe</td></tr>
+           </thead>
+           <tbody>
+<?php
+		if ($this->JPK['IN_INSERT']) {
+			$xmlIN_INSERT = simplexml_load_string($this->JPK['IN_INSERT']);
+			$IN_INSERT = $this->showJPK_VAT($xmlIN_INSERT);
+		}
+		if ($this->JPK['IN_L1']) {
+			$xmlIN_L1 = simplexml_load_string($this->JPK['IN_L1']);
+			$IN_L1 = $this->showJPK_VAT($xmlIN_L1);
+		}
+		if ($this->JPK['OUT_MERGED']) {
+			$xmlOUT_MERGED = simplexml_load_string($this->JPK['OUT_MERGED']);
+			$OUT_MERGED = $this->showJPK_VAT($xmlOUT_MERGED);
+		}
+
+		foreach ($this->fieldsDescrJPK_VAT as $fieldKey => $fieldName) {
+			echo "<tr><td>{$fieldName}</td><td>";
+			if ($this->JPK['IN_INSERT']) echo $IN_INSERT[$fieldKey];
+			echo "</td><td>";
+			if ($this->JPK['IN_L1']) echo $IN_L1[$fieldKey];
+			echo "</td><td>";
+			if ($this->JPK['OUT_MERGED']) echo $OUT_MERGED[$fieldKey];
+			echo "</td></tr>\n";
+		}
+?>
+           </tbody>
+         <table>
+      </div>
+    </div>
+<?php
+	}
+
+	private function show() {
+		SE_Layout::gora();
+		SE_Layout::menu();
+?>
+<div class="container" style="margin-top:20px">
+  <form class="form-horizontal" method="post" enctype="multipart/form-data">
+    <legend>
+      Podgląd deklaracji JPK :: <?=$this->JPK['TYPE']?> - <?=$this->JPK['MONTH']." (".($this->JPK['PURPOSE'] == 1 ? "pierwsze złożenie" : "korekta").")"?>
+      <span class="pull-right">
+        <?=$this->BO['name1']?>
+      </span>
+    </legend>
+    <div class="form-group">
+    <div class="form-group">
+      <div class="col-sm-10">
+	<a href="<?=$_SERVER['HTTP_REFERER']?>&dupa=test" target="_blank" class="btn-sm btn-primary">Pobierz plik JPK</a>
+      </div>
+    </div>
+<?=$this->showTable();?>
+    <div class="form-group" style="text-align:center">
+      <div class="col-sm-12">
+        <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
+        <input type="hidden" name="_task" value="edit">
+        <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
+      </div>
+    </div>
+  </form>
+</div>
+<?php
+		SE_Layout::dol();
+	}
+
+	private function edit() {
+		SE_Layout::gora();
+		SE_Layout::menu();
+?>
+<div class="container" style="margin-top:20px">
+  <form class="form-horizontal" method="post" enctype="multipart/form-data">
+    <legend>
+      Edycja deklaracji JPK :: <?=$this->JPK['TYPE']?> - <?=$this->JPK['MONTH']." (".($this->JPK['PURPOSE'] == 1 ? "pierwsze złożenie" : "korekta").")"?>
+      <span class="pull-right">
+        <?=$this->BO['name1']?>
+      </span>
+    </legend>
+    <div class="form-group">
+      <label class="col-sm-3 control-label"><?=($this->JPK['IN_INSERT'] ? "Usuń dane zaimportowane" : "Dodaj plik JPK")?> z pakietu Insert</label>
+<?php
+		if ($this->JPK['IN_INSERT']) {
+?>
+      <div class="col-sm-9" style="margin-top:3px;">
+	<button type="submit" class="btn-xs btn-default" name="action" value="delete_insert_jpk">Usuń</button>
+      </div>
+<?php
+		} else {
+?>
+      <div class="col-sm-9" style="margin-top:7px;">
+	<input type="hidden" name="action" value="upload_insert_jpk"/>
+	<input type="file" name="IN_INSERT" onchange="javascript:this.form.submit();"/>
+      </div>
+<?php
+		}
+?>
+    </div>
+    <div class="form-group">
+      <label class="col-sm-3 control-label"><?=($this->JPK['IN_L1'] ? "Usuń" : "Pobierz")?> dane z L1</label>
+      <div class="col-sm-9" style="margin-top:3px;">
+	<button type="submit" class="btn-xs btn-default" name="action" value=<?=($this->JPK['IN_L1'] ? '"delete_l1_jpk">Usuń' : '"import_l1_jpk">Pobierz')?></button>
+      </div>
+    </div>
+<?php
+		if (!($this->JPK['IN_INSERT'] || $this->JPK['IN_L1'])) {
+?>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Reinicjalizuj deklarację</label>
+      <div class="col-sm-9" style="margin-top:3px;">
+        <button type="submit" class="btn-xs btn-default" name="action" value="reinitialize">Reinicjalizuj</button>
+      </div>
+    </div>
+<?php
+		}
+		if ($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'] && (!$this->JPK['OUT_MERGED'])) {
+?>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Importuj dane podmiotu z</label>
+      <div class="col-sm-9" style="margin-top:3px;">
+	<input type="radio" name="SRC_PODMIOT" value="Insert" checked> Insert<br/>
+	<input type="radio" name="SRC_PODMIOT" value="L1"> L1
+      </div>
+    </div>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Generuj deklarację wynikową</label>
+      <div class="col-sm-9" style="margin-top:3px;">
+        <button type="submit" class="btn-xs btn-default" name="action" value="generate_merged_jpk">Generuj</button>
+      </div>
+    </div>
+<?php
+		}
+		if ($this->JPK['OUT_MERGED']) {
+?>
+    <div class="form-group">
+      <label class="col-sm-3 control-label">Zamknij deklarację JPK</label>
+      <div class="col-sm-9" style="margin-top:3px;">
+        <button type="submit" class="btn-xs btn-default" name="action" value="close_jpk">Zamknij</button>
+	<p class="help-block">(tej operacji nie można cofnąć)</p>
+      </div>
+    </div>
+<?php
+		}
+?>
+<?=$this->showTable()?>
+    <div class="form-group" style="text-align:center">
+      <div class="col-sm-12">
+	<input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
+	<input type="hidden" name="_task" value="edit">
+        <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
+      </div>
+    </div>
+  </form>
+</div>
+<?php
+		SE_Layout::dol();
+	}
+
+	public function editAction() {
+		$allowedActions = array("upload_insert_jpk", "delete_insert_jpk", "import_l1_jpk", "delete_l1_jpk", "generate_merged_jpk", "close_jpk", "reinitialize");
+
+		if (in_array(($action = V::get('action','',$_POST)), $allowedActions)) $this->$action();
+		else {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', "Wykryto abuse! Wysłano informację do administratora.");
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function getSummaryJPK_VAT($xml) {
+		$PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1",
+			"K_30" => "1", "K_33" => "1", "K_35" => "1", "K_36" => "1", "K_37" => "1", "K_38" => "-1", "K_39" => "-1");
+		$PodatekNaliczonyFields = array("K_44" => 1, "K_46" => 1, "K_47" => 1, "K_48" => 1, "K_49" => 1, "K_50" => 1);
+
+		$result = array(
+			"LiczbaWierszySprzedazy" => 0,
+			"PodatekNalezny" => 0,
+			"LiczbaWierszyZakupow" => 0,
+			"PodatekNaliczony" => 0);
+
+		foreach ($xml->SprzedazWiersz as $SprzedazWiersz) {
+			foreach ($PodatekNaleznyFields as $PodatekNaleznyField => $sign) {
+				if (isset($SprzedazWiersz->$PodatekNaleznyField)) {
+					$result["PodatekNalezny"] += round((float) $SprzedazWiersz->$PodatekNaleznyField * $sign, 2);
+				}
+			}
+			$result["LiczbaWierszySprzedazy"]++;
+		}
+
+		foreach ($xml->ZakupWiersz as $ZakupWiersz) {
+			foreach ($PodatekNaliczonyFields as $PodatekNaliczonyField => $sign) {
+				if (isset($ZakupWiersz->$PodatekNaliczonyField)) {
+					$result["PodatekNaliczony"] += round((float) $ZakupWiersz->$PodatekNaliczonyField * $sign, 2);
+				}
+			}
+			$result["LiczbaWierszyZakupow"]++;
+		}
+
+		$result["PodatekNalezny"] = round($result["PodatekNalezny"], 2);
+		$result["PodatekNaliczony"] = round($result["PodatekNaliczony"], 2);
+		return $result;
+	}
+
+	private function validateJPK_VAT(&$xml) {
+		$ns = $xml->getNamespaces(true);
+		if ($xml->Naglowek->KodFormularza != "JPK_VAT") throw new Exception("Błędny typ deklaracji JPK");
+		if ($xml->Naglowek->WariantFormularza != "2") throw new Exception("Błędna wersja deklaracji JPK");
+		if ($xml->Naglowek->CelZlozenia != $this->JPK['PURPOSE']) throw new Exception("Niezgodny cel złożenia deklaracji JPK");
+		if ($xml->Naglowek->DataOd != ($this->JPK['MONTH'] . "-01")) throw new Exception("Błędna data 'od' deklaracji JPK");
+		if ($xml->Naglowek->DataDo != date("Y-m-d", strtotime($xml->Naglowek->DataOd . "+ 1 month - 1 day"))) throw new Exception("Błędna data 'do' deklaracji JPK");
+		if ($xml->Naglowek->DomyslnyKodWaluty != "PLN") throw new Exception("Błędna waluta deklaracji JPK");
+		if (trim(str_replace('-', '', $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP)) != trim(str_replace('-', '', $this->BO['nip']))) throw new Exception("Niezgodny NIP podmiotu w deklaracji JPK");
+		$summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
+		if ($summaryJPK_VAT["LiczbaWierszySprzedazy"]) {
+			if ($xml->SprzedazCtrl->LiczbaWierszySprzedazy != $summaryJPK_VAT["LiczbaWierszySprzedazy"]) throw new Exception("Brak spójności liczby wierszy sprzedaży w deklaracji JPK");
+			if (((float) $xml->SprzedazCtrl->PodatekNalezny) != $summaryJPK_VAT["PodatekNalezny"])  throw new Exception("Brak spójności wartości podatku należnego w deklaracji JPK");
+		}
+		if ($summaryJPK_VAT["LiczbaWierszyZakupow"]) {
+			if ($xml->ZakupCtrl->LiczbaWierszyZakupow != $summaryJPK_VAT["LiczbaWierszyZakupow"]) throw new Exception("Brak spójności liczby wierszy zakupów w deklaracji JPK");
+			if (((float) $xml->ZakupCtrl->PodatekNaliczony) != $summaryJPK_VAT["PodatekNaliczony"])  throw new Exception("Brak spójności wartości podatku naliczonego w deklaracji JPK");
+		}
+
+		function HandleXmlError($errno, $errstr, $errfile, $errline) {
+			if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0)) throw new DOMException($errstr);
+			else return false;
+		}
+
+		set_error_handler('HandleXmlError');
+		try {
+			$dom = new DOMDocument();
+			$dom->preserveWhiteSpace = false;
+			$dom->formatOutput = true;
+			$dom->loadXML($xml->asXML());
+		} catch (Exception $e) {
+			throw new Exception("Błąd parsowania pliku JPK");
+		}
+		restore_error_handler();
+
+		$xml = simplexml_load_string($dom->saveXML());
+	}
+
+	private function upload_insert_jpk() {
+		try {
+			if ($_FILES['IN_INSERT']['type'] != "text/xml") throw new Exception("Błędny plik JPK");
+			$xml = simplexml_load_file($_FILES['IN_INSERT']['tmp_name']);
+			$this->validateJPK_VAT($xml);
+			if ($this->JPK['IN_L1']) $info = "Zaimportowano dane z Insert i L1";
+			else $info = "Zaimportowano dane z Insert";
+
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS_INFO = $info;
+			$sqlObj->IN_INSERT = $xml->asXml();
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił błąd, prawdopodobnie Ten plik JPK został wgrany już wcześniej");
+			$this->handleAuth();
+			$this->edit();
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function delete_insert_jpk() {
+		try {
+			$info = "Usunięto dane z Insert";
+			if ($this->JPK['IN_L1']) $info .= " (pozostawiono dane z L1)";
+
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS_INFO = $info;
+			$sqlObj->IN_INSERT = null;
+			$sqlObj->OUT_MERGED = null;
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
+			$this->handleAuth();
+			$this->edit();
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function import_l1_jpk() {
+
+		$xmlSchema = <<<EOT
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<JPK xmlns="http://jpk.mf.gov.pl/wzor/2016/10/26/10261/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <Naglowek>
+    <KodFormularza kodSystemowy="JPK_VAT (2)" wersjaSchemy="1-0">JPK_VAT</KodFormularza>
+    <WariantFormularza>2</WariantFormularza>
+    <CelZlozenia></CelZlozenia>
+    <DataWytworzeniaJPK></DataWytworzeniaJPK>
+    <DataOd></DataOd>
+    <DataDo></DataDo>
+    <DomyslnyKodWaluty>PLN</DomyslnyKodWaluty>
+    <KodUrzedu></KodUrzedu>
+  </Naglowek>
+  <Podmiot1>
+    <IdentyfikatorPodmiotu>
+      <etd:NIP></etd:NIP>
+      <etd:PelnaNazwa></etd:PelnaNazwa>
+      <etd:REGON></etd:REGON>
+    </IdentyfikatorPodmiotu>
+    <AdresPodmiotu>
+      <KodKraju></KodKraju>
+      <Wojewodztwo></Wojewodztwo>
+      <Powiat></Powiat>
+      <Gmina></Gmina>
+      <Ulica></Ulica>
+      <NrDomu></NrDomu>
+      <NrLokalu></NrLokalu>
+      <Miejscowosc></Miejscowosc>
+      <KodPocztowy></KodPocztowy>
+      <Poczta></Poczta>
+    </AdresPodmiotu>
+  </Podmiot1>
+</JPK>
+EOT;
+
+		$queryFVAT = <<<EOT
+select
+bn.ID as BN_ID,
+concat(bua.P_NAME, if(bua.P_NAME_SECOND='','',concat(' ',bua.P_NAME_SECOND))) AS NazwaKontrahenta,
+concat(bua.P_ADDRESS_STREET,' ',bua.P_ADDRESS_HOUSE, if(bua.P_ADDRESS_HOME='','',concat('/',bua.P_ADDRESS_HOME)),', ',P_ADDRESS_POST_CODE,' ',P_ADDRESS_CITY) AS AdresKontrahenta,
+bf.SELL_DATE AS 'DataWystawienia',
+concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
+if(coalesce(bua.P_NIP,'')='','brak',coalesce(bua.P_NIP,'')) AS 'NrKontrahenta',
+round(bfp.AMMOUNT * bfp.PRICE, 2) as Netto,
+round(round(bfp.AMMOUNT * bfp.PRICE, 2) * bfp.VAT/100, 2) as VAT,
+bfp.VAT_NAME as 'VAT_NAME'
+from BILLING_NUMBERS bn
+join BILLS_FVAT bf on bn.ID=bf.ID_BILLING_NUMBERS
+join BILLS_FVAT_POS bfp on bf.ID=bfp.ID_BILLS_FVAT
+join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
+join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
+where bn.ID_BILLING_NUMBERS_TYPE='1' and bf.BILL_DATE like '{$this->JPK['MONTH']}%'
+and bu.BILLING_OWNER='{$this->BO['ID']}'
+order by bf.BILL_DATE,bn.ID
+EOT;
+
+		$queryKORV = <<<EOT
+select
+bn.ID AS BN_ID,
+concat(bua.P_NAME, if(bua.P_NAME_SECOND='','',concat(' ',bua.P_NAME_SECOND))) AS NazwaKontrahenta,
+concat(bua.P_ADDRESS_STREET,' ',bua.P_ADDRESS_HOUSE, if(bua.P_ADDRESS_HOME='','',concat('/',bua.P_ADDRESS_HOME)),', ',P_ADDRESS_POST_CODE,' ',P_ADDRESS_CITY) AS AdresKontrahenta,
+bk.BILL_DATE AS 'DataWystawienia',
+bk.SELL_DATE AS 'DataSprzedazy',
+concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
+if(coalesce(bua.P_NIP,'')='','brak',coalesce(bua.P_NIP,'')) AS 'NrKontrahenta',
+bkp.AMMOUNT AS AMMOUNT,
+bkp.PRICE AS PRICE,
+bkp.VAT AS VAT,
+bkp.VAT_NAME AS VAT_NAME,
+bkp.N_AMMOUNT AS N_AMMOUNT,
+bkp.N_PRICE AS N_PRICE,
+bkp.N_VAT AS N_VAT,
+bkp.N_VAT_NAME AS N_VAT_NAME,
+bkp.TYP_KOREKTY AS TYP_KOREKTY
+from BILLING_NUMBERS bn
+join BILLS_KORV bk on bn.ID=bk.ID_BILLING_NUMBERS
+join BILLS_KORV_POS bkp on bk.ID=bkp.ID_BILLS_FVAT
+join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
+join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
+where bn.ID_BILLING_NUMBERS_TYPE='3'
+and bk.BILL_DATE like '{$this->JPK['MONTH']}%'
+and bkp.TYP_KOREKTY IS NOT NULL
+and bu.BILLING_OWNER='{$this->BO['ID']}'
+order by bk.BILL_DATE,bn.ID
+EOT;
+
+		$xmlVAT = array(
+			'ZW' => array('netto' => 'K_10', 'vat' => ''),
+			'0' => array('netto' => 'K_13', 'vat' => ''),
+			'7' => array('netto' => 'K_17', 'vat' => 'K_18'),
+			'8' => array('netto' => 'K_17', 'vat' => 'K_18'),
+			'22' => array('netto' => 'K_19', 'vat' => 'K_20'),
+			'23' => array('netto' => 'K_19', 'vat' => 'K_20')
+		);
+
+		try {
+			if (DB::getPDO(931)->fetchValue("select sum(c) from (select count(*) as c from BILLS_FVAT where OPEN='y' union select count(*) as c from BILLS_KORV where OPEN='y') as c;")) {
+				throw new Exception("wykryto niezamknięte faktury lub korekty faktur");
+			}
+
+			$xml = new SimpleXMLElement($xmlSchema);
+			$ns = $ns = $xml->getNamespaces(true);
+
+			$xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE'];
+			$xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
+			$xml->Naglowek->DataOd = $this->JPK['MONTH'] . "-01";
+			$xml->Naglowek->DataDo = date("Y-m-d", strtotime($xml->Naglowek->DataOd . "+ 1 month - 1 day"));
+			if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego");
+			if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP = $this->BO['nip'])) throw new Exception("blędne dane podmiotu - brak NIP");
+			if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
+			if ($this->BO['name2']) $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa .= " " . $this->BO['name2'];
+			if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON = $this->BO['regon'])) unset($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON);
+			if (!($xml->Podmiot1->AdresPodmiotu->KodKraju = $this->BO['kodKraju'])) throw new Exception("blędne dane podmiotu - brak kodu kraju");
+			if (!($xml->Podmiot1->AdresPodmiotu->Wojewodztwo = $this->BO['wojewodztwo'])) unset($xml->Podmiot1->AdresPodmiotu->Wojewodztwo);
+			if (!($xml->Podmiot1->AdresPodmiotu->Powiat = $this->BO['powiat'])) unset($xml->Podmiot1->AdresPodmiotu->Powiat);
+			if (!($xml->Podmiot1->AdresPodmiotu->Gmina = $this->BO['gmina'])) unset($xml->Podmiot1->AdresPodmiotu->Gmina);
+			if (!($xml->Podmiot1->AdresPodmiotu->Ulica = $this->BO['ulica'])) unset($xml->Podmiot1->AdresPodmiotu->Ulica);
+			if (!($xml->Podmiot1->AdresPodmiotu->NrDomu = $this->BO['numer_dom'])) unset($xml->Podmiot1->AdresPodmiotu->NrDomu);
+			if (!($xml->Podmiot1->AdresPodmiotu->NrLokalu = $this->BO['numer_pos'])) unset($xml->Podmiot1->AdresPodmiotu->NrLokalu);
+			if (!($xml->Podmiot1->AdresPodmiotu->Miejscowosc = $this->BO['miasto'])) throw new Exception("blędne dane podmiotu - brak nazwy miejscowości");
+			if (!($xml->Podmiot1->AdresPodmiotu->KodPocztowy = $this->BO['kod'])) unset($xml->Podmiot1->AdresPodmiotu->KodPocztowy);
+			if (!($xml->Podmiot1->AdresPodmiotu->Poczta = $this->BO['poczta'])) unset($xml->Podmiot1->AdresPodmiotu->Poczta);
+
+			$data = array();
+			$allVAT = 0;
+
+			$result = DB::getPDO(931)->fetchall($queryFVAT);
+			foreach ($result as $row) {
+				$data[$row['BN_ID']][0]['NrKontrahenta'] = $row['NrKontrahenta'];
+				$data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
+				$data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
+				$data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
+				$data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
+				if (!in_array($row['VAT_NAME'],array_keys($xmlVAT))) throw new Exception("Problem ze stawką VAT (1)");
+				$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['netto']] += $row['Netto'];
+				if ($row['VAT']) {
+					if (!$xmlVAT[$row['VAT_NAME']]['vat']) throw new Exception("Problem ze stawką VAT (2)");
+					$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += $row['VAT'];
+					$allVAT += $row['VAT'];
+				}
+			}
+
+			$result = DB::getPDO(931)->fetchall($queryKORV);
+			foreach ($result as $row) {
+				$data[$row['BN_ID']][0]['NrKontrahenta'] = $row['NrKontrahenta'];
+				$data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
+				$data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
+				$data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
+				$data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
+				$data[$row['BN_ID']][0]['DataSprzedazy'] = $row['DataSprzedazy'];
+				if (!(in_array($row['VAT_NAME'], array_keys($xmlVAT)) && in_array($row['N_VAT_NAME'], array_keys($xmlVAT)))) throw new Exception("Problem ze stawką VAT (1)");
+				if (($row['VAT'] && !($xmlVAT[$row['VAT_NAME']]['vat'])) || ($row['N_VAT'] && !($xmlVAT[$row['N_VAT_NAME']]['vat']))) throw new Exception("Problem ze stawką VAT (2)");
+				if ($row['VAT_NAME'] == $row['N_VAT_NAME']) {
+					$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['netto']] += round($row['AMMOUNT']*$row['PRICE'],2);
+					if ($row['VAT']) {
+						$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
+						$allVAT += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
+					}
+				} else {
+					$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['netto']] += round($row['N_AMMOUNT']*$row['N_PRICE'],2) + round($row['AMMOUNT']*$row['PRICE'],2);
+					$data[$row['BN_ID']][1][$xmlVAT[$row['N_VAT_NAME']]['netto']] -= round($row['N_AMMOUNT']*$row['N_PRICE'],2);
+					if ($row['VAT']) {
+						$data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2)
+							+ round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
+						$allVAT += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2) + round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
+					}
+					if ($row['N_VAT']) {
+						$data[$row['BN_ID']][1][$xmlVAT[$row['N_VAT_NAME']]['vat']] -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2);
+						$allVAT -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2);
+					}
+				}
+			}
+
+			ksort($data);
+
+			$i = 0;
+			foreach ($data as $pos) {
+				$x = $xml->addChild('SprzedazWiersz');
+				$x->addAttribute('typ', 'G');
+				$x->addChild('LpSprzedazy', ++$i);
+				ksort($pos[1]);
+				foreach ($pos as $subpos) foreach ($subpos as $key => $value) $x->addChild($key, $value);
+			}
+
+			$xml->SprzedazCtrl->LiczbaWierszySprzedazy = count($data);
+			$xml->SprzedazCtrl->PodatekNalezny = $allVAT;
+
+			$this->validateJPK_VAT($xml);
+			if ($this->JPK['IN_INSERT']) $info = "Zaimportowano dane z Insert i L1";
+			else $info = "Zaimportowano dane z L1";
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS_INFO = $info;
+			$sqlObj->IN_L1 = $xml->asXml();
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
+			$this->handleAuth();
+			$this->edit();
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', "Błąd w trakcie importu danych z L1 ({$e->getMessage()})");
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function delete_l1_jpk() {
+		try {
+			$info = "Usunięto dane z L1";
+			if ($this->JPK['IN_INSERT']) $info .= " (pozostawiono dane z Insert)";
+
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS_INFO = $info;
+			$sqlObj->IN_L1 = null;
+			$sqlObj->OUT_MERGED = null;
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
+			$this->handleAuth();
+			$this->edit();
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function generate_merged_jpk() {
+
+		$xmlSchema = <<<EOT
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<JPK xmlns="http://jpk.mf.gov.pl/wzor/2016/10/26/10261/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+</JPK>
+EOT;
+
+		function xml_append(SimpleXMLElement $to, SimpleXMLElement $from) {
+			$toDom = dom_import_simplexml($to);
+			$fromDom = dom_import_simplexml($from);
+			$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
+		}
+
+		try {
+			if (!($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'])) throw new Exception("Błąd danych");
+
+			$xmlInsert = simplexml_load_string($this->JPK['IN_INSERT']);
+			$xmlL1 = simplexml_load_string($this->JPK['IN_L1']);
+			$xml = simplexml_load_string($xmlSchema);
+
+			switch (V::get('SRC_PODMIOT','',$_POST)) {
+				case "Insert":
+					xml_append($xml, $xmlInsert->Naglowek);
+					xml_append($xml, $xmlInsert->Podmiot1);
+					break;
+				case "L1":
+					xml_append($xml, $xmlL1->Naglowek);
+					xml_append($xml, $xmlL1->Podmiot1);
+					break;
+				default:
+					throw new Exception("Błąd formularza");
+			}
+
+			$xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
+
+			$i = 0;
+			foreach ($xmlInsert->SprzedazWiersz as $sprzedazWiersz) {
+				$sprzedazWiersz->LpSprzedazy = ++$i;
+				xml_append($xml, $sprzedazWiersz);
+			}
+			foreach ($xmlL1->SprzedazWiersz as $sprzedazWiersz) {
+				$sprzedazWiersz->LpSprzedazy = ++$i;
+				xml_append($xml, $sprzedazWiersz);
+			}
+			$xml->addChild("SprzedazCtrl");
+
+			$i = 0;
+			foreach ($xmlInsert->ZakupWiersz as $zakupWiersz) {
+				$zakupWiersz->LpZakupu = ++$i;
+				xml_append($xml, $zakupWiersz);
+			}
+			foreach ($xmlL1->ZakupWiersz as $zakupWiersz) {
+				$zakupWiersz->LpZakupu = ++$i;
+				xml_append($xml, $zakupWiersz);
+			}
+			$xml->addChild("ZakupCtrl");
+
+			$sumaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
+			$xml->SprzedazCtrl->LiczbaWierszySprzedazy = $sumaryJPK_VAT['LiczbaWierszySprzedazy'];
+			$xml->SprzedazCtrl->PodatekNalezny = $sumaryJPK_VAT['PodatekNalezny'];
+			$xml->ZakupCtrl->LiczbaWierszyZakupow = $sumaryJPK_VAT['LiczbaWierszyZakupow'];
+			$xml->ZakupCtrl->PodatekNaliczony = $sumaryJPK_VAT['PodatekNaliczony'];
+			$this->validateJPK_VAT($xml);
+
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS_INFO = "Wygenerowano wynikowy plik JPK";
+			$sqlObj->OUT_MERGED = $xml->asXml();
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
+			$this->handleAuth();
+			$this->edit();
+
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function close_jpk() {
+		try {
+			$sqlObj = new stdClass();
+			$sqlObj->ID = $this->JPK['ID'];
+			$sqlObj->A_STATUS = 'OFF_HARD';
+			$sqlObj->A_STATUS_INFO = "Zamknięto deklarację JPK";
+			if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
+			$this->handleAuth();
+			$this->show();
+		} catch (Exception $e) {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', $e->getMessage());
+?>
+<div class="container" style="text-align:center">
+  <form method="post" action="<?php echo $this->LAST_REFERER?>">
+    <input type="hidden" name="REFERER" value="<?php echo $this->REFERER?>"/>
+    <button type="submit" class="btn btn-primary">Powrót</button>
+  </form>
+</div>
+<?php
+			SE_Layout::dol();
+		}
+	}
+
+	private function reinitialize() {
+		$sqlObj = new stdClass();
+		$sqlObj->ID = $this->JPK['ID'];
+		$sqlObj->A_STATUS = 'WAITING';
+		$sqlObj->A_STATUS_INFO = "Oczekuje na inicjalizację";
+		$sqlObj->MONTH = "NULL";
+		$sqlObj->PURPOSE = "NULL";
+		DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
+		$this->initialize();
+}
+
+	public function defaultAction() {
+		switch ($this->JPK['A_STATUS']) {
+			case "WAITING":
+				$this->initialize();
+				break;
+			case "NORMAL":
+				$this->edit();
+				break;
+			case "OFF_HARD":
+				$this->show();
+				break;
+			default:
+				SE_Layout::alert('danger', "Błędny status rekordu.");
+		}
+	}
+
+	public function reinstallAction() {
+		$this->reinstall();
+		die('OK');
+	}
+
+	public function reinstall() {
+		$sqlList = array();
+/*		$sqlList['InstallLayerTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_LAYERS` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `the_geom` polygon NOT NULL,
+  `ID_PROJECT` int(11) NOT NULL,
+  `LAYER_NAME` varchar(100) NOT NULL,
+  `LAYER_TYPE` enum('GeoTIFF','QGIS') NOT NULL DEFAULT 'GeoTIFF',
+  `OLD_LAYER_TYPE` enum('GeoTIFF','QGIS') NOT NULL,
+  `LAYER_DESC` text NOT NULL,
+  `ID_WMS_MAPS` int(11) NOT NULL,
+  `OLD_ID_WMS_MAPS` int(11) NOT NULL,
+  `FILE_NAME` varchar(255) NOT NULL,
+  `FILE_STATUS` enum('NONE','TO_GENERATE','IN_PROGRESS','GENERATED','ERROR') NOT NULL DEFAULT 'NONE',
+  `FILE_STATUS_INFO` varchar(255) NOT NULL,
+  `EPSG` int(11) NOT NULL,
+  `EXTENT` varchar(100) NOT NULL,
+  `MAP_STATUS` enum('ACTIVE','INACTIVE') NOT NULL DEFAULT 'INACTIVE',
+  `FILE_MD5` varchar(32) NOT NULL,
+  `A_RECORD_CREATE_DATE` datetime NOT NULL,
+  `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL,
+  `A_RECORD_UPDATE_DATE` varchar(18) NOT NULL,
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL,
+  `L_APPOITMENT_DATE` datetime NOT NULL,
+  `L_APPOITMENT_USER` varchar(40) NOT NULL,
+  `L_APPOITMENT_PERIOD` varchar(30) NOT NULL,
+  `L_APPOITMENT_INFO` varchar(200) NOT NULL,
+  `L_APPOITMENT_TYPE` enum('','ARRANGED','TO_ARRANGE','CANCELLED','TO_CANCEL','RELATE','WAIT') NOT NULL,
+  `A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') NOT NULL,
+  `A_PROBLEM_DESC` varchar(200) NOT NULL,
+  `A_PROBLEM_DATE` datetime NOT NULL,
+  `A_STATUS` enum('DELETED','MONITOR','NORMAL','OFF_HARD','OFF_SOFT','WAITING','WARNING') NOT NULL DEFAULT 'WAITING',
+  `A_STATUS_INFO` varchar(100) NOT NULL,
+  `A_STATUS_LASTCHANGE_DATE` datetime NOT NULL,
+  `A_ADM_COMPANY` varchar(100) NOT NULL,
+  `A_CLASSIFIED` varchar(100) NOT NULL,
+  `SYNC_SQIX_STATUS` varchar(100) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+SQL;
+
+                $sqlList['InstallLayerHistTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_LAYERS_HIST` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `ID_USERS2` int(11) NOT NULL,
+  `the_geom` text,
+  `ID_PROJECT` varchar(20) DEFAULT 'N/S;',
+  `LAYER_NAME` varchar(100) DEFAULT 'N/S;',
+  `LAYER_TYPE` varchar(10) DEFAULT 'N/S;',
+  `OLD_LAYER_TYPE` varchar(10) DEFAULT 'N/S;',
+  `LAYER_DESC` varchar(10000) DEFAULT 'N/S;',
+  `ID_WMS_MAPS` varchar(20) DEFAULT 'N/S;',
+  `OLD_ID_WMS_MAPS` varchar(20) DEFAULT 'N/S;',
+  `FILE_NAME` varchar(255) DEFAULT 'N/S;',
+  `FILE_STATUS` varchar(20) DEFAULT 'N/S;',
+  `FILE_STATUS_INFO` varchar(255) DEFAULT 'N/S;',
+  `EPSG` varchar(10) DEFAULT 'N/S;',
+  `EXTENT` varchar(100) DEFAULT 'N/S;',
+  `MAP_STATUS` varchar(20) DEFAULT 'N/S;',
+  `FILE_MD5` varchar(32) DEFAULT 'N/S;',
+  `A_RECORD_CREATE_DATE` varchar(30) DEFAULT 'N/S;',
+  `A_RECORD_CREATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_DATE` varchar(18) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_DATE` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_USER` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_PERIOD` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_INFO` varchar(200) DEFAULT 'N/S;',
+  `L_APPOITMENT_TYPE` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM_DESC` varchar(200) DEFAULT 'N/S;',
+  `A_PROBLEM_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS_INFO` varchar(100) DEFAULT 'N/S;',
+  `A_STATUS_LASTCHANGE_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_ADM_COMPANY` varchar(100) DEFAULT 'N/S;',
+  `A_CLASSIFIED` varchar(100) DEFAULT 'N/S;',
+  `SYNC_SQIX_STATUS` varchar(100) DEFAULT 'N/S;',
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+SQL;
+
+		$sqlList['InstallMapTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_MAPS` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `MAP_NAME` varchar(100) NOT NULL,
+  `MAP_DESC` text NOT NULL,
+  `MAP_STATUS` enum('NONE','TO_GENERATE','IN_PROGRESS','GENERATED','ERROR') NOT NULL DEFAULT 'NONE',
+  `MAP_STATUS_INFO` varchar(255) NOT NULL,
+  `MAP_URL` varchar(100) NOT NULL,
+  `MAP_FILE` varchar(100) NOT NULL,
+  `A_RECORD_CREATE_DATE` datetime NOT NULL,
+  `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL,
+  `A_RECORD_UPDATE_DATE` varchar(18) NOT NULL,
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL,
+  `L_APPOITMENT_DATE` datetime NOT NULL,
+  `L_APPOITMENT_USER` varchar(40) NOT NULL,
+  `L_APPOITMENT_PERIOD` varchar(30) NOT NULL,
+  `L_APPOITMENT_INFO` varchar(200) NOT NULL,
+  `L_APPOITMENT_TYPE` enum('','ARRANGED','TO_ARRANGE','CANCELLED','TO_CANCEL','RELATE','WAIT') NOT NULL,
+  `A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') NOT NULL,
+  `A_PROBLEM_DESC` varchar(200) NOT NULL,
+  `A_PROBLEM_DATE` datetime NOT NULL,
+  `A_STATUS` enum('DELETED','MONITOR','NORMAL','OFF_HARD','OFF_SOFT','WAITING','WARNING') NOT NULL DEFAULT 'WAITING',
+  `A_STATUS_INFO` varchar(100) NOT NULL,
+  `A_STATUS_LASTCHANGE_DATE` datetime NOT NULL,
+  `A_ADM_COMPANY` varchar(100) NOT NULL,
+  `A_CLASSIFIED` varchar(100) NOT NULL,
+  `SYNC_SQIX_STATUS` varchar(100) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+SQL;
+
+		$sqlList['InstallMapHistTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_MAPS_HIST` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `ID_USERS2` int(11) NOT NULL,
+  `MAP_NAME` varchar(100) DEFAULT 'N/S;',
+  `MAP_DESC` varchar(10000) NOT NULL DEFAULT 'N/S;',
+  `MAP_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
+  `MAP_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
+  `MAP_URL` varchar(100) NOT NULL DEFAULT 'N/S;',
+  `MAP_FILE` varchar(100) NOT NULL DEFAULT 'N/S;',
+  `A_RECORD_CREATE_DATE` varchar(30) DEFAULT 'N/S;',
+  `A_RECORD_CREATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_DATE` varchar(18) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_DATE` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_USER` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_PERIOD` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_INFO` varchar(200) DEFAULT 'N/S;',
+  `L_APPOITMENT_TYPE` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM_DESC` varchar(200) DEFAULT 'N/S;',
+  `A_PROBLEM_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS_INFO` varchar(100) DEFAULT 'N/S;',
+  `A_STATUS_LASTCHANGE_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_ADM_COMPANY` varchar(100) DEFAULT 'N/S;',
+  `A_CLASSIFIED` varchar(100) DEFAULT 'N/S;',
+  `SYNC_SQIX_STATUS` varchar(100) DEFAULT 'N/S;',
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+SQL;
+*/
+		$db = DB::getDB();
+		if ($db->has_errors()) {
+			throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
+		}
+		foreach ($sqlList as $sqlName => $sql) {
+			$res = $db->query($sql);
+			if ($db->has_errors()) {
+				throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
+			}
+		}
+	}
+
+
+}