From 4f327dd19803b41236b409038ed234d43f9dc724 Mon Sep 17 00:00:00 2001 From: opth Date: Sat, 14 Dec 2024 18:53:42 +0100 Subject: [PATCH 1/6] implemetace logovani smluv --- app/presenters/SpravaSmluvPresenter.php | 28 ++++++++++++++----- app/presenters/UzivatelActionsPresenter.php | 31 +++++++++++++++++---- app/presenters/UzivatelPresenter.php | 1 - www/digisign-webhook/WebhookReceiver.php | 29 +++++++++++++++++++ 4 files changed, 75 insertions(+), 14 deletions(-) diff --git a/app/presenters/SpravaSmluvPresenter.php b/app/presenters/SpravaSmluvPresenter.php index 723a9e0b..7dfea00d 100755 --- a/app/presenters/SpravaSmluvPresenter.php +++ b/app/presenters/SpravaSmluvPresenter.php @@ -12,10 +12,13 @@ class SpravaSmluvPresenter extends BasePresenter protected $smlouva; protected $podpis; + protected $logger; - public function __construct(Model\Smlouva $smlouva, Model\PodpisSmlouvy $podpis) { + public function __construct(Model\Smlouva $smlouva, + Model\PodpisSmlouvy $podpis, Model\Log $logger) { $this->smlouva = $smlouva; $this->podpis = $podpis; + $this->logger = $logger; } // Zkontroluje ze jsme dostali ID a existuje smlouva s timto ID @@ -85,8 +88,6 @@ public function parseDate(string $timestamp): DateTime { } public function actionCancelContract() { - // TODO: Logování změn - $contract_id = $this->getParameter('id'); $this->idAndContractExists($contract_id); $this->userCanChange($contract_id); @@ -97,12 +98,19 @@ public function actionCancelContract() { $this->redirect('SpravaSmluv:show'); } + $now = new DateTime(); $updated_row = $current_contract->update([ - 'kdy_ukonceno' => new DateTime() + 'kdy_ukonceno' => $now ]); if ($updated_row) { $this->flashMessage('Smlouva č. ' . $contract_id . ' vypovězena!'); + $log = []; + $this->logger->logujUpdate( + ['kdy_ukonceno' => null], ['kdy_ukonceno' => $now], + 'Smlouva', $log + ); + $this->logger->loguj('Smlouva', $current_contract->id, $log); } else { $this->flashMessage('Chyba ve vypovezení smlouvy.', 'danger'); } @@ -110,8 +118,6 @@ public function actionCancelContract() { } public function actionUpdateNote() { - // TODO: Logování změn - $request = $this->getHttpRequest(); $contract_id = $this->getParameter('id'); @@ -123,12 +129,20 @@ public function actionUpdateNote() { $this->idAndContractExists($contract_id); $this->userCanChange($contract_id); - $updated_row = $this->smlouva->find($contract_id)->update([ + $current_contract = $this->smlouva->find($contract_id); + $old_note = $current_contract->poznamka; + $updated_row = $current_contract->update([ 'poznamka' => $request->getPost('interni-poznamka') ]); if ($updated_row) { $this->flashMessage('Poznámka uložena'); + $log = []; + $this->logger->logujUpdate( + ['poznamka' => $old_note], ['poznamka' => $request->getPost('interni-poznamka')], + 'Smlouva', $log + ); + $this->logger->loguj('Smlouva', $current_contract->id, $log); } else { $this->flashMessage('Chyba při update poznámky.', 'danger'); } diff --git a/app/presenters/UzivatelActionsPresenter.php b/app/presenters/UzivatelActionsPresenter.php index bc80acfa..21edf66b 100755 --- a/app/presenters/UzivatelActionsPresenter.php +++ b/app/presenters/UzivatelActionsPresenter.php @@ -20,14 +20,24 @@ class UzivatelActionsPresenter extends UzivatelPresenter private $mailService; private $smlouva; private $database; - - public function __construct(\Nette\Database\Connection $database, Services\MailService $mailsvc, Services\PdfGenerator $pdf, Model\AccountActivation $accActivation, Model\Uzivatel $uzivatel, Model\Smlouva $smlouva) { + private $logger; + + public function __construct( + \Nette\Database\Connection $database, + Services\MailService $mailsvc, + Services\PdfGenerator $pdf, + Model\AccountActivation $accActivation, + Model\Uzivatel $uzivatel, + Model\Smlouva $smlouva, + Model\Log $logger + ) { $this->database = $database; $this->pdfGenerator = $pdf; $this->accountActivation = $accActivation; $this->uzivatel = $uzivatel; $this->mailService = $mailsvc; $this->smlouva = $smlouva; + $this->logger = $logger; } public function actionMoneyActivate() { @@ -141,8 +151,6 @@ public function actionHandleSubscriberContractPreview() { } public function actionHandleSubscriberContract() { - // TODO: Logování změn - if (!$this->getParameter('id')) { $this->flashMessage('Žádné id.'); $this->redirect('UzivatelList:listall'); @@ -157,12 +165,13 @@ public function actionHandleSubscriberContract() { } // Kontrola, že od poslední generace uběhlo aspoň 5 minut... - // $this->checkTimeSinceLastGenerateContract(); + $this->checkTimeSinceLastGenerateContract(); + $now = new DateTime(); $this->database->query('INSERT INTO Smlouva ?', [ 'Uzivatel_id' => $user_id, 'typ' => 'ucastnicka', - 'kdy_vygenerovano' => new DateTime() + 'kdy_vygenerovano' => $now ]); $newId = $this->database->getInsertId(); @@ -171,6 +180,16 @@ public function actionHandleSubscriberContract() { error_log("RUN: [$cmd2]", ); proc_close(proc_open($cmd2, array(), $foo)); + $log = []; + $new_data = [ + 'id' => $newId, + 'Uzivatel_id' => $user_id, + 'typ' => 'ucastnicka', + 'kdy_vygenerovano' => $now + ]; + $this->logger->logujInsert($new_data, 'Smlouva', $log); + $this->logger->loguj('Smlouva', $newId, $log); + $this->flashMessage(sprintf('Nová smlouva číso %u bude odeslána na e-mail %s.', $newId, $current_user->email)); // Tady call na generaci nove smlouvy a odeslani $this->redirect('Uzivatel:show', array('id' => $user_id)); diff --git a/app/presenters/UzivatelPresenter.php b/app/presenters/UzivatelPresenter.php index 7866978c..28d50a99 100644 --- a/app/presenters/UzivatelPresenter.php +++ b/app/presenters/UzivatelPresenter.php @@ -259,7 +259,6 @@ public function renderShow() { $seznamUzivatelu = array_merge($seznamUzivatelu, $this->uzivatel->findUsersIdsFromOtherAreasByAreaId($ap->id, $subnety)); } } - // \Tracy\Debugger::barDump($seznamUzivatelu); $this->template->canViewOrEdit = $this->getUser()->isInRole('EXTSUPPORT') || $this->ap->canViewOrEditAP($uzivatel->Ap_id, $this->getUser()) diff --git a/www/digisign-webhook/WebhookReceiver.php b/www/digisign-webhook/WebhookReceiver.php index f6973f37..66655e0d 100644 --- a/www/digisign-webhook/WebhookReceiver.php +++ b/www/digisign-webhook/WebhookReceiver.php @@ -14,7 +14,9 @@ function process_digisign_webhook($hook) { $UzivatelModel = $container->getByType(\App\Model\Uzivatel::class); $SmlouvaModel = $container->getByType(\App\Model\Smlouva::class); + $Logger = $container->getByType(\App\Model\Log::class); $PodpisSmlouvyModel = $container->getByType(\App\Model\PodpisSmlouvy::class); + $log = []; $FILE_STORAGE_PATH = getenv('FILE_STORAGE_PATH') ?: '/tmp'; $FILE_STORAGE_PATH .= '/ucastnickeSmlouvy'; @@ -82,6 +84,7 @@ function process_digisign_webhook($hook) { $podpis = $PodpisSmlouvyModel->findOneBy(['smlouva_id' => $smlouva->id, 'smluvni_strana' => 'ucastnik']); $podpis->update(['kdy_podepsano' => $hook->time]); print_and_log(sprintf("smlouva #%u podpis ucastnika \"%s\" datum/cas: %s", $smlouva->id, $podpis->jmeno, $hook->time)); + // 2. stáhnout podepsaný PDF a uložit $fileResponse = $ENVELOPES->download($envelope->id); $documentFullName = "{$FILE_STORAGE_PATH}/{$envelope->documents[0]->name}"; @@ -90,14 +93,17 @@ function process_digisign_webhook($hook) { $smlouva->update(['podepsany_dokument_nazev' => $envelope->documents[0]->name]); $smlouva->update(['podepsany_dokument_content_type' => 'application/pdf']); $smlouva->update(['podepsany_dokument_path' => $documentFullName]); + // 3. pokud nemáme datum narození, zkusíme parsovat vyplněný ze smlouvy $uzivatel = $UzivatelModel->find($smlouva->uzivatel); if (!$uzivatel->datum_narozeni) { $recipient1 = $ENVELOPES->recipients($envelope)->get($envelope->recipients[0]->id); $tags = $recipient1->tags->toArray(); + foreach ($tags as $tag) { if ($tag['recipientClaim'] == 'birthdate') { $birthdate_dirty = $tag['value']; + try { $d = new DateTime(preg_replace('/\s+/', '', $birthdate_dirty) . " 00:00:00"); print_and_log(sprintf('datum narozeni [%s] parsovano jako %s', $birthdate_dirty, $d->format('Y-m-d'))); @@ -124,6 +130,10 @@ function process_digisign_webhook($hook) { // 5. nastavit "vztah" s družstvem $uzivatel->update(['druzstvo' => 1]); + // 6. zalogovat, že smlouva byla podepsána + $Logger->logujInsert(['kdy_podepsano' => $hook->time], 'Smlouva', $log); + $Logger->loguj('Smlouva', $smlouva->id, $log); + break; case 'envelopeDeclined': // obálka byla odmítnuta /** @@ -139,6 +149,7 @@ function process_digisign_webhook($hook) { $podpis = $PodpisSmlouvyModel->findOneBy(['smlouva_id' => $smlouva->id, 'smluvni_strana' => 'ucastnik']); $podpis->update(['kdy_odmitnuto' => $hook->time]); print_and_log(sprintf("smlouva #%u podpis \"%s\" odmitnut, datum/cas: %s", $smlouva->id, $podpis->jmeno, $hook->time)); + // 2. důvod odmítnutí uložit do poznámky if (!empty($envelope->recipients[0]->declineReason)) { $novaPoznamka = sprintf( @@ -150,6 +161,15 @@ function process_digisign_webhook($hook) { ); $smlouva->update(['poznamka' => $novaPoznamka]); } + + // 3. zalogovat, že smlouva byla odmítnnuta + $new_data = [ + 'kdy_odmitnuto' => $hook->time, + 'poznamka' => $novaPoznamka + ]; + $Logger->logujInsert($new_data, 'Smlouva', $log); + $Logger->loguj('Smlouva', $smlouva->id, $log); + break; case 'envelopeExpired': // obálka expirovala // ověřit skutečný stav @@ -166,6 +186,15 @@ function process_digisign_webhook($hook) { empty($smlouva->poznamka) ? '' : "\n", $envelope->recipients[0]->declinedAt->format('d.m.Y H:i'), ); + + // 2. zalogovat že smlouva vypršela + $Logger->logujUpdate( + ['poznamka' => $smlouva->poznamka], + ['poznamka' => $novaPoznamka], + 'Smlouva', + $log + ); + $Logger->loguj('Smlouva', $smlouva->id, $log); $smlouva->update(['poznamka' => $novaPoznamka]); break; case 'envelopeCancelled': // obálka byla zrušena From 2f016eb1dec8f944b7002e751d8c4ee570633f20 Mon Sep 17 00:00:00 2001 From: Vojtech Pithart Date: Wed, 18 Dec 2024 04:41:59 -0700 Subject: [PATCH 2/6] WebhookReceiver vic hlasek do syslogu --- app/services/RequestDruzstvoContract.php | 27 ++++++++++++++++++++---- www/digisign-webhook/index.php | 4 +++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/services/RequestDruzstvoContract.php b/app/services/RequestDruzstvoContract.php index e129912b..88d5c081 100644 --- a/app/services/RequestDruzstvoContract.php +++ b/app/services/RequestDruzstvoContract.php @@ -3,19 +3,29 @@ namespace App\Services; use Nette; +use App\Model; +use DateTime; class RequestDruzstvoContract { private $connection; - public function __construct(Nette\Database\Connection $connection) { + private Model\Log $logger; + + public function __construct( + Nette\Database\Connection $connection, + Model\Log $logger, + ) { $this->connection = $connection; + $this->logger = $logger; } public function execute(int $userId): int { + $now = new DateTime(); + $this->connection->query('INSERT INTO Smlouva ?', [ 'Uzivatel_id' => $userId, 'typ' => 'ucastnicka', - 'kdy_vygenerovano' => new \Nette\Utils\DateTime() + 'kdy_vygenerovano' => $now ]); $newId = $this->connection->getInsertId(); @@ -24,7 +34,16 @@ public function execute(int $userId): int { error_log("RUN: [$cmd2]", ); proc_close(proc_open($cmd2, array(), $foo)); - return $newId; - } + $log = []; + $new_data = [ + 'id' => $newId, + 'Uzivatel_id' => $userId, + 'typ' => 'ucastnicka', + 'kdy_vygenerovano' => $now + ]; + $this->logger->logujInsert($new_data, 'Smlouva', $log); + $this->logger->loguj('Smlouva', $newId, $log); + return (int) $newId; + } } diff --git a/www/digisign-webhook/index.php b/www/digisign-webhook/index.php index f50d5b81..b26721f2 100644 --- a/www/digisign-webhook/index.php +++ b/www/digisign-webhook/index.php @@ -19,8 +19,10 @@ return; } -print_and_log(sprintf("%s %s %s", $hook->event, $hook->entityName, $hook->entityId)); +print_and_log(sprintf("%s %s %s START", $hook->event, $hook->entityName, $hook->entityId)); process_digisign_webhook($hook); +print_and_log(sprintf("%s %s %s DONE", $hook->event, $hook->entityName, $hook->entityId)); + http_response_code(200); From 5437fdaac28d710c853c5c4d4364de2edf4696ef Mon Sep 17 00:00:00 2001 From: Vojtech Pithart Date: Wed, 18 Dec 2024 04:57:18 -0700 Subject: [PATCH 3/6] webhook - logovat az na konci --- www/digisign-webhook/WebhookReceiver.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/www/digisign-webhook/WebhookReceiver.php b/www/digisign-webhook/WebhookReceiver.php index b68bc516..c9f185e9 100644 --- a/www/digisign-webhook/WebhookReceiver.php +++ b/www/digisign-webhook/WebhookReceiver.php @@ -128,23 +128,25 @@ function process_digisign_webhook($hook) { } } } + // 4. zrušit členství ve spolku (pokud existuje) if ($uzivatel->spolek) { $uzivatel->update(['TypClenstvi_id' => 1]); // zrušeno } + // 5. nastavit "vztah" s družstvem $uzivatel->update(['druzstvo' => 1]); - // 6. zalogovat, že smlouva byla podepsána - $Logger->logujInsert(['kdy_podepsano' => $hook->time], 'Smlouva', $log); - $Logger->loguj('Smlouva', $smlouva->id, $log); - // 7. Uživatele označit štítkem /* migrace 2025 temporary */ $Stitkovac->addStitek($uzivatel, 'Mig3'); // 8. Odstranit oneclick_auth (odkaz v e-mailu už nebude fungovat) /* migrace 2025 temporary */ $uzivatel->update(['oneclick_auth' => null]); + // 9. zalogovat, že smlouva byla podepsána + $Logger->logujInsert(['kdy_podepsano' => $hook->time], 'Smlouva', $log); + $Logger->loguj('Smlouva', $smlouva->id, $log); + break; case 'envelopeDeclined': // obálka byla odmítnuta /** From aa7d28ac2a7d21df95a8ea4e88b6f31c7a367fd1 Mon Sep 17 00:00:00 2001 From: Vojtech Pithart Date: Wed, 18 Dec 2024 04:58:44 -0700 Subject: [PATCH 4/6] webhook - logovat az na konci --- www/digisign-webhook/WebhookReceiver.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/digisign-webhook/WebhookReceiver.php b/www/digisign-webhook/WebhookReceiver.php index c9f185e9..ba48c373 100644 --- a/www/digisign-webhook/WebhookReceiver.php +++ b/www/digisign-webhook/WebhookReceiver.php @@ -137,13 +137,13 @@ function process_digisign_webhook($hook) { // 5. nastavit "vztah" s družstvem $uzivatel->update(['druzstvo' => 1]); - // 7. Uživatele označit štítkem /* migrace 2025 temporary */ + // 6. Uživatele označit štítkem /* migrace 2025 temporary */ $Stitkovac->addStitek($uzivatel, 'Mig3'); - // 8. Odstranit oneclick_auth (odkaz v e-mailu už nebude fungovat) /* migrace 2025 temporary */ + // 7. Odstranit oneclick_auth (odkaz v e-mailu už nebude fungovat) /* migrace 2025 temporary */ $uzivatel->update(['oneclick_auth' => null]); - // 9. zalogovat, že smlouva byla podepsána + // 8. zalogovat, že smlouva byla podepsána $Logger->logujInsert(['kdy_podepsano' => $hook->time], 'Smlouva', $log); $Logger->loguj('Smlouva', $smlouva->id, $log); From 95a8a6dcdde4722f59419191e1e017d277548ca9 Mon Sep 17 00:00:00 2001 From: Vojtech Pithart Date: Wed, 18 Dec 2024 05:02:19 -0700 Subject: [PATCH 5/6] Merge master dorovnani po konfliktu --- app/presenters/UzivatelActionsPresenter.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/presenters/UzivatelActionsPresenter.php b/app/presenters/UzivatelActionsPresenter.php index ba585139..4132c9c8 100755 --- a/app/presenters/UzivatelActionsPresenter.php +++ b/app/presenters/UzivatelActionsPresenter.php @@ -19,12 +19,10 @@ class UzivatelActionsPresenter extends UzivatelPresenter private $pdfGenerator; private $mailService; private $smlouva; - private $database; private Services\RequestDruzstvoContract $requestDruzstvoContract; private Services\Stitkovac $stitkovac; public function __construct( - \Nette\Database\Connection $database, Model\Parameters $parameters, Services\MailService $mailsvc, Services\PdfGenerator $pdf, @@ -35,7 +33,6 @@ public function __construct( Services\Stitkovac $stitkovac, Services\CryptoSluzba $cryptosvc, ) { - $this->database = $database; $this->parameters = $parameters; $this->pdfGenerator = $pdf; $this->accountActivation = $accActivation; From 0f2a4c0018d70c7b75389dce93941228fa4b34ee Mon Sep 17 00:00:00 2001 From: Vojtech Pithart Date: Wed, 18 Dec 2024 05:02:35 -0700 Subject: [PATCH 6/6] Lepsi syslog ve webhooku --- www/digisign-webhook/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/digisign-webhook/index.php b/www/digisign-webhook/index.php index b26721f2..54f490ae 100644 --- a/www/digisign-webhook/index.php +++ b/www/digisign-webhook/index.php @@ -19,10 +19,10 @@ return; } -print_and_log(sprintf("%s %s %s START", $hook->event, $hook->entityName, $hook->entityId)); +print_and_log(sprintf("%s (%s %s) START", $hook->event, $hook->entityName, $hook->entityId)); process_digisign_webhook($hook); -print_and_log(sprintf("%s %s %s DONE", $hook->event, $hook->entityName, $hook->entityId)); +print_and_log(sprintf("%s (%s %s) DONE", $hook->event, $hook->entityName, $hook->entityId)); http_response_code(200);