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:
- Načte nastavení banky
- Kontroluje
enableAlertUsers - Získá seznam uživatelů a týmů
- 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
- Vždy používejte Service layer místo přímého přístupu k repository
- Validujte data před uložením do databáze
- Logujte důležité operace pro audit trail
- Používejte transakce pro komplexní operace
- Cachujte často používaná data (seznam bank, kódy)
- Handleujte exceptions a poskytujte smysluplné chybové zprávy
- 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)