Přeskočit na hlavní obsah

Bank - Services

Dokumentace business logiky a služeb pro práci s entitou Bank.

Bank Service​

Cesta: backend/Services/Bank.php Namespace: Espo\Modules\Banking\Services

Účel​

Bank Service poskytuje business logiku pro:

  • Validaci dat při vytváření/úpravě bank
  • Správu notifikací
  • Zpracování událostí
  • Propojení s účty a transakcemi

Metody​

create()​

Vytvoření nové banky.

Parametry:

  • $data (stdClass) - Data nové banky

Vrací:

  • Entity Bank

Validace:

  • Kontrola povinných polí
  • Validace kódu banky
  • Ověření duplicit

Příklad:

$service = $this->getServiceFactory()->create('Bank');
$bank = $service->create((object)[
'name' => 'Česká spořitelna, a.s.',
'code' => '0800',
'usesApi' => true
]);

update()​

Aktualizace existující banky.

Parametry:

  • $id (string) - ID banky
  • $data (stdClass) - Aktualizovaná data

Vrací:

  • Entity Bank

Validace:

  • Kontrola existence
  • Validace změn
  • Ochrana proti konfliktům

read()​

Načtení detailu banky.

Parametry:

  • $id (string) - ID banky

Vrací:

  • Entity Bank

Načítá:

  • Základní údaje
  • Related entities (podle ACL)
  • Počet účtů a transakcí

delete()​

Smazání banky (soft-delete).

Parametry:

  • $id (string) - ID banky

Kontroly:

  • Zda má banka přiřazené účty
  • Zda má banka transakce
  • ACL oprávnění

Vyvolává:

  • Forbidden - pokud má banka závislosti
  • ForbiddenException - pokud nemá uživatel oprávnění

Notifikační logika​

sendNotification()​

Odeslání notifikace o nové transakci.

Parametry:

  • $bankId (string) - ID banky
  • $transactionId (string) - ID transakce

Proces:

  1. Načte nastavení banky
  2. Kontroluje enableAlertUsers
  3. Získá seznam uživatelů a týmů
  4. Odešle notifikace

Příklad:

$service->sendNotification($bankId, $transactionId);

getNotificationRecipients()​

Získání příjemců notifikací.

Parametry:

  • $bankId (string) - ID banky

Vrací:

  • Array uživatelských ID

Zahrnuje:

  • Uživatele z pole users
  • Členy týmů z notificationTeams
  • Přiřazeného uživatele

Validační metody​

validateBankCode()​

Validace kódu banky.

Parametry:

  • $code (string) - Kód banky

Validuje:

  • Formát kódu (4 číslice)
  • Existence v seznamu známých bank
  • Duplicita

Vrací:

  • bool

checkForDuplicates()​

Kontrola duplicitních bank.

Parametry:

  • $name (string) - Název banky
  • $excludeId (string|null) - ID k vyloučení

Vrací:

  • bool - true pokud existuje duplicita

Statistické metody​

getAccountsCount()​

Počet účtů u banky.

Parametry:

  • $bankId (string) - ID banky

Vrací:

  • int - Počet aktivních účtů

getTransactionsCount()​

Počet transakcí spojených s bankou.

Parametry:

  • $bankId (string) - ID banky
  • $dateFrom (string|null) - Od data
  • $dateTo (string|null) - Do data

Vrací:

  • int - Počet transakcí

getTotalVolume()​

Celkový objem transakcí.

Parametry:

  • $bankId (string) - ID banky
  • $type (string) - 'incoming' nebo 'outgoing'
  • $period (string) - Časové období

Vrací:

  • float - Celkový objem v CZK

Bank Repository​

Cesta: backend/Repositories/Bank.php Namespace: Espo\Modules\Banking\Repositories

Účel​

Repository poskytuje databázové operace a custom queries.

Metody​

findWithAccounts()​

Načtení bank s počtem účtů.

Vrací:

  • Collection bank s připojeným počtem účtů

SQL Optimization:

  • Left join na BankAccount
  • Group by pro agregaci
  • Eager loading related dat

findActive()​

Banky s aktivními účty.

Vrací:

  • Collection aktivních bank

getByCode()​

Najít banku podle kódu.

Parametry:

  • $code (string) - Kód banky

Vrací:

  • Entity|null

Hooks​

Bank Hooks​

Cesta: backend/Hooks/Bank/

BeforeSave​

Soubor: BeforeSave.php

Akce:

  • Validace kódu banky
  • Trim whitespace
  • Kontrola duplicit

AfterSave​

Soubor: AfterSave.php

Akce:

  • Aktualizace related entities
  • Flush cache
  • Logování změn

BeforeRemove​

Soubor: BeforeRemove.php

Akce:

  • Kontrola závislých účtů
  • Kontrola transakcí
  • Prevent delete pokud má závislosti

AfterRemove​

Soubor: AfterRemove.php

Akce:

  • Cleanup orphaned records
  • Aktualizace statistik

Events​

Podporované události​

bank.created​

Vyvoláno po vytvoření banky.

Payload:

[
'bankId' => 'xxx',
'name' => 'Bank Name',
'userId' => 'yyy'
]

bank.updated​

Vyvoláno po aktualizaci banky.

Payload:

[
'bankId' => 'xxx',
'changes' => [...],
'userId' => 'yyy'
]

bank.deleted​

Vyvoláno po smazání banky.

Payload:

[
'bankId' => 'xxx',
'userId' => 'yyy'
]

Integrace​

Email Service​

Pro odesílání notifikací:

$emailService = $this->getServiceFactory()->create('Email');
$emailService->send([
'to' => $recipients,
'subject' => 'New Bank Transaction',
'body' => $body
]);

Notification Service​

Pro in-app notifikace:

$notificationService = $this->getServiceFactory()->create('Notification');
$notificationService->notifyAbout($entity, $userIdList);

Rozšíření​

Custom Service​

Vytvoření vlastní služby:

namespace Espo\Custom\Modules\Banking\Services;

use Espo\Modules\Banking\Services\Bank as Original;

class Bank extends Original
{
public function create($data)
{
// Custom pre-processing
$data = $this->customValidation($data);

// Volání původní metody
$bank = parent::create($data);

// Custom post-processing
$this->sendWelcomeEmail($bank);

return $bank;
}

protected function customValidation($data)
{
// Custom validace
return $data;
}

protected function sendWelcomeEmail($bank)
{
// Odeslání welcome e-mailu
}
}

Custom Hook​

Přidání vlastního hooku:

namespace Espo\Custom\Hooks\Bank;

use Espo\Core\Hook\Hook\AfterSave;
use Espo\ORM\Entity;

class CustomNotification implements AfterSave
{
public function afterSave(Entity $entity, array $options): void
{
if (!$entity->isNew()) {
return;
}

// Custom notifikační logika
$this->notifyAdmins($entity);
}

private function notifyAdmins(Entity $bank): void
{
// Implementace notifikace
}
}

Testing​

Unit Test Example​

namespace Test\Unit\Espo\Modules\Banking\Services;

use Espo\Modules\Banking\Services\Bank;

class BankTest extends \PHPUnit\Framework\TestCase
{
private $service;

protected function setUp(): void
{
$this->service = $this->createService();
}

public function testCreate(): void
{
$data = (object)[
'name' => 'Test Bank',
'code' => '9999'
];

$bank = $this->service->create($data);

$this->assertNotNull($bank->getId());
$this->assertEquals('Test Bank', $bank->get('name'));
}

public function testValidateBankCode(): void
{
$this->assertTrue($this->service->validateBankCode('0800'));
$this->assertFalse($this->service->validateBankCode('invalid'));
}
}

Best Practices​

  1. Vždy používejte Service layer místo přímého přístupu k repository
  2. Validujte data před uložením do databáze
  3. Logujte důležité operace pro audit trail
  4. Používejte transakce pro komplexní operace
  5. Cachujte často používaná data (seznam bank, kódy)
  6. Handleujte exceptions a poskytujte smysluplné chybové zprávy
  7. Testujte business logiku unit testy

Poznámky​

  • Service je singleton per request
  • Všechny metody respektují ACL
  • Hooks jsou spouštěny v definovaném pořadí
  • Events jsou asynchronní (pokud je enabled message queue)