77 lines
2.5 KiB
Markdown
77 lines
2.5 KiB
Markdown
# Košíky (FunnelCart)
|
||
|
||
## Model
|
||
|
||
`App\Models\FunnelCart` – tabulka `funnel_carts`
|
||
|
||
| Sloupec | Typ | Popis |
|
||
|---------|-----|-------|
|
||
| `id` | bigint | PK |
|
||
| `team_id` | bigint | Příslušnost k týmu |
|
||
| `tracking_site_id` | bigint | Příslušný web/eshop |
|
||
| `visitor_id` | string | ID anonymního návštěvníka |
|
||
| `contact_id` | bigint | Propojený kontakt (nullable) |
|
||
| `status` | string | `open` / `empty` / `converted` / `expired` |
|
||
| `items` | json | Pole položek košíku |
|
||
| `currency` | string | ISO kód měny |
|
||
| `total_no_tax` | decimal | Celková suma bez DPH |
|
||
| `shipping_fee_no_tax` | decimal | Cena dopravy bez DPH |
|
||
| `cod_fee_no_tax` | decimal | Poplatek za dobírku bez DPH |
|
||
| `shipping_label` | string | Název dopravce |
|
||
| `first_seen_at` | timestamp | Kdy košík vznikl |
|
||
| `last_seen_at` | timestamp | Poslední aktivita |
|
||
| `completed_at` | timestamp | Kdy byl dokončen |
|
||
| `is_completed` | boolean | Flag dokončení |
|
||
| `is_expired` | boolean | Flag expirování |
|
||
|
||
## Formát položky košíku (`items[]`)
|
||
|
||
```json
|
||
{
|
||
"code": "PROD-001",
|
||
"name": "Název produktu",
|
||
"qty": 2,
|
||
"unit_no_tax": 99.00,
|
||
"total_no_tax": 198.00,
|
||
"url": "https://eshop.cz/produkt",
|
||
"package": {}
|
||
}
|
||
```
|
||
|
||
## Stavy košíku
|
||
|
||
```
|
||
open – košík má položky, zákazník nakupuje
|
||
empty – košík byl vyprázdněn
|
||
converted – objednávka dokončena
|
||
expired – košík expiroval (job ExpireFunnelCarts)
|
||
```
|
||
|
||
## Browser tracking (collect.js)
|
||
|
||
Košíky z prohlížeče jdou přes dva endpointy:
|
||
|
||
- **`POST /api/cart`** – `CartController` – upsert košíku (event `cart_upsert`)
|
||
- **`POST /api/cart/complete`** – `CartCompleteController` – dokončení (event `cart_completed`)
|
||
|
||
Deduplikace přes `external_event_id` ve formátu `cart:{id}:cart_upsert:{hash}` kde hash je SHA1 z obsahu (kódy produktů, množství, ceny, měna).
|
||
|
||
## Server-to-server (eshop API)
|
||
|
||
Viz samostatná stránka [Integrace Eshop API](Integrace-Eshop-API).
|
||
|
||
- **`POST /api/eshop/cart`** – `EshopCartController` – párování podle emailu
|
||
- **`POST /api/eshop/order`** – `EshopOrderController` – dokončení podle emailu
|
||
|
||
## Expirování košíků
|
||
|
||
Job `ExpireFunnelCartsJob` (command `ExpireFunnelCarts`) pravidelně označuje staré otevřené košíky jako `expired`.
|
||
|
||
## Statistiky
|
||
|
||
Denní statistiky košíků se agregují do:
|
||
- `campaign_cart_daily_stats` – košíky per kampaň
|
||
- `product_group_cart_daily_stats` – košíky per produktová skupina
|
||
|
||
Rebuild přes command `RebuildCampaignCartDailyStats` / `RebuildProductGroupCartDailyStats`.
|