ID = $id; $uploader = new FileUploader($table.'_COLUMN', $record); $errMsg = ""; if (!$uploader->setConfig($folderConf, $errMsg)) throw new HttpException("Błąd danych konfiguracyjnych
\n{$$errMsg}", 404); $uploader->findFolder(); return $uploader->getDestLocalPath(true); } private function getUrl($table, $id) { $folderConf = FoldersConfig::getAll($table.'_COLUMN'); $record = new stdClass; $record->ID = $id; $uploader = new FileUploader($table.'_COLUMN', $record); $errMsg = ""; if (!$uploader->setConfig($folderConf, $errMsg)) throw new HttpException("Błąd danych konfiguracyjnych
\n{$$errMsg}", 404); return $uploader->getFolderWeb() . "/" . $uploader->getDestFolder(true); } private function getMainDirectory() { $folderConf = FoldersConfig::getAll('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_COLUMN'); if (!isset($folderConf['mount_point'])) throw new HttpException("Błąd danych konfiguracyjnych
\n{$errMsg}", 404); return $folderConf['mount_point']; } private function initializePowiazaniaForm() { ?>
Generowanie powiązań :: powiazanie['L_APPOITMENT_INFO']?> # powiazanie['ID']?>

Wybierz pracowników, dla których mają zostać wyszukane powiązania

buildQuery(['limit' => 0]); $pracownicy = $queryFeatures->getItems(); foreach ($pracownicy as $pracownik) { ?>
ID Imiona Nazwisko Pesel NIP Regon source
Częściowe odświeżenie wymagane w przypadku, gdy dokonano dowolnych zmian w tabelach pracowników/kontrahentów.
Pełne odświeżenie wymagane w przypadku modyfikacji baz KRS lub CEiDG (UWAGA - trwa to wiele godzin)
Anuluj
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; $this->truncatePowiazaniaFromDB($powiazanieID); $refPowiazaniaToPracownicy = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'default_db__x3A__BI_audit_ENERGA_PRACOWNICY:BI_audit_ENERGA_PRACOWNICY'); foreach ($prID as $v) DB::getPDO()->insert($refPowiazaniaToPracownicy, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $v]); $refPowiazaniaToKontrahenci = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI:BI_audit_ENERGA_RUM_KONTRAHENCI'); foreach ($kontrahenci as $kontrahent) DB::getPDO()->insert($refPowiazaniaToKontrahenci, ['PRIMARY_KEY' => $powiazanieID, 'REMOTE_PRIMARY_KEY' => $kontrahent['ID']]); $refPowiazaniaToKwRequestedPreson = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'default_db__x3A__BI_audit_KW_requested_person:BI_audit_KW_requested_person'); 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ń'); ?>
Powrót
initializePowiazaniaSave(); break; default: $this->initializePowiazaniaForm(); } } private function showPowiazania() { // echo "Statystyki znalezionych powiązań [TODO]"; $dir = $this->getDirectory('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']); $pdfFile = "{$dir}/relations.pdf"; $htmlFile = "{$dir}/html/relations-{$this->powiazanie['ID']}.html"; $htmlZipFile = "{$dir}/html.zip"; $url = $this->getUrl('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $this->powiazanie['ID']); $pdfUrl = "{$url}/relations.pdf"; $htmlUrl = "{$url}/html/relations-{$this->powiazanie['ID']}.html"; $htmlZipUrl = "{$url}/html.zip"; ?>
Wygenerowany raport nr powiazanie['ID']?>
initializePowiazaniaSave(); break; } $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"); $query = "select * from `{$this->SOURCE['TABLE']}` where ID = '{$this->SOURCE['ID']}'"; $pracownik = DB::getPDO()->fetchFirst($query); if (!$pracownik) throw new Exception("Błąd danych"); ?>
Lista wygenerowanych powiązań :: #

Lista wygenerowanych powiązań, w których znajduje się pracownik

SOURCE['ID']}'"; $result = DB::getPDO()->fetchAll($query); if (!$result) echo ''; else { foreach ($result as $row) { $query = "select count(*) from `{$refPowiazaniaToPracownicy}` where `PRIMARY_KEY` = '{$row['ID']}'"; $count = DB::getPDO()->fetchValue($query); ?>
ID Adnotacje Minimalna głębokość analizy Maksymalna głębokość analizy Powiązania tylko do celów Status raportu Status raportu - informacje Indywidualny raport
Brak znalezionych powiązań
1 ? 'Nie' : 'Tak')?> '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']]])?>

Dodaj nowe zadanie generowania powiazań dla tego pracownika

" required/>
Częściowe odświeżenie wymagane w przypadku, gdy dokonano dowolnych zmian w tabelach pracowników/kontrahentów.
Pełne odświeżenie wymagane w przypadku modyfikacji baz KRS lub CEiDG (UWAGA - trwa to wiele godzin)
Powrót
SOURCE) throw new Exception("Błąd danych"); elseif (!(isset($this->SOURCE['TABLE']) && isset($this->SOURCE['ID']))) throw new Exception("Błąd danych"); switch ($this->SOURCE['TABLE']) { case "BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA": $powiazania = DB::getPDO()->fetchall("select * from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where ID = '{$this->SOURCE['ID']}'"); if (!$powiazania) throw new Exception("Błąd danych"); $this->powiazanie = $powiazania[0]; switch ($this->powiazanie['FILE_STATUS']) { case "NONE": $this->initializePowiazania(); break; case "GENERATED": $this->showPowiazania(); break; default: throw new Exception("Błędny status rekordu"); } break; case "BI_audit_ENERGA_PRACOWNICY": $this->showPowiazaniaList(); break; case "BI_audit_KRS": $this->importKrsToPracownicySearch($this->SOURCE['ID']); break; case "BI_audit_KRS_person": $this->showKrsForKrsPerson(); break; default: throw new Exception("Błąd wyzwolenia funkcji BiAuditGenerate"); } } catch (Exception $e) { SE_Layout::alert('danger',$e->getMessage()); $_SESSION['REFERER'] = $this->REFERER; ?>
Powrót
importKrsToPracownicySearch(); break; default: $this->importKrsToPracownicyForm(); } } private function importKrsToPracownicyForm() { ?>
Importowanie podmiotów z KRS do tabel kontrahentów i pracowników

Znajdź podmiot

Powrót
'like', "krs" => '=', "nip" => '=', "regon" => '=', ]; try { $subaction = V::get('subaction', '', $_POST); switch ($subaction) { case "listKrsPerson": $krsId = V::get('krsId', 0, $_POST, int); break; case "addKrsPersonToPracownicy": $krsId = V::get('krsId', 0, $_POST, int); $personId = V::get('personId', [], $_POST); if (!$personId) throw new Exception("Błąd formularza"); $query = "insert into BI_audit_ENERGA_PRACOWNICY (source, imiona, nazwisko, pesel) select 'KRS', imiona, nazwisko, pesel from BI_audit_KRS_person where ID in (" . implode(", ", $personId) . ")"; DB::getPDO()->query($query); SE_Layout::alert('success', "Pomyślnie zaimportowano " . count($personId) . " pracownik" . ((count($personId) == 1) ? "a" : "ów")); break; case "addKrsToKontrahenci": $krsId = V::get('krsId', 0, $_POST, int); if (!$krsId) throw new Exception("Błąd formularza"); $query = "select count(*) from BI_audit_ENERGA_RUM_KONTRAHENCI kh join BI_audit_KRS krs on (kh.NIP = krs.nip or kh.REGON = krs.regon or kh.KRS = krs.krs) where krs.ID = '{$krsId}'"; $kontrahentExists = DB::getPDO()->fetchValue($query); if ($kontrahentExists) throw new Exception("Podmiot znajduje się już w tabeli kontrahentów"); $query = "insert into BI_audit_ENERGA_RUM_KONTRAHENCI (Tytul_dokumentu, Pelna_nazwa_kontrahenta, REGON, NIP, KRS) select 'ZaImportowano z KRS', nazwa, regon, nip, krs from BI_audit_KRS where ID = ".$krsId." "; DB::getPDO()->query($query); SE_Layout::alert('success', "Pomyślnie zaimportowano kontrahenta"); break; } if ($krsId) { $where = ["ID = '{$krsId}'"]; } else { $form = []; foreach ($formItems as $item => $type) { if ($param = V::get($item, '', $_POST)) { if ($type == 'like') $param = "%{$param}%"; $form[$item] = DB::getPDO()->quote($param); } } if (!$form) throw new Exception("Nie wypełniono żadnego pola wyszukiwania!"); $where = []; foreach ($form as $name => $value) $where[] = "`{$name}` {$formItems[$name]} {$value}"; } } catch (Exception $e) { SE_Layout::alert('danger', $e->getMessage()); $this->importKrsToPracownicyForm(); return; } $query = "select * from `BI_audit_KRS` where " . implode(" and ", $where) . "order by ID limit 1001"; $result = DB::getPDO()->fetchAll($query); if (count($result) == 1001) { SE_Layout::alert('danger', 'Znaleziono zbyt wiele wyników. Doprecyzuj parametry wyszukiwania.'); $this->importKrsToPracownicyForm(); return; } elseif (count($result) == 1) { $krsId = $result[0]['ID']; } ?>
Importowanie podmiotów z KRS do tabel kontrahentów i pracowników

Znalezione podmioty:

1) { ?> '; else { $lp = 1; foreach ($result as $row) { $adres = $row['A_miejscowosc']; if ($row['A_ulica']) $adres .= ", {$row['A_ulica']}"; if ($row['A_nrDomu']) { $adres .= " {$row['A_nrDomu']}"; if ($row['A_nrLokalu']) $adres .= "/{$row['A_nrLokalu']}"; } ?> 1) { ?>
Lp. Nazwa Adres KRS NIP Regon Wybierz
Nie znaleziono podmiotu
1) { ?>
Powrót

Znalezione osoby:

fetchValue($query); $refKrsToKrsPerson = ACL::getRefTable('default_db/BI_audit_KRS/BI_audit_KRS', "default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person"); $query = "select person.*, pracownicy.ID as pracownicyId from `{$refKrsToKrsPerson}` ref join `BI_audit_KRS_person` person on ref.REMOTE_PRIMARY_KEY = person.ID left join BI_audit_ENERGA_PRACOWNICY pracownicy on person.pesel = pracownicy.pesel where ref.PRIMARY_KEY = '{$krsId}'"; $result = DB::getPDO()->fetchAll($query); if (!$result) echo ''; else { $lp = 1; foreach ($result as $row) { ?> >
Lp. Nazwisko Imiona Pesel
Nie znaleziono osób powiązanych z podmiotem
/>
Powrót
SOURCE['ID']}'"; $result = DB::getPDO()->fetchFirst($query); ?>
Lista podmiotów, w których występuje
SOURCE['ID']}'"; $result = DB::getPDO()->fetchAll($query); if (!$result) echo ''; else { $lp = 1; foreach ($result as $row) { $adres = $row['A_miejscowosc']; if ($row['A_ulica']) $adres .= ", {$row['A_ulica']}"; if ($row['A_nrDomu']) { $adres .= " {$row['A_nrDomu']}"; if ($row['A_nrLokalu']) $adres .= "/{$row['A_nrLokalu']}"; } ?>
Lp. Nazwa Adres KRS NIP Regon
Nie znaleziono powiązanych podmiotów
'btn-info btn-xs', 'action' => "index.php?_route=ViewTableAjax&namespace=default_db/BI_audit_KRS/BI_audit_KRS&ff_ID={$row['ID']}", 'data' > ['f_ID' => $row['ID']]])?>
REFERER = $_SESSION['REFERER']; unset($_SESSION['REFERER']); } elseif (V::get('REFERER', '', $_POST) != '') $this->REFERER = V::get('REFERER', '', $_POST); else $this->REFERER=$_SERVER['HTTP_REFERER']; if (($ID = V::get('ID_BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA'; elseif (($ID = V::get('ID_BI_audit_ENERGA_PRACOWNICY', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_ENERGA_PRACOWNICY'; elseif (($ID = V::get('ID_BI_audit_KRS', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_KRS'; elseif (($ID = V::get('ID_BI_audit_KRS_person', 0, $_GET, 'int')) > 0) $this->SOURCE['TABLE'] = 'BI_audit_KRS_person'; if ($this->SOURCE) { $this->SOURCE['ID'] = $ID; $this->powiazania(); } elseif ($TABLE = V::get('_fromNamespace', '', $_GET)) { switch ($TABLE) { case "default_db/BI_audit_ENERGA_PRACOWNICY": $this->importKrsToPracownicy(); break; default: SE_Layout::alert('danger', 'Błąd parametru'); } } else SE_Layout::alert('danger', 'Błąd parametru'); SE_Layout::dol(); } private function getRefsTables($namespace) { try { $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($namespace, [ 'propertyName' => '*,field' ]); if (!($item['hasStruct'] && $item['isStructInstalled'] && $item['isObjectActive'])) throw new Exception("Object error"); $fields = $item['field']; $refsTables = []; foreach ($fields as $field) { list($type, $child) = explode(":", $field['xsdType'], 2); if ($type == "ref" && $field['idZasob'] && $field['isActive'] && (!$field['isLocal'])) $refsTables[] = ACL::getRefTable($namespace, $child); } return $refsTables; } catch (Exception $e) { echo "{$namespace} - {$e->getMessage}"; return []; } } private function truncatePowiazaniaFromDB($ID) { $refsTables = $this->getRefsTables('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA'); if (!$refsTables) return null; $refPowiazaniaToPowiazaniaRow = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row'); $refsTables = array_diff($refsTables, [$refPowiazaniaToPowiazaniaRow]); $query = "delete from `" . implode("`, `", $refsTables) . "` using `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`"; foreach ($refsTables as $refTable) $query .= " left join `{$refTable}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = `{$refTable}`.`PRIMARY_KEY`"; $query .= " where `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = '{$ID}'"; DB::getPDO()->query($query); } private function deleteResultsFromDB($ID) { $refPowiazaniaToPowiazaniaRow = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row'); $refPowiazaniaRowToPowiazaniaRowObject = ACL::getRefTable('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row', 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object'); $refsTables = $this->getRefsTables('default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object'); $sqlDeleteFrom = "delete from `{$refPowiazaniaToPowiazaniaRow}`, `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row`, `{$refPowiazaniaRowToPowiazaniaRowObject}`, `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object`"; $sqlUsing = " using `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA` join `{$refPowiazaniaToPowiazaniaRow}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = `{$refPowiazaniaToPowiazaniaRow}`.`PRIMARY_KEY` join `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row` on `{$refPowiazaniaToPowiazaniaRow}`.`REMOTE_PRIMARY_KEY` = `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row`.`ID` join `{$refPowiazaniaRowToPowiazaniaRowObject}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row`.ID = `{$refPowiazaniaRowToPowiazaniaRowObject}`.`PRIMARY_KEY` join `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object` on `{$refPowiazaniaRowToPowiazaniaRowObject}`.`REMOTE_PRIMARY_KEY` = `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object`.ID"; $sqlWhere = " where `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA`.`ID` = '{$ID}'"; foreach ($refsTables as $refTable) { $sqlDeleteFrom .= ",\n`{$refTable}`"; $sqlUsing .= "\nleft join `{$refTable}` on `BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object`.`ID` = `{$refTable}`.`PRIMARY_KEY`"; } $query = $sqlDeleteFrom . $sqlUsing . $sqlWhere; DB::getPDO()->query($query); } public function doGenerate() { function generatePhpScript($function) { return '' . $function . '; '; } try { ### Ustawiamy zmienną sesji nazwy użytkownika, aby w rekordach historycznych było widać, że autorem systemu jest moduł BiAuditGenerate $_SESSION['ADM_ACCOUNT']="BiAuditGenerate"; ### Sprawdzenie czy modul BiAudit jest aktywny na danej instalacji Procesy5 $moduleActive=DB::getPDO()->fetchValue("select count(*) from CRM_CONFIG where CONF_KEY='module_BiAudit' and CONF_VAL='on'"); if (!$moduleActive) throw new Exception("Module BiAudit disabled/not installed."); ### Ustawienie zmiennych $powiazaniaDirLocation = $this->getMainDirectory(); $tasksDirLocation = $powiazaniaDirLocation . "/.tasks"; $reloadCachePhpFile = $tasksDirLocation . "/reloadCache.php"; $reloadCachePidFile = $tasksDirLocation . "/reloadCache.pid"; $reloadCacheResultFile = $tasksDirLocation . "/reloadCache.result"; $reloadCacheLogFile = $tasksDirLocation . "/reloadCache.log"; ### Utworzenie niezbędnych katalogów i plików if (!file_exists($tasksDirLocation)) mkdir($tasksDirLocation, 0755, true); if (!file_exists($tasksDirLocation)) throw new Exception('Error during creating temporary directory.'); ### Sprawdzenie czy któryś rekord wymaga odświeżenia cache $doGenerate = true; $query = "select ID from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where BI_analiza_reloadCache in ('Full', 'Part') and FILE_STATUS = 'TO_GENERATE'"; $result = DB::getPDO()->fetchAll($query); if ($result) { $doGenerate = false; $sqlArr = []; if (file_exists($reloadCachePhpFile)) { if (file_exists($reloadCacheResultFile)) { $reloadCacheResult = file_get_contents($reloadCacheResultFile); if ($reloadCacheResult == "ok") { $sqlArr = [ 'FILE_STATUS_info' => 'Odświeżono cache, oczekiwanie na wygenerowanie powiązań', 'BI_analiza_reloadCache' => 'No', ]; $doGenerate = true; } else { $sqlArr = [ 'FILE_STATUS' => 'ERROR', 'FILE_STATUS_info' => "Wystąpił błąd podczas odświeżania cache ({$reloadCacheResult})", ]; $query = "select ID from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where FILE_STATUS = 'TO_GENERATE'"; $result = DB::getPDO()->fetchAll($query); } unlink($reloadCachePhpFile); unlink($reloadCachePidFile); unlink($reloadCacheResultFile); } elseif (file_exists($reloadCachePidFile)) { $pid = file_get_contents($reloadCachePidFile); $processRunning = trim(shell_exec("ps -p {$pid} -o command | grep -v '^COMMAND$'")); $processShouldBeRunning = "php {$reloadCachePhpFile}"; if ($processRunning != $processShouldBeRunning) { if (!file_exists($reloadCacheResultFile)) { $sqlArr = [ 'FILE_STATUS' => 'ERROR', 'FILE_STATUS_info' => "Wystąpił nieznany błąd podczas odświeżania cache - nie znaleziono procesu potomnego", ]; $query = "select ID from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where FILE_STATUS = 'TO_GENERATE'"; $result = DB::getPDO()->fetchAll($query); unlink($reloadCachePhpFile); unlink($reloadCachePidFile); unlink($reloadCacheResultFile); } } } } else { $query = "select count(*) from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where FILE_STATUS = 'IN_PROGRESS'"; $result2 = DB::getPDO()->fetchValue($query); if ($result2) { $sqlArr = [ 'FILE_STATUS_info' => 'Wstrzymano odświeżanie cache - oczekiwanie na dokończenie szukania powiązań dla innych rekordów', ]; } else { $sqlArr = [ 'FILE_STATUS_info' => 'W trakcie odświeżania cache', ]; $query = "select count(*) from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where BI_analiza_reloadCache = 'Full' and FILE_STATUS = 'TO_GENERATE'"; $fullReloadCache = (DB::getPDO()->fetchValue($query) > 0); file_put_contents($reloadCachePhpFile, generatePhpScript("doReloadCache({$fullReloadCache})")); shell_exec('su - root -c "php ' . $reloadCachePhpFile . ' > ' . $reloadCacheLogFile. ' 2>&1 &"'); } } if ($sqlArr) { foreach ($result as $row) { DB::getDB()->UPDATE_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', array_merge(['ID' => $row['ID']], $sqlArr)); } } } ### Generowanie powiązań if ($doGenerate) { $query = "select ID from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where FILE_STATUS = 'TO_GENERATE'"; //TODO TEST: and ID = 1 $result = DB::getPDO()->fetchAll($query); foreach ($result as $row) { $sqlArr = [ 'ID' => $row['ID'], 'FILE_STATUS' => 'IN_PROGRESS', 'FILE_STATUS_info' => 'W trakcie generowania powiązań', ]; DB::getDB()->UPDATE_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $sqlArr); $this->deleteResultsFromDB($row['ID']); $generatePowiazaniaResultFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.result"; $generatePowiazaniaPhpFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.php"; $generatePowiazaniaLogFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.log"; file_put_contents($generatePowiazaniaPhpFile, generatePhpScript("doGeneratePowiazania({$row['ID']})")); shell_exec('su - root -c "php ' . $generatePowiazaniaPhpFile . ' > ' . $generatePowiazaniaLogFile. ' 2>&1 &"'); } } ### Weryfikacja świeżo wygenerowanych powiązań $query = "select ID from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where FILE_STATUS = 'IN_PROGRESS'"; $result = DB::getPDO()->fetchAll($query); foreach ($result as $row) { $generatePowiazaniaResultFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.result"; $generatePowiazaniaPidFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.pid"; $generatePowiazaniaPhpFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.php"; $generatePowiazaniaPdfFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.pdf"; $generatePowiazaniaHtmlDir = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.html"; $generatePowiazaniaHtmlZipFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.zip"; $error = false; $success = false; $sqlArr = []; if (file_exists($generatePowiazaniaResultFile)) { $generatePowiazaniaResult = file_get_contents($generatePowiazaniaResultFile); if ($generatePowiazaniaResult == "ok") { $xmlFile = "{$tasksDirLocation}/generatePowiazania-{$row['ID']}.xml"; if (file_exists($xmlFile)) { if (filesize($xmlFile)) { $powiazanieDirLocation = $this->getDirectory('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $row['ID']); if (!file_exists($powiazanieDirLocation)) mkdir($powiazanieDirLocation, 0777, false); if (!file_exists($powiazanieDirLocation)) $error = "Nie udało się wgrać pliku xml - nie można utworzyć katalogu dla rekordu"; else $success = true; } else $error = "Wystąpił nieznany błąd - plk xml został wygenerowany niepoprawnie"; } else $error = "Wystąpił nienzany błąd - nie znaleziono pliku xml"; } else $error = "Wystąpił błąd podczas generowania powiązań ({$generatePowiazaniaResult})"; } elseif (file_exists($generatePowiazaniaPidFile)) { $pid = file_get_contents($generatePowiazaniaPidFile); $processRunning = trim(shell_exec("ps -p {$pid} -o command | grep -v '^COMMAND$'")); $processShouldBeRunning = "php {$generatePowiazaniaPhpFile}"; if ($processRunning != $processShouldBeRunning) { if (!file_exists($generatePowiazaniaResultFile)) $error = "Wystąpił nieznany błąd w przetwarzaniu - nie znaleziono procesu potomnego"; } } if ($error) { $sqlArr = [ 'FILE_STATUS' => 'ERROR', 'FILE_STATUS_info' => $error, ]; $this->deleteResultsFromDB($row['ID']); if (file_exists($xmlFile)) unlink($xmlFile); } elseif ($success) { $sqlArr = [ 'FILE_STATUS' => 'GENERATED', 'FILE_STATUS_info' => 'Poprawnie wygenerowano powiązania', ]; $destXmlFile = "{$powiazanieDirLocation}/relations.xml"; $destPdfFile = "{$powiazanieDirLocation}/relations.pdf"; $destHtmlDir = "{$powiazanieDirLocation}/html"; $destHtmlZipFile = "{$powiazanieDirLocation}/html.zip"; rename($xmlFile, $destXmlFile); if (file_exists($generatePowiazaniaPdfFile)) rename($generatePowiazaniaPdfFile, $destPdfFile); if (file_exists($generatePowiazaniaHtmlDir)) { if (file_exists($destHtmlDir)) shell_exec("rm -rf \"{$destHtmlDir}\""); rename($generatePowiazaniaHtmlDir, $destHtmlDir); } if (file_exists($generatePowiazaniaHtmlZipFile)) rename($generatePowiazaniaHtmlZipFile, $destHtmlZipFile); } if ($sqlArr) { $sqlArr['ID'] = $row['ID']; DB::getDB()->UPDATE_OBJ('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $sqlArr); if (file_exists($generatePowiazaniaPhpFile)) unlink($generatePowiazaniaPhpFile); if (file_exists($generatePowiazaniaPidFile)) unlink($generatePowiazaniaPidFile); if (file_exists($generatePowiazaniaResultFile)) unlink($generatePowiazaniaResultFile); } } } catch (Exception $e) { echo $e->getMessage()."\n"; } } private function reloadCache_reTeryt($full = false) { Lib::loadClass('Teryt'); $tables = [ 'BI_audit_CEIDG' => [ 'fields' => [ 'wojewodztwo' => 'wojewodztwo', 'powiat' => 'powiat', 'gmina' => 'gmina', 'miejscowosc' => 'miejscowosc', 'ulica' => 'ulica', 'kodPocztowy' => 'kodPocztowy', ], 'full' => false, ], 'BI_audit_CEIDG_pelnomocnicy' => [ 'fields' => [ 'wojewodztwo' => 'wojewodztwo', 'powiat' => 'powiat', 'gmina' => 'gmina', 'miejscowosc' => 'miejscowosc', 'ulica' => 'ulica', 'kodPocztowy' => 'kodPocztowy', ], 'full' => false, ], 'BI_audit_ENERGA_PRACOWNICY' => [ 'fields' => [ 'miejscowosc' => 'miejscowosc', 'kodPocztowy' => 'kodPocztowy', 'ulica' => 'ulica', ], 'full' => true, ], 'BI_audit_ENERGA_PRACOWNICY_adresy' => [ 'fields' => [ 'kodPocztowy' => 'kodPocztowy', 'miejscowosc' => 'miejscowosc', 'ulica' => 'ulica', ], 'full' => true, ], 'BI_audit_ENERGA_RUM_KONTRAHENCI' => [ 'fields' => [ 'kodPocztowy' => 'Kod_pocztowy', 'miejscowosc' => 'Miejscowosc', 'ulica' => 'Ulica', ], 'full' => true, ], 'BI_audit_KRS' => [ 'fields' => [ 'wojewodztwo' => 'S_wojewodztwo', 'powiat' => 'S_powiat', 'gmina' => 'S_gmina', 'miejscowosc' => 'A_miejscowosc', 'ulica' => 'A_ulica', 'kodPocztowy' => 'A_kod', ], 'full' => false, ], 'BI_audit_KRS_address' => [ 'fields' => [ 'wojewodztwo' => 'S_wojewodztwo', 'powiat' => 'S_powiat', 'gmina' => 'S_gmina', 'miejscowosc' => 'A_miejscowosc', 'ulica' => 'A_ulica', 'kodPocztowy' => 'A_kod', ], 'full' => false, ], 'BI_audit_MSIG_address' => [ 'fields' => [ 'wojewodztwo' => 'S_wojewodztwo', 'powiat' => 'S_powiat', 'gmina' => 'S_gmina', 'miejscowosc' => 'A_miejscowosc', 'ulica' => 'A_ulica', 'kodPocztowy' => 'A_kod', ], 'full' => false, ], ]; foreach ($tables as $table => $tableConf) { $where = ($full && $tableConf['full']) ? "" : "where `TERYT_SYM` is null and `cached` = 0"; $query = "select * from `{$table}` {$where}"; try { $adresy = DB::getPDO()->query($query); while ($adres = $adresy->fetch()) { $search = []; foreach ($tableConf['fields'] as $field => $param) if (!empty($adres[$param])) $search[$field] = $adres[$param]; try { $teryt = Teryt::search($search); if ($teryt) { $sqlArr = ['TERYT_SYM' => $teryt['SYM']]; $sqlArr['TERYT_SYM_UL'] = (isset($teryt['SYM_UL']) ? $teryt['SYM_UL'] : 0); DB::getPDO()->update($table, "ID", $adres['ID'], $sqlArr); } } catch (Exception $e) { } } } catch (Exception $e) { } } } private function reloadCache_updateAll($full = false) { $tablesConf = [ 'BI_audit_CEIDG' => [ 'fields' => [ 'nip' => 'nip', 'regon' => 'regon', 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'budynek', 'nrLokalu' => 'lokal', ], 'base' => '1', ], 'BI_audit_CEIDG_pelnomocnicy' => [ 'fields' => [ 'nip' => 'nip', 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'budynek', 'nrLokalu' => 'lokal', ], 'base' => '1', ], 'BI_audit_CEIDG_powiazania' => [ 'fields' => [ 'nip' => 'nip', 'regon' => 'regon', ], 'base' => '1', ], 'BI_audit_ENERGA_PRACOWNICY' => [ 'fields' => [ 'nip' => 'nip', 'regon' => 'regon', 'pesel' => 'pesel', 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'nr', 'nrLokalu' => 'nrLokalu', ], 'base' => '0', //'where' => '', ], 'BI_audit_ENERGA_PRACOWNICY_adresy' => [ 'fields' => [ 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'nrBudynku', 'nrLokalu' => 'nrLokalu', ], 'base' => '0', //'where' => '', ], 'BI_audit_ENERGA_RUM_KONTRAHENCI' => [ 'fields' => [ 'krs' => 'KRS', 'nip' => 'NIP', 'regon' => 'REGON', 'pesel' => 'PESEL', 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'Numer_budynku', 'nrLokalu' => 'Numer_mieszkania_lokalu', ], 'base' => '0', 'where' => "and ownCompany != 'Y'", ], 'BI_audit_KRS' => [ 'fields' => [ 'krs' => 'krs', 'nip' => 'nip', 'regon' => 'regon', 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'A_nrDomu', 'nrLokalu' => 'A_nrLokalu', ], 'base' => '1', ], 'BI_audit_KRS_address' => [ 'fields' => [ 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'A_nrDomu', 'nrLokalu' => 'A_nrLokalu', ], 'base' => '1', ], 'BI_audit_KRS_company' => [ 'fields' => [ 'regon' => 'regon', 'krs' => 'krs', ], 'base' => '1', ], 'BI_audit_KRS_person' => [ 'fields' => [ 'pesel' => 'pesel', ], 'base' => '1', ], 'BI_audit_MSIG' => [ 'fields' => [ 'krs' => 'krs', 'nip' => 'nip', 'regon' => 'regon', ], 'base' => '1', ], 'BI_audit_MSIG_address' => [ 'fields' => [ 'TERYT_SYM' => 'TERYT_SYM', 'TERYT_SYM_UL' => 'TERYT_SYM_UL', 'nrDomu' => 'A_nrDomu', 'nrLokalu' => 'A_nrLokalu', ], 'base' => '1', ], 'BI_audit_MSIG_company' => [ 'fields' => [ 'regon' => 'regon', 'krs' => 'krs', ], 'base' => '1', ], 'BI_audit_MSIG_person' => [ 'fields' => [ 'pesel' => 'pesel', ], 'base' => '1', ], // 'BI_audit_KW_requested_person' => [ // 'fields' => [ // 'pesel' => 'Seller_person_pesel', // 'krs' => 'Seller_person_KRS', // 'nip' => 'Seller_person_NIP', // 'regon' => 'Seller_person_REGON', // ], // 'base' => '0', // //'where' => '', // ], ]; $refTablesConf = [ 'BI_audit_CEIDG' => [ 'refTablesTo' => [ 'BI_audit_CEIDG_pelnomocnicy', 'BI_audit_CEIDG_powiazania', ], 'base' => 1, ], 'BI_audit_ENERGA_PRACOWNICY' => [ 'refTablesTo' => [ 'BI_audit_ENERGA_PRACOWNICY_adresy', ], 'base' => 0, ], 'BI_audit_KRS' => [ 'refTablesTo' => [ 'BI_audit_KRS_address', 'BI_audit_KRS_company', 'BI_audit_KRS_person', ], 'base' => 1, ], 'BI_audit_MSIG' => [ 'refTablesTo' => [ 'BI_audit_MSIG_address', 'BI_audit_MSIG_company', 'BI_audit_MSIG_person', ], 'base' => 1, ], ]; if ($full) { foreach ($tablesConf as $table => $tableConf) if (!$tableConf['base']) $queries[] = "update `{$table}` set `cached` = 0"; $queries[] = "delete from BI_audit_ALL where BASE = 0"; $queries[] = "delete from BI_audit_ALL_ref where BASE = 0"; } foreach ($refTablesConf as $refTableFrom => $refTableConf) { if ($refTableConf['base']) continue; foreach ($refTableConf['refTablesTo'] as $refTableTo) { $refTable = ACL::getRefTable("default_db/{$refTableFrom}/{$refTableFrom}", "default_db__x3A__{$refTableTo}:{$refTableTo}"); $queries[] = "update `{$refTable}` set `A_STATUS` = 'WAITNG' where `A_STATUS` = 'NORMAL'"; } } foreach ($tablesConf as $table => $tableConf) { $where = "where `cached` = 0"; if (!empty($tableConf['where'])) $where .= " {$tableConf['where']}"; // $queries[] = "lock tables `{$table}` write"; $queries[] = "insert into `BI_audit_ALL` (`REMOTE_TABLE`, `REMOTE_ID`, `BASE`, " . implode(", ", array_keys($tableConf['fields'])) . ") select '{$table}', ID, '{$tableConf['base']}', " . implode(", ", $tableConf['fields']) . " from `{$table}` {$where}"; $queries[] = "update `{$table}` set `cached` = 1 {$where}"; // $queries[] = "unlock tables"; } $queries[] = "update `BI_audit_ALL` set `nip` = null where `nip` = 0"; $queries[] = "update `BI_audit_ALL` set `regon` = null where `regon` = 0"; $queries[] = "update `BI_audit_ALL` set `krs` = null where `krs` = 0"; $queries[] = "update `BI_audit_ALL` set `pesel` = null where `pesel` = 0"; $queries[] = "update `BI_audit_ALL` set `TERYT_SYM` = null where `TERYT_SYM` = 0"; $queries[] = "update `BI_audit_ALL` set `TERYT_SYM_UL` = null where `TERYT_SYM_UL` = 0"; $queries[] = "update `BI_audit_ALL` set `nrDomu` = null where trim(`nrDomu`) = ''"; $queries[] = "update `BI_audit_ALL` set `nrLokalu` = null where trim(`nrLokalu`) = ''"; $queries[] = "update `BI_audit_ALL` set `nrDomu` = substring(`nrDomu`, 1, position('/' in `nrDomu`) - 1), `nrLokalu` = substring(`nrDomu`, position('/' in `nrDomu`) + 1) where `reffed` = 0 and `nrDomu` rlike '^[[:digit:]]+.*/[[:digit:]]+.*$' and `nrLokalu` is null"; $queries[] = "set @var = (select round(coalesce(max(`ID`), '0.5'), 1) from `BI_audit_ALL_ref_RELATIONS`)"; $queries[] = "insert into `BI_audit_ALL_ref_RELATIONS` (`ID`, `RELATION`, `BASE`) select @var:=@var*2, `a`.`RELATION`, `a`.`BASE` from (select `a`.`REMOTE_TABLE` as `RELATION`, `a`.`BASE` as `BASE` from `BI_audit_ALL` `a` where `a`.`REMOTE_TABLE` not in ('BI_audit_ENERGA_RUM_KONTRAHENCI', 'BI_audit_KW_requested_person') group by `a`.`REMOTE_TABLE` order by `a`.`BASE` desc) as `a` left join `BI_audit_ALL_ref_RELATIONS` `r` on `a`.`RELATION` = `r`.`RELATION` where `r`.`RELATION` is null"; foreach ($refTablesConf as $refTableFrom => $refTableConf) { foreach ($refTableConf['refTablesTo'] as $refTableTo) { $refTable = ACL::getRefTable("default_db/{$refTableFrom}/{$refTableFrom}", "default_db__x3A__{$refTableTo}:{$refTableTo}"); // $queries[] = "lock tables `{$refTable}` write"; $joins = "`BI_audit_ALL` as `all1` join `{$refTable}` as `ref` on `all1`.`REMOTE_TABLE` = '{$refTableFrom}' and `all1`.`REMOTE_ID` = `ref`.`PRIMARY_KEY` and `ref`.`A_STATUS` = 'WAITING' join `BI_audit_ALL` as `all2` on `all2`.`REMOTE_TABLE` = '{$refTableTo}' and `ref`.`REMOTE_PRIMARY_KEY` = `all2`.`REMOTE_ID` join `BI_audit_ALL_ref_RELATIONS` `rel` on `all1`.`REMOTE_TABLE` = `rel`.`RELATION`"; $queries[] = "insert ignore into `BI_audit_ALL_ref` (`ID1`, `ID2`, `RELATION_ID`, `BASE`) select `all1`.`ID`, `all2`.`ID`, `rel`.`ID`, {$refTableConf['base']} from {$joins}"; $queries[] = "insert ignore into `BI_audit_ALL_ref` (`ID1`, `ID2`, `RELATION_ID`, `BASE`) select `all2`.`ID`, `all1`.`ID`, `rel`.`ID`, {$refTableConf['base']} from {$joins}"; $queries[] = "update {$joins} set `ref`.`A_STATUS` = 'NORMAL'"; // $queries[] = "unlock tables"; } } echo implode(";\n", $queries) . ";\n"; foreach ($queries as $query) DB::getPDO()->query($query); $BiAuditRelations = new BiAuditRelations($full); // DB::getPDO()->query("lock tables `BI_audit_ALL` write"); $result = DB::getPDO()->query("select `ID` from `BI_audit_ALL` where `reffed` = 0 order by `ID`"); while ($row = $result->fetch()) $BiAuditRelations->findRelations($row['ID']); DB::getPDO()->query("update `BI_audit_ALL` set `reffed` = 1"); // DB::getPDO()->query("unlock tables"); } public function doReloadCache($full = false) { $powiazaniaDirLocation = $this->getMainDirectory(); $tasksDirLocation = $powiazaniaDirLocation . "/.tasks"; $reloadCachePidFile = $tasksDirLocation . "/reloadCache.pid"; $reloadCacheResultFile = $tasksDirLocation . "/reloadCache.result"; file_put_contents($reloadCachePidFile, getmypid()); try { $this->reloadCache_reTeryt($full); $this->reloadCache_updateAll($full); file_put_contents($reloadCacheResultFile, "ok"); } catch (Exception $e) { file_put_contents($reloadCacheResultFile, $e->getMessage()); } } public function doGeneratePowiazania($ID) { $powiazaniaDirLocation = $this->getMainDirectory(); $tasksDirLocation = $powiazaniaDirLocation . "/.tasks"; $resultFile = "{$tasksDirLocation}/generatePowiazania-{$ID}.result"; $xmlFile = "{$tasksDirLocation}/generatePowiazania-{$ID}.xml"; $pdfFile = "{$tasksDirLocation}/generatePowiazania-{$ID}.pdf"; $pidFile = "{$tasksDirLocation}/generatePowiazania-{$ID}.pid"; file_put_contents($pidFile, getmypid()); $tablesConf = [ 'BI_audit_CEIDG' => ['ID', 'imie', 'nazwisko', 'nip', 'regon', 'firma', 'miejscowosc'], 'BI_audit_CEIDG_pelnomocnicy' => ['ID', 'nazwa', 'nip', 'miejscowosc'], 'BI_audit_CEIDG_powiazania' => ['ID', 'nip', 'regon'], 'BI_audit_ENERGA_PRACOWNICY' => ['ID', 'imiona', 'nazwisko', 'pesel', 'nip', 'regon'], 'BI_audit_ENERGA_PRACOWNICY_adresy' => ['ID', 'miejscowosc'], 'BI_audit_ENERGA_RUM_KONTRAHENCI' => ['ID', 'Pelna_nazwa_kontrahenta', 'NIP', 'REGON', 'PESEL', 'KRS', 'Miejscowosc'], 'BI_audit_KRS' => ['ID', 'krs', 'nip', 'regon', 'nazwa', 'A_miejscowosc'], 'BI_audit_KRS_company' => ['ID', 'nazwa', 'regon', 'krs'], 'BI_audit_KRS_person' => ['ID', 'nazwisko', 'imiona', 'pesel'], 'BI_audit_KW_requested_person' => ['ID', 'Seller_person', 'Seller_person_pesel', 'Seller_person_KRS', 'Seller_person_NIP', 'Seller_person_REGON'], ]; try { $BiAuditPowiazania = new BiAuditPowiazania($ID); if (!$BiAuditPowiazania->powiazaniaFound()) throw new Exception("Nie znaleziono żadnych powiązań"); file_put_contents($xmlFile, $BiAuditPowiazania->asXml()); $BiAuditPowiazania->saveToDb(); $BiAuditPowiazania->generatePdfAndHtml($tasksDirLocation); file_put_contents($resultFile, "ok"); } catch (Exception $e) { file_put_contents($resultFile, $e->getMessage()); } } public function reinstallAction() { $this->reinstall(); die('OK'); } public function reinstall() { $sqlList = array(); //$sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_CONFIG`"; $sqlList['ActivateBiAuditGenerate'] = <<has_errors()) { throw new Exception("DB Errors: " . implode("\n
", $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
", $db->get_errors())); } } } } class BiAuditRelations { private $RELATIONS_ID = []; private $full; private $relations = [ 'nip' => ['nip'], 'regon' => ['regon'], 'krs' => ['krs'], 'pesel' => ['pesel'], 'adres' => ['TERYT_SYM', 'TERYT_SYM_UL', 'nrDomu', 'nrLokalu'], ]; private $destTables = ['BI_audit_ENERGA_RUM_KONTRAHENCI', 'BI_audit_KW_requested_person']; private $sourceTables = ['BI_audit_ENERGA_PRACOWNICY', 'BI_audit_ENERGA_PRACOWNICY_adresy']; public function __construct() { $query = "select * from BI_audit_ALL_ref_RELATIONS"; $result = DB::getPDO()->fetchAll($query); foreach ($result as $row) $this->RELATIONS_ID[$row['RELATION']] = $row['ID']; } private function getRelationID($name) { if (!isset($this->RELATIONS_ID[$name])) { $query = "select round(coalesce(max(ID), 0.5) * 2) as newID from BI_audit_ALL_ref_RELATIONS"; $newID = DB::getPDO()->fetchValue($query); $this->RELATIONS_ID[$name] = $newID; $query = "insert into BI_audit_ALL_ref_RELATIONS (ID, RELATION) values ('{$newID}', '{$name}')"; DB::getPDO()->query($query); } return $this->RELATIONS_ID[$name]; } public function findRelations($ID) { $query = "select * from BI_audit_ALL where ID = '{$ID}'"; if (!($result = DB::getPDO()->fetchAll($query))) return false; $row = $result[0]; $joins = []; $items = ''; foreach ($this->relations as $name => $columns) { $ok = 0; $join = []; foreach ($columns as $column) { $join[] = "t1.{$column} = t2.{$column}"; if ($row[$column]) $ok++; } if ($ok / count($columns) > 0.5) { $joins[] = "(" . implode(" and ", $join) . ")"; $items .= ", if(" . implode(" and ", $join) . ", 1, 0) as {$name}"; } } if (!$joins) return false; $query = "select t2.ID as ID, t1.REMOTE_TABLE as REMOTE_TABLE_1, t2.REMOTE_TABLE as REMOTE_TABLE_2 {$items}, t1.BASE * t2.BASE as BASE " . "from BI_audit_ALL t1 join BI_audit_ALL t2 on " . implode(" or ", $joins) . " where t1.ID = {$ID} and (t2.reffed = 1 or t2.ID > {$ID})"; $result = DB::getPDO()->fetchAll($query); foreach ($result as $row) { $relationID = 0; foreach ($this->relations as $name => $v) { if (isset($row[$name]) && $row[$name]) $relationID += $this->getRelationID($name); } $start1 = (in_array($row['REMOTE_TABLE_1'], $this->sourceTables) ? 1 : 0); $start2 = (in_array($row['REMOTE_TABLE_2'], $this->sourceTables) ? 1 : 0); $end1 = (in_array($row['REMOTE_TABLE_1'], $this->destTables) ? 1 : 0); $end2 = (in_array($row['REMOTE_TABLE_2'], $this->destTables) ? 1 : 0); if (!($start2 || $end1)) { $query = "insert into BI_audit_ALL_ref (ID1, ID2, RELATION_ID, END, BASE) values ({$ID}, {$row['ID']}, '{$relationID}', {$end2}, {$row['BASE']})"; DB::getPDO()->query($query); } if (!($start1 || $end2)) { $query = "insert into BI_audit_ALL_ref (ID2, ID1, RELATION_ID, END, BASE) values ({$ID}, {$row['ID']}, '{$relationID}', {$end1}, {$row['BASE']})"; DB::getPDO()->query($query); } } } } class BiAuditPowiazania { private $minDepth; private $maxDepth; private $onlyTargets; private $ID; private $endNodes; private $path = []; private $results = []; private $items_results = []; private $relations = []; private $destTables = ['BI_audit_ENERGA_RUM_KONTRAHENCI', 'BI_audit_KW_requested_person']; private $refTables = []; private function getRefTable($tableFrom, $tableTo, $returnException = true) { if (!isset($this->refTables[$tableFrom][$tableTo])) { try { $this->refTables[$tableFrom][$tableTo] = ACL::getRefTable("default_db/{$tableFrom}/{$tableFrom}", "default_db__x3A__{$tableTo}:{$tableTo}"); } catch (Exception $e) { if ($returnException) throw new Exception($e->getMessage()); $this->refTables[$tableFrom][$tableTo] = false; } } return $this->refTables[$tableFrom][$tableTo]; } public function __construct($ID = 0) { if (!$ID) throw new Exception("Wrong ID parameter"); $query = "select BI_analiza_minDepth, BI_analiza_maxDepth, BI_analiza_onlyTargets from BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA where ID = '{$ID}' and FILE_STATUS = 'IN_PROGRESS' and BI_analiza_reloadCache not in ('Full', 'Part')"; $result = DB::getPDO()->fetchAll($query); if (!$result) throw new Exception("Błąd danych"); $this->minDepth = (int) $result[0]['BI_analiza_minDepth']; $this->maxDepth = (int) $result[0]['BI_analiza_maxDepth']; $this->onlyTargets = ($result[0]['BI_analiza_onlyTargets'] != 'N'); if (!$this->minDepth) $this->minDepth = 1; if (!$this->maxDepth) throw new Exception("Błąd danych - nieokreślono maksymalnej głębokości analizy"); if ($this->minDepth > $this->maxDepth) throw new Exception("Wartość minimalnej głębokości analizy jest większa od wartości maksymalnej głębokości analizy"); $this->ID = $ID; $subQueries = []; foreach ($this->destTables as $destTable) { $refTable = $this->getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', $destTable); $subQueries[] = "select `all`.ID from BI_audit_ALL `all` join `{$refTable}` ref on `all`.REMOTE_TABLE = '{$destTable}' and `all`.REMOTE_ID = ref.REMOTE_PRIMARY_KEY and ref.PRIMARY_KEY = '{$ID}'"; } $query = implode(" union ", $subQueries); $result = DB::getPDO()->fetchAll($query); if (!$result) throw new Exception("Błąd danych - nie zdefinowano żadnego końcowego obiektu"); $this->endNodes = array_map('reset', $result); $refPowiazaniaToPracownicy = $this->getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_PRACOWNICY'); $query = "select `all`.ID as ID from BI_audit_ALL `all` join `{$refPowiazaniaToPracownicy}` ref on `all`.REMOTE_TABLE = 'BI_audit_ENERGA_PRACOWNICY' and `all`.REMOTE_ID = ref.REMOTE_PRIMARY_KEY and ref.PRIMARY_KEY = '{$ID}'"; $result = DB::getPDO()->fetchAll($query); foreach ($result as $row) $this->findPowiazania($row['ID']); } public function findPowiazania($ID, $relation = "", $end = 0) { if (isset($this->path[$ID])) return false; $this->path[$ID] = $relation; if (!$relation) $relation = 0; if ($end) { if (in_array($ID, $this->endNodes) && count($this->path) > $this->minDepth) $this->results[] = $this->path; array_pop($this->path); return true; } if (count($this->path) > $this->maxDepth) { if (!$this->onlyTargets) $this->results[] = $this->path; array_pop($this->path); return false; } $nodes = []; if ($relation) $where = "and ({$relation} & ref.RELATION_ID) != {$relation}"; else $where = ""; $query = "select ref.ID2, RELATION_ID, END from BI_audit_ALL_ref ref where ref.ID1 = '{$ID}' {$where}"; $result = DB::query($query); while ($row = DB::fetch($result)) $nodes[$row->ID2] = ['relation' => (int) $row->RELATION_ID, 'end' => $row->END]; foreach ($nodes as $node => $data) $this->findPowiazania($node, $data['relation'], $data['end']); array_pop($this->path); } private function relationName($ID) { if (!isset($this->relations[$ID])) { $query = "select RELATION from BI_audit_ALL_ref_RELATIONS where ID & '{$ID}' order by ID"; $result = DB::getPDO()->fetchAll($query); $rels = array_map('reset', $result); $this->relations[$ID] = implode(", ", $rels); } return $this->relations[$ID]; } private function generateItemsResults() { $xmlRoot2 = "BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA"; $xmlElements = "BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row"; $this->items_results = []; $items_kontrahenci = []; $items_kw_person = []; $kontrahenci = []; $kw_person = []; $refUmowyToKontrahenci = $this->getRefTable('BI_audit_ENERGA_RUM_UMOWY', 'BI_audit_ENERGA_RUM_KONTRAHENCI'); $refKwRequestedToKwRequestedPerson = $this->getRefTable('/BI_audit_KW_requested', 'BI_audit_KW_requested_person'); foreach ($this->results as $result) { $item_results = []; foreach ($result as $ID => $rel) { $query = "select REMOTE_TABLE, REMOTE_ID from BI_audit_ALL where ID = '{$ID}'"; $row = DB::getPDO()->fetchFirst($query); $query = "select * from `{$row['REMOTE_TABLE']}` where ID = '{$row['REMOTE_ID']}'"; $obj = DB::fetch(DB::query($query)); $item_result = [$row['REMOTE_TABLE'] => (array) $obj]; if ($refTable = $this->getRefTable('BI_audit_operational_raport_note', $row['REMOTE_TABLE'], false)) { $query = "select `note`.* from `BI_audit_operational_raport_note` `note` join `{$refTable}` `ref` on `note`.`ID` = `ref`.`PRIMARY_KEY` where `ref`.`REMOTE_PRIMARY_KEY` = '{$row['REMOTE_ID']}'"; if ($notes = DB::getPDO()->fetchAll($query)) $item_result[$row['REMOTE_TABLE']]['operational_raport_note'] = $notes; } if ($rel) $item_result['relation_from'] = $this->relationName($rel); $item_results['object'][] = $item_result; if ($row['REMOTE_TABLE'] == "BI_audit_ENERGA_RUM_KONTRAHENCI" && (!in_array($row['REMOTE_ID'], $kontrahenci))) { $kontrahenci[] = $row['REMOTE_ID']; $query = "select umowy.* from BI_audit_ENERGA_RUM_UMOWY umowy join `{$refUmowyToKontrahenci}` ref on umowy.ID = ref.PRIMARY_KEY where ref.REMOTE_PRIMARY_KEY = '{$row['REMOTE_ID']}'"; $res = DB::query($query); if (mysql_num_rows($res)) { $umowy = []; while ($obj = DB::fetch($res)) $umowy[] = (array) $obj; $item_kontrahenci['ID'] = $row['REMOTE_ID']; $item_kontrahenci['BI_audit_ENERGA_RUM_UMOWY'] = $umowy; $items_kontrahenci[] = $item_kontrahenci; } } elseif ($row['REMOTE_TABLE'] == "BI_audit_KW_requested_person" && (!in_array($row['REMOTE_ID'], $kw_person))) { $kw_person[] = $row['REMOTE_ID']; $query = "select kw.* from BI_audit_KW_requested kw join `{$refKwRequestedToKwRequestedPerson}` ref on kw.ID = ref.PRIMARY_KEY where ref.REMOTE_PRIMARY_KEY = '{$row['REMOTE_ID']}'"; $res = DB::query($query); if (mysql_num_rows($res)) { $kw = []; while ($obj = DB::fetch($res)) $kw[] = (array) $obj; $item_kw_person['ID'] = $row['REMOTE_ID']; $item_kw_person['BI_audit_KW_requested'] = $kw; $items_kw_person[] = $item_kw_person; } } } $this->items_results[$xmlRoot2][$xmlElements][] = $item_results; } $this->items_results[$xmlRoot2]['BI_audit_ENERGA_RUM_KONTRAHENCI'] = $items_kontrahenci; $this->items_results[$xmlRoot2]['BI_audit_KW_requested_person'] = $items_kw_person; } public function saveToDb() { if (!$this->results) return null; $refPowiazaniaToPowiazaniaRow = $this->getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA', 'BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row'); $refPowiazaniaRowToPowiazaniaRowObject = $this->getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row', 'BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object'); foreach ($this->results as $result) { $IdPowiazaniaRow = DB::getPDO()->insert('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row', []); DB::getPDO()->insert($refPowiazaniaToPowiazaniaRow, ['PRIMARY_KEY' => $this->ID, 'REMOTE_PRIMARY_KEY' => $IdPowiazaniaRow]); foreach ($result as $ID => $rel) { $query = "select REMOTE_TABLE, REMOTE_ID from BI_audit_ALL where ID = '{$ID}'"; $object = DB::getPDO()->fetchFirst($query); $idPowiazaniaRowObject = DB::getPDO()->insert('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object', ['relation_from' => $this->relations[$rel]]); DB::getPDO()->insert($refPowiazaniaRowToPowiazaniaRowObject, ['PRIMARY_KEY' => $IdPowiazaniaRow, 'REMOTE_PRIMARY_KEY' => $idPowiazaniaRowObject]); $ref = $this->getRefTable('BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object', $object['REMOTE_TABLE']); DB::getPDO()->insert($ref, ['PRIMARY_KEY' => $idPowiazaniaRowObject, 'REMOTE_PRIMARY_KEY' => $object['REMOTE_ID']]); } } } public function asXml() { if (!$this->results) return null; if (!$this->items_results) $this->generateItemsResults(); $xmlRoot = "RelatedFeatureRoot"; return V::arrayToXML($this->items_results, true, $xmlRoot); } public function asArray($subArray = null) { if (!$this->results) return null; if (!$this->items_results) $this->generateItemsResults(); if ($subArray) { if (isset($this->items_results[$subArray])) return $this->items_results[$subArray]; else return []; } else return $this->items_results; } public function powiazaniaFound() { if ($this->results) return true; else return false; } public function generatePdfAndHtml($tasksDirLocation) { $xmlFile = "{$tasksDirLocation}/generatePowiazania-{$this->ID}.xml"; $pdfDestFile = "{$tasksDirLocation}/generatePowiazania-{$this->ID}.pdf"; $htmlDestDir = "{$tasksDirLocation}/generatePowiazania-{$this->ID}.html"; $htmlZipDestFile = "{$tasksDirLocation}/generatePowiazania-{$this->ID}.zip"; $antDir = "/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/recurse_ant/out"; $antXmlFilename = "relations-{$this->ID}.out_task.dita.final_with_RelatedFeatureLoop.xml"; $antXmlFile = $antDir . "/" . $antXmlFilename; $pdfFile = "/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree/temp/relations-{$this->ID}/pdf/relations-{$this->ID}.pdf"; $htmlDir = "/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree/temp/relations-{$this->ID}/html"; if (!file_exists($antDir)) mkdir($antDir, 0755, true); if (!is_dir($antDir)) $sqlArr['FILE_STATUS_info'] .= ", ale nie udało się utworzyć pliku PDF"; else { copy($xmlFile, $antXmlFile); shell_exec("cd /Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree && /opt/local/bin/ant -f build_CRM_PROCES_tree.xml default_db:PROCES_INIT:tree:dita -Duuid=relations-{$this->ID}"); shell_exec("cd \"/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree/temp/relations-{$this->ID}\" && /Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3/bin/dita -o pdf -i relations-{$this->ID}.ditamap -f pdf"); if (file_exists($pdfFile)) rename($pdfFile, $pdfDestFile); shell_exec("cd \"/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree/temp/relations-{$this->ID}\" && /Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3/bin/dita -o html -i relations-{$this->ID}.ditamap -f tocjs"); if (file_exists($htmlDir) && is_dir($htmlDir)) { shell_exec("cd \"/Library/Server/Web/Data/Sites/Default/SE/schema/WPS_Functions/default_db/CRM_PROCES_tree/temp/relations-{$this->ID}\" && zip -r \"{$htmlZipDestFile}\" html"); if (file_exists($htmlDestDir)) shell_exec("rm -rf \"{$htmlDestDir}\""); shell_exec("mv \"{$htmlDir}\" \"{$htmlDestDir}\""); } } } }