Frontend - Klientská část
Dokumentace frontendové části modulu Banking - views, handlery, komponenty a uživatelské rozhraní.
Architektura
Frontend modul Banking je postaven na frameworku EspoCRM a používá:
- TypeScript/JavaScript - Pro logiku
- Backbone.js - Model-View architektura
- Handlebars - Templating engine
- Bull - Frontend view framework
Struktura
client/src/
├── handlers/ # Event handlery a custom logika
│ ├── bank-account/
│ └── bank-transaction/
└── views/ # Custom views a komponenty
├── bank/
├── bank-account/
│ └── fields/
│ └── credential.ts
└── bank-transaction/
Views (Pohledy)
Bank Views
BankAccount Fields - Credential
Soubor: client/src/views/bank-account/fields/credential.ts
Typ: Custom field view
Účel: Speciální zobrazení a editace credentials pro bankovní účty
Funkce:
- Výběr typu credentials (UniCredit, ČSOB, atd.)
- Dynamické načítání formuláře podle typu banky
- Validace přihlašovacích údajů
- Zobrazení stavu připojení k API
Použití:
// Registrace v metadata
{
"credential": {
"type": "linkParent",
"view": "banking:views/bank-account/fields/credential"
}
}
Vlastnosti:
- Podporuje všechny typy credentials (UniCredit, ČSOB, Česká spořitelna, VÚB)
- Real-time validace
- Indikace aktivního/neaktivního připojení
- Tooltip s nápovědou
Bank Views
Cesta: client/src/views/bank/
Custom views pro entitu Bank:
- Speciální zobrazení kontaktních údajů
- Správa notifikací
- Seznam účtů a transakcí
BankAccount Views
Cesta: client/src/views/bank-account/
Custom views pro entitu BankAccount:
- Zobrazení zůstatku s formátováním
- Status indikátor připojení k API
- Tlačítko pro manuální stažení transakcí
BankTransaction Views
Cesta: client/src/views/bank-transaction/
Custom views pro entitu BankTransaction:
- Barevné označení typu (příchozí/odchozí)
- Indikátor spárování s fakturou
- Zobrazení detailu protiúčtu
Handlers (Event handlery)
BankAccount Handlers
Cesta: client/src/handlers/bank-account/
Event handlery pro BankAccount:
- Validace formátu čísla účtu
- Automatické doplnění IBAN
- Kontrola dostupnosti API
Příklad: Validace čísla účtu
export default class BankAccountNumberHandler {
onFieldChange(field: string, value: any) {
if (field === 'bankAccountNumber') {
this.validateBankAccountNumber(value);
}
}
validateBankAccountNumber(value: string) {
// Validační logika
const pattern = /^\d{6}-\d{10}\/\d{4}$/;
return pattern.test(value);
}
}
BankTransaction Handlers
Cesta: client/src/handlers/bank-transaction/
Event handlery pro BankTransaction:
- Automatické párování při změně VS
- Aktualizace statusu faktury
- Notifikace při nepárované transakci
Příklad: Párování s fakturou
export default class InvoiceMatchingHandler {
onFieldChange(field: string, value: any) {
if (field === 'variableSymbol') {
this.findMatchingInvoice(value);
}
}
async findMatchingInvoice(vs: string) {
// Logika hledání faktury
const invoices = await this.findInvoices(vs);
if (invoices.length === 1) {
this.model.set('invoice', invoices[0]);
}
}
}
Komponenty
BankAccountNumber Field
Speciální field pro zobrazení a editaci čísla bankovního účtu
Features:
- Formátování:
prefix-number/bankCode - Validace formátu
- Automatické doplnění banky podle kódu
- Tooltip s plným IBAN
Currency Display
Zobrazení finančních částek s formátováním
Features:
- Správné zobrazení měny
- Zaokrouhlení podle nastavení
- Barevné označení (příjem zelená, výdaj červená)
- Převod měn
Dynamic Logic
BankAccount Dynamic Logic
{
"fields": {
"iban": {
"visible": {
"conditionGroup": [
{
"type": "equals",
"attribute": "type",
"value": "foreign"
}
]
}
},
"swift": {
"visible": {
"conditionGroup": [
{
"type": "equals",
"attribute": "type",
"value": "foreign"
}
]
}
}
}
}
Logika:
- IBAN a SWIFT se zobrazí pouze pro zahraniční účty
- Credential field se aktivuje, když je vybrána banka s API
BankTransaction Dynamic Logic
{
"fields": {
"cardNumber": {
"visible": {
"conditionGroup": [
{
"type": "equals",
"attribute": "transactionType",
"value": "Card"
}
]
}
},
"cardHolder": {
"visible": {
"conditionGroup": [
{
"type": "equals",
"attribute": "transactionType",
"value": "Card"
}
]
}
}
}
}
Logika:
- Pole pro karty se zobrazí pouze pro kartové transakce
- Pole pro faktury se zobrazí podle typu transakce (příchozí/odchozí)
Action Buttons
BankAccount Actions
Download Transactions
Label: "Stáhnout transakce" Action: Manuální stažení transakcí z API
actionDownloadTransactions() {
this.ajaxPostRequest(`BankAccount/action/downloadTransactions`, {
id: this.model.id
}).then(() => {
Espo.Ui.success(this.translate('Downloaded', 'labels', 'Banking'));
this.model.fetch();
});
}
Test Connection
Label: "Test připojení" Action: Otestování připojení k bankovnímu API
actionTestConnection() {
this.ajaxPostRequest(`BankAccount/action/testConnection`, {
id: this.model.id
}).then((result) => {
if (result.success) {
Espo.Ui.success('Connection successful');
} else {
Espo.Ui.error('Connection failed: ' + result.message);
}
});
}
BankTransaction Actions
Pair with Invoice
Label: "Spárovat s fakturou" Action: Manuální spárování s fakturou
actionPairWithInvoice() {
this.createView('dialog', 'banking:views/modals/select-invoice', {
scope: 'Invoice',
filters: {
variableSymbol: this.model.get('variableSymbol')
}
}, (view) => {
view.render();
});
}
List Views
Bank List
- Zobrazení názvu, kódu a API statusu
- Filtr podle API podpory
- Rychlé akce: Editace, Smazání
BankAccount List
- Zobrazení čísla účtu, banky a zůstatku
- Filtr podle typu (domácí/zahraniční)
- Filtr podle aktivního stavu
- Barevné označení neaktivních účtů
- Rychlé akce: Stáhnout transakce, Editace
BankTransaction List
- Zobrazení data, typu, částky a protiúčtu
- Filtr podle typu (příchozí/odchozí)
- Filtr podle spárování s fakturou
- Filtr "Faktura nenalezena"
- Barevné označení:
- Zelená: Příchozí
- Červená: Odchozí
- Oranžová: Nepárováno
- Rychlé akce: Spárovat s fakturou, Detail
Detail Views
Bank Detail
Panels:
- Přehled - Základní informace, kontakty
- Notifikace - Nastavení upozornění
- Adresy - Fakturační a doručovací adresa
- Bankovní účty - Panel se seznamem účtů
- Aktivity - CRM aktivity
BankAccount Detail
Panels:
- Přehled - Číslo účtu, IBAN, typ, zůstatek
- API přístup - Credentials, status připojení
- Banka - Detail banky
- Transakce - Panel se seznamem transakcí
- Historie - Změny a aktualizace
Special Features:
- Real-time aktualizace zůstatku
- Indikátor poslední synchronizace
- Graf vývoje zůstatku (pokud je aktivní)
BankTransaction Detail
Panels:
- Přehled - Částka, datum, typ, účet
- Protiúčet - Detail protistrany
- Symboly - VS, KS, SS
- Faktury - Propojené faktury
- Karta - Detail karty (pokud je kartová transakce)
- Zdrojový e-mail - Pokud importováno z mailu
Special Features:
- Barevné označení typu
- Status indikátor párování
- Link na fakturu
- Historie změn
Modals (Dialogy)
Select Invoice Modal
Dialog pro výběr faktury k transakci
Features:
- Filtrování podle VS
- Zobrazení částky a splatnosti
- Preview faktury
- Možnost odpojit stávající fakturu
Credential Setup Modal
Dialog pro nastavení credentials
Features:
- Formulář podle typu banky
- Validace přihlašovacích údajů
- Test připojení
- Nápověda a dokumentace
Notifications
Toast Notifikace
Success
Espo.Ui.success(this.translate('transactionDownloaded', 'messages', 'Banking'));
Error
Espo.Ui.error(this.translate('downloadFailed', 'messages', 'Banking'));
Warning
Espo.Ui.warning(this.translate('invoiceNotFound', 'messages', 'Banking'));
Desktop Notifikace
Pokud je povoleno v nastavení, zobrazí se desktop notifikace při:
- Nové transakci
- Spárování s fakturou
- Chybě stahování
Rozšiřitelnost
Custom Field View
import BaseFieldView from 'views/fields/base';
export default class CustomBankingField extends BaseFieldView {
setup() {
super.setup();
// Custom setup
}
afterRender() {
super.afterRender();
// Custom rendering
}
}
Custom Handler
export default class CustomHandler {
constructor(view) {
this.view = view;
}
onFieldChange(field, value) {
// Custom logic
}
}
Rozšíření existující view
import Original from 'banking:views/bank-account/detail';
export default class Extended extends Original {
setup() {
super.setup();
// Přidat vlastní logiku
}
}
Styling
CSS Classes
Bank Transaction Types
.badge-incoming {
background-color: #28a745;
}
.badge-outgoing {
background-color: #dc3545;
}
.badge-unpaired {
background-color: #fd7e14;
}
Bank Account Status
.bank-account-active {
color: #28a745;
}
.bank-account-inactive {
color: #6c757d;
}
Performance
Optimalizace
- Lazy loading pro velké seznamy transakcí
- Debounce pro validaci polí
- Cache pro často používané entity
- Batch loading pro related records
Best Practices
- Používejte
noLoad: truepro large collections - Implementujte pagination pro seznamy
- Cache API responses kde je to možné
- Minimize re-renders
Testování
Unit testy
describe('BankAccountNumberField', () => {
it('should validate correct format', () => {
const field = new BankAccountNumberField();
expect(field.validate('123456-1234567890/0800')).toBe(true);
});
});
Integration testy
describe('Invoice Pairing', () => {
it('should pair transaction with invoice', async () => {
// Test logika
});
});
Poznámky
- Všechny custom views by měly extendovat příslušné base views
- Type annotations jsou důležité pro TypeScript files
- Používejte translation keys místo hardcoded textů
- Event handlers by měly být debounced pro performance