Procházet zdrojové kódy

Dodanie kontekstu przeglądania raportu rozkładu Benford'a

Mariusz Muszyński před 7 roky
rodič
revize
4b2ec52415
1 změnil soubory, kde provedl 209 přidání a 154 odebrání
  1. 209 154
      SE/se-lib/Route/UrlAction/BiAuditGenerate.php

+ 209 - 154
SE/se-lib/Route/UrlAction/BiAuditGenerate.php

@@ -169,128 +169,128 @@ source.form['checkAll'].checked = all;
 -->
 </script>
 <?php
-}
-
-private function initializePowiazaniaSave() {
-	$prID = V::get('prID', array(), $_POST);
-	if (!$prID) throw new Exception("Nie wybrano żadnego pracownika!");
-
-	$acl = Core_AclHelper::getAclByNamespace('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI/BI_audit_ENERGA_RUM_KONTRAHENCI');
-	$queryFeatures = $acl->buildQuery(['limit' => 0, 'cols' => ['ID']]);
-	$kontrahenci = $queryFeatures->getItems();
-
-	$acl = Core_AclHelper::getAclByNamespace('default_db/BI_audit_KW_requested_person/BI_audit_KW_requested_person');
-	$queryFeatures = $acl->buildQuery(['limit' => 0, 'cols' => ['ID']]);
-	$requestedPersons = $queryFeatures->getItems();
-
-	if (!($kontrahenci || $requestedPersons)) throw new Exception("Nie znaleziono żadnego obiektu końcowego");
-
-	$sqlUpdate = ['FILE_STATUS' => 'TO_GENERATE'];
-
-	$reloadCache = V::get('reloadCache', 'No', $_POST);
-	$reloadCacheAvailable = ['Full', 'Part', 'No'];
-	if (!in_array($reloadCache, $reloadCacheAvailable)) throw new Exception("Błąd formularza!");
-	$sqlUpdate['BI_analiza_reloadCache'] = $reloadCache;
-
-	$query = "select count(*) from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where BI_analiza_reloadCache in ('Full', 'Part')";
-	$result = DB::getPDO()->fetchValue($query);
-	if ($result) $sqlUpdate['FILE_STATUS_info'] = 'Oczekuje na odświeżenie cache (wymagane dla innego rekordu)';
-	elseif ($reloadCache != 'No') $sqlUpdate['FILE_STATUS_info'] = 'Oczekuje na odświeżenie cache';
-	else $sqlUpdate['FILE_STATUS_info'] = "Oczekuje na wygenerowanie powiązań";
-
-	if ($this->powiazanie) { // wyzwolone z poziomu tabeli BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA - aktualizujemy istniejący rekord
-		$powiazanieID = $this->powiazanie['ID'];
-	} else { // wyzwolone z poziomu tabeli BI_audit_ENERGA_PRACOWNICY - dodajemy nowy rekord
-		if (count($prID) != 1) throw new Exception("Błąd formularza!");
-		if (!($lAppoitmentInfo = V::get('info', false, $_POST))) throw new Exception("Błąd formularza!");
-		if (!($BiAnalizaMinDepth = V::get('minDepth', false, $_POST))) throw new Exception("Błąd formularza!");
-		if (!($BiAnalizaMaxDepth = V::get('maxDepth', false, $_POST))) throw new Exception("Błąd formularza!");
-		if (!($BiAnalizaOnlyTargets = V::get('onlyTargets', false, $_POST))) throw new Exception("Błąd formularza!");
-		$query = "select * from BI_audit_ENERGA_PRACOWNICY where ID='{$prID[0]}'";
-		$result = DB::getPDO()->fetchFirst($query);
-		if (!$result) throw new Exception("Błąd formularza!");
-		$sqlInsert = [
-			'L_APPOITMENT_INFO' => $lAppoitmentInfo,
-			'A_STATUS' => 'NORMAL',
-			'A_STATUS_INFO' => 'Dodane przez BiAuditGenerate z poziomu tabeli BI_audit_ENERGA_PRACOWNICY',
-			'A_ADM_COMPANY' => $result['A_ADM_COMPANY'],
-			'A_CLASSIFIED' => $result['A_CLASSIFIED'],
-			'FILE_STATUS' => 'NONE',
-			'FILE_STATUS_info' => 'Oczekuję na zdefiniowanie danych wejściowych',
-			'BI_analiza_reloadCache' => $sqlUpdate['BI_analiza_reloadCache'],
-			'BI_analiza_minDepth' => $BiAnalizaMinDepth,
-			'BI_analiza_maxDepth' => $BiAnalizaMaxDepth,
-			'BI_analiza_onlyTargets' => $BiAnalizaOnlyTargets,
-		];
-		$powiazanieID = DB::getDB()->ADD_NEW_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', (object)$sqlInsert);
-		if ($powiazanieID) SE_Layout::alert('success','Dodano rekord do wygenerowania powiązań');
-		else throw new Exception("Wystąpił nieznany błąd @initializePowiazaniaSave");
 	}
 
-	$sqlUpdate['ID'] = $powiazanieID;
+	private function initializePowiazaniaSave() {
+		$prID = V::get('prID', array(), $_POST);
+		if (!$prID) throw new Exception("Nie wybrano żadnego pracownika!");
+
+		$acl = Core_AclHelper::getAclByNamespace('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI/BI_audit_ENERGA_RUM_KONTRAHENCI');
+		$queryFeatures = $acl->buildQuery(['limit' => 0, 'cols' => ['ID']]);
+		$kontrahenci = $queryFeatures->getItems();
+
+		$acl = Core_AclHelper::getAclByNamespace('default_db/BI_audit_KW_requested_person/BI_audit_KW_requested_person');
+		$queryFeatures = $acl->buildQuery(['limit' => 0, 'cols' => ['ID']]);
+		$requestedPersons = $queryFeatures->getItems();
+
+		if (!($kontrahenci || $requestedPersons)) throw new Exception("Nie znaleziono żadnego obiektu końcowego");
+
+		$sqlUpdate = ['FILE_STATUS' => 'TO_GENERATE'];
+
+		$reloadCache = V::get('reloadCache', 'No', $_POST);
+		$reloadCacheAvailable = ['Full', 'Part', 'No'];
+		if (!in_array($reloadCache, $reloadCacheAvailable)) throw new Exception("Błąd formularza!");
+		$sqlUpdate['BI_analiza_reloadCache'] = $reloadCache;
+
+		$query = "select count(*) from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where BI_analiza_reloadCache in ('Full', 'Part')";
+		$result = DB::getPDO()->fetchValue($query);
+		if ($result) $sqlUpdate['FILE_STATUS_info'] = 'Oczekuje na odświeżenie cache (wymagane dla innego rekordu)';
+		elseif ($reloadCache != 'No') $sqlUpdate['FILE_STATUS_info'] = 'Oczekuje na odświeżenie cache';
+		else $sqlUpdate['FILE_STATUS_info'] = "Oczekuje na wygenerowanie powiązań";
+
+		if ($this->powiazanie) { // wyzwolone z poziomu tabeli BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA - aktualizujemy istniejący rekord
+			$powiazanieID = $this->powiazanie['ID'];
+		} else { // wyzwolone z poziomu tabeli BI_audit_ENERGA_PRACOWNICY - dodajemy nowy rekord
+			if (count($prID) != 1) throw new Exception("Błąd formularza!");
+			if (!($lAppoitmentInfo = V::get('info', false, $_POST))) throw new Exception("Błąd formularza!");
+			if (!($BiAnalizaMinDepth = V::get('minDepth', false, $_POST))) throw new Exception("Błąd formularza!");
+			if (!($BiAnalizaMaxDepth = V::get('maxDepth', false, $_POST))) throw new Exception("Błąd formularza!");
+			if (!($BiAnalizaOnlyTargets = V::get('onlyTargets', false, $_POST))) throw new Exception("Błąd formularza!");
+			$query = "select * from BI_audit_ENERGA_PRACOWNICY where ID='{$prID[0]}'";
+			$result = DB::getPDO()->fetchFirst($query);
+			if (!$result) throw new Exception("Błąd formularza!");
+			$sqlInsert = [
+				'L_APPOITMENT_INFO' => $lAppoitmentInfo,
+				'A_STATUS' => 'NORMAL',
+				'A_STATUS_INFO' => 'Dodane przez BiAuditGenerate z poziomu tabeli BI_audit_ENERGA_PRACOWNICY',
+				'A_ADM_COMPANY' => $result['A_ADM_COMPANY'],
+				'A_CLASSIFIED' => $result['A_CLASSIFIED'],
+				'FILE_STATUS' => 'NONE',
+				'FILE_STATUS_info' => 'Oczekuję na zdefiniowanie danych wejściowych',
+				'BI_analiza_reloadCache' => $sqlUpdate['BI_analiza_reloadCache'],
+				'BI_analiza_minDepth' => $BiAnalizaMinDepth,
+				'BI_analiza_maxDepth' => $BiAnalizaMaxDepth,
+				'BI_analiza_onlyTargets' => $BiAnalizaOnlyTargets,
+			];
+			$powiazanieID = DB::getDB()->ADD_NEW_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', (object)$sqlInsert);
+			if ($powiazanieID) SE_Layout::alert('success','Dodano rekord do wygenerowania powiązań');
+			else throw new Exception("Wystąpił nieznany błąd @initializePowiazaniaSave");
+		}
 
-	self::truncatePowiazaniaFromDB($powiazanieID);
+		$sqlUpdate['ID'] = $powiazanieID;
 
-	$refPowiazaniaToPracownicy = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_PRACOWNICY', true);
-	foreach ($prID as $v) DB::getPDO()->insert($refPowiazaniaToPracownicy, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $v]);
+		self::truncatePowiazaniaFromDB($powiazanieID);
 
-	$refPowiazaniaToKontrahenci = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_RUM_KONTRAHENCI', true);
-	foreach ($kontrahenci as $kontrahent) DB::getPDO()->insert($refPowiazaniaToKontrahenci, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $kontrahent['ID']]);
+		$refPowiazaniaToPracownicy = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_PRACOWNICY', true);
+		foreach ($prID as $v) DB::getPDO()->insert($refPowiazaniaToPracownicy, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $v]);
 
-	$refPowiazaniaToKwRequestedPreson = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_KW_requested_person', true);
-	foreach ($requestedPersons as $requestedPerson) DB::getPDO()->insert($refPowiazaniaToKwRequestedPreson, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $requestedPerson['ID']]);
+		$refPowiazaniaToKontrahenci = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_RUM_KONTRAHENCI', true);
+		foreach ($kontrahenci as $kontrahent) DB::getPDO()->insert($refPowiazaniaToKontrahenci, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $kontrahent['ID']]);
 
-	$affected = DB::getDB()->UPDATE_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $sqlUpdate);
-	if ($affected) {
-		if ($this->powiazanie) {
-			SE_Layout::alert('success','Oznaczono rekord do wygenerowania powiązań');
+		$refPowiazaniaToKwRequestedPreson = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_KW_requested_person', true);
+		foreach ($requestedPersons as $requestedPerson) DB::getPDO()->insert($refPowiazaniaToKwRequestedPreson, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $requestedPerson['ID']]);
+
+		$affected = DB::getDB()->UPDATE_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $sqlUpdate);
+		if ($affected) {
+			if ($this->powiazanie) {
+				SE_Layout::alert('success','Oznaczono rekord do wygenerowania powiązań');
 ?>
 <div class="container" style="text-align:center">
 <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
 </div>
 <?php
-		}
-	} else throw new Exception("Wystąpił nieznany błąd @initializePowiazaniaSave");
-}
+			}
+		} else throw new Exception("Wystąpił nieznany błąd @initializePowiazaniaSave");
+	}
 
-private function initializePowiazania() {
-	switch (V::get('action', '', $_POST)) {
-		case "initialize":
-			$this->initializePowiazaniaSave();
-			break;
-		default:
-			$this->initializePowiazaniaForm();
+	private function initializePowiazania() {
+		switch (V::get('action', '', $_POST)) {
+			case "initialize":
+				$this->initializePowiazaniaSave();
+				break;
+			default:
+				$this->initializePowiazaniaForm();
+		}
 	}
-}
 
-private function showPowiazania() {
+	private function showPowiazania() {
 //		echo "Statystyki znalezionych powiązań [TODO]";
-	$dir = self::getDirectory('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']);
-	$url = self::getUrl('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']);
-
-	$reports = [
-		'pdf' => [
-			'files' => glob("{$dir}/relations*.pdf"),
-			'label' => 'Raporty PDF:<br/>&nbsp;',
-			'button' => 'Pokaż raport PDF',
-			'regex' => "/^relations(-{$this->powiazanie['ID']})?_([[:digit:]]+)\.pdf$/",
-			'parentDir' => false,
-		],
-		'html' => [
-			'files' => glob("{$dir}/html*/relations-{$this->powiazanie['ID']}*.html"),
-			'label' => 'Raporty HTML<br/>do przeglądania:',
-			'button' => 'Pokaż raport HTML',
-			'regex' => "/^relations-({$this->powiazanie['ID']})_([[:digit:]]+)\.html$/",
-			'parentDir' => true,
-		],
-		'htmlZip' => [
-			'files' => glob("{$dir}/html*.zip"),
-			'label' => 'Raporty HTML<br/>do pobrania:',
-			'button' => 'Pobież raport HTML',
-			'regex' => "/^html(-{$this->powiazanie['ID']})?_([[:digit:]]+)\.zip$/",
-			'parentDir' => false,
-		],
-	];
+		$dir = self::getDirectory('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']);
+		$url = self::getUrl('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']);
+
+		$reports = [
+			'pdf' => [
+				'files' => glob("{$dir}/relations*.pdf"),
+				'label' => 'Raporty PDF:<br/>&nbsp;',
+				'button' => 'Pokaż raport PDF',
+				'regex' => "/^relations(-{$this->powiazanie['ID']})?_([[:digit:]]+)\.pdf$/",
+				'parentDir' => false,
+			],
+			'html' => [
+				'files' => glob("{$dir}/html*/relations-{$this->powiazanie['ID']}*.html"),
+				'label' => 'Raporty HTML<br/>do przeglądania:',
+				'button' => 'Pokaż raport HTML',
+				'regex' => "/^relations-({$this->powiazanie['ID']})_([[:digit:]]+)\.html$/",
+				'parentDir' => true,
+			],
+			'htmlZip' => [
+				'files' => glob("{$dir}/html*.zip"),
+				'label' => 'Raporty HTML<br/>do pobrania:',
+				'button' => 'Pobież raport HTML',
+				'regex' => "/^html(-{$this->powiazanie['ID']})?_([[:digit:]]+)\.zip$/",
+				'parentDir' => false,
+			],
+		];
 ?>
 <div class="container" style="margin-top:20px">
 <legend>
@@ -298,20 +298,20 @@ Wygenerowany raport nr <?=$this->powiazanie['ID']?>
 </legend>
 <div class="form-group" style="text-align: center;">
 <?php
-	array_walk($reports, function ($report) use ($url) {
-		echo "<div class=\"col-sm-2\"><h4>{$report['label']}</h4>";
-		$hrefs = array_filter(array_map(function ($path) use ($url, $report) {
-			if (!is_file($path)) return false;
-			$file = basename($path);
-			if (preg_match($report['regex'], $file, $matches)) $i = " (" . ltrim($matches[2], '0') . ")";
-			else $i = '';
-			if ($report['parentDir']) $file = basename(dirname($path)) . "/" . $file;
-			return "<a href=\"{$url}/{$file}\" target=\"_blank\" class=\"btn btn-primary\">{$report['button']}{$i}</a>";
-		}, $report['files']));
-		if ($hrefs) echo implode('<br/><br/>', $hrefs);
-		else echo "<h5>Nie znaleziono</h5>";
-		echo "</div>\n";
-	});
+		array_walk($reports, function ($report) use ($url) {
+			echo "<div class=\"col-sm-2\"><h4>{$report['label']}</h4>";
+			$hrefs = array_filter(array_map(function ($path) use ($url, $report) {
+				if (!is_file($path)) return false;
+				$file = basename($path);
+				if (preg_match($report['regex'], $file, $matches)) $i = " (" . ltrim($matches[2], '0') . ")";
+				else $i = '';
+				if ($report['parentDir']) $file = basename(dirname($path)) . "/" . $file;
+				return "<a href=\"{$url}/{$file}\" target=\"_blank\" class=\"btn btn-primary\">{$report['button']}{$i}</a>";
+			}, $report['files']));
+			if ($hrefs) echo implode('<br/><br/>', $hrefs);
+			else echo "<h5>Nie znaleziono</h5>";
+			echo "</div>\n";
+		});
 ?>
 </div>
 <div class="form-group">
@@ -321,24 +321,24 @@ Wygenerowany raport nr <?=$this->powiazanie['ID']?>
 </div>
 </div>
 <?php
-}
+	}
 
-private function showPowiazaniaList() {
-	switch (V::get('action', '', $_POST)) {
-		case "initialize":
-			$this->initializePowiazaniaSave();
-			break;
+	private function showPowiazaniaList() {
+		switch (V::get('action', '', $_POST)) {
+			case "initialize":
+				$this->initializePowiazaniaSave();
+				break;
+		}
+		$this->showPowiazaniaListForm();
 	}
-	$this->showPowiazaniaListForm();
-}
 
-private function showPowiazaniaListForm() {
-	if (!$this->SOURCE['ID']) throw new Exception("Błąd danych");
-	elseif ($this->SOURCE['TABLE'] != 'BI_audit_ENERGA_PRACOWNICY') throw new Exception("Błąd danych");
+	private function showPowiazaniaListForm() {
+		if (!$this->SOURCE['ID']) throw new Exception("Błąd danych");
+		elseif ($this->SOURCE['TABLE'] != 'BI_audit_ENERGA_PRACOWNICY') throw new Exception("Błąd danych");
 
-	$query = "select * from `{$this->SOURCE['TABLE']}` where ID = '{$this->SOURCE['ID']}'";
-	$pracownik = DB::getPDO()->fetchFirst($query);
-	if (!$pracownik) throw new Exception("Błąd danych");
+		$query = "select * from `{$this->SOURCE['TABLE']}` where ID = '{$this->SOURCE['ID']}'";
+		$pracownik = DB::getPDO()->fetchFirst($query);
+		if (!$pracownik) throw new Exception("Błąd danych");
 ?>
 <div class="container" style="margin-top:20px">
 <legend>
@@ -365,18 +365,18 @@ Lista wygenerowanych powiązań :: <?=htmlspecialchars($pracownik['imiona'] . "
 <tbody>
 
 <?php
-	$refPowiazaniaToPracownicy = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_PRACOWNICY', true);
-	$query = "select `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.*
-from `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`
-join `{$refPowiazaniaToPracownicy}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = `{$refPowiazaniaToPracownicy}`.`PRIMARY_KEY`
-where `REMOTE_PRIMARY_KEY` = '{$this->SOURCE['ID']}'";
-	$result = DB::getPDO()->fetchAll($query);
-
-	if (!$result) echo '<tr><td align="center" colspan="9">Brak znalezionych powiązań</td></tr>';
-	else {
-		foreach ($result as $row) {
-			$query = "select count(*) from `{$refPowiazaniaToPracownicy}` where `PRIMARY_KEY` = '{$row['ID']}'";
-			$count = DB::getPDO()->fetchValue($query);
+		$refPowiazaniaToPracownicy = BiAuditRefTables::getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_PRACOWNICY', true);
+		$query = "select `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.*
+			from `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`
+			join `{$refPowiazaniaToPracownicy}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = `{$refPowiazaniaToPracownicy}`.`PRIMARY_KEY`
+			where `REMOTE_PRIMARY_KEY` = '{$this->SOURCE['ID']}'";
+		$result = DB::getPDO()->fetchAll($query);
+
+		if (!$result) echo '<tr><td align="center" colspan="9">Brak znalezionych powiązań</td></tr>';
+		else {
+			foreach ($result as $row) {
+				$query = "select count(*) from `{$refPowiazaniaToPracownicy}` where `PRIMARY_KEY` = '{$row['ID']}'";
+				$count = DB::getPDO()->fetchValue($query);
 ?>
   <tr>
     <td align="right"><?=$row['ID']?></td>
@@ -390,8 +390,8 @@ where `REMOTE_PRIMARY_KEY` = '{$this->SOURCE['ID']}'";
     <td><?=UI::hButtonPost("Pokaż w tabeli", ['class' => 'btn-info btn-xs', 'action' => "index.php?_route=ViewTableAjax&namespace=default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA&ff_ID={$row['ID']}", 'data' > ['f_ID' => $row['ID']]])?></td>
   </tr>
 <?php
+			}
 		}
-	}
 ?>
 </tbody>
 </table>
@@ -668,6 +668,9 @@ format: 'YYYY-MM-DD'
 						case "BI_audit_ENERGA_PRACOWNICY":
 							$this->showPowiazaniaList();
 							break;
+						case "BI_audit_BENFORD":
+							$this->benford_showReport();
+							break;
 						default: throw new Exception("Błąd wyzwolenia funkcji BiAuditGenerate");
 					}
 			}
@@ -1369,7 +1372,7 @@ function validateCompany(source) {
 		}
 ?>
 <div class="container" style="margin-top:20px">
-  <form method="post" onSubmit="showMsg('Proszę czekać, generuję raport...');">
+  <form method="post" onSubmit="showMsg('<center>Proszę czekać, generuję raport...<br/><br/><p class=benfordLoader></p></center>');">
     <legend>
       Analiza rozkładu Benford'a
       <span class="pull-right">Tabela: <?=$this->SOURCE['TABLE']?></span>
@@ -1486,6 +1489,9 @@ function validateCompany(source) {
 <div id="details" onClick="hideDetails();">
   <div id="detailsMsg" onClick="event.stopPropagation();"></div>
 </div>
+<div id="message">
+  <div id="messageBody" onClick="event.stopPropagation();"></div>
+</div>
 <style type="text/css">
 <!--
 #benford .step1-green,#benford .step1-red {font-weight:bold;}
@@ -1494,15 +1500,19 @@ function validateCompany(source) {
 #benford table { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}
 td {font-size: 12px;}
 #benford ::selection {background: transparent;}
-#details {display:none; position: fixed; left: 0; top: 0; width: 100%; height: 100%; text-align: center; z-index: 1000; background-color: rgba(0,0,0,0.5);}
-#details div {width: 500px; height: auto; margin: 100px auto; background: #fff; padding: 10px; text-align: center; overflow: hidden; border-radius: 5px; box-shadow: 0 0 7px 7px rgba(0,0,0,0.25);}
+#details,#message {display:none; position: fixed; left: 0; top: 0; width: 100%; height: 100%; text-align: center; z-index: 1000; background-color: rgba(0,0,0,0.5);}
+#details,#message div {width: 500px; height: auto; margin: 100px auto; background: #fff; padding: 10px; text-align: center; overflow: hidden; border-radius: 5px; box-shadow: 0 0 7px 7px rgba(0,0,0,0.25);}
+.benfordLoader {border: 4px solid #f3f3f3; border-radius: 50%; border-top: 4px solid #000000; width: 32px; height: 32px; -webkit-animation: spin 1s linear infinite; animation: spin 1s linear infinite;}
+@-webkit-keyframes spin {0% {-webkit-transform: rotate(0deg);} 100% {-webkit-transform: rotate(360deg);}}
+@keyframes spin {0% {transform: rotate(0deg);} 100% {transform: rotate(360deg);}}
 -->
 </style>
 <script language="JavaScript">
 <!--
 function showDetails(groupField, ka, kb) {
   event.stopPropagation();
-  showMsg('Proszę czekać...');
+  document.getElementById('detailsMsg').innerHTML = "<h4>Proszę czekać...</h4>";
+  document.getElementById('details').style.display = 'block';
   var post = "_noMenu=1&action=getDetails&_groupField=" + groupField + "&_ka=" + ka;
   if (kb !== null) post += "&_kb=" + kb;
   var xhttp = new XMLHttpRequest();
@@ -1521,8 +1531,9 @@ function showDetails2(node, ka, kb) {
   showDetails(groupField, ka, kb);
 }
 function showMsg(msg) {
-  document.getElementById('detailsMsg').innerHTML = "<h4>" + msg + "</h4>";
-  document.getElementById('details').style.display = 'block';
+  event.stopPropagation();
+  document.getElementById('messageBody').innerHTML = "<h4>" + msg + "</h4>";
+  document.getElementById('message').style.display = 'block';
 }
 function hideDetails() {
   document.getElementById('details').style.display = 'none';
@@ -1716,7 +1727,8 @@ function toggleCheckSecond(check) {
 			$pdf = self::antXmlToPdf($xmlFile);
 			copy($pdf, $pdfFile);
 			DB::getPDO()->update($mainTable, 'ID', $benfordId, ['A_STATUS' => 'NORMAL', 'A_STATUS_INFO' => 'Poprawnie wygenerowano raport']);
-			SE_Layout::alert('success', 'Poprawnie wygenerowano raport');
+			SE_Layout::alert('success', 'Poprawnie wygenerowano raport' .
+				'<br/><br/><a href="index.php?_route=UrlAction_BiAuditGenerate&ID_BI_audit_BENFORD=' . $benfordId . '" class="btn btn-default" style="width: 120px;">Pokaż raport</a>');
 		} catch (Exception $e) {
 			if ($benfordId) DB::getPDO()->update($mainTable, 'ID', $benfordId, ['A_STATUS' => 'DELETED', 'A_STATUS_INFO' => $e->getMessage()]);
 			SE_Layout::alert('danger', $e->getMessage());
@@ -1729,6 +1741,48 @@ function toggleCheckSecond(check) {
 <?php
 	}
 
+	private function benford_showReport() {
+		$dir = self::getDirectory('BI_audit_BENFORD', $this->SOURCE['ID']);
+		$url = self::getUrl('BI_audit_BENFORD', $this->SOURCE['ID']);
+
+		$reports = [
+			'pdf' => [
+				'files' => glob("{$dir}/BI_audit_BENFORD_{$this->SOURCE['ID']}.pdf"),
+				'label' => 'Raport PDF:<br/>&nbsp;',
+				'button' => 'Pokaż raport PDF',
+				'parentDir' => false,
+			],
+		];
+?>
+<div class="container" style="margin-top:20px">
+<legend>
+Wygenerowany raport Benford'a nr <?=$this->SOURCE['ID']?>
+</legend>
+<div class="form-group" style="text-align: center;">
+<?php
+		array_walk($reports, function ($report) use ($url) {
+			echo "<div class=\"col-sm-2\"><h4>{$report['label']}</h4>";
+			$hrefs = array_filter(array_map(function ($path) use ($url, $report) {
+				if (!is_file($path)) return false;
+				$file = basename($path);
+				if ($report['parentDir']) $file = basename(dirname($path)) . "/" . $file;
+				return "<a href=\"{$url}/{$file}\" target=\"_blank\" class=\"btn btn-primary\">{$report['button']}</a>";
+			}, $report['files']));
+			if ($hrefs) echo implode('<br/><br/>', $hrefs);
+			else echo "<h5>Nie znaleziono</h5>";
+			echo "</div>\n";
+		});
+?>
+</div>
+<div class="form-group">
+<div class="col-sm-12">
+<br/><br/><a href="<?=$this->REFERER?>" class="btn btn-default">Powrót</a>
+</div>
+</div>
+</div>
+<?php
+	}
+
 	private function benford() {
 		try {
 			$action = V::get('action', '', $_POST);
@@ -1949,6 +2003,7 @@ function toggleCheckSecond(check) {
 		elseif (($ID = V::get('ID_BI_audit_MSIG_person', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_MSIG_person';
 		elseif (($ID = V::get('ID_BI_audit_CEIDG', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_CEIDG';
 		elseif (($ID = V::get('ID_BI_audit_CEIDG_pelnomocnicy', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_CEIDG_pelnomocnicy';
+		elseif (($ID = V::get('ID_BI_audit_BENFORD', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_BENFORD';
 		if ($this->SOURCE) {
 			$this->SOURCE['ID'] = $ID;
 			$this->urlActionOnItem();