Prechádzať zdrojové kódy

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

Piotr Labudda 7 rokov pred
rodič
commit
b170fef5b7

+ 9 - 0
SE/se-lib/Config.php

@@ -428,6 +428,15 @@ class Config {
 				'DEST_FOLDER_FORMAT' => "BI_audit_BENFORD.<VARNAME1>",
 				'DEST_FOLDER_VARNAME1' => "ID",
 			],
+			'BI_audit_VALIDATE_COLUMN' => [
+				'mount_point' => "BI_audit_VALIDATE",
+				'share_point' => "BI_audit_VALIDATE",
+				'www_share_point' => "BI_audit_VALIDATE",
+				'LOOKAT_FOLDER_LOOK_GLOB' => "BI_audit_VALIDATE.<VARNAME>",
+				'LOOKAT_FOLDER_VARNAME' => "ID",
+				'DEST_FOLDER_FORMAT' => "BI_audit_VALIDATE.<VARNAME1>",
+				'DEST_FOLDER_VARNAME1' => "ID",
+			],
 		];
 
 		return ('inc' == $outputFormat)

+ 220 - 22
SE/se-lib/Route/UrlAction/BiAuditGenerate.php

@@ -473,6 +473,35 @@ function validate() {
 <?php
 	}
 
+	private function showPowiazania_progress() {
+?>
+<div class="container" style="margin-top:20px">
+  <legend>
+    Postęp generowania raportu nr <?=$this->powiazanie['ID']?>
+  </legend>
+  Panel w przygotowaniu
+<?php
+		$action = V::get('action', '', $_POST);
+		switch ($action) {
+			case "abort":
+				$powiazaniaDirLocation = self::getMainDirectory();
+				$tasksDirLocation = $powiazaniaDirLocation . "/.tasks";
+				$abortFile = "{$tasksDirLocation}/generatePowiazania-{$this->powiazanie['ID']}.abort";
+				touch($abortFile);
+?>
+  <h4>Zlecono przerwanie badania - odczekaj kilka minut</h4>
+<?php
+				break;
+			default:
+?>
+  <form method="post">
+    <button type="submit" name="action" value="abort">Przerwij badanie</button>
+  </form>
+</div>
+<?php
+		}
+	}
+
 	private function powiazania() {
 		try {
 			if (!$this->SOURCE) throw new Exception("Błąd danych");
@@ -486,6 +515,9 @@ function validate() {
 						case "NONE":
 							$this->initializePowiazania();
 							break;
+						case "IN_PROGRESS":
+							$this->showPowiazania_progress();
+							break;
 						case "GENERATED":
 							$this->showPowiazania();
 							break;
@@ -1103,6 +1135,18 @@ function validateCompany(source) {
 		}
 	}
 
+	private static function getNamespace($table, $field = null) {
+		if ($field === null) return "default_db__x3A__{$table}";
+		return "default_db__x3A__{$table}:{$field}";
+	}
+
+	private static function arrayWithNamespace($table, $array) {
+		$keys = array_map(function($key) use ($table) {
+			return self::getNamespace($table, $key);
+		}, array_keys($array));
+		return array_combine($keys, $array);
+	}
+
 	private function benford_getDetails($a = null, $b = null) {
                 try {
 			if (!($benford = V::get('benford', '', $_SESSION))) throw new Exception("Nieznany błąd wewnętrzny #1");
@@ -1417,17 +1461,6 @@ function toggleCheckSecond(check) {
 	}
 
 	private function benford_generate() {
-		$namespace = function($table, $field = null) {
-			if ($field === null) return "default_db__x3A__{$table}";
-			return "default_db__x3A__{$table}:{$field}";
-		};
-		$arrayWithNamespace = function($table, $array) use ($namespace) {
-			$keys = array_map(function($key) use ($table, $namespace) {
-				return $namespace($table, $key);
-			}, array_keys($array));
-			return array_combine($keys, $array);
-		};
-
 		$benfordId = null;
 		try {
 			$benford = @unserialize(@gzuncompress(V::get('benford', '', $_SESSION)[$this->SOURCE['TABLE']]['data']));
@@ -1463,10 +1496,10 @@ function toggleCheckSecond(check) {
 				'xmlns' => 'http://www.opengis.net/wfs',
 				'xmlns:system_cache__dita' => 'http://biuro.biall-net.pl/xmlschema_procesy5/default_db_xml_cache/dita.xsd',
 				'xmlns:p5' => 'https://biuro.biall-net.pl/wfs',
-				'xmlns:'.$namespace($mainTable) => 'https://biuro.biall-net.pl/wfs',
-				'xmlns:'.$namespace($this->SOURCE['TABLE']) => 'https://biuro.biall-net.pl/wfs'
+				'xmlns:'.self::getNamespace($mainTable) => 'https://biuro.biall-net.pl/wfs',
+				'xmlns:'.self::getNamespace($this->SOURCE['TABLE']) => 'https://biuro.biall-net.pl/wfs'
 			];
-			$array[$namespace($mainTable, $mainTable)] = array_merge(['@attributes' => ['fid' => "{$mainTable}.{$benfordId}", 'p5:primaryKey' => $benfordId]], $arrayWithNamespace($mainTable, array_merge(['ID' => $benfordId], $sqlArr)));
+			$array[self::getNamespace($mainTable, $mainTable)] = array_merge(['@attributes' => ['fid' => "{$mainTable}.{$benfordId}", 'p5:primaryKey' => $benfordId]], self::arrayWithNamespace($mainTable, array_merge(['ID' => $benfordId], $sqlArr)));
 			$checked = [
 				'firstStep' => V::get('checkFirstStep', [], $_POST),
 				'secondStep' => V::get('checkSecondStep', [], $_POST),
@@ -1484,7 +1517,7 @@ function toggleCheckSecond(check) {
 					'deviation' => (double) round($va['value'] / $va['norm'] - 1, 5),
 					'correct' => $va['correct'] ? 'true' : 'false',
 				];
-				if ($array[$namespace($mainTable, $mainTable)][$namespace($mainTable, 'step')] == 'second' && (!$va['correct'])) {
+				if ($array[self::getNamespace($mainTable, $mainTable)][self::getNamespace($mainTable, 'step')] == 'second' && (!$va['correct'])) {
 					$secondStep = [];
 					for ($kb = 0; $kb <= 9; $kb++) {
 						if (!isset($benford['secondStep'][$ka][$kb])) $vb = ['count' => 0, 'value' => 0, 'correct' => true];
@@ -1503,9 +1536,9 @@ function toggleCheckSecond(check) {
 								DB::getPDO()->insert($refTable, ['PRIMARY_KEY' => $benfordId, 'REMOTE_PRIMARY_KEY' => $id]);
 								$object = DB::getPDO()->fetchFirst("select * from `{$this->SOURCE['TABLE']}` where `ID` = " . DB::getPDO()->quote($id));
 								if (!$object) continue;
-								$objects[] = array_merge(['@attributes' => ['fid' => "{$this->SOURCE['TABLE']}.{$id}", 'p5:primaryKey' => $id]], $arrayWithNamespace($this->SOURCE['TABLE'], $object));
+								$objects[] = array_merge(['@attributes' => ['fid' => "{$this->SOURCE['TABLE']}.{$id}", 'p5:primaryKey' => $id]], self::arrayWithNamespace($this->SOURCE['TABLE'], $object));
 							}
-							$_secondStep[$namespace($this->SOURCE['TABLE'], $this->SOURCE['TABLE'])][] = $objects;
+							$_secondStep[self::getNamespace($this->SOURCE['TABLE'], $this->SOURCE['TABLE'])][] = $objects;
 						}
 						$secondStep[] = $_secondStep;
 					}
@@ -1516,13 +1549,13 @@ function toggleCheckSecond(check) {
 						DB::getPDO()->insert($refTable, ['PRIMARY_KEY' => $benfordId, 'REMOTE_PRIMARY_KEY' => $id]);
 						$object = DB::getPDO()->fetchFirst("select * from `{$this->SOURCE['TABLE']}` where `ID` = " . DB::getPDO()->quote($id));
 						if (!$object) continue;
-						$objects[] = array_merge(['@attributes' => ['fid' => "{$this->SOURCE['TABLE']}.{$id}", 'p5:primaryKey' => $id]], $arrayWithNamespace($this->SOURCE['TABLE'], $object));
+						$objects[] = array_merge(['@attributes' => ['fid' => "{$this->SOURCE['TABLE']}.{$id}", 'p5:primaryKey' => $id]], self::arrayWithNamespace($this->SOURCE['TABLE'], $object));
 					}
-					$_firstStep[$namespace($this->SOURCE['TABLE'], $this->SOURCE['TABLE'])][] = $objects;
+					$_firstStep[self::getNamespace($this->SOURCE['TABLE'], $this->SOURCE['TABLE'])][] = $objects;
 				}
 				$firstStep[] = $_firstStep;
 			}
-			$array[$namespace($mainTable, $mainTable)]['firstStep'] = $firstStep;
+			$array[self::getNamespace($mainTable, $mainTable)]['firstStep'] = $firstStep;
 
 			$xml = V::arrayToXML($array, true, $root);
 			file_put_contents($dir . DIRECTORY_SEPARATOR . "{$mainTable}_{$benfordId}.xml", $xml);
@@ -1532,7 +1565,6 @@ function toggleCheckSecond(check) {
 			SE_Layout::alert('danger', $e->getMessage());
 		}
 ?>
-<pre><?//=htmlspecialchars($xml)?></pre>
 <br><br>
 <div style="text-align:center">
   <a href="<?=$this->REFERER?>" class="btn btn-default" style="width: 80px;">Powrót</a>
@@ -1560,6 +1592,163 @@ function toggleCheckSecond(check) {
 		}
 	}
 
+	private function validate_form() {
+		if (!($namespace = V::get('_fromNamespace', '', $_GET))) throw new Exception("Błąd formularza");
+
+		Lib::loadClass('FeatureAttrSelected');
+		$count = FeatureAttrSelected::getTotalSelected($namespace);
+		$selectedTable = FeatureAttrSelected::getAttributeTableName($namespace, User::getID());
+		$query = "select `t`.`ID` from `{$this->SOURCE['TABLE']}` `t` join `{$selectedTable}` `s` on `t`.`ID` = `s`.`primaryKey` order by `s`.`primaryKey`";
+		$values = [];
+		try {
+			$result = DB::getPDO()->fetchAll($query);
+			$values = array_map('reset', $result);
+		} catch (Exception $e) {
+			throw new Exception("Błąd zapytania SQL ({$e->getMessage()})");
+		}
+		if (!$values) throw new Exception("Nie wybrano żadnych obiektów lub wszystkie wybrane obiekty mają zerową wartość");
+		$_SESSION['validate'][$this->SOURCE['TABLE']] = gzcompress(serialize($values));
+?>                              
+<div class="container" style="margin-top:20px">
+  <form method="post">  
+    <legend>
+      Analiza błędów
+      <span class="pull-right">Tabela: <?=$this->SOURCE['TABLE']?></span>
+    </legend>           
+    <div class="form-group">
+      <div class="col-sm-12">
+        <h5>Liczba wybranych obiektów: <?=count($values)?></h5>
+      </div>
+    </div>
+    <div class="form-group">
+      <div class="col-sm-12">
+        <center>
+          <h3>Generowanie raportu analizy błędów</h3>
+          <table>
+            <tr>
+              <td><input type="text" class="form-control" name="L_APPOITMENT_INFO" title="Tytuł raportu" placeholder="Tytuł raportu" required/ size="50"></td>
+              <td>&nbsp;&nbsp;</td>
+              <td><button type="submit" class="btn btn-primary" name="action" value="generate" style="width: 80px;">Generuj</button></td>
+            </tr>
+          </table>
+        </center>
+        <br/><br/>
+      </div>
+    </div>
+  </form>
+</div>
+<?php
+	}
+
+        
+	private function validate_generate() {
+		$validateId = null;
+		try {
+			$validate = @unserialize(@gzuncompress(V::get('validate', '', $_SESSION)[$this->SOURCE['TABLE']]));
+			unset($_SESSION['validate'][$this->SOURCE['TABLE']]);
+			if (!$validate) {
+				$this->validate_form();
+				return;
+			}
+
+			$mainTable = 'BI_audit_VALIDATE';
+
+			if (!($refTable = BiAuditRefTables::getRefTable($mainTable, $this->SOURCE['TABLE'], false))) throw new Exception("Nie znaleziono relacji do obiektu \"{$this->SOURCE['TABLE']}\" w konfiguracji obiektu \"{$mainTable}\" - nie można wygenerować raportu.");
+
+			$sqlArr = [
+				'table' => $this->SOURCE['TABLE'],
+				'L_APPOITMENT_INFO' => V::get('L_APPOITMENT_INFO', '', $_POST),
+				'A_RECORD_CREATE_AUTHOR' => User::getName(),
+				'A_RECORD_CREATE_DATE' => date('Y-m-d-H:i'),
+			];
+			if (!($validateId = DB::getPDO()->insert($mainTable, $sqlArr))) throw new Exception("Nie wygenerowano raportu - Wystąpił nieznany błąd podczas zapisywania raportu do bazy");
+
+			$dir = self::getDirectory($mainTable, $validateId);
+			if (!file_exists($dir)) mkdir($dir, 0770, true);
+			if (!is_dir($dir)) throw new Exception("Nie wygenerowano raportu - wystąpił błąd podczas tworzenia katalogu dla rekordu");
+
+			$root = 'RelatedFeatureRoot';
+			$array = [];
+			$array['@attributes'] = [
+				'xmlns' => 'http://www.opengis.net/wfs',
+				'xmlns:system_cache__dita' => 'http://biuro.biall-net.pl/xmlschema_procesy5/default_db_xml_cache/dita.xsd',
+				'xmlns:p5' => 'https://biuro.biall-net.pl/wfs',
+				'xmlns:'.self::getNamespace($mainTable) => 'https://biuro.biall-net.pl/wfs',
+				'xmlns:'.self::getNamespace($this->SOURCE['TABLE']) => 'https://biuro.biall-net.pl/wfs',
+				'xmlns:'.self::getNamespace('BI_audit_ENERGA_RUM_KONTRAHENCI') => 'https://biuro.biall-net.pl/wfs',
+				'xmlns:'.self::getNamespace('BI_audit_ENERGA_FAKTURY') => 'https://biuro.biall-net.pl/wfs',
+			];
+			$array[self::getNamespace($mainTable, $mainTable)] = array_merge(['@attributes' => ['fid' => "{$mainTable}.{$validateId}", 'p5:primaryKey' => $validateId]], self::arrayWithNamespace($mainTable, array_merge(['ID' => $validateId], $sqlArr)));
+
+			$umowy = [];
+			$kontrahenci = [];
+			$refUmowyToKontrahenci = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_UMOWY', 'BI_audit_ENERGA_RUM_KONTRAHENCI', true);
+			$refFakturyToKontrahenci = BiAuditRefTables::getRefTable('BI_audit_ENERGA_FAKTURY', 'BI_audit_ENERGA_RUM_KONTRAHENCI', true);
+
+			foreach ($validate as $id) {
+				$object = DB::getPDO()->fetchFirst("select * from `{$this->SOURCE['TABLE']}` where `ID` = " . DB::getPDO()->quote($id));
+				if (!$object) continue;
+				DB::getPDO()->insert($refTable, ['PRIMARY_KEY' => $validateId, 'REMOTE_PRIMARY_KEY' => $id]);
+				$_umowa = array_merge(['@attributes' => ['fid' => "{$this->SOURCE['TABLE']}.{$id}", 'p5:primaryKey' => $id]], self::arrayWithNamespace($this->SOURCE['TABLE'], $object));
+				$kontrahenciId = array_map('reset', DB::getPDO()->fetchAll("select `REMOTE_PRIMARY_KEY` from `{$refUmowyToKontrahenci}` where `PRIMARY_KEY` = " . DB::getPDO()->quote($id)));
+				$_kontrahenci = [];
+				$_kontrahenciId = [];
+				foreach ($kontrahenciId as $kontrahentId) {
+					$_kontrahenciId[] = $kontrahentId;
+					if (!isset($kontrahenci[$kontrahentId])) {
+						if ($kontrahent = DB::getPDO()->fetchFirst("select * from `BI_audit_ENERGA_RUM_KONTRAHENCI` where `ID` = {$kontrahentId}")) {
+							$kontrahenci[$kontrahentId] = array_merge(['@attributes' => ['fid' => "BI_audit_ENERGA_RUM_KONTRAHENCI.{$kontrahentId}", 'p5:primaryKey' => $kontrahentId]],
+								self::arrayWithNamespace('BI_audit_ENERGA_RUM_KONTRAHENCI', $kontrahent));
+							$fakturyId = array_map('reset', DB::getPDO()->fetchAll("select `PRIMARY_KEY` from `{$refFakturyToKontrahenci}` where `REMOTE_PRIMARY_KEY` = {$kontrahentId}"));
+							$faktury = [];
+							foreach ($fakturyId as $fakturaId) {
+								if ($faktura = DB::getPDO()->fetchFirst("select * from `BI_audit_ENERGA_FAKTURY` where `ID` = {$fakturaId}")) {
+									$faktury[] = array_merge(['@attributes' => ['fid' => "BI_audit_ENERGA_FAKTURY.{$fakturaId}", 'p5:primaryKey' => $fakturaId]],
+										self::arrayWithNamespace('BI_audit_ENERGA_FAKTURY', $faktura));
+								}
+							}
+							if ($faktury) $kontrahenci[$kontrahentId][self::getNamespace('BI_audit_ENERGA_FAKTURY', 'BI_audit_ENERGA_FAKTURY')] = $faktury;
+						}
+					}
+				}
+				$_kontrahenciId = array_unique($_kontrahenciId, SORT_NUMERIC);
+				foreach ($_kontrahenciId as $kontrahentId) {
+					$_kontrahenci[] = ['@attributes' => ['xlink:href' => "https://biuro.biall-net.pl/wfs/default_db/BI_audit_ENERGA_RUM_KONTRAHENCI#BI_audit_ENERGA_RUM_KONTRAHENCI.{$kontrahentId}", 'p5:primaryKey' => $kontrahentId]];
+				}
+				$_umowa[self::getNamespace('BI_audit_ENERGA_RUM_KONTRAHENCI', 'BI_audit_ENERGA_RUM_KONTRAHENCI')] = $_kontrahenci;
+				$umowy[] = $_umowa;
+			}
+			if ($umowy) $array[self::getNamespace($mainTable, $mainTable)][self::getNamespace($this->SOURCE['TABLE'], $this->SOURCE['TABLE'])] = $umowy;
+			if ($kontrahenci) {
+				ksort($kontrahenci, SORT_NUMERIC);
+				$array[self::getNamespace($mainTable, $mainTable)][self::getNamespace('BI_audit_ENERGA_RUM_KONTRAHENCI', 'BI_audit_ENERGA_RUM_KONTRAHENCI')] = $kontrahenci;
+			}
+
+			$xml = V::arrayToXML($array, true, $root);
+			file_put_contents($dir . DIRECTORY_SEPARATOR . "{$mainTable}_{$validateId}.xml", $xml);
+			DB::getPDO()->update($mainTable, 'ID', $validateId, ['A_STATUS' => 'NORMAL', 'A_STATUS_INFO' => 'Poprawnie wygenerowano raport']);
+			SE_Layout::alert('success', "Poprawnie wygenerowano raport");
+		} catch (Exception $e) {
+			if ($validateId) DB::getPDO()->update($mainTable, 'ID', $validateId, ['A_STATUS' => 'DELETED', 'A_STATUS_INFO' => $e->getMessage()]);
+			SE_Layout::alert('danger', $e->getMessage());
+		}
+	}
+
+	private function validate() {
+		try {
+			$action = V::get('action', '', $_POST);
+			switch ($action) {
+				case "generate":
+					$this->validate_generate();
+					break;
+				default:
+					$this->validate_form();
+			}
+		} catch (Exception $e) {
+			SE_Layout::alert('danger', $e->getMessage());
+		}
+	}
+
 	public function defaultAction() {
 		$showMenu = !(V::get('_noMenu', false, $_POST));
 		if ($showMenu) {
@@ -1620,6 +1809,9 @@ function toggleCheckSecond(check) {
 						case "benford":
 							$this->benford();
 							break;
+						case "validate":
+							$this->validate();
+							break;
 						default: SE_Layout::alert('danger', 'Błąd parametru #24');
 					}
 					break;
@@ -3139,6 +3331,11 @@ class BiAuditPowiazania {
 		if (isset($args['reportsCreated'])) $this->progress['summary']['reportsCreated'] = round($this->progress['summary']['reportsCreated'] + $args['reportsCreated'], 2);
 		$this->progress['summary']['ts'] = $timestamp;
 		file_put_contents($this->progressFile, json_encode($this->progress));
+
+		if (file_exists("{$this->tasksDirLocation}/generatePowiazania-{$this->ID}.abort")) {
+			unlink("$this->tasksDirLocation}/generatePowiazania-{$this->ID}.abort");
+			self::throwException("Przerwano na żądanie użytkownika");
+		}
 	}
 
 	private static function throwException($message) {
@@ -3160,6 +3357,8 @@ class BiAuditPowiazania {
 		$result = DB::getPDO()->fetchAll($query);
 		if (!$result) self::throwException("Błąd danych");
 
+		$this->L_APPOITMENT_INFO = $result[0]['L_APPOITMENT_INFO'];
+
 		if ($this->loadResults()) {
 			$this->splitResults();
 			return;
@@ -3167,7 +3366,6 @@ class BiAuditPowiazania {
 
 		self::saveToLog("Wczytuję parametry wyszukiwania powiązań");
 		Route_UrlAction_BiAuditGenerate::deleteResultsFromDB($this->ID);
-		$this->L_APPOITMENT_INFO = $result[0]['L_APPOITMENT_INFO'];
 		$this->minDepth = (int) $result[0]['BI_analiza_minDepth'];
 		$this->maxDepth = (int) $result[0]['BI_analiza_maxDepth'];
 		$this->onlyTargets = ($result[0]['BI_analiza_onlyTargets'] != 'N');

+ 1 - 1
SE/se-lib/V.php

@@ -591,7 +591,7 @@ EOF';
 					else $child->appendChild($dom->createCDATASection($data));
 				} else $parent->appendChild($child);
 			}
-			if ($child->hasChildNodes()) $parent->appendChild($child);
+			if ($child->hasChildNodes() || $child->hasAttributes()) $parent->appendChild($child);
 		};
 
 		if (!is_array($array)) throw new Exception("First argument need to be an array");

+ 10 - 0
SE/superedit-INSTALL_SES_PROCESY_A.php

@@ -2060,6 +2060,16 @@ LOOKAT_FOLDER_VARNAME=\"ID\"
 DEST_FOLDER_FORMAT=\"BI_audit_BENFORD.<VARNAME1>\"
 DEST_FOLDER_VARNAME1=\"ID\"
 
+
+[BI_audit_VALIDATE_COLUMN]
+mount_point=\"BI_audit_VALIDATE\"
+share_point=\"BI_audit_VALIDATE\"
+www_share_point=\"BI_audit_VALIDATE\"
+LOOKAT_FOLDER_LOOK_GLOB=\"BI_audit_VALIDATE.<VARNAME>\"
+LOOKAT_FOLDER_VARNAME=\"ID\"
+DEST_FOLDER_FORMAT=\"BI_audit_VALIDATE.<VARNAME1>\"
+DEST_FOLDER_VARNAME1=\"ID\"
+
 " > /Library/Server/Web/Data/Sites/Default/SE/config/.cnf--folders-'.$SERVER_ADDRESS.'.ini.php';
 //! .config_domena_.php
 //LDAP