This commit is contained in:
2026-04-22 13:01:47 +02:00
commit 803acf3da3
14 changed files with 1101 additions and 0 deletions

69
Kontakty.md Normal file
View File

@@ -0,0 +1,69 @@
# Kontakty a CRM
## Model Contact
`App\Models\Contact` tabulka `contacts`
| Sloupec | Typ | Popis |
|---------|-----|-------|
| `id` | bigint | PK |
| `team_id` | bigint | Příslušnost k týmu |
| `email` | string | E-mail (unikátní per team) |
| `name` | string | Celé jméno |
| `phone` | string | Telefon |
| `source` | string | Zdroj (`web`, `eshop`, `import`...) |
| `user_id` | string | ID zákazníka v externím systému |
| `tags` | json | Pole tagů |
| `flags` | json | Slovník příznaků (user_id, kampaně...) |
| `traits` | json | Vlastnosti kontaktu |
| `meta` | json | Libovolná metadata |
| `identify_token` | string | Token pro identifikaci z emailového odkazu |
| `last_activity_at` | timestamp | Poslední aktivita |
| `email_opt_out_at` | timestamp | Datum odhlášení z emailů |
| `internal` | boolean | Interní kontakt (nezapočítává se do statistik) |
| `smartemailing_id` | int | ID v SmartEmailing |
| `vario_ids` | json | ID záznamu v Vario ERP |
## Identifikace (IdentityLinker)
`App\Services\Tracking\IdentityLinker` zajišťuje propojení anonymního `visitor_id` s `Contact`:
```
visitor_id ──► visitor_identities ──► contact_id
```
### Metody
- **`identify($teamId, $data)`** párování podle emailu; vytvoří kontakt pokud neexistuje; backfilluje `contact_id` ke starším eventům
- **`identifyByToken($teamId, $data)`** párování přes `ftclid` (click token z emailové kampaně); dohledá `EmailCampaignSend``Contact`
- **`contactIdForVisitor($teamId, $visitorId)`** rychlý lookup mapping
## Segmenty
`Segment` sdružuje kontakty do skupiny. Každý segment má:
- **`FunnelColumn`** sloupce (stavy), ve kterých se kontakt nachází (Kanban-style)
- **`FunnelRule`** pravidla pro přechod mezi sloupci
- **`FunnelState`** aktuální stav konkrétního kontaktu v segmentu
## Tagy
Kontakty lze tagovat. Tagy jsou uloženy jako JSON pole. Přidávání tagů probíhá přes:
- `SetTagDriver` (akce automace)
- `SmartEmailingAddTagDriver` (sync do SmartEmailing)
- Automaticky při kliknutí na kampaňový email (`email_campaign:{id}`)
## Import kontaktů
- **CSV import** `ContactsImportCsv` Livewire + `JsonContactImporter`
- **Vario sync** `VarioSyncContacts` command / `SyncVarioContactsJob`
- **SmartEmailing webhook** `SmartEmailingWebhookController`
## Firmy (Company)
Kontakty mohou být přiřazeny k firmám (`Company` model). Firmy se synchronizují z Vario ERP přes `VarioSyncCompanies`.
## Odhlášení z emailů
- `email_opt_out_at` globální odhlášení
- `EmailCategoryUnsubscribe` odhlášení z konkrétní kategorie emailů
- Unsubscribe link vede na `UnsubscribeController` nebo `EmailUnsubscribeController` (TOR-friendly doména)