Compare commits
24
Commits
0f3c608d86
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8f6d1bcaa | ||
|
|
533d05e8dd | ||
|
|
9beb63dbee | ||
|
|
bbaddf92ce | ||
|
|
d38530821c | ||
|
|
74de3d37dd | ||
|
|
1ab63d6ba0 | ||
|
|
7c7833bdef | ||
|
|
bc27fe696b | ||
|
|
74146c1ad8 | ||
|
|
0058493a54 | ||
|
|
782541338c | ||
|
|
86df1bf0b0 | ||
|
|
6374e0502f | ||
|
|
e2b4fec2a3 | ||
|
|
17b4665e23 | ||
|
|
bf2c58f90a | ||
|
|
f491b393d7 | ||
|
|
81375b3dd3 | ||
|
|
608d39a4f2 | ||
|
|
332e6d20f4 | ||
|
|
84d8a21d38 | ||
|
|
e9c363639f | ||
|
|
1a6eaa69fe |
@@ -0,0 +1,265 @@
|
||||
# SOGo Mail Filter Agent
|
||||
|
||||
Ucel: pomahat se spravou sdilene schranky `info@9b-plus.com` v SOGo na `mail.ma-al.com`, hlavne s tridicimi filtry, slozkami a bezpecnou analyzou dorucene posty.
|
||||
|
||||
## Bezpecnostni pravidla
|
||||
|
||||
- Nikdy nechtit heslo v chatu. Uzivatel se prihlasuje sam v prohlizeci.
|
||||
- Bez vyslovneho souhlasu nemazat zpravy, nemazat filtry, neposilat e-maily a nezapinat preposilani.
|
||||
- Pred kazdou vetsi upravou ulozit/exportovat aktualni stav do `docs/`.
|
||||
- Pri praci ve webmailu rozlisovat analyzu, navrh a skutecne ulozeni zmen.
|
||||
- Pri zmene filtru vzdy po ulozeni overit aspon nekolik vzorku z ruznych casti seznamu.
|
||||
- Pokud filtr pouziva OR logiku (`odpovidaji nekteremu z nasledujicich pravidel`), neupravovat ho stejnym zpusobem jako AND filtry bez samostatneho posouzeni.
|
||||
|
||||
## Aktualni stav po upravach 2026-08-06
|
||||
|
||||
Slozky byly sjednocene do citelnejsi struktury:
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `02 - Objednavky zakaznici`
|
||||
- `03 - B2B objednavky`
|
||||
- `04 - B2B faktury a doklady`
|
||||
- `05 - Dopravci - dorucovani`
|
||||
- `06 - Dopravci - dobirky a faktury`
|
||||
- `07 - Reklamace`
|
||||
- `08 - Recenze`
|
||||
- `09 - Marketing a platformy`
|
||||
- `90 - Archiv vyrizeno`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
Slozky `01 - Akcni - k reseni`, `07 - Reklamace` a `99 - Automaticky odfiltrovano` byly dodatecne presunuty pod `Dorucena posta`, aby byly vsechny hlavni pracovni slozky v jedne strukture.
|
||||
|
||||
Zpravy z `Kos` byly presunuty do `99 - Automaticky odfiltrovano`. Kos byl po presunu prazdny.
|
||||
|
||||
Filtry byly prejmenovane do citelneho formatu:
|
||||
|
||||
`CILOVA_SLOZKA - ZDROJ - TYP_ZPRAVY`
|
||||
|
||||
Priklad:
|
||||
|
||||
`05 Dopravci dorucovani - GLS - doruceno`
|
||||
|
||||
## Logika proti schovani odpovedi
|
||||
|
||||
Bezna automaticka pravidla maji mit ochranu, aby neschovala zive odpovedi od lidi.
|
||||
|
||||
Doplnena podminka:
|
||||
|
||||
- pole: `Predmet`
|
||||
- operator: `neodpovida regularnimu vyrazu`
|
||||
- hodnota: `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
|
||||
Vyznam: pokud predmet zacina `RE:`, `Re:`, `AW:`, `Aw:`, `FWD:` nebo `Fwd:`, filtr se nema spustit.
|
||||
|
||||
Tato ochrana je doplnena do 60 beznych AND filtru.
|
||||
|
||||
Zamerne vynechany filtr:
|
||||
|
||||
- `99 Automaticky odfiltrovano - Spam domeny - blokovani`
|
||||
|
||||
Duvod: pouziva OR logiku. Stejna podminka by tam nebyla spolecnym guardem pro vsechny vetve.
|
||||
|
||||
## Dulezite soubory
|
||||
|
||||
Pred dalsi praci si vzdy precist:
|
||||
|
||||
- `docs/mail-sogo-current-filters-2026-08-07.json`
|
||||
- `docs/mail-sogo-current-filters-summary-2026-08-07.md`
|
||||
- `docs/mail-sogo-filter-lookup-2026-08-07.json`
|
||||
- `docs/mail-sogo-change-log-2026-08-06.md`
|
||||
- `docs/mail-sogo-current-filter-additions-2026-08-07.json`
|
||||
- `docs/mail-sogo-reply-guard-log-2026-08-06.md`
|
||||
- `docs/mail-sogo-folder-inbox-move-log-2026-08-06.md`
|
||||
- `docs/mail-sogo-filter-change-plan-2026-08-06.md`
|
||||
- `docs/mail-sogo-filter-rename-map-2026-08-06.md`
|
||||
|
||||
Zaloha puvodniho stavu:
|
||||
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.json`
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.md`
|
||||
- `docs/mail-sogo-audit-2026-08-06.md`
|
||||
|
||||
Aktualni live snapshot:
|
||||
|
||||
- `docs/mail-sogo-current-filters-2026-08-07.json`
|
||||
- Vytvoren 2026-08-07 ze SOGo `Preferences#!/mailer`.
|
||||
- Obsahuje 68 aktualnich filtru, vcetne poslednich novych pravidel z 2026-08-07.
|
||||
- Audit byl read-only: kazdy filtr byl otevren, precten a zavren pres `STORNO`; v SOGo se nic neukladalo.
|
||||
- 67 filtru ma reply guard `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`.
|
||||
- Jedina zamerna vyjimka je `99 Automaticky odfiltrovano - Spam domeny - blokovani`, protoze pouziva OR logiku.
|
||||
- Pro rychle hledani existujicich pravidel pouzit `docs/mail-sogo-filter-lookup-2026-08-07.json`; obsahuje index podle odesilatele, cilove slozky a predmetovych frazi.
|
||||
|
||||
## Odpovidani na zakaznicke e-maily
|
||||
|
||||
Pri priprave odpovedi v SOGo platí stejna bezpecnostni pravidla jako u filtru:
|
||||
|
||||
- Nikdy neposilat e-mail bez vyslovneho potvrzeni uzivatele v danem okamziku.
|
||||
- Pokud uzivatel chce draft, pripravit jen rozepsanou odpoved v SOGo a jasne rict, ze nebyla odeslana.
|
||||
- Pred odpovedi si precist cele vlakno, predmet, objednavku/reference a prilohy, pokud jsou relevantni.
|
||||
- U priloh s fotkami dat uzivateli nestranne hodnoceni: co je jasne videt, co neni prokazane a co je jen pravdepodobne.
|
||||
- Odpovidat slusne, vecne a zakaznicky; neobvinovat zakaznika a nepsat zbytecne ostre formulace.
|
||||
- Uznat problem, ktery je z podkladu jasny, i kdyz ostatni cast reklamace neni prokazana.
|
||||
- Nepriznavat vinu nebo zavazek nad ramec toho, co uzivatel schvalil.
|
||||
- Kdyz je vhodne nabidnout reseni, preferovat konkretni dalsi krok: potvrzeni vraceni, Packomat/parcel locker, instrukce, refund po prijeti a kontrole.
|
||||
- Neprepisovat adresy, osobni udaje ani detaily objednavky do finalni odpovedi, pokud to neni nutne.
|
||||
|
||||
### Vzor logiky pro reklamaci PVUQEDGMH
|
||||
|
||||
Email: `Complaint - Item Received in Used/Damaged Condition (Order reference number PVUQEDGMH)`
|
||||
|
||||
Zjisteni:
|
||||
|
||||
- Zakaznice tvrdi, ze krabice byla poskozena a lezecky vypadaly pouzite.
|
||||
- Z fotek je krabice jasne poskozena.
|
||||
- Na samotnych lezeckach nebyla z fotek videt jasna vada ani jednoznacne znamky lezeni/pouziti.
|
||||
- Vhodna odpoved: omluvit se za stav baliku/krabice, vecne rict, ze na fotkach neni videt jasna vada bot, ale respektovat obavu zakaznice.
|
||||
- Nabidka: pokud chce zbozi vratit, zaridit bezplatne vraceni pres Packomat / parcel locker a po prijeti a kontrole vratit penize.
|
||||
|
||||
Pouzitelny ton:
|
||||
|
||||
`We are sorry that the parcel and the shoe box arrived in this condition. From the photos, the box is clearly damaged. Regarding the climbing shoes themselves, we do not see any clear visible defect or obvious signs of actual climbing use on the photos, but we understand your concern. If you would like to return the item, we can arrange a free return via a parcel locker / Packomat.`
|
||||
|
||||
## Postup pro pristi upravy
|
||||
|
||||
1. Nejdriv zjistit cil: analyza, navrh, nebo realna uprava.
|
||||
2. Pokud jde o realnou upravu, potvrdit rozsah a zakazane akce.
|
||||
3. Pred zmenami ulozit aktualni stav do noveho souboru v `docs/`.
|
||||
4. U filtru zkontrolovat:
|
||||
- nazev
|
||||
- rezim shody AND/OR
|
||||
- podminky
|
||||
- cilovou slozku
|
||||
- zda uz existuje reply guard
|
||||
5. Neduplicovat filtry, pokud jde sloucit logiku citelneji.
|
||||
6. Po ulozeni overit vzorky z zacatku, stredu a konce seznamu.
|
||||
7. Dopsat zmeny do change logu.
|
||||
|
||||
## Rychly postup: pridani noveho SOGo filtru
|
||||
|
||||
Pouzivat, kdyz uzivatel odsouhlasi konkretni novy filtr.
|
||||
|
||||
Komunikace:
|
||||
|
||||
- Pri opakovanych rutinnich filtrech minimalne psat do chatu.
|
||||
- Nezahlcovat uzivatele prubeznymi technickymi vypisy.
|
||||
- Napsat jen kratce, ze filtr pridavam, a na konci potvrdit hotovo.
|
||||
- Pokud se UI nezasekne, postup ma byt hotovy zhruba do 1 minuty.
|
||||
- DOM vypisy delat jen pri chybe nebo kdyz se zmeni SOGo UI.
|
||||
|
||||
1. Otevrit SOGo predvolby primo:
|
||||
- `https://mail.ma-al.com/SOGo/so/info@9b-plus.com/Preferences#!/mailer`
|
||||
2. Kliknout vnitrni zalozku `TRIDENI`.
|
||||
- SOGo pro ni nema samostatnou normalni URL; je to Angular Material tab uvnitr `#!/mailer`.
|
||||
- Rychle pres browser automation: najit `md-tab-item` s textem `TRIDENI`, pripadne kliknout posledne zname `#tab-item-135`, pokud stale sedi.
|
||||
- Po kliknuti overit, ze stranka obsahuje seznam filtru a tlacitko `VYTVORIT FILTR`.
|
||||
3. Kliknout `VYTVORIT FILTR`.
|
||||
4. Vyplnit formular:
|
||||
- `Jmeno filtru`
|
||||
- ponechat rezim `odpovidaji vsem nasledujicim pravidlum`, pokud uzivatel nevyslovne chce OR logiku
|
||||
- pridavat podminky tlacitkem `Pridat podminku`
|
||||
- pro bezne filtry pridat reply guard:
|
||||
- pole `Predmet`
|
||||
- operator `neodpovida regularnimu vyrazu`
|
||||
- hodnota `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
- pridat akci tlacitkem `Pridat akci`
|
||||
- defaultni akce `Uloz zpravu do slozky` je obvykle spravne
|
||||
- vybrat cilovou slozku, napr. `03 - B2B objednavky`
|
||||
5. Pred potvrzenim dialogu povinne zkontrolovat hodnoty primo ve formulari:
|
||||
- nazev filtru
|
||||
- vsechny podminky
|
||||
- cilovou slozku
|
||||
- tlacitko `OK` nesmi byt disabled
|
||||
6. Kliknout `OK`.
|
||||
7. Pred hlavnim ulozenim overit, ze se novy filtr pridal do seznamu:
|
||||
- pocet filtru se zvysil o 1
|
||||
- nazev je mezi `input[aria-label="Jmeno filtru"]`
|
||||
8. Kliknout hlavni plovouci tlacitko `save` v predvolbach.
|
||||
9. Overit toast `Predvolby ulozeny`.
|
||||
10. Znovu overit, ze filtr zustal v seznamu a pocet filtru sedi.
|
||||
11. Zapsat lokalni evidenci:
|
||||
- pridat zaznam do `docs/mail-sogo-current-filter-additions-YYYY-MM-DD.json`
|
||||
- zapsat kratky log do `docs/mail-sogo-change-log-2026-08-06.md`
|
||||
- pokud jde o dulezitou zmenu procesu, doplnit tuto agents poznamku
|
||||
|
||||
Prakticke poznamky:
|
||||
|
||||
- Neklikat na `mailcow Predvolby`; to vede na `https://mail.ma-al.com/user` a muze skoncit login obrazovkou mimo SOGo.
|
||||
- Horni ikona `Predvolby` v SOGo ma spravny odkaz `/SOGo/so/info@9b-plus.com/Preferences`, ale nejrychlejsi je jit primo na URL z bodu 1.
|
||||
- SOGo po kliknuti `OK` nemusi ukazat novy filtr ve viditelnem textu, proto kontrolovat hodnoty inputu v DOMu.
|
||||
- Pro pridavani podminek a akci pouzivat spolehlive fyzicke kliknuti na tlacitka `Pridat podminku` / `Pridat akci`, kdyz locator podle textu zlobí.
|
||||
- Neprochazet znovu vsech 61+ filtru v SOGo UI, pokud uzivatel posila jasny novy filtr a neni duvod kontrolovat duplicitu primo v UI.
|
||||
- Lokalne ulozene JSON/MD evidence filtru klidne rychle projit; je to rychle a neblokuje praci.
|
||||
- Kontrolu duplicity delat rychle hlavne podle lokalni evidence a zjevne podobneho existujiciho pravidla.
|
||||
- Stare zalohy `docs/mail-sogo-old-settings-2026-08-06.json` neprepisovat. Nove pridane filtry evidovat v samostatnem current/additions JSON.
|
||||
- Stare filtry nemazat jen proto, ze vznikl novy filtr. Mazani/vypinani starych filtru vzdy jen po samostatnem potvrzeni uzivatelem.
|
||||
|
||||
## Hromadny presun starych zprav podle existujicich filtru
|
||||
|
||||
Kdyz uzivatel chce uklidit stare e-maily, ktere uz odpovidaji existujicim filtrum, nedelat to po jednom. Postupovat po davkach podle existujicich pravidel.
|
||||
|
||||
Bezpecny postup v SOGo:
|
||||
|
||||
1. Otevrit hledani v `Dorucena posta`.
|
||||
2. Vyhledat presny text podle existujiciho filtru.
|
||||
3. Zkontrolovat pocet vysledku, napr. `98 zpravy`.
|
||||
4. Kliknout nejdrive na jeden radek / vyber zpravy, aby se v SOGo probudil toolbar vyberu.
|
||||
5. Kliknout `Vybrat vse`.
|
||||
6. Povinne overit, ze SOGo skutecne ukazuje napr. `98 vybrano`.
|
||||
7. Teprve potom pouzit `Dalsi moznosti zprav` -> `Presunout do` -> cilova slozka.
|
||||
8. Po presunu overit, ze vysledky hledani zmizely nebo ukazuji `Zadna zprava`.
|
||||
|
||||
Dulezite pouceni:
|
||||
|
||||
- Nestaci, ze je videt tlacitko `Vybrat vse`; SOGo nekdy zobrazi toolbar, ale realne je porad `0 vybrano`.
|
||||
- Pred presunem musi byt vzdy potvrzen konkretni pocet `X vybrano`.
|
||||
- Pokud po presunu vysledky zustanou videt, presun se pravdepodobne neprovedl; netvrdit hotovo a znovu overit vyber.
|
||||
- Pokud hledani vrati podezrele moc vysledku, davku nevybirat ani nepresouvat. U beznych uklidu pouzivat pojistku na maximalni pocet vysledku.
|
||||
- Dotaz `Last week's updates in your shared folders` pro Dropbox v SOGo jednou vratil cely Inbox misto Dropbox vysledku. Dropbox neuklizet pres bezne hledani bez rucni kontroly nebo uzsiho overeneho dotazu.
|
||||
- Nevytvaret nove filtry behem tohoto uklidu. Nove filtry se navrhuji az po sesbirani dat.
|
||||
- Nejasne nebo zive konverzace s `RE:`, `AW:`, `FWD:` nepresouvat automaticky, pokud to neni vyslovne soucast existujiciho a schvaleneho pravidla.
|
||||
|
||||
Overene davky z 2026-08-06:
|
||||
|
||||
- `PPL - Prevzali jsme Vasi/vasi zasilku`: 41 zprav -> `05 - Dopravci - dorucovani`
|
||||
- `DPD - Vas balicek je na ceste`: 98 zprav -> `05 - Dopravci - dorucovani`
|
||||
- `Pinguin - Potvrzeni objednavky ze systemu B2B`: 12 zprav -> `03 - B2B objednavky`
|
||||
- `Sea to Summit Order Confirmation Order`: 14 zprav -> `03 - B2B objednavky`
|
||||
- `Zasilkovna - Prehled vybranych dobirek`: 229 zprav -> `99 - Automaticky odfiltrovano`
|
||||
|
||||
## Dalsi doporucene prace
|
||||
|
||||
- Najit duplicity hlavne u DPD, GLS, PPL, Zasilkovny, Fio a Vertone.
|
||||
- Vertone meni B2B rezim. Nove zpravy z `noreply@vert1.cz` s predmetem `Objednavka ... byla prave vyrizena` se tridi novym filtrem `03 B2B objednavky - Vertone - objednavka vyrizena`. Stare Vertone filtry zatim nemazat; casem je vypnout nebo smazat az po potvrzeni uzivatelem.
|
||||
- Rozhodnout, jestli spamovy OR filtr nechat jako blacklist, nebo ho rozdelit na citelnejsi samostatne filtry.
|
||||
- Pri budoucim napojeni Maalflows na e-mail pouzit radsi API/IMAP pristup s minimalnimi pravy nez sdileni hesla v chatu.
|
||||
- Pri kazdem dalsim presunu slozek zkontrolovat filtry: SOGo muze po presunu zmenit cil akce na placeholder `Postovni schranka`.
|
||||
|
||||
## Rucni spam workflow
|
||||
|
||||
Od 2026-08-06 existuje pod `Dorucena posta` slozka:
|
||||
|
||||
- `10 - Spam ke kontrole`
|
||||
|
||||
Ucel slozky:
|
||||
|
||||
- Uzivatel do ni rucne presouva zpravy, ktere povazuje za spam.
|
||||
- Slozka nema sama o sobe spoustet zadny automaticky filtr.
|
||||
- Pri pravidelne kontrole ma agent projit vzorky z teto slozky a najit opakujici se adresy, domeny, predmety a fraze.
|
||||
- Agent ma nejdrive navrhnout zmeny spam filtru a vysvetlit riziko false-positive.
|
||||
- Az po vyslovnem potvrzeni uzivatele muze agent upravit SOGo spam filtr.
|
||||
- Novy spam filtr muze nove zachycene spamy presouvat do `Kos`, ne mazat trvale.
|
||||
- Po uprave spam filtru ma agent zapsat zmenu do `docs/` a overit par vzorku.
|
||||
|
||||
Bez potvrzeni uzivatele agent nesmi mazat zpravy ze slozky `10 - Spam ke kontrole` ani menit spam filtr.
|
||||
|
||||
### Spam filter policy
|
||||
|
||||
- Slozka `10 - Spam ke kontrole` znamena uzivatelem potvrzeny spam.
|
||||
- Pri navrhu pravidel primarne pouzivat `Odesilatel je rovno konkretni@email` nebo `Odesilatel obsahuje @domena`.
|
||||
- Nove potvrzene spam adresy/domeny standardne nepridavat jako samostatny filtr. Slucovat je do existujiciho OR blacklist filtru `99 Automaticky odfiltrovano - Spam domeny - blokovani`, pokud uzivatel nechce jinak.
|
||||
- Samostatny spam filtr vytvorit jen vyjimecne: docasny test, jiny cil nez standardni spam workflow, nebo vyslovne prani uzivatele.
|
||||
- Pred navrhem domeneho bloku vzdy porovnat domenu proti aktualnimu lookupu dobrych filtru.
|
||||
- Nikdy neblokovat celou verejnou emailovou domenu typu `gmail.com`, `seznam.cz`, `email.cz`, `centrum.cz`, `volny.cz`, `outlook.com`, `hotmail.com`, `live.com`, `yahoo.com`, `icloud.com`, `proton.me`, `protonmail.com` apod.
|
||||
- U verejnych emailovych domen blokovat jen presnou adresu odesilatele.
|
||||
- Pokud je domena podobna existujicimu dodavateli, dopravci, B2B partnerovi nebo zakaznicke domene, upozornit uzivatele a bez potvrzeni ji neblokovat.
|
||||
- Filtry podle predmetu nebo tela u spamu nepouzivat jako prvni volbu; jen pokud to uzivatel vyslovne odsouhlasi.
|
||||
@@ -1,5 +1,13 @@
|
||||
node_modules/
|
||||
.env
|
||||
dist/
|
||||
build/
|
||||
coverage/
|
||||
test-results/
|
||||
playwright-report/
|
||||
*.sql
|
||||
*.zip
|
||||
config/local.json
|
||||
data/*.sqlite
|
||||
data/*.sqlite-*
|
||||
data/uploads/
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
# MaalFlows Agent
|
||||
|
||||
Purpose: maintain the MaalFlows live chat widget and admin app.
|
||||
|
||||
## Project Shape
|
||||
|
||||
- Main application file: `server.js`.
|
||||
- Frontend assets: `public/widget.js`, `public/admin.js`, `public/admin.html`, `public/preview.html`.
|
||||
- CSS source: `src/styles/tailwind.css` imports specialized admin styles from `src/styles/admin.css` and builds the single served stylesheet `public/tailwind.css`.
|
||||
- Runtime: Node.js without a framework, SQLite through `better-sqlite3`.
|
||||
- Local check command: `npm.cmd run check`.
|
||||
- Production app is proxied by nginx on `app.black-week.cz` to `127.0.0.1:3400`.
|
||||
|
||||
## Work Rules
|
||||
|
||||
- Read the relevant code before editing.
|
||||
- Keep changes small and focused on the user's request.
|
||||
- Do not touch `.agents/sogo-mail-filter-agent.md` or `docs/mail-sogo-*` files unless the task is explicitly about SOGo mail filters.
|
||||
- Preserve existing user changes. Do not reset, checkout, or delete unrelated work.
|
||||
- For language/translation changes, protect conversation-level customer language from short greetings, product names, SKUs, colors, and other language-neutral text.
|
||||
|
||||
## Verification
|
||||
|
||||
Before finishing a code change, run:
|
||||
|
||||
```powershell
|
||||
npm.cmd run verify
|
||||
```
|
||||
|
||||
`verify` runs syntax checks, Tailwind CSS build, and Playwright UI smoke tests. If the change is documentation-only, `npm.cmd run check` is sufficient, but say that explicitly.
|
||||
|
||||
For any meaningful layout or styling change:
|
||||
|
||||
- Start or let Playwright start the local server.
|
||||
- Use Playwright for visual inspection instead of judging only from code.
|
||||
- Check at least desktop and mobile viewports when the UI surface can appear on both.
|
||||
- Inspect screenshots for overlap, broken spacing, unreadable text, and inconsistent controls.
|
||||
- Keep normal Playwright runs headless. Use headed/visible browser only while diagnosing a UI or scraping/browser-automation failure.
|
||||
- If browser automation is added for external sources, choose the browser engine from source configuration, behave slowly and politely, and do not use Playwright to bypass site protections.
|
||||
|
||||
Playwright scripts:
|
||||
|
||||
```powershell
|
||||
npm.cmd run test:ui
|
||||
npm.cmd run test:ui:headed
|
||||
```
|
||||
|
||||
Playwright screenshots and reports are ignored by Git.
|
||||
|
||||
## TailwindCSS
|
||||
|
||||
TailwindCSS is the main styling system for new and refactored UI. The source file is `src/styles/tailwind.css`, built to `public/tailwind.css` with:
|
||||
|
||||
```powershell
|
||||
npm.cmd run build:css
|
||||
```
|
||||
|
||||
Rules:
|
||||
|
||||
- Treat `src/styles/tailwind.css` as the master style source from now on.
|
||||
- `src/styles/admin.css` contains legacy/specialized admin CSS that is imported into the Tailwind build. Do not create or link standalone CSS files for app UI; migrate repeated UI patterns into `src/styles/tailwind.css` component classes instead.
|
||||
- New screens and redesigned sections should be built with Tailwind utility classes or reusable classes from `@layer components`.
|
||||
- Prefer reusable Tailwind component classes in `@layer components` over one-off CSS for repeated controls.
|
||||
- Repeated controls should share the same structure: icon before text, centered text, chevron on the right, consistent icon size/color/alignment, height, padding, border, radius, hover, and focus states.
|
||||
- Panel top bars should share height, border, background, text color, and button styling.
|
||||
- If a master style exists, extend it instead of creating a second variant of the same control.
|
||||
- Dark/light theme changes must apply consistently to sidebars, panels, tables/grids, modals, inputs, and controls.
|
||||
- Data-heavy UI should stay compact, scannable, responsive, and avoid an Excel-like look unless explicitly required.
|
||||
- Wide data workspaces should allow horizontal scrolling when content is wider than the viewport.
|
||||
- Before finishing a UI component change, check similar components for style consistency.
|
||||
|
||||
## Git Workflow
|
||||
|
||||
Project remote:
|
||||
|
||||
```text
|
||||
https://git.ma-al.com/rajch_ales/MaalFlows.git
|
||||
```
|
||||
|
||||
The main branch is `main`.
|
||||
|
||||
After each completed project code change:
|
||||
|
||||
1. Review `git diff`.
|
||||
2. Stage only files that belong to the change.
|
||||
3. Commit with a concise message.
|
||||
4. Push the current branch to `origin`.
|
||||
5. Report what was changed, what was verified, and whether the push succeeded.
|
||||
|
||||
Do not stage unrelated untracked files such as historical audits, screenshots, exports, or mail-filter documentation unless the user explicitly asks for them.
|
||||
|
||||
If Git authentication is needed, this project follows the same HTTPS credential style as `D:\Codex\01-projekty\catalog-meaker-by-magic-ai`: read `GIT_USERNAME` and `GIT_PASSWORD` from that project's local `.env` only for the command that needs them. Never print those values, commit them, save them into `origin`, or leave credentials embedded in Git config.
|
||||
|
||||
## Production Update
|
||||
|
||||
After a successful push, update the production server.
|
||||
|
||||
Production details:
|
||||
|
||||
```text
|
||||
Host: app.black-week.cz
|
||||
SSH user: root
|
||||
SSH key: C:/Users/DELL/.ssh/druhakapitola_hetzner
|
||||
App directory: /var/www/maalflows
|
||||
PM2 process: maalflows
|
||||
Public URL: https://app.black-week.cz/admin
|
||||
```
|
||||
|
||||
Deploy workflow:
|
||||
|
||||
1. SSH to `root@app.black-week.cz` with the `druhakapitola_hetzner` key.
|
||||
2. In `/var/www/maalflows`, check `git status --short` first. Stop if there are unexpected local changes.
|
||||
3. Ensure server `origin` is `https://git.ma-al.com/rajch_ales/MaalFlows.git`.
|
||||
4. Fetch `origin main`. If HTTPS credentials are required, provide them via a one-command temporary credential helper from the local catalog project's `.env`; do not store credentials on the server.
|
||||
5. Run `git merge --ff-only FETCH_HEAD`.
|
||||
6. Run `npm install --omit=dev`.
|
||||
7. Run `npm run check`.
|
||||
8. Run `pm2 restart maalflows`.
|
||||
9. Run `pm2 save`.
|
||||
10. Verify:
|
||||
|
||||
```bash
|
||||
cd /var/www/maalflows && git status --short
|
||||
cd /var/www/maalflows && git log -1 --oneline
|
||||
pm2 describe maalflows
|
||||
curl -s -o /dev/null -w '%{http_code} %{content_type}\n' http://127.0.0.1:3400/admin
|
||||
curl -s -o /dev/null -w '%{http_code} %{content_type}\n' http://127.0.0.1:3400/widget.js
|
||||
curl -k -s -o /dev/null -w '%{http_code} %{content_type}\n' https://app.black-week.cz/admin
|
||||
```
|
||||
|
||||
Expected verification: PM2 status `online`, local `/admin` and `/widget.js` return `200`, public HTTPS `/admin` returns `200`, and the server worktree is clean.
|
||||
@@ -0,0 +1,228 @@
|
||||
# Audit nastaveni SOGo mailboxu info@9b-plus.com
|
||||
|
||||
Datum: 2026-08-06
|
||||
Rezim: pouze analyza, bez mazani, presouvani, ukladani nebo zmen nastaveni
|
||||
Mailbox: info@9b-plus.com
|
||||
Rozhrani: SOGo Groupware / mail.ma-al.com
|
||||
|
||||
## Shrnuti
|
||||
|
||||
Mailbox ma rozsahle rucne nastavene trideni. Aktualne bylo nalezeno 61 filtru, coz uz je dost na to, aby vznikaly duplicity, prekryvy a nejasne chovani pri pridavani dalsich pravidel.
|
||||
|
||||
Hlavni cil neni pridat dalsi filtry, ale sjednotit system:
|
||||
|
||||
- jasne pojmenovani pravidel
|
||||
- mene cilovych slozek, ale s jasnym vyznamem
|
||||
- oddeleni automatickych notifikaci od zive komunikace
|
||||
- omezit nebo nahradit mazaci pravidla bezpecnejsi karantenou
|
||||
- zavest evidenci pravidel, aby se nova pravidla neduplikovala
|
||||
|
||||
## Stav mailboxu
|
||||
|
||||
- Inbox: priblizne 10 347 zprav
|
||||
- Kapacita: priblizne 76 % z 10 240 MB
|
||||
- Riziko: mailbox se blizi prakticke hranici, kde bude vhodne resit archivaci a ukladani velkych priloh
|
||||
|
||||
## Viditelne slozky
|
||||
|
||||
- AAA - vyrizena konverzace
|
||||
- B2B - faktury
|
||||
- B2B - potvrzeni objednavky
|
||||
- B2C - potvrzeni objednavky
|
||||
- Dopravci - dorucovane zasilky
|
||||
- Dopravci - faktury atd.
|
||||
- Google - ADS
|
||||
- Recenze od zakazniku
|
||||
- Koncepty
|
||||
- Odeslana posta
|
||||
- Kos
|
||||
- Nevyzadana posta
|
||||
- Sablony
|
||||
- Archive
|
||||
|
||||
## Obecna nastaveni posty
|
||||
|
||||
- Automaticke oznacovani zprav jako prectene: zapnuto
|
||||
- Oznaceni za prectene: ihned po zobrazeni
|
||||
- Vzdalene inline obrazky: nikdy
|
||||
- Podpis do novych zprav: zapnuto
|
||||
- Podpis do odpovedi: zapnuto
|
||||
- Podpis do preposlanych zprav: zapnuto
|
||||
- Format vytvarenych zprav: HTML
|
||||
- Automaticke ukladani rozepsane zpravy: kazdych 5 minut
|
||||
|
||||
Poznamka: nastaveni vzdalenych obrazku na "Nikdy" je bezpecne. Automaticke oznaceni za prectene ihned po otevreni muze byt problem u sdilene schranky, protoze zprava muze zmizet z pozornosti ostatnich lidi.
|
||||
|
||||
## Stitky
|
||||
|
||||
- Pracovni
|
||||
- Pozdeji
|
||||
- Dulezity
|
||||
- Treba udelat
|
||||
- Odeslano potvrzeni o precteni
|
||||
- Osobni
|
||||
|
||||
## Soucasne skupiny filtru
|
||||
|
||||
### Mazaci / odfiltrovavaci
|
||||
|
||||
- Smazat oznameni PKO - PayU
|
||||
- Smazat oznameni PKO - DPD
|
||||
- Smazat oznameni PKO - Zasilkovna
|
||||
- Smazat oznameni FIO - DPD
|
||||
- Smazat oznameni FIO - Zasilkovna - CZK
|
||||
- Smazat oznameni FIO - Zasilkovna - EUR
|
||||
- Smazat oznameni FIO - GLS - CZK
|
||||
- Smazat oznameni FIO - Fio banka - vydaj na konte
|
||||
- Smazat oznameni FIO - GLS
|
||||
|
||||
Riziko: mazaci filtry jsou nejcitlivejsi cast. Doporuceni je nemenit je rovnou na tvrde mazani, ale nejdrive pouzit slozku typu "99 - Automaticky odfiltrovano" nebo "99 - Karantena automatika".
|
||||
|
||||
### B2B faktury a doklady
|
||||
|
||||
- B2B - faktury - Yate
|
||||
- B2B - faktury - RP Climbing - Ocun
|
||||
- B2B - faktury - Ferrino
|
||||
- B2B - faktury - Dodaci list - RP Climbing - Ocun
|
||||
- B2B - faktury - Activent 365 s.r.o. - Pinguin
|
||||
- B2B - faktury - STS
|
||||
- B2B - faktury - Norský svet
|
||||
- B2B - faktury - Pinguin - Potvrzeni objednavky ze systemu B2B
|
||||
- B2B - faktury - Norge
|
||||
- B2B - Faktura c - Vertone
|
||||
- HEUREKA.SK - Faktura - danovy doklad
|
||||
|
||||
### B2B potvrzeni a objednavky
|
||||
|
||||
- B2B - potvrzeni objednavky - TECHINOVA s.r.o.
|
||||
- B2B - potvrzeni objednavky - BRYNJE.eu
|
||||
- B2B - potvrzeni objednavky - Ocun
|
||||
- B2B - potvrzeni objednavky - Vertone - Objednavka byla prijata
|
||||
- B2B - Objednavka zbozi - obchod@warmpeace.cz
|
||||
- B2B - Your Submitted Rock Empire Order
|
||||
- B2B - Sea to Summit Order Confirmation Order
|
||||
- B2B - Shipping Confirmation + Delivery note Sea to Summit GmbH
|
||||
- B2B - Vertone - Dekujeme za Vasi B2B objednavku
|
||||
|
||||
### B2C
|
||||
|
||||
- B2C - potvrzeni objednavky
|
||||
|
||||
### Dopravci
|
||||
|
||||
- Dopravci - GLS - Aktualni stav
|
||||
- Dopravci - DPD - Tydenni rozpis hromadnych plateb za obdobi
|
||||
- Dopravci - GLS - International ShopReturnService Report
|
||||
- Dopravci - DPD - recenze na doruceni
|
||||
- Dopravci - DPD - Dnes Vam dorucime balicek
|
||||
- Dopravci - PPL - Prevzali jsme vasi
|
||||
- Dopravci - Zasilkovna - Prehled vybranych dobirek
|
||||
- Dopravci - Zasilkovna - Zasilku jsme prevzali a nasledujici pracovni den ji dorucime
|
||||
- Dopravci - GLS - Dnes vam budeme dorucovat balik
|
||||
- Dopravci - GLS - Seznam dobirek
|
||||
- Dopravci - GLS - Sledovani baliku
|
||||
- Dopravci - GLS - Dorucili jsme vas balik
|
||||
- Dopravci - DPD - Vas balicek je na ceste
|
||||
- Dopravci - GLS - Track & Trace Protocol
|
||||
- Dopravci - PPL - Vasi zasilku budeme dnes dorucovat
|
||||
- Dopravci - PPL - Prevzali jsme Vasi zasilku
|
||||
- Dopravci - Nowa przesylka
|
||||
- Dopravci - Przesylki w drodze
|
||||
- Dopravci - GLS - Zoznam dobierok
|
||||
- Dopravci - DPD - Vas balicek DPD uz je na ceste
|
||||
- Dopravci - GLS - Prevzali jsme vas balik
|
||||
- Dopravci - GLS - Utanvet reszletezo
|
||||
- Dopravci - Balikovna - Vezeme Vam balik
|
||||
|
||||
### Recenze
|
||||
|
||||
- Recenze - Trustpilot
|
||||
- Recenze - Google
|
||||
|
||||
### Marketing / platformy / social
|
||||
|
||||
- Google - ADS - reklamy
|
||||
- Dropbox - Last week's updates in your shared folders
|
||||
- Instagram - 9bplus, mrknete na momenty, ktere vam utekly
|
||||
- Instagram - 9bplus, mate neprectene zpravy
|
||||
- Instagram - 9bplus, sledujte ve svem kanalu
|
||||
|
||||
### Spam
|
||||
|
||||
- SPAM
|
||||
|
||||
## Klicove pravidlo pro budouci trideni
|
||||
|
||||
Automaticke filtry maji filtrovat pouze systemove a automaticke e-maily. Jakmile se z automatickeho e-mailu stane ziva konverzace, zprava ma zustat v Inboxu nebo dostat stav "k reseni".
|
||||
|
||||
Prakticky princip:
|
||||
|
||||
- filtrovat podle kombinace odesilatele a predmetu
|
||||
- nepouzivat samotny predmet jako jedine pravidlo
|
||||
- odpovedi s prefixem RE:, Re:, Aw:, Fwd: netridit automaticky pryc
|
||||
- u dodavatelu a zakaznicke komunikace davat prednost ponechani v Inboxu pred skrytim do slozky
|
||||
|
||||
Navrhovana bezpecnostni brzda pro automaticke filtry:
|
||||
|
||||
- Predmet neobsahuje RE:
|
||||
- Predmet neobsahuje Re:
|
||||
- Predmet neobsahuje AW:
|
||||
- Predmet neobsahuje Aw:
|
||||
- Predmet neobsahuje FWD:
|
||||
- Predmet neobsahuje Fwd:
|
||||
|
||||
Podle moznosti SOGo/Sieve je vhodne pridat i kontrolu hlavicek typu Auto-Submitted, Precedence nebo konkretni automaticke odesilatele.
|
||||
|
||||
## Navrhovane cilove slozky
|
||||
|
||||
Navrh pro sjednoceni:
|
||||
|
||||
- 01 - Akcni / k reseni
|
||||
- 02 - Objednavky zakaznici
|
||||
- 03 - B2B objednavky
|
||||
- 04 - B2B faktury a doklady
|
||||
- 05 - Dopravci - dorucovani
|
||||
- 06 - Dopravci - dobirky a faktury
|
||||
- 07 - Reklamace
|
||||
- 08 - Recenze
|
||||
- 09 - Marketing a platformy
|
||||
- 90 - Archiv vyrizeno
|
||||
- 99 - Automaticky odfiltrovano
|
||||
|
||||
## Navrhovane pojmenovani filtru
|
||||
|
||||
Format:
|
||||
|
||||
`Kategorie - Zdroj - Typ zpravy`
|
||||
|
||||
Priklady:
|
||||
|
||||
- B2B faktury - Yate - faktura
|
||||
- B2B objednavky - Vertone - potvrzeni
|
||||
- Dopravci dorucovani - DPD - balik na ceste
|
||||
- Dopravci dobirky - GLS - seznam dobirek
|
||||
- Marketing - Instagram - notifikace
|
||||
- Banka - Fio - prijem
|
||||
- Karantena - PayU - PKO oznameni
|
||||
|
||||
## Navrhovany dalsi postup
|
||||
|
||||
1. Vyexportovat nebo rucne opsat detailni podminky vsech 61 filtru.
|
||||
2. U kazdeho filtru doplnit: podminka, akce, cilova slozka, zda zastavuje dalsi pravidla.
|
||||
3. Oznacit filtry jako:
|
||||
- ponechat
|
||||
- sloucit
|
||||
- prejmenovat
|
||||
- vypnout
|
||||
- nahradit bezpecnejsim pravidlem
|
||||
- rizikove mazani
|
||||
4. Nejdrive upravit nazvy a karantenu, ne mazani.
|
||||
5. Po testovacim obdobi resit archivaci a pripadne cisteni.
|
||||
|
||||
## Zasady bezpecnosti
|
||||
|
||||
- Zadna hesla neukladat do dokumentace.
|
||||
- Pred zmenami vzdy mit aktualni audit.
|
||||
- Mazaci pravidla nemenit bez explicitniho potvrzeni.
|
||||
- U zive komunikace preferovat Inbox nebo "01 - Akcni / k reseni".
|
||||
- Automatizace Maalflows ma v prvni fazi pouze cist a navrhovat, ne odesilat a nemazat.
|
||||
@@ -0,0 +1,285 @@
|
||||
# Provedene upravy SOGo - info@9b-plus.com
|
||||
|
||||
Datum: 2026-08-06
|
||||
Rezim: upravy schvalene uzivatelem v SOGo
|
||||
|
||||
## Pred upravami
|
||||
|
||||
Stare nastaveni bylo ulozeno pred zasahem:
|
||||
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.json`
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.md`
|
||||
- `docs/mail-sogo-audit-2026-08-06.md`
|
||||
|
||||
## Provedene zmeny
|
||||
|
||||
### Vytvorene slozky
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `07 - Reklamace`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
Poznamka: misto lomitka v `01 - Akcni / k reseni` byl pouzit spojovnik, protoze lomitko muze v IMAP znamenat hierarchii podslozek.
|
||||
|
||||
### Prejmenovane slozky
|
||||
|
||||
- `AAA - vyřízená konverzace` -> `90 - Archiv vyrizeno`
|
||||
- `B2B - faktury` -> `04 - B2B faktury a doklady`
|
||||
- `B2B - potvrzeni objednavky` -> `03 - B2B objednavky`
|
||||
- `B2C - potvrzení objednávky` -> `02 - Objednavky zakaznici`
|
||||
- `Dopravci - doručované zásilky` -> `05 - Dopravci - dorucovani`
|
||||
- `Dopravci - faktury atd.` -> `06 - Dopravci - dobirky a faktury`
|
||||
- `Google - ADS` -> `09 - Marketing a platformy`
|
||||
- `Recenze od zákazníků` -> `08 - Recenze`
|
||||
|
||||
### Presun zprav
|
||||
|
||||
- Z `Koš` bylo presunuto `5520` zprav do `99 - Automaticky odfiltrovano`.
|
||||
- Po presunu ukazoval `Koš` stav `Žádná zpráva`.
|
||||
- Cilova slozka `99 - Automaticky odfiltrovano` byla overena se stavem `5520 zprávy`.
|
||||
|
||||
### Uprava cilu filtru
|
||||
|
||||
Po prejmenovani slozek zustaly filtry napojene na stare nazvy nebo na `Koš`. Proto byly prepsany cilove slozky filtru:
|
||||
|
||||
- `Koš` -> `99 - Automaticky odfiltrovano`
|
||||
- `B2B - faktury` -> `04 - B2B faktury a doklady`
|
||||
- `B2B - potvrzeni objednavky` -> `03 - B2B objednavky`
|
||||
- `B2C - potvrzení objednávky` -> `02 - Objednavky zakaznici`
|
||||
- `Dopravci - doručované zásilky` -> `05 - Dopravci - dorucovani`
|
||||
- `Dopravci - faktury atd.` -> `06 - Dopravci - dobirky a faktury`
|
||||
- `Recenze od zákazníků` -> `08 - Recenze`
|
||||
- `Google - ADS` -> `09 - Marketing a platformy`
|
||||
|
||||
Celkem bylo zkontrolovano/upraveno 61 filtru:
|
||||
|
||||
- 1 filtr byl nastaven na novy cil pri testovaci uprave
|
||||
- dalsich 60 filtru bylo nasledne presmerovano podle mapy vyse
|
||||
- hlavni `save` v SOGo byl potvrzen a po ulozeni bylo tlacitko `save` opet neaktivni
|
||||
|
||||
## Overeni
|
||||
|
||||
Kontrolne byly overeny tyto filtry po ulozeni:
|
||||
|
||||
- `Smazat oznámení PKO - PayU` -> `99 - Automaticky odfiltrovano`
|
||||
- `B2B - faktury - Yate` -> `04 - B2B faktury a doklady`
|
||||
- `Dopravci - Balíkovna - Vezeme Vám balík` -> `05 - Dopravci - dorucovani`
|
||||
|
||||
Kontrolni pruchod cteni vsech filtru po ulozeni se zastavil po 18 filtrech kvuli pomalemu otevreni jednoho dialogu v UI, ale prvnich 18 overenych filtru a tri cilene vzorky vcetne konce seznamu ukazovaly spravne cile.
|
||||
|
||||
## Co zatim nebylo meneno
|
||||
|
||||
- Zadna zprava nebyla smazana.
|
||||
- Zadny filtr nebyl smazan.
|
||||
- Nebylo zapnuto zadne preposilani.
|
||||
- Nebyly odeslany zadne e-maily.
|
||||
|
||||
## Dodatecna uprava nazvu filtru
|
||||
|
||||
Po strukturalnich zmenach byly prejmenovany vsechny filtry tak, aby byl primo v nazvu videt cil trideni.
|
||||
|
||||
Format:
|
||||
|
||||
`CILOVA_SLOZKA - ZDROJ - TYP_ZPRAVY`
|
||||
|
||||
Priklady:
|
||||
|
||||
- `03 B2B objednavky - Vertone - prijata objednavka`
|
||||
- `04 B2B faktury/doklady - Yate - faktura`
|
||||
- `05 Dopravci dorucovani - GLS - doruceno`
|
||||
- `99 Automaticky odfiltrovano - Fio/DPD - prijem COD`
|
||||
|
||||
Mapa prejmenovani je ulozena zde:
|
||||
|
||||
- `docs/mail-sogo-filter-rename-map-2026-08-06.json`
|
||||
- `docs/mail-sogo-filter-rename-map-2026-08-06.md`
|
||||
|
||||
Overeni po reloadu SOGo:
|
||||
|
||||
- pocet nazvu filtru: 61
|
||||
- prvni filtry zacinaji `99 Automaticky odfiltrovano...`
|
||||
- posledni overeny filtr: `05 Dopravci dorucovani - Balikovna - vezeme balik`
|
||||
|
||||
## Dalsi doporucena faze
|
||||
|
||||
1. Zkontrolovat, jestli neexistuji duplicity hlavne u DPD, GLS, PPL, Zasilkovny a Vertone.
|
||||
2. Rozhodnout, jestli spamovy OR filtr `99 Automaticky odfiltrovano - Spam domeny - blokovani` ponechat jako samostatny blacklist, nebo ho pozdeji rozdelit na citelnejsi jednotlive filtry.
|
||||
|
||||
## Dodatecna uprava podminek filtru
|
||||
|
||||
Byla doplnena ochrana proti odfiltrovani zive komunikace.
|
||||
|
||||
Do 60 beznych filtru s rezimem `odpovidaji vsem nasledujicim pravidlum` byla doplnena podminka:
|
||||
|
||||
- `Predmet` `neodpovida regularnimu vyrazu` `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
|
||||
Vynechan byl 1 filtr:
|
||||
|
||||
- `99 Automaticky odfiltrovano - Spam domeny - blokovani`
|
||||
|
||||
Duvod: tento filtr pouziva rezim `odpovidaji nekteremu z nasledujicich pravidel`, tedy OR logiku. Pridat do nej stejnou podminku by nebylo spolecnym guardem pro vsechny spamove podminky.
|
||||
|
||||
Detailni log je ulozen zde:
|
||||
|
||||
- `docs/mail-sogo-reply-guard-log-2026-08-06.md`
|
||||
|
||||
## Pracovni agent pro priste
|
||||
|
||||
Pro navazani v pristich sezenich byl zalozen agent/instruktazni soubor:
|
||||
|
||||
- `.agents/sogo-mail-filter-agent.md`
|
||||
|
||||
## Dodatecny presun slozek pod Dorucenou postu
|
||||
|
||||
Na zaklade pozadavku uzivatele byly pod `Dorucena posta` presunuty slozky:
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `07 - Reklamace`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
Po presunu slozky `99 - Automaticky odfiltrovano` bylo nutne opravit cile filtru, protoze filtry ukazovaly placeholder `Postovni schranka`.
|
||||
|
||||
Opraveno:
|
||||
|
||||
- 17 filtru s prefixem `99 Automaticky odfiltrovano`
|
||||
- cil byl znovu nastaven na `99 - Automaticky odfiltrovano`
|
||||
- SOGo zmeny byly ulozeny hlavnim `save`
|
||||
|
||||
Detailni log je ulozen zde:
|
||||
|
||||
- `docs/mail-sogo-folder-inbox-move-log-2026-08-06.md`
|
||||
|
||||
## Rucni trideni Inboxu mail po mailu
|
||||
|
||||
Po predchozi chybne davce byl dalsi uklid provaden jen rucne po jednotlivych viditelnych zpravach. Presunuty byly pouze zpravy s jasnou shodou na existujici filtr nebo blacklist, vzdy po otevreni/overeni detailu.
|
||||
|
||||
Provedene presuny:
|
||||
|
||||
- `fordogtrainers.it` / `"Wegovy" ohne Spritze? Diese Kapsel schmilzt Fett .` -> `99 - Automaticky odfiltrovano`
|
||||
- `info@hoffmannkuechen.de` / `RE: "Wegovy" ohne Spritze? Diese Kapsel schmilzt Fett .` -> `99 - Automaticky odfiltrovano`
|
||||
- `HKTDC Conference` / `Register NOW: Belt and Road Summit 2026` -> `99 - Automaticky odfiltrovano`
|
||||
- `Thomas Brandstater - jt-Trading UG` / `New Balance, Adidas, Puma & Converse - neue Angebote / New Offers - KW 29/1` -> `99 - Automaticky odfiltrovano`
|
||||
- `Heureka.sk` / `Faktura - danovy doklad VS 2100037790` -> `99 - Automaticky odfiltrovano`
|
||||
- `Google Ads` / `Aktualizace sluzby: Zkontrolujte nastaveni strategii nabidek zalozenych na cili` -> `09 - Marketing a platformy`
|
||||
- `Google Ads` / `Udelejte dalsi krok k optimalizaci kampane PL-PL-3-LOW-PC` -> `09 - Marketing a platformy`
|
||||
- `reports@gls-czech.com` / `Aktualni stav jednotlivych baliku...` -> `06 - Dopravci - dobirky a faktury`
|
||||
- `Instagram` / `9bplus, podivejte se, co se deje na Instagramu` -> `99 - Automaticky odfiltrovano`
|
||||
- `HKTDC Exhibition` / `[CENTRESTAGE 2026] Announcing the CENTRESTAGE ELITES Designer!` -> `99 - Automaticky odfiltrovano`
|
||||
- `NOREPLY@dpd.cz` / `Dnes Vam dorucime balicek` -> `05 - Dopravci - dorucovani`
|
||||
|
||||
Inbox po teto rucni casti: `364` zprav. Nejasne zpravy, zive odpovedi (`RE:`, `FW:`), objednavky z e-shopu, ucetni doklady a mozne nove spam vzory bez existujiciho pravidla byly ponechany v Inboxu.
|
||||
|
||||
## Novy filtr Vertone B2B
|
||||
|
||||
Na zaklade potvrzeni uzivatele byl 2026-08-07 v SOGo pridan novy filtr pro novy Vertone B2B rezim.
|
||||
|
||||
Filtr:
|
||||
|
||||
- nazev: `03 B2B objednavky - Vertone - objednavka vyrizena`
|
||||
- rezim: odpovidaji vsem nasledujicim pravidlum
|
||||
- podminky:
|
||||
- `Odesilatel` je rovno `noreply@vert1.cz`
|
||||
- `Predmet` obsahuje `Objednavka`
|
||||
- `Predmet` obsahuje `byla prave vyrizena`
|
||||
- `Predmet` neodpovida regularnimu vyrazu `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
- akce: ulozit zpravu do `03 - B2B objednavky`
|
||||
|
||||
Po ulozeni SOGo zobrazilo `Predvolby ulozeny`. Pocet filtru v DOM byl overen jako `62` a novy filtr byl pritomen v seznamu. Stare Vertone filtry nebyly mazany ani upravovany.
|
||||
|
||||
Lokální evidence:
|
||||
|
||||
- `docs/mail-sogo-current-filter-additions-2026-08-07.json`
|
||||
|
||||
## Novy filtr Outdoor Concept B2B objednavky
|
||||
|
||||
Na zaklade pozadavku uzivatele byl 2026-08-07 v SOGo pridan novy filtr pro potvrzeni B2B objednavky Outdoor Concept.
|
||||
|
||||
Filtr:
|
||||
|
||||
- nazev: `03 B2B objednavky - Outdoor Concept - objednavka prijata`
|
||||
- rezim: odpovidaji vsem nasledujicim pravidlum
|
||||
- podminky:
|
||||
- `Odesilatel` je rovno `cpz@outdoorconcept.cz`
|
||||
- `Predmet` obsahuje `OC B2B - Objednavka`
|
||||
- `Predmet` obsahuje `prijata`
|
||||
- `Predmet` neodpovida regularnimu vyrazu `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
- akce: ulozit zpravu do `03 - B2B objednavky`
|
||||
|
||||
Po ulozeni SOGo zobrazilo `Predvolby ulozeny`. Pocet filtru byl overen jako `64` a novy filtr byl pritomen v seznamu.
|
||||
|
||||
Lokální evidence:
|
||||
|
||||
- `docs/mail-sogo-current-filter-additions-2026-08-07.json`
|
||||
|
||||
## Novy filtr Rock Empire B2B faktury
|
||||
|
||||
Na zaklade potvrzeni uzivatele byl 2026-08-07 v SOGo pridan novy filtr pro B2B faktury Rock Empire.
|
||||
|
||||
Filtr:
|
||||
|
||||
- nazev: `04 B2B faktury/doklady - Rock Empire - faktura B2B`
|
||||
- rezim: odpovidaji vsem nasledujicim pravidlum
|
||||
- podminky:
|
||||
- `Odesilatel` je rovno `jakub.kurfirt@rockempire.cz`
|
||||
- `Predmet` obsahuje `Fakta - B2B`
|
||||
- `Predmet` neodpovida regularnimu vyrazu `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
- akce: ulozit zpravu do `04 - B2B faktury a doklady`
|
||||
|
||||
Po ulozeni SOGo zobrazilo `Predvolby ulozeny`. Pocet filtru v DOM byl overen jako `63` a novy filtr byl pritomen v seznamu. Stavajici Rock Empire filtr na objednavky z `b2b@rockempire.cz` nebyl menen.
|
||||
|
||||
Lokální evidence:
|
||||
|
||||
- `docs/mail-sogo-current-filter-additions-2026-08-07.json`
|
||||
|
||||
## Hromadny presun starych zprav podle existujicich filtru
|
||||
|
||||
Na zaklade pozadavku uzivatele byly v SOGo hromadne vyhledany a presunuty stare zpravy z `Dorucena posta`, ktere odpovidaly uz existujicim filtrum. Nebyly vytvareny nove filtry a zpravy nebyly mazany.
|
||||
|
||||
Provedene davky:
|
||||
|
||||
- `PPL - Prevzali jsme Vasi/vasi zasilku`: 41 zprav -> `05 - Dopravci - dorucovani`
|
||||
- `DPD - Vas balicek je na ceste`: 98 zprav -> `05 - Dopravci - dorucovani`
|
||||
- `Pinguin - Potvrzeni objednavky ze systemu B2B`: 12 zprav -> `03 - B2B objednavky`
|
||||
- `Sea to Summit Order Confirmation Order`: 14 zprav -> `03 - B2B objednavky`
|
||||
- `Zasilkovna - Prehled vybranych dobirek`: 229 zprav -> `99 - Automaticky odfiltrovano`
|
||||
|
||||
U jednotlivych davek byl pred presunem overen pocet vybranych zprav v SOGo a po presunu bylo zkontrolovano, ze vysledky hledani zmizely nebo ukazaly `Zadna zprava`.
|
||||
|
||||
## Hromadny uklid a obnova po chybne davce
|
||||
|
||||
Pri dalsim hromadnem uklidu byly presouvany jasne davky podle existujicich filtru. Behem davky `Dropbox - Last week's updates in your shared folders` vratilo SOGo hledani chybne cely Inbox misto maleho Dropbox vysledku. Dalsi prace byla okamzite zastavena, slozka `99 - Automaticky odfiltrovano` byla otevrena a bylo potvrzeno, ze se do ni omylem dostaly i zive zpravy z Inboxu.
|
||||
|
||||
Obnova:
|
||||
|
||||
- obsah `99 - Automaticky odfiltrovano` byl hromadne presunut zpet do `Dorucena posta`
|
||||
- obnoveno bylo `15151` zprav
|
||||
- pote byl znovu zkontrolovan Inbox, mel `15151` zprav
|
||||
- nasledne byly znovu presunuty jen jasne existujici filtry s pevnou pojistkou na maximalni pocet vysledku
|
||||
|
||||
Pojistka od teto chvile:
|
||||
|
||||
- pokud hledani vrati podezrele moc vysledku, davka se nesmi vybrat ani presunout
|
||||
- u beznych davkovych uklidu pouzivat limit napr. `1000` zprav, u konkretni vetsi bankovni davky lze limit zvednout jen po posouzeni
|
||||
- `Dropbox - Last week's updates in your shared folders` neuklizet pres bezne hledani bez dalsi rucni kontroly, protoze SOGo pri tomto dotazu vratilo `13283` vysledku
|
||||
|
||||
Po obnoveni a opatrnem znovuuklizeni mel Inbox `13283` zprav.
|
||||
|
||||
## Dodatecny presun slozek pod Dorucenou postu
|
||||
|
||||
Na zaklade pozadavku uzivatele byly pod `Dorucena posta` presunuty slozky:
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `07 - Reklamace`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
Po presunu slozky `99 - Automaticky odfiltrovano` bylo nutne opravit cile filtru, protoze filtry ukazovaly placeholder `Postovni schranka`.
|
||||
|
||||
Opraveno:
|
||||
|
||||
- 17 filtru s prefixem `99 Automaticky odfiltrovano`
|
||||
- cil byl znovu nastaven na `99 - Automaticky odfiltrovano`
|
||||
- SOGo zmeny byly ulozeny hlavnim `save`
|
||||
|
||||
Detailni log je ulozen zde:
|
||||
|
||||
- `docs/mail-sogo-folder-inbox-move-log-2026-08-06.md`
|
||||
@@ -0,0 +1,567 @@
|
||||
[
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "03 B2B objednavky - Vertone - objednavka vyrizena",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "noreply@vert1.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Objednavka"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "byla prave vyrizena"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "03 - B2B objednavky"
|
||||
}
|
||||
],
|
||||
"note": "Novy Vertone B2B rezim. Stare Vertone filtry zatim ponechany, casem se mohou vypnout nebo smazat po overeni, ze stary typ zprav uz nechodi."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "04 B2B faktury/doklady - Rock Empire - faktura B2B",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "jakub.kurfirt@rockempire.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Fakta - B2B"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "04 - B2B faktury a doklady"
|
||||
}
|
||||
],
|
||||
"note": "Rock Empire B2B faktury od Jakuba Kurfirta. Stavajici Rock Empire filtr na objednavky z b2b@rockempire.cz ponechan beze zmen."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "03 B2B objednavky - Outdoor Concept - objednavka prijata",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "cpz@outdoorconcept.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "OC B2B - Objednavka"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "prijata"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "03 - B2B objednavky"
|
||||
}
|
||||
],
|
||||
"note": "Outdoor Concept B2B potvrzeni objednavky. Vzor predmetu: OC B2B - Objednavka 1130057808 prijata."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "99 Automaticky odfiltrovano - Fio/GLS SK - prijem dobirky",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "automat@fio.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Fio banka - prijem na konte"
|
||||
},
|
||||
{
|
||||
"field": "Telo",
|
||||
"operator": "obsahuje",
|
||||
"value": "SK9602000000002802401454/0200"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "GLS SK dobirka podle protiuctu ve Fio prijmu."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "04 B2B faktury/doklady - Saltic - faktura za odeslane zbozi",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "podpora@saltic.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Faktura"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "za odeslane zbozi"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "04 - B2B faktury a doklady"
|
||||
}
|
||||
],
|
||||
"note": "Saltic faktury za odeslane zbozi z adresy podpora@saltic.cz."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "05 Dopravci dorucovani - Balikovna - potvrzeni prevzeti baliku",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "balikovna@balikovna.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Potvrzeni o prevzeti baliku"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "05 - Dopravci - dorucovani"
|
||||
}
|
||||
],
|
||||
"note": "Balikovna potvrzeni o prevzeti baliku, napr. DR0488841587X."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"name": "05 Dopravci dorucovani - Balikovna - balik v nasich rukach",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "balikovna@balikovna.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Vas balik"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "je v nasich rukach"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "05 - Dopravci - dorucovani"
|
||||
}
|
||||
],
|
||||
"note": "Balikovna zprava o prevzeti baliku do prepravy, napr. DV2093002778C."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - Zasilkovna - posledni den vyzvednuti",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "obsahuje",
|
||||
"value": "noreply@zasilkovna.cz"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "obsahuje",
|
||||
"value": "Posledni den na vyzvednuti zasilek"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "Zasilkovna upozorneni na posledni den vyzvednuti zasilek neni pro nas dulezite, presouvat do Kose."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - Spam adresa - cespedtoledo jesus",
|
||||
"status": "merged_into_blacklist",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "jesus@cespedtoledo.com"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "Presna spam adresa ze slozky 10 - Spam ke kontrole. Slouceno do existujiciho OR spam blacklistu 2026-08-08; samostatny SOGo filtr byl smazan.",
|
||||
"mergedInto": "99 Automaticky odfiltrovano - Spam domeny - blokovani"
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - Spam adresa - gmail faithstella883",
|
||||
"status": "merged_into_blacklist",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "faithstella883@gmail.com"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "Verejna domena Gmail se nikdy neblokuje cela, jen presna spam adresa. Slouceno do existujiciho OR spam blacklistu 2026-08-08; samostatny SOGo filtr byl smazan.",
|
||||
"mergedInto": "99 Automaticky odfiltrovano - Spam domeny - blokovani"
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - Spam domena - efektywnymarketing",
|
||||
"status": "merged_into_blacklist",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "obsahuje",
|
||||
"value": "@efektywnymarketing.org.pl"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "Spam domena ze slozky 10 - Spam ke kontrole, bez shody v dobrych filtrech. Slouceno do existujiciho OR spam blacklistu 2026-08-08; samostatny SOGo filtr byl smazan.",
|
||||
"mergedInto": "99 Automaticky odfiltrovano - Spam domeny - blokovani"
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - Spam domena - dream-ind.cn",
|
||||
"status": "merged_into_blacklist",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "obsahuje",
|
||||
"value": "@dream-ind.cn"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "Spam domena ze slozky 10 - Spam ke kontrole, blokovana jen .cn domena odesilatele. Slouceno do existujiciho OR spam blacklistu 2026-08-08; samostatny SOGo filtr byl smazan.",
|
||||
"mergedInto": "99 Automaticky odfiltrovano - Spam domeny - blokovani"
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - PayU/Ceneo - prikaz k uhrade",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "Odesilatel",
|
||||
"operator": "je rovno",
|
||||
"value": "service@payu.com"
|
||||
},
|
||||
{
|
||||
"field": "Telo",
|
||||
"operator": "obsahuje",
|
||||
"value": "CENEO.PL"
|
||||
},
|
||||
{
|
||||
"field": "Predmet",
|
||||
"operator": "neodpovida regularnimu vyrazu",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"action": "Uloz zpravu do slozky",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "PayU muze posilat i legitimni zpravy, proto neblokovat celou domenu. Filtrovat jen presnou kombinaci service@payu.com + CENEO.PL v tele. SOGo filtr pridan a ulozen 2026-08-08."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-08",
|
||||
"name": "99 Automaticky odfiltrovano - PKO/PayU Ceneo - obciazenie konta",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "from",
|
||||
"operator": "equals",
|
||||
"value": "powiadomienia@pkobp.pl"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "contains",
|
||||
"value": "Obci\u0105\u017cenie konta"
|
||||
},
|
||||
{
|
||||
"field": "body",
|
||||
"operator": "contains",
|
||||
"value": "WWW.CENEO.PL"
|
||||
},
|
||||
{
|
||||
"field": "body",
|
||||
"operator": "contains",
|
||||
"value": "PAYU SA"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "not_regex",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "fileinto",
|
||||
"target": "Kos"
|
||||
}
|
||||
],
|
||||
"note": "PKO banka muze posilat i legitimni zpravy, proto neblokovat celou domenu. Filtrovat jen presnou kombinaci powiadomienia@pkobp.pl + Obci\u0105\u017cenie konta + CENEO/PAYU v tele. SOGo filtr pridan a ulozen 2026-08-08."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-10",
|
||||
"name": "04 B2B faktury/doklady - Summit Trade - prijata objednavka",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "from",
|
||||
"operator": "equals",
|
||||
"value": "objednavky@summit-trade.cz"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "contains",
|
||||
"value": "P\u0159ijali jsme Va\u0161i objedn\u00e1vku"
|
||||
},
|
||||
{
|
||||
"field": "body",
|
||||
"operator": "contains",
|
||||
"value": "b2b.summit-trade.cz"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "not_regex",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "fileinto",
|
||||
"target": "04 - B2B faktury a doklady"
|
||||
}
|
||||
],
|
||||
"note": "Summit Trade B2B potvrzeni objednavky presunuto podle zadani uzivatele do B2B faktury a doklady. SOGo filtr pridan a ulozen 2026-08-10."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-15",
|
||||
"name": "03 B2B objednavky - Singing Rock - potvrzeni objednavky",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "from",
|
||||
"operator": "equals",
|
||||
"value": "info@singingrock.cz"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "contains",
|
||||
"value": "Order no."
|
||||
},
|
||||
{
|
||||
"field": "body",
|
||||
"operator": "contains",
|
||||
"value": "b2b.singingrock.cz"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "not_regex",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "fileinto",
|
||||
"target": "03 - B2B objednavky"
|
||||
}
|
||||
],
|
||||
"note": "Singing Rock B2B potvrzeni objednavky presunuto podle zadani uzivatele do B2B objednavky. SOGo filtr pridan a ulozen 2026-08-15."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-15",
|
||||
"name": "03 B2B objednavky - Yate - objednavka",
|
||||
"status": "active",
|
||||
"match": "all",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "from",
|
||||
"operator": "equals",
|
||||
"value": "yate@yate.cz"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "contains",
|
||||
"value": "[YATE.CZ] Objedn\u00e1vka"
|
||||
},
|
||||
{
|
||||
"field": "body",
|
||||
"operator": "contains",
|
||||
"value": "Objedn\u00e1vka na YATE.CZ"
|
||||
},
|
||||
{
|
||||
"field": "subject",
|
||||
"operator": "not_regex",
|
||||
"value": "^(RE|Re|AW|Aw|FWD|Fwd)\\s*:"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "fileinto",
|
||||
"target": "03 - B2B objednavky"
|
||||
}
|
||||
],
|
||||
"note": "YATE objednavka z yate@yate.cz presunuta podle zadani uzivatele do B2B objednavky. Existujici YATE faktury z expedice@yate.cz zustavaji oddelene v B2B faktury/doklady. SOGo filtr pridan a ulozen 2026-08-15."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-17",
|
||||
"name": "99 Automaticky odfiltrovano - Spam domeny - digitalgrowth-inc.com",
|
||||
"status": "merged",
|
||||
"match": "or",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "from",
|
||||
"operator": "contains",
|
||||
"value": "@digitalgrowth-inc.com"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "fileinto",
|
||||
"target": "99 - Automaticky odfiltrovano"
|
||||
}
|
||||
],
|
||||
"mergedInto": "99 Automaticky odfiltrovano - Spam domeny - blokovani",
|
||||
"note": "Spam domena potvrzena uzivatelem. Slouceno do existujiciho OR spam blacklistu 2026-08-17; samostatny SOGo filtr nevytvaren."
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
||||
# SOGo current filters summary - 2026-08-07
|
||||
|
||||
Source JSON: `docs/mail-sogo-current-filters-2026-08-07.json`
|
||||
|
||||
Audit type: read-only live SOGo audit. Each filter dialog was opened, read, and closed with `STORNO`. No SOGo settings were saved during this audit.
|
||||
|
||||
## Counts
|
||||
|
||||
- Total filters: 68
|
||||
- Audit errors: 0
|
||||
- Filters with reply guard: 67
|
||||
- Filters without reply guard: 1
|
||||
|
||||
The only filter without reply guard is:
|
||||
|
||||
- `99 Automaticky odfiltrovano - Spam domeny - blokovani`
|
||||
|
||||
Reason: it uses OR logic, so the reply guard cannot be added as a simple shared AND condition without changing behavior.
|
||||
|
||||
## Target folders
|
||||
|
||||
- `99 - Automaticky odfiltrovano`: 17
|
||||
- `03 - B2B objednavky`: 12
|
||||
- `06 - Dopravci - dobirky a faktury`: 7
|
||||
- `08 - Recenze`: 2
|
||||
- `09 - Marketing a platformy`: 1
|
||||
- `04 - B2B faktury a doklady`: 11
|
||||
- `05 - Dopravci - dorucovani`: 16
|
||||
- `02 - Objednavky zakaznici`: 1
|
||||
- `Koš`: 1
|
||||
|
||||
## Notes for next work
|
||||
|
||||
- Use `mail-sogo-current-filters-2026-08-07.json` as the current master filter list.
|
||||
- Use `mail-sogo-current-filter-additions-2026-08-07.json` only as the log of filters added on 2026-08-07.
|
||||
- Do not re-audit all filters for routine additions unless SOGo behavior changes or a duplicate is unclear.
|
||||
- Before adding a new routine filter, quickly check the current master JSON for sender, subject phrase, and target folder.
|
||||
@@ -0,0 +1,140 @@
|
||||
# Navrh uprav filtru SOGo - info@9b-plus.com
|
||||
|
||||
Datum: 2026-08-06
|
||||
Vychazi ze zalohy: `docs/mail-sogo-old-settings-2026-08-06.json`
|
||||
Rezim navrhu: priprava zmen, bez provedeni v SOGo
|
||||
|
||||
## Co je ulozeno jako stary stav
|
||||
|
||||
- Kompletnich 61 filtru vcetne podminek a akci
|
||||
- Viditelne slozky mailboxu
|
||||
- Zakladni predvolby posty
|
||||
- Stav stitku, IMAP uctu, nepritomnosti a preposilani
|
||||
|
||||
Zalohy:
|
||||
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.json`
|
||||
- `docs/mail-sogo-old-settings-2026-08-06.md`
|
||||
|
||||
## Zjisteni
|
||||
|
||||
- Celkem filtru: 61
|
||||
- Filtru smerujicich do Kose: 17
|
||||
- Filtru bez ochrany proti odpovedim typu RE/Aw/Fwd: 56
|
||||
- Hlavni cilove slozky:
|
||||
- Kos: 17
|
||||
- Dopravci - dorucovane zasilky: 14
|
||||
- B2B - potvrzeni objednavky: 10
|
||||
- B2B - faktury: 9
|
||||
- Dopravci - faktury atd.: 7
|
||||
- Recenze od zakazniku: 2
|
||||
- B2C - potvrzeni objednavky: 1
|
||||
- Google - ADS: 1
|
||||
|
||||
## Hlavni problem
|
||||
|
||||
Filtry dobre tridily automaticke e-maily, ale nejsou systemove sjednocene. Pri dalsim pridavani pravidel hrozi:
|
||||
|
||||
- duplicitni filtr pro stejneho dopravce/dodavatele
|
||||
- skryti zive konverzace po odpovedi zakaznika nebo dodavatele
|
||||
- omylem presunute dulezite zpravy do Kose
|
||||
- nejasne nazvy pravidel
|
||||
- pravidla postavena jen na predmetu bez kontroly odesilatele
|
||||
|
||||
## Bezpecnostni pravidlo pro vsechny automaticke filtry
|
||||
|
||||
Automaticke trideni nema odfiltrovat zive odpovedi. U filtru, kde to SOGo/Sieve dovoli, doplnit podminky:
|
||||
|
||||
- Predmet neobsahuje `RE:`
|
||||
- Predmet neobsahuje `Re:`
|
||||
- Predmet neobsahuje `AW:`
|
||||
- Predmet neobsahuje `Aw:`
|
||||
- Predmet neobsahuje `FWD:`
|
||||
- Predmet neobsahuje `Fwd:`
|
||||
|
||||
U automatickych filtru idealne kombinovat:
|
||||
|
||||
- odesilatel je konkretni systemova adresa
|
||||
- predmet obsahuje konkretni automaticky text
|
||||
- predmet neobsahuje odpovedni prefix
|
||||
|
||||
## Faze 1 - bezpecne zmeny
|
||||
|
||||
Tyto zmeny jsou vhodne jako prvni, protoze nemazou zadne zpravy.
|
||||
|
||||
1. Vytvorit nebo domluvit slozku `99 - Automaticky odfiltrovano`.
|
||||
2. Filtry, ktere dnes ukladaji do `Kos`, zatim nemenit na trvale mazani.
|
||||
3. U vybranych filtru z `Kos` zmenit cil na `99 - Automaticky odfiltrovano`, hlavne:
|
||||
- PKO / PayU
|
||||
- PKO / DPD
|
||||
- PKO / Zasilkovna
|
||||
- FIO / DPD
|
||||
- FIO / Zasilkovna
|
||||
- FIO / GLS
|
||||
- Instagram notifikace
|
||||
- Dropbox notifikace
|
||||
4. U automatickych dopravcu doplnit ochranu proti odpovedim.
|
||||
5. U B2B filtru doplnit ochranu proti odpovedim, aby komunikace s dodavatelem zustala v Inboxu.
|
||||
|
||||
## Faze 2 - sjednoceni nazvu
|
||||
|
||||
Navrzeny format:
|
||||
|
||||
`Kategorie - Zdroj - Typ zpravy`
|
||||
|
||||
Priklady:
|
||||
|
||||
- `B2B faktury - Yate - faktura`
|
||||
- `B2B objednavky - Vertone - potvrzeni`
|
||||
- `Dopravci dorucovani - DPD - balik na ceste`
|
||||
- `Dopravci dobirky - GLS - seznam dobirek`
|
||||
- `Marketing - Instagram - notifikace`
|
||||
- `Banka - Fio - oznameni`
|
||||
- `Karantena - PayU - PKO oznameni`
|
||||
|
||||
## Faze 3 - sjednoceni slozek
|
||||
|
||||
Navrh cilove struktury:
|
||||
|
||||
- `01 - Akcni / k reseni`
|
||||
- `02 - Objednavky zakaznici`
|
||||
- `03 - B2B objednavky`
|
||||
- `04 - B2B faktury a doklady`
|
||||
- `05 - Dopravci - dorucovani`
|
||||
- `06 - Dopravci - dobirky a faktury`
|
||||
- `07 - Reklamace`
|
||||
- `08 - Recenze`
|
||||
- `09 - Marketing a platformy`
|
||||
- `90 - Archiv vyrizeno`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
## Faze 4 - kontrola duplicit
|
||||
|
||||
Po prejmenovani a presunu cilovych slozek projit zejmena:
|
||||
|
||||
- DPD dorucovani: vice podobnych predmetu typu "balicek je na ceste"
|
||||
- GLS dorucovani: vice podobnych stavu baliku
|
||||
- PPL prevzeti/dorucovani: podobne ceske predmety
|
||||
- Zasilkovna: oddelit dobirky od dorucovani
|
||||
- Vertone: vice B2B pravidel s objednavkou i fakturou
|
||||
- Pinguin: jedno pravidlo je pojmenovane jako faktury, ale cilem je B2B potvrzeni objednavky
|
||||
|
||||
## Co nedelat bez dalsiho potvrzeni
|
||||
|
||||
- nemazat zadne zpravy
|
||||
- nemazat zadne filtry
|
||||
- nevypinat filtry hromadne
|
||||
- nezapinat preposilani
|
||||
- nemenit pristupova hesla
|
||||
- neodesilat zadne e-maily
|
||||
|
||||
## Doporuceny prvni realny zasah
|
||||
|
||||
Nejbezpecnejsi prvni zasah:
|
||||
|
||||
1. Vytvorit slozku `99 - Automaticky odfiltrovano`.
|
||||
2. Prevest filtry smerujici do `Kos` na tuto slozku.
|
||||
3. Nepresouvat existujici zpravy rucne.
|
||||
4. Nechat bezet par dni a kontrolovat, jestli se do slozky nedostavaji dulezite zpravy.
|
||||
|
||||
Az potom resit mazani nebo archivaci.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,63 @@
|
||||
[
|
||||
{"index":1,"old":"Smazat oznámení PKO - PayU","new":"99 Automaticky odfiltrovano - PKO/PayU - uznani konta"},
|
||||
{"index":2,"old":"Smazat oznámení PKO - DPD","new":"99 Automaticky odfiltrovano - PKO/DPD - uznani konta"},
|
||||
{"index":3,"old":"Smazat oznámení PKO - Zasilkovna","new":"99 Automaticky odfiltrovano - PKO/Zasilkovna - uznani konta"},
|
||||
{"index":4,"old":"B2B - potvrzeni objednavky - TECHINOVA s.r.o.","new":"03 B2B objednavky - Techinova - potvrzeni"},
|
||||
{"index":5,"old":"Dopravci - GLS - Aktualni stav","new":"06 Dopravci dobirky/faktury - GLS - aktualni stav"},
|
||||
{"index":6,"old":"Dopravci - DPD - Týdenní rozpis hromadných plateb za období","new":"06 Dopravci dobirky/faktury - DPD - hromadne platby COD"},
|
||||
{"index":7,"old":"Dopravci - GLS - International ShopReturnService Report","new":"06 Dopravci dobirky/faktury - GLS Returns - report"},
|
||||
{"index":8,"old":"Recenze - Trustpilot","new":"08 Recenze - Trustpilot - nova recenze"},
|
||||
{"index":9,"old":"Google - ADS - reklamy","new":"09 Marketing a platformy - Google Ads - notifikace"},
|
||||
{"index":10,"old":"Dopravci - DPD - recenze na doručení","new":"99 Automaticky odfiltrovano - DPD - dotaznik doruceni"},
|
||||
{"index":11,"old":"B2B - faktury - Yate","new":"04 B2B faktury/doklady - Yate - faktura"},
|
||||
{"index":12,"old":"Dopravci - DPD - Dnes Vám doručíme balíček","new":"05 Dopravci dorucovani - DPD - dnes dorucime balicek"},
|
||||
{"index":13,"old":"Recenze - Google","new":"08 Recenze - Google Business - nova recenze"},
|
||||
{"index":14,"old":"Dopravci - PPL - Převzali jsme vaši","new":"05 Dopravci dorucovani - PPL - prevzali zasilku"},
|
||||
{"index":15,"old":"B2C - potvrzeni objednavky","new":"02 Objednavky zakaznici - 9b-plus - nova objednavka"},
|
||||
{"index":16,"old":"Dropbox - Last week's updates in your shared folders","new":"99 Automaticky odfiltrovano - Dropbox - tydenni souhrn"},
|
||||
{"index":17,"old":"Instagram - 9bplus, mrkněte na momenty, které vám utekly","new":"99 Automaticky odfiltrovano - Instagram - momenty"},
|
||||
{"index":18,"old":"SPAM","new":"99 Automaticky odfiltrovano - Spam domeny - blokovani"},
|
||||
{"index":19,"old":"B2B - faktury - RP Climbing - Ocún","new":"04 B2B faktury/doklady - Ocun - faktura"},
|
||||
{"index":20,"old":"B2B - faktury - Ferrino","new":"04 B2B faktury/doklady - Ferrino - faktura"},
|
||||
{"index":21,"old":"B2B - faktury - Dodací list - RP Climbing - Ocún","new":"04 B2B faktury/doklady - Ocun - dodaci list"},
|
||||
{"index":22,"old":"Instagram - 9bplus, máte nepřečtené zprávy","new":"99 Automaticky odfiltrovano - Instagram - neprectene zpravy"},
|
||||
{"index":23,"old":"B2B - faktury - Activent 365 s.r.o. - Pinguin","new":"04 B2B faktury/doklady - Pinguin/Activent - faktura"},
|
||||
{"index":24,"old":"B2B - potvrzeni objednavky - BRYNJE.eu","new":"03 B2B objednavky - Brynje/Norsky svet - potvrzeni"},
|
||||
{"index":25,"old":"B2B - potvrzeni objednavky - Ocun","new":"03 B2B objednavky - Ocun - potvrzeni"},
|
||||
{"index":26,"old":"Dopravci - Zásilkovna - Přehled vybraných dobírek","new":"99 Automaticky odfiltrovano - Zasilkovna - prehled dobirek"},
|
||||
{"index":27,"old":"Dopravci - Zásilkovna - Zásilku jsme převzali a následující pracovní den ji doručíme","new":"05 Dopravci dorucovani - Zasilkovna - prevzato"},
|
||||
{"index":28,"old":"B2B - faktury - STS","new":"04 B2B faktury/doklady - Sea to Summit - invoice"},
|
||||
{"index":29,"old":"Dopravci - GLS - Dnes vám budeme doručovat balík","new":"05 Dopravci dorucovani - GLS - dnes dorucujeme"},
|
||||
{"index":30,"old":"Smazat oznámení FIO - DPD","new":"99 Automaticky odfiltrovano - Fio/DPD - prijem COD"},
|
||||
{"index":31,"old":"Smazat oznámení FIO - Zásilkovna - CZK","new":"99 Automaticky odfiltrovano - Fio/Zasilkovna CZK - prijem COD"},
|
||||
{"index":32,"old":"Dopravci - GLS - Seznam dobírek","new":"06 Dopravci dobirky/faktury - GLS - seznam dobirek"},
|
||||
{"index":33,"old":"Dopravci - GLS - Sledování balíku","new":"05 Dopravci dorucovani - GLS - sledovani baliku"},
|
||||
{"index":34,"old":"HEUREKA.SK - Faktúra - daňový doklad","new":"99 Automaticky odfiltrovano - Heureka SK - faktura"},
|
||||
{"index":35,"old":"Smazat oznámení FIO - Zásilkovna - EUR","new":"99 Automaticky odfiltrovano - Fio/Zasilkovna EUR - prijem COD"},
|
||||
{"index":36,"old":"Dopravci - GLS - Doručili jsme váš balík","new":"05 Dopravci dorucovani - GLS - doruceno"},
|
||||
{"index":37,"old":"Instagram - 9bplus, sledujte ve svém kanálu","new":"99 Automaticky odfiltrovano - Instagram - feed notifikace"},
|
||||
{"index":38,"old":"Smazat oznámení FIO - GLS - CZK","new":"99 Automaticky odfiltrovano - Fio/GLS CZK - prijem COD"},
|
||||
{"index":39,"old":"Dopravci - DPD - Váš balícek je na ceste","new":"05 Dopravci dorucovani - DPD SK - balik na ceste"},
|
||||
{"index":40,"old":"Smazat oznámení FIO - Fio banka - vydaj na konte","new":"99 Automaticky odfiltrovano - Fio - vydaj z uctu"},
|
||||
{"index":41,"old":"B2B - potvrzeni objednavky - Vertone - Objednávka byla přijata","new":"03 B2B objednavky - Vertone - prijata objednavka"},
|
||||
{"index":42,"old":"Dopravci - GLS - Track & Trace Protocol","new":"06 Dopravci dobirky/faktury - GLS - track trace protocol"},
|
||||
{"index":43,"old":"B2B - faktury - Norský svět","new":"04 B2B faktury/doklady - Norsky svet - faktura"},
|
||||
{"index":44,"old":"Dopravci - PPL – Vaši zásilku budeme dnes doručovat","new":"05 Dopravci dorucovani - PPL - dnes dorucujeme"},
|
||||
{"index":45,"old":"B2B - faktury - Pinguin - Potvrzení objednávky ze systému B2B","new":"03 B2B objednavky - Pinguin/Activent - potvrzeni"},
|
||||
{"index":46,"old":"Dopravci - PPL – Převzali jsme Vaši zásilku","new":"05 Dopravci dorucovani - PPL - prevzato"},
|
||||
{"index":47,"old":"Dopravci - Nowa przesyłka","new":"05 Dopravci dorucovani - Wygodne Zwroty - nova zasilka"},
|
||||
{"index":48,"old":"Dopravci - Przesyłki w drodze","new":"05 Dopravci dorucovani - Wygodne Zwroty - na ceste"},
|
||||
{"index":49,"old":"B2B - Objednavka zbozi - obchod@warmpeace.cz","new":"03 B2B objednavky - Warmpeace - objednavka zbozi"},
|
||||
{"index":50,"old":"B2B - Your Submitted Rock Empire Order","new":"03 B2B objednavky - Rock Empire - submitted order"},
|
||||
{"index":51,"old":"B2B - Sea to Summit Order Confirmation Order","new":"03 B2B objednavky - Sea to Summit - potvrzeni"},
|
||||
{"index":52,"old":"Smazat oznámení FIO - GLS","new":"99 Automaticky odfiltrovano - Fio/GLS - prijem COD"},
|
||||
{"index":53,"old":"Dopravci - GLS - Zoznam dobierok","new":"06 Dopravci dobirky/faktury - GLS SK - zoznam dobierok"},
|
||||
{"index":54,"old":"Dopravci - DPD - Váš balíček DPD už je na cestě","new":"05 Dopravci dorucovani - DPD CZ - balik na ceste"},
|
||||
{"index":55,"old":"Dopravci - GLS - Převzali jsme váš balík","new":"05 Dopravci dorucovani - GLS - prevzali balik"},
|
||||
{"index":56,"old":"B2B - Shipping Confirmation + Delivery note Sea to Summit GmbH","new":"03 B2B objednavky - Sea to Summit - shipping/delivery note"},
|
||||
{"index":57,"old":"B2B - faktury - Norge","new":"04 B2B faktury/doklady - Norge - faktura k objednavce"},
|
||||
{"index":58,"old":"B2B - Vertone - Děkujeme za Vaši B2B objednávku","new":"03 B2B objednavky - Vertone - dekujeme za objednavku"},
|
||||
{"index":59,"old":"Dopravci - GLS - Utanvet reszletezo","new":"06 Dopravci dobirky/faktury - GLS HU - utanvet"},
|
||||
{"index":60,"old":"B2B - Faktura č - Vertone","new":"04 B2B faktury/doklady - Vertone - faktura"},
|
||||
{"index":61,"old":"Dopravci - Balíkovna - Vezeme Vám balík","new":"05 Dopravci dorucovani - Balikovna - vezeme balik"}
|
||||
]
|
||||
@@ -0,0 +1,80 @@
|
||||
# Mapa prejmenovani filtru SOGo
|
||||
|
||||
Datum: 2026-08-06
|
||||
|
||||
Format noveho nazvu:
|
||||
|
||||
`CILOVA_SLOZKA - ZDROJ - TYP_ZPRAVY`
|
||||
|
||||
Priklady:
|
||||
|
||||
- `03 B2B objednavky - Vertone - prijata objednavka`
|
||||
- `04 B2B faktury/doklady - Yate - faktura`
|
||||
- `05 Dopravci dorucovani - GLS - doruceno`
|
||||
- `99 Automaticky odfiltrovano - Fio/DPD - prijem COD`
|
||||
|
||||
## Nove nazvy
|
||||
|
||||
| # | Novy nazev |
|
||||
|---:|---|
|
||||
| 1 | 99 Automaticky odfiltrovano - PKO/PayU - uznani konta |
|
||||
| 2 | 99 Automaticky odfiltrovano - PKO/DPD - uznani konta |
|
||||
| 3 | 99 Automaticky odfiltrovano - PKO/Zasilkovna - uznani konta |
|
||||
| 4 | 03 B2B objednavky - Techinova - potvrzeni |
|
||||
| 5 | 06 Dopravci dobirky/faktury - GLS - aktualni stav |
|
||||
| 6 | 06 Dopravci dobirky/faktury - DPD - hromadne platby COD |
|
||||
| 7 | 06 Dopravci dobirky/faktury - GLS Returns - report |
|
||||
| 8 | 08 Recenze - Trustpilot - nova recenze |
|
||||
| 9 | 09 Marketing a platformy - Google Ads - notifikace |
|
||||
| 10 | 99 Automaticky odfiltrovano - DPD - dotaznik doruceni |
|
||||
| 11 | 04 B2B faktury/doklady - Yate - faktura |
|
||||
| 12 | 05 Dopravci dorucovani - DPD - dnes dorucime balicek |
|
||||
| 13 | 08 Recenze - Google Business - nova recenze |
|
||||
| 14 | 05 Dopravci dorucovani - PPL - prevzali zasilku |
|
||||
| 15 | 02 Objednavky zakaznici - 9b-plus - nova objednavka |
|
||||
| 16 | 99 Automaticky odfiltrovano - Dropbox - tydenni souhrn |
|
||||
| 17 | 99 Automaticky odfiltrovano - Instagram - momenty |
|
||||
| 18 | 99 Automaticky odfiltrovano - Spam domeny - blokovani |
|
||||
| 19 | 04 B2B faktury/doklady - Ocun - faktura |
|
||||
| 20 | 04 B2B faktury/doklady - Ferrino - faktura |
|
||||
| 21 | 04 B2B faktury/doklady - Ocun - dodaci list |
|
||||
| 22 | 99 Automaticky odfiltrovano - Instagram - neprectene zpravy |
|
||||
| 23 | 04 B2B faktury/doklady - Pinguin/Activent - faktura |
|
||||
| 24 | 03 B2B objednavky - Brynje/Norsky svet - potvrzeni |
|
||||
| 25 | 03 B2B objednavky - Ocun - potvrzeni |
|
||||
| 26 | 99 Automaticky odfiltrovano - Zasilkovna - prehled dobirek |
|
||||
| 27 | 05 Dopravci dorucovani - Zasilkovna - prevzato |
|
||||
| 28 | 04 B2B faktury/doklady - Sea to Summit - invoice |
|
||||
| 29 | 05 Dopravci dorucovani - GLS - dnes dorucujeme |
|
||||
| 30 | 99 Automaticky odfiltrovano - Fio/DPD - prijem COD |
|
||||
| 31 | 99 Automaticky odfiltrovano - Fio/Zasilkovna CZK - prijem COD |
|
||||
| 32 | 06 Dopravci dobirky/faktury - GLS - seznam dobirek |
|
||||
| 33 | 05 Dopravci dorucovani - GLS - sledovani baliku |
|
||||
| 34 | 99 Automaticky odfiltrovano - Heureka SK - faktura |
|
||||
| 35 | 99 Automaticky odfiltrovano - Fio/Zasilkovna EUR - prijem COD |
|
||||
| 36 | 05 Dopravci dorucovani - GLS - doruceno |
|
||||
| 37 | 99 Automaticky odfiltrovano - Instagram - feed notifikace |
|
||||
| 38 | 99 Automaticky odfiltrovano - Fio/GLS CZK - prijem COD |
|
||||
| 39 | 05 Dopravci dorucovani - DPD SK - balik na ceste |
|
||||
| 40 | 99 Automaticky odfiltrovano - Fio - vydaj z uctu |
|
||||
| 41 | 03 B2B objednavky - Vertone - prijata objednavka |
|
||||
| 42 | 06 Dopravci dobirky/faktury - GLS - track trace protocol |
|
||||
| 43 | 04 B2B faktury/doklady - Norsky svet - faktura |
|
||||
| 44 | 05 Dopravci dorucovani - PPL - dnes dorucujeme |
|
||||
| 45 | 03 B2B objednavky - Pinguin/Activent - potvrzeni |
|
||||
| 46 | 05 Dopravci dorucovani - PPL - prevzato |
|
||||
| 47 | 05 Dopravci dorucovani - Wygodne Zwroty - nova zasilka |
|
||||
| 48 | 05 Dopravci dorucovani - Wygodne Zwroty - na ceste |
|
||||
| 49 | 03 B2B objednavky - Warmpeace - objednavka zbozi |
|
||||
| 50 | 03 B2B objednavky - Rock Empire - submitted order |
|
||||
| 51 | 03 B2B objednavky - Sea to Summit - potvrzeni |
|
||||
| 52 | 99 Automaticky odfiltrovano - Fio/GLS - prijem COD |
|
||||
| 53 | 06 Dopravci dobirky/faktury - GLS SK - zoznam dobierok |
|
||||
| 54 | 05 Dopravci dorucovani - DPD CZ - balik na ceste |
|
||||
| 55 | 05 Dopravci dorucovani - GLS - prevzali balik |
|
||||
| 56 | 03 B2B objednavky - Sea to Summit - shipping/delivery note |
|
||||
| 57 | 04 B2B faktury/doklady - Norge - faktura k objednavce |
|
||||
| 58 | 03 B2B objednavky - Vertone - dekujeme za objednavku |
|
||||
| 59 | 06 Dopravci dobirky/faktury - GLS HU - utanvet |
|
||||
| 60 | 04 B2B faktury/doklady - Vertone - faktura |
|
||||
| 61 | 05 Dopravci dorucovani - Balikovna - vezeme balik |
|
||||
@@ -0,0 +1,60 @@
|
||||
# SOGo slozky - presun pod Dorucenou postu
|
||||
|
||||
Datum: 2026-08-06
|
||||
Ucet: `info@9b-plus.com`
|
||||
|
||||
## Cil
|
||||
|
||||
Sjednotit pracovni slozky tak, aby byly vsechny hlavni tridici slozky pohromade pod `Dorucena posta`.
|
||||
|
||||
## Presunute slozky
|
||||
|
||||
Tyto slozky byly presunuty pod `Dorucena posta`:
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `07 - Reklamace`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
Po presunu je strom slozek pod `Dorucena posta`:
|
||||
|
||||
- `01 - Akcni - k reseni`
|
||||
- `02 - Objednavky zakaznici`
|
||||
- `03 - B2B objednavky`
|
||||
- `04 - B2B faktury a doklady`
|
||||
- `05 - Dopravci - dorucovani`
|
||||
- `06 - Dopravci - dobirky a faktury`
|
||||
- `07 - Reklamace`
|
||||
- `08 - Recenze`
|
||||
- `09 - Marketing a platformy`
|
||||
- `90 - Archiv vyrizeno`
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
## Oprava filtru po presunu
|
||||
|
||||
Po presunu slozky `99 - Automaticky odfiltrovano` ukazovaly filtry, ktere do ni drive mirily, jen placeholder `Postovni schranka`. Proto byly jejich cile znovu nastaveny na aktualni slozku `99 - Automaticky odfiltrovano` pod `Dorucena posta`.
|
||||
|
||||
Opraveno:
|
||||
|
||||
- 17 filtru s prefixem `99 Automaticky odfiltrovano`
|
||||
- z toho 1 filtr byl opraven kontrolne rucne jako prvni
|
||||
- dalsich 16 filtru bylo opraveno v pruchodu seznamem
|
||||
|
||||
Kontrolne overene filtry po ulozeni:
|
||||
|
||||
- `99 Automaticky odfiltrovano - PKO/PayU - uznani konta`
|
||||
- `99 Automaticky odfiltrovano - Spam domeny - blokovani`
|
||||
- `99 Automaticky odfiltrovano - Fio/GLS - prijem COD`
|
||||
|
||||
Vsechny tri overene filtry ukazovaly cil:
|
||||
|
||||
- `99 - Automaticky odfiltrovano`
|
||||
|
||||
## Ulozeni a overeni
|
||||
|
||||
Po oprave filtru bylo kliknuto hlavni `save` v SOGo. SOGo zobrazilo potvrzeni `ulozeny` a tlacitko `save` bylo nasledne znovu neaktivni.
|
||||
|
||||
Finalni vizualni kontrola ve stromu slozek potvrdila, ze `01`, `07` a `99` jsou pod `Dorucena posta`.
|
||||
|
||||
## Bezpecnostni poznamka
|
||||
|
||||
Pri teto fazi nebyly mazany zadne zpravy, nebyly mazany zadne filtry, nebyly odesilany zadne e-maily a nebylo zapnuto preposilani.
|
||||
@@ -0,0 +1,88 @@
|
||||
# SOGo Inbox audit - vzorek pro trideni
|
||||
|
||||
Datum: 2026-08-06 14:35
|
||||
Ucet: `info@9b-plus.com`
|
||||
Rezim: pouze audit, bez zmen v SOGo
|
||||
|
||||
## Cil
|
||||
|
||||
Projit rozumny vzorek starsich e-mailu v Inboxu kolem data `03.07.2026` a starsich.
|
||||
|
||||
Cilem neni vytvaret filtry jeden po druhem, ale rozdelit e-maily do skupin:
|
||||
|
||||
- existujici filtr uz mame
|
||||
- filtr chybi a stoji za navrh
|
||||
- ziva komunikace / ponechat v Inboxu
|
||||
- nejiste, nutne rozhodnout pozdeji
|
||||
|
||||
## Provedeny vzorek
|
||||
|
||||
Viditelny vzorek obsahoval hlavne zpravy z `02.07.2026` a `01.07.2026`.
|
||||
|
||||
Pred timto auditem byl jeden starsi e-mail Instagram z `03.07.2026` presunut do `99 - Automaticky odfiltrovano`, protoze odpovidal uz existujicimu Instagram filtru.
|
||||
|
||||
## Uz pokryto existujicim filtrem
|
||||
|
||||
Tyto zpravy maji podle ulozenych pravidel existujici filtr. Lze je hromadne presouvat do odpovidajicich slozek.
|
||||
|
||||
| Datum | Odesilatel | Predmet | Cil |
|
||||
|---|---|---|---|
|
||||
| 02.07.2026 | `customers@activent365.com` | `Pinguin - Potvrzeni objednavky ze systemu B2B` | `03 - B2B objednavky` |
|
||||
| 02.07.2026 | `Sea to Summit EMEA B2B` | `Sea to Summit Order Confirmation Order No. SMT12059` | `03 - B2B objednavky` |
|
||||
| 02.07.2026 | `support@ppl.cz` | `PPL - Prevzali jsme vasi zasilku` | `05 - Dopravci - dorucovani` |
|
||||
| 01.07.2026 | `Zasilkovna s.r.o.` | `Prehled vybranych dobirek` | `99 - Automaticky odfiltrovano` |
|
||||
| 01.07.2026 | `NOREPLY@dpd.cz` | `Vas balicek je na ceste` | `05 - Dopravci - dorucovani` |
|
||||
|
||||
Poznamka: U Zasilkovny je potreba pri presunu overit presnou odesilaci adresu. Existujici filtr ceka `fakturace@zasilkovna.cz`.
|
||||
|
||||
## Pravdepodobne pokryto, ale chce overit detail
|
||||
|
||||
Tyto zpravy vypadaji jako veci, pro ktere uz logicky filtr mame, ale podle viditelneho seznamu neni jistota, ze sedi presna kombinace odesilatel + predmet.
|
||||
|
||||
| Datum | Odesilatel | Predmet | Pravdepodobny cil | Proc overit |
|
||||
|---|---|---|---|---|
|
||||
| 01.07.2026 | `Zasilkovna s.r.o.` | `Faktura za sluzby a prehled vybranych dobirek` | `99 - Automaticky odfiltrovano` nebo `06 - Dopravci - dobirky a faktury` | existujici filtr pokryva `Prehled vybranych dobirek`, ale nemusi pokryt fakturu za sluzby |
|
||||
| 02.07.2026 | `fakturace@gls-czech.com` | `GLS Faktura/Invoice 26043045` | `06 - Dopravci - dobirky a faktury` | v ulozenych filtrech je vice GLS pravidel, ale nenasel se jasny filtr pro `fakturace@gls-czech.com` + faktura |
|
||||
|
||||
## Kandidati na nove filtry
|
||||
|
||||
Tyto zpravy pravdepodobne zatim nemaji samostatny filtr a stoji za sbirani do davkoveho navrhu.
|
||||
|
||||
| Datum | Odesilatel | Predmet | Navrh |
|
||||
|---|---|---|---|
|
||||
| 01.07.2026 | `FAYN` | `Vyuctovani telekomunikacnich sluzeb 6/2026` | novy filtr do `04 - B2B faktury a doklady` nebo samostatne rozhodnout, kam patri telekom faktury |
|
||||
| 02.07.2026 | `Sea to Summit EMEA B2B` | `135072 is your code` | pravdepodobne jednorazovy prihlasovaci kod; spis nevytvaret filtr, nebo davat do `99` jen pokud se opakuje |
|
||||
| 02.07.2026 | `Karel` | `Vas e-shop me zaujal z jednoho duvodu` | obchodni nabidka/spam kandidat; nejdrive sbirat dalsi podobne vzorky |
|
||||
|
||||
## Ponechat v Inboxu / ziva komunikace
|
||||
|
||||
Tyto zpravy vypadaji jako komunikace se zakaznikem nebo odpovedi. Nemely by padat do automatickych slozek, pokud nejsou vyrizene rucne.
|
||||
|
||||
| Datum | Odesilatel | Predmet | Duvod |
|
||||
|---|---|---|---|
|
||||
| 02.07.2026 | `Monika 9b plus` | `RE: [9b-plus] New order ...` | odpoved / interni nebo zakaznicka komunikace |
|
||||
| 02.07.2026 | `ales.rajch@9b-plus.com` | `RE: Vas e-shop me zaujal z jednoho duvodu` | odpoved, nema se filtrovat podle puvodniho spamu |
|
||||
| 02.07.2026 | `Miroslava Helusova` | `Re: [9b-plus] Cekani na bankovni platbu ...` | ziva zakaznicka komunikace |
|
||||
| 01.07.2026 | `Monika 9b plus` | `RE: Wrong DPD Pickup Locker - Request for Assistance` | ziva komunikace |
|
||||
| 01.07.2026 | `MonikaBednarek` | `Witam jaki jest czas oczekiwania...` | dotaz zakaznika |
|
||||
|
||||
## Doporuceny dalsi postup
|
||||
|
||||
1. Nejdriv udelat hromadny presun jasne pokrytych zpravy:
|
||||
- Pinguin potvrzeni -> `03 - B2B objednavky`
|
||||
- Sea to Summit order confirmation -> `03 - B2B objednavky`
|
||||
- PPL prevzali zasilku -> `05 - Dopravci - dorucovani`
|
||||
- DPD balik na ceste -> `05 - Dopravci - dorucovani`
|
||||
- Zasilkovna prehled dobirek -> `99 - Automaticky odfiltrovano`, pokud sedi odesilatel
|
||||
2. Pred presunem nejasnych GLS/Zasilkovna/FAYN otevrit detail zpravy a overit presne odesilatele.
|
||||
3. Nove filtry zatim nevytvaret jednotlive. Nejdrive nasbirat vice podobnych vzorku.
|
||||
4. Az bude vzorku vic, vytvorit davkovy navrh novych filtru:
|
||||
- GLS faktury
|
||||
- FAYN vyuctovani
|
||||
- obchodni nabidky/spam typu `Vas e-shop me zaujal...`
|
||||
5. U vsech novych automatickych filtru zachovat ochranu proti odpovedim:
|
||||
- predmet neodpovida regexu `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
|
||||
## Bezpecnost
|
||||
|
||||
Behem tohoto auditu nebyly vytvareny nove filtry, nebyly mazany zpravy a nebyly provedeny hromadne presuny.
|
||||
@@ -0,0 +1,121 @@
|
||||
# SOGo - cervnovy vzorek Inboxu
|
||||
|
||||
Datum auditu: 2026-08-06
|
||||
|
||||
Rozsah vzorku:
|
||||
|
||||
- slozka: `Dorucena posta`
|
||||
- viditelny cervnovy usek: priblizne `19-Cer-26` az `01-Cer-26`
|
||||
- pocet vytazenych radku: `305`
|
||||
- ucel: pouze analyza, bez presunu, bez mazani a bez tvorby novych filtru
|
||||
|
||||
## Hromadne ukliditelne podle existujicich filtru
|
||||
|
||||
Tyto vzory uz pravdepodobne odpovidaji existujicim filtrum. Dalsi krok muze byt hromadne vyhledat, overit pocet `X vybrano` a presunout do cilove slozky.
|
||||
|
||||
- `reports@gls-czech.com` - `3.31. Aktualni stav jednotlivych baliku + adresy ... Scheduled report ID: 2918`
|
||||
- ve vzorku: `11`
|
||||
- cil podle existujici logiky: `06 - Dopravci - dobirky a faktury`
|
||||
|
||||
- `dobirky@gls-czech.com` - `Seznam dobirek ... klient 53003289`
|
||||
- ve vzorku: `2`
|
||||
- cil podle existujici logiky: `06 - Dopravci - dobirky a faktury`
|
||||
|
||||
- `dobierky@gls-slovakia.sk` - `Zoznam dobierok / COD list ...`
|
||||
- viditelne ve vzorku drive kolem 26. 6.
|
||||
- cil podle existujici logiky: `06 - Dopravci - dobirky a faktury`
|
||||
|
||||
- `noreply@gls-czech.com` - `GLS - Dnes vam budeme dorucovat balik...`
|
||||
- ve vzorku: `2+`
|
||||
- cil podle existujici logiky: `05 - Dopravci - dorucovani`
|
||||
|
||||
- `noreply@gls-czech.com` - `GLS - Prevzali jsme vas balik...`
|
||||
- ve vzorku: `2+`
|
||||
- cil podle existujici logiky: `05 - Dopravci - dorucovani`
|
||||
|
||||
- `NOREPLY@dpd.cz` - `Vas balicek je na ceste`
|
||||
- ve vzorku: `2`
|
||||
- cil podle existujici logiky: `05 - Dopravci - dorucovani`
|
||||
|
||||
- `hromadne.COD@dpd.cz` - `DPD: Tydenni rozpis hromadnych plateb...`
|
||||
- ve vzorku: `2`
|
||||
- cil podle existujici logiky: `06 - Dopravci - dobirky a faktury`
|
||||
|
||||
- `Zasilkovna` - `Zasilku jsme prevzali a nasledujici pracovni den ji dorucime...`
|
||||
- ve vzorku: `1+`
|
||||
- cil podle existujici logiky: `05 - Dopravci - dorucovani`
|
||||
|
||||
- `Balikovna` - `Vezeme Vam balik` / `Vas balik ... je v nasich rukach`
|
||||
- ve vzorku: `3`
|
||||
- cil podle existujici logiky: `05 - Dopravci - dorucovani`
|
||||
|
||||
- `Dropbox` - `Last week's updates in your shared folders`
|
||||
- ve vzorku: `1`
|
||||
- cil podle existujici logiky: `99 - Automaticky odfiltrovano`
|
||||
|
||||
## Kandidati na novy filtr / spam nebo marketing
|
||||
|
||||
Tyto vzory vypadaji jako opakovany marketing, cold outreach nebo spam. Pred tvorbou filtru jeste overit par dalsich vysledku hledanim v SOGo.
|
||||
|
||||
- `global@intro.rinda.ai`
|
||||
- priklady: `9b-plus's products and global buyers`, `Reaching 9b-plus's global buyers with RINDA`
|
||||
- navrh: novy filtr do `99 - Automaticky odfiltrovano` nebo `10 - Spam ke kontrole`
|
||||
|
||||
- `Iza from Dealavo`
|
||||
- priklady: `Going live TODAY...`, `Is the "Rule of 100" wrong?`, `54% of consumers got the math wrong.`
|
||||
- navrh: marketing filtr, spise `99 - Automaticky odfiltrovano`
|
||||
|
||||
- genericke predmety `Question for`
|
||||
- odesilatele ve vzorku: `Laura Bedford`, `Maureen Donovan`, `Aaliyah Gulgowski`
|
||||
- navrh: ne podle predmetu samotneho, radeji podle domen/odesilatelu po dalsim overeni
|
||||
|
||||
- `Arina Nosek`
|
||||
- priklady: `Easy help for your site`, `Re: Easy help for your site`
|
||||
- navrh: spam/marketing kandidat
|
||||
|
||||
- genericke predmety `Looking forward`
|
||||
- odesilatele ve vzorku: `Adi Levy`, `Meda Schmidt`
|
||||
- navrh: ne podle predmetu samotneho, radeji podle domen/odesilatelu po dalsim overeni
|
||||
|
||||
- `ShakerX Sales`
|
||||
- priklad: `Personalizovane sejkry a sportovni lahve pro Vase cleny`
|
||||
- navrh: spam/marketing kandidat
|
||||
|
||||
- `Bennett Kerluke`
|
||||
- priklad: `Small idea`
|
||||
- navrh: spam/marketing kandidat
|
||||
|
||||
- `Lucia Raye`
|
||||
- priklad: `Scaling your MySQL + Marketing setup!`
|
||||
- navrh: spam/marketing kandidat
|
||||
|
||||
- `BrandIdea`
|
||||
- priklad: `Dotrzyj do klientow przez tematyczne grupy Facebooka`
|
||||
- navrh: marketing kandidat
|
||||
|
||||
- `Scarlett Wang`
|
||||
- priklad: `The global bag market hits $214B in 2026...`
|
||||
- navrh: spam/marketing kandidat
|
||||
|
||||
- `HKTDC Exhibition`
|
||||
- priklad: `CENTRESTAGE 2026...`
|
||||
- navrh: marketing kandidat
|
||||
|
||||
- `Nikoleta Mikulkova`
|
||||
- priklad: `Byli Jste Vybrani, Potvrdte Prijeti Grantu Google Relief Grant`
|
||||
- navrh: velmi pravdepodobny spam/scam
|
||||
|
||||
## Nechat byt / nesahat automaticky
|
||||
|
||||
Tyto vzory vypadaji jako ziva zakaznicka nebo obchodni komunikace. Nepresouvat automaticky bez samostatneho rozhodnuti.
|
||||
|
||||
- zpravy zacinajici `RE:`, `Re:`, `AW:`, `FW:` od zakazniku nebo od `Monika 9b plus` / `ales.rajch@9b-plus.com`
|
||||
- reklamace, vratky a dotazy typu `Ruckgabe meiner Bestellung`, `No information about order`, `Delivery`
|
||||
- odpovedi na objednavky `[9b-plus] New order`, `Potvrzeni objednavky`, `PayU - zamowienie oplacone`
|
||||
- B2B komunikace typu `Quotation`, `Skladovka`, `objednavka`, pokud neni jasne systemova notifikace
|
||||
|
||||
## Navrh dalsiho kroku
|
||||
|
||||
1. Nejdrev hromadne uklidit existujici jasne filtry: GLS reports, GLS dobirky, GLS dorucovani, DPD, Balikovna, Dropbox.
|
||||
2. Pak vyhledat kazdeho spam/marketing kandidata samostatne a overit pocet vysledku.
|
||||
3. Teprve po potvrzeni uzivatelem vytvorit nove filtry pro opakovane spam/marketing zdroje.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,484 @@
|
||||
# Zaloha stareho nastaveni SOGo - info@9b-plus.com
|
||||
|
||||
Datum ulozeni: 2026-08-06
|
||||
Rezim: pouze cteni, bez ulozeni zmen v SOGo
|
||||
|
||||
## Souhrn
|
||||
|
||||
- Mailbox: info@9b-plus.com
|
||||
- Zdroj: SOGo Groupware / mail.ma-al.com
|
||||
- Inbox: 10347 zprávy
|
||||
- Kapacita: 76% využito z 10240 MB
|
||||
- Pocet ulozenych filtru: 61
|
||||
|
||||
## Slozky
|
||||
|
||||
- Doručená pošta
|
||||
- AAA - vyřízená konverzace
|
||||
- B2B - faktury
|
||||
- B2B - potvrzeni objednavky
|
||||
- B2C - potvrzení objednávky
|
||||
- Dopravci - doručované zásilky
|
||||
- Dopravci - faktury atd.
|
||||
- Google - ADS
|
||||
- Recenze od zákazníků
|
||||
- Koncepty
|
||||
- Odeslaná pošta
|
||||
- Koš
|
||||
- Nevyžádaná pošta
|
||||
- Šablony
|
||||
- Archive
|
||||
|
||||
## Filtry
|
||||
|
||||
### 1. Smazat oznámení PKO - PayU
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Uznanie konta
|
||||
- Podminka: Odesílatel je rovno powiadomienia@pkobp.pl
|
||||
- Podminka: Tělo obsahuje Wypłata z PayU
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 2. Smazat oznámení PKO - DPD
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Uznanie konta
|
||||
- Podminka: Odesílatel je rovno powiadomienia@pkobp.pl
|
||||
- Podminka: Tělo obsahuje DPD POLSKA
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 3. Smazat oznámení PKO - Zasilkovna
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Uznanie konta
|
||||
- Podminka: Odesílatel je rovno powiadomienia@pkobp.pl
|
||||
- Podminka: Tělo obsahuje ZASILKOVNA
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 4. B2B - potvrzeni objednavky - TECHINOVA s.r.o.
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Potvrzení obj. číslo
|
||||
- Podminka: Odesílatel je rovno office@veltrek.cz
|
||||
- Podminka: Tělo obsahuje v příloze zasíláme potvrzení objednávky
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 5. Dopravci - GLS - Aktualni stav
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Aktuální stav jednotlivých balíků
|
||||
- Podminka: Odesílatel je rovno reports@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 6. Dopravci - DPD - Týdenní rozpis hromadných plateb za období
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Týdenní rozpis hromadných plateb za období
|
||||
- Podminka: Odesílatel je rovno hromadne.COD@dpd.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 7. Dopravci - GLS - International ShopReturnService Report
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje International ShopReturnService Report
|
||||
- Podminka: Odesílatel je rovno no-reply@mail.gls-returns.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 8. Recenze - Trustpilot
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje You've got a new 5-star review
|
||||
- Podminka: Odesílatel je rovno noreply.notifications@trustpilot.com
|
||||
- Akce: Ulož zprávu do složky -> Recenze od zákazníků
|
||||
|
||||
### 9. Google - ADS - reklamy
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno ads-noreply@google.com
|
||||
- Akce: Ulož zprávu do složky -> Google - ADS
|
||||
|
||||
### 10. Dopravci - DPD - recenze na doručení
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno vasnazor@feedback.dpd.cz
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 11. B2B - faktury - Yate
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje FAKTURA - daňový doklad ev.č.
|
||||
- Podminka: Odesílatel je rovno expedice@yate.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 12. Dopravci - DPD - Dnes Vám doručíme balíček
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno NOREPLY@dpd.cz
|
||||
- Podminka: Předmět je rovno Dnes Vám doručíme balíček
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 13. Recenze - Google
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno businessprofile-noreply@google.com
|
||||
- Podminka: Tělo obsahuje Vedete si skvěle, dostali jste novou 5hvězdičkovou recenzi
|
||||
- Akce: Ulož zprávu do složky -> Recenze od zákazníků
|
||||
|
||||
### 14. Dopravci - PPL - Převzali jsme vaši
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno support@ppl.cz
|
||||
- Podminka: Předmět je rovno PPL – Převzali jsme vaši
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 15. B2C - potvrzeni objednavky
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje [9b-plus] New order
|
||||
- Podminka: Odesílatel je rovno info@9b-plus.com
|
||||
- Podminka: Předmět neobsahuje RE: [9b-plus] New order
|
||||
- Akce: Ulož zprávu do složky -> B2C - potvrzení objednávky
|
||||
|
||||
### 16. Dropbox - Last week's updates in your shared folders
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Last week's updates in your shared folders
|
||||
- Podminka: Odesílatel je rovno no-reply@dropbox.com
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 17. Instagram - 9bplus, mrkněte na momenty, které vám utekly
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno no-reply@mail.instagram.com
|
||||
- Podminka: Předmět obsahuje 9bplus, mrkněte na momenty, které vám utekly
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 18. SPAM
|
||||
|
||||
- Shoda: odpovídají některému z následujících pravidel
|
||||
- Podminka: Odesílatel obsahuje @chinapipa.com
|
||||
- Podminka: Odesílatel obsahuje @live-haixingapp.com
|
||||
- Podminka: Odesílatel obsahuje @jt-trading.de
|
||||
- Podminka: Odesílatel obsahuje @hktdc.com
|
||||
- Podminka: Odesílatel obsahuje @volnezakazky.com
|
||||
- Podminka: Odesílatel obsahuje @magedia.eu
|
||||
- Podminka: Odesílatel obsahuje @skyprime.info
|
||||
- Podminka: Odesílatel obsahuje @integratedcollision.com
|
||||
- Podminka: Odesílatel obsahuje @bagoem.com
|
||||
- Podminka: Odesílatel obsahuje @mailclaro.com.pe
|
||||
- Podminka: Odesílatel obsahuje @arredamenti2c.com
|
||||
- Podminka: Odesílatel obsahuje @home-sina.com
|
||||
- Podminka: Odesílatel obsahuje @hoffmannkuechen.de
|
||||
- Podminka: Odesílatel obsahuje @fordogtrainers.it
|
||||
- Podminka: Odesílatel obsahuje @tx.xmbagsss.com>
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 19. B2B - faktury - RP Climbing - Ocún
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno invoicing@ocun.com
|
||||
- Podminka: Předmět obsahuje Faktura č.
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 20. B2B - faktury - Ferrino
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Faktura Ferrino
|
||||
- Podminka: Odesílatel je rovno velkoobchod@ferrino.cz
|
||||
- Podminka: Předmět neobsahuje RE: Faktura Ferrino
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 21. B2B - faktury - Dodací list - RP Climbing - Ocún
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Dodací list
|
||||
- Podminka: Odesílatel je rovno noreply@ocun.com
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 22. Instagram - 9bplus, máte nepřečtené zprávy
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje 9bplus, máte nepřečtené zprávy
|
||||
- Podminka: Odesílatel je rovno no-reply@mail.instagram.com
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 23. B2B - faktury - Activent 365 s.r.o. - Pinguin
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno objednavky@activent365.com
|
||||
- Podminka: Předmět obsahuje Faktura č.:
|
||||
- Podminka: Předmět neobsahuje RE: Faktura č.:
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 24. B2B - potvrzeni objednavky - BRYNJE.eu
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Objednávka č
|
||||
- Podminka: Odesílatel je rovno obchod@norskysvet.cz
|
||||
- Podminka: Předmět neobsahuje RE: Objednávka č
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 25. B2B - potvrzeni objednavky - Ocun
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno noreply@ocun.com
|
||||
- Podminka: Předmět obsahuje Potvrzení přijetí objednávky
|
||||
- Podminka: Předmět neobsahuje RE: Potvrzení přijetí objednávky
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 26. Dopravci - Zásilkovna - Přehled vybraných dobírek
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Přehled vybraných dobírek
|
||||
- Podminka: Odesílatel je rovno fakturace@zasilkovna.cz
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 27. Dopravci - Zásilkovna - Zásilku jsme převzali a následující pracovní den ji doručíme
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Zásilku jsme převzali a následující pracovní den ji doručíme
|
||||
- Podminka: Odesílatel obsahuje noreply@zasilkovna.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 28. B2B - faktury - STS
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Sea to Summit GmbH - Invoice
|
||||
- Podminka: Odesílatel obsahuje system@sent-via.netsuite.com
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 29. Dopravci - GLS - Dnes vám budeme doručovat balík
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje GLS - Dnes vám budeme doručovat balík
|
||||
- Podminka: Odesílatel je rovno noreply@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 30. Smazat oznámení FIO - DPD
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Fio banka - prijem na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Podminka: Tělo obsahuje Protiúčet: 5080116857/5500
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 31. Smazat oznámení FIO - Zásilkovna - CZK
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Fio banka - prijem na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Podminka: Tělo obsahuje Protiúčet: 2534330118/2600
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 32. Dopravci - GLS - Seznam dobírek
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Seznam dobírek
|
||||
- Podminka: Odesílatel je rovno dobirky@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 33. Dopravci - GLS - Sledování balíku
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje GLS - Sledování balíku
|
||||
- Podminka: Odesílatel je rovno noreply@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 34. HEUREKA.SK - Faktúra - daňový doklad
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Faktúra - daňový doklad
|
||||
- Podminka: Odesílatel je rovno no-reply@heureka.sk
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 35. Smazat oznámení FIO - Zásilkovna - EUR
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Fio banka - prijem na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Podminka: Tělo obsahuje Protiúčet: CZ2826000000002534330505/2600
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 36. Dopravci - GLS - Doručili jsme váš balík
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje GLS - Doručili jsme váš balík
|
||||
- Podminka: Odesílatel je rovno noreply@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 37. Instagram - 9bplus, sledujte ve svém kanálu
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje 9bplus, sledujte ve svém kanálu
|
||||
- Podminka: Odesílatel je rovno no-reply@mail.instagram.com
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 38. Smazat oznámení FIO - GLS - CZK
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Fio banka - prijem na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Podminka: Tělo obsahuje Protiúčet: 2110374539/2700
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 39. Dopravci - DPD - Váš balícek je na ceste
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Váš balícek je na ceste
|
||||
- Podminka: Odesílatel je rovno NOREPLY@dpd.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 40. Smazat oznámení FIO - Fio banka - vydaj na konte
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Fio banka - vydaj na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 41. B2B - potvrzeni objednavky - Vertone - Objednávka byla přijata
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Objednávka byla přijata
|
||||
- Podminka: Odesílatel je rovno info@vertone.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 42. Dopravci - GLS - Track & Trace Protocol
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Track & Trace Protocol
|
||||
- Podminka: Odesílatel je rovno noreply@gls-group.eu
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 43. B2B - faktury - Norský svět
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Faktura za objednávku
|
||||
- Podminka: Odesílatel je rovno michal@norge.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 44. Dopravci - PPL – Vaši zásilku budeme dnes doručovat
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno PPL – Vaši zásilku budeme dnes doručovat
|
||||
- Podminka: Odesílatel je rovno support@ppl.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 45. B2B - faktury - Pinguin - Potvrzení objednávky ze systému B2B
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Pinguin - Potvrzení objednávky ze systému B2B
|
||||
- Podminka: Odesílatel je rovno customers@activent365.com
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 46. Dopravci - PPL – Převzali jsme Vaši zásilku
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno PPL – Převzali jsme Vaši zásilku
|
||||
- Podminka: Odesílatel je rovno support@ppl.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 47. Dopravci - Nowa przesyłka
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Nowa przesyłka
|
||||
- Podminka: Odesílatel je rovno noreply@wygodnezwroty.pl
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 48. Dopravci - Przesyłki w drodze
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Przesyłki w drodze
|
||||
- Podminka: Odesílatel je rovno noreply@wygodnezwroty.pl
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 49. B2B - Objednavka zbozi - obchod@warmpeace.cz
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Odesílatel je rovno obchod@warmpeace.cz
|
||||
- Podminka: Předmět je rovno Objednavka zbozi
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 50. B2B - Your Submitted Rock Empire Order
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Your Submitted Rock Empire Order
|
||||
- Podminka: Odesílatel je rovno b2b@rockempire.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 51. B2B - Sea to Summit Order Confirmation Order
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Sea to Summit Order Confirmation Order
|
||||
- Podminka: Odesílatel je rovno bestellungen@seatosummit.eu
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 52. Smazat oznámení FIO - GLS
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Fio banka - prijem na konte
|
||||
- Podminka: Odesílatel je rovno automat@fio.cz
|
||||
- Podminka: Tělo obsahuje 2110374539/2700
|
||||
- Akce: Ulož zprávu do složky -> Koš
|
||||
|
||||
### 53. Dopravci - GLS - Zoznam dobierok
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Zoznam dobierok
|
||||
- Podminka: Odesílatel je rovno dobierky@gls-slovakia.sk
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 54. Dopravci - DPD - Váš balíček DPD už je na cestě
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět je rovno Váš balíček DPD už je na cestě
|
||||
- Podminka: Odesílatel je rovno NOREPLY@dpd.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 55. Dopravci - GLS - Převzali jsme váš balík
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje GLS - Převzali jsme váš balík
|
||||
- Podminka: Odesílatel je rovno noreply@gls-czech.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
|
||||
### 56. B2B - Shipping Confirmation + Delivery note Sea to Summit GmbH
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Shipping Confirmation + Delivery note Sea to Summit GmbH
|
||||
- Podminka: Odesílatel je rovno bestellungen@seatosummit.de
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 57. B2B - faktury - Norge
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Faktura k objednávce
|
||||
- Podminka: Odesílatel je rovno michal@norge.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 58. B2B - Vertone - Děkujeme za Vaši B2B objednávku
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Děkujeme za Vaši B2B objednávku
|
||||
- Podminka: Odesílatel je rovno noreply@vert1.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - potvrzeni objednavky
|
||||
|
||||
### 59. Dopravci - GLS - Utanvet reszletezo
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Utanvet reszletezo
|
||||
- Podminka: Odesílatel je rovno utanvet@gls-hungary.com
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - faktury atd.
|
||||
|
||||
### 60. B2B - Faktura č - Vertone
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Faktura č
|
||||
- Podminka: Odesílatel je rovno fakturace@vertone.cz
|
||||
- Akce: Ulož zprávu do složky -> B2B - faktury
|
||||
|
||||
### 61. Dopravci - Balíkovna - Vezeme Vám balík
|
||||
|
||||
- Shoda: odpovídají všem následujícím pravidlům
|
||||
- Podminka: Předmět obsahuje Vezeme Vám balík
|
||||
- Podminka: Odesílatel obsahuje balikovna@balikovna.cz
|
||||
- Akce: Ulož zprávu do složky -> Dopravci - doručované zásilky
|
||||
@@ -0,0 +1,44 @@
|
||||
# SOGo filtry - ochrana proti odpovedim
|
||||
|
||||
Datum: 2026-08-06
|
||||
Ucet: `info@9b-plus.com`
|
||||
|
||||
## Cil upravy
|
||||
|
||||
Automaticke trideni ma zachytavat hlavne systemove a automaticke e-maily. Pokud na takovy e-mail clovek odpovi, odpoved nemá byt schovana do automatickych slozek, ale ma zustat viditelna jako ziva komunikace.
|
||||
|
||||
## Doplnene pravidlo
|
||||
|
||||
Do beznych filtru s rezimem `odpovidaji vsem nasledujicim pravidlum` byla doplnena podminka:
|
||||
|
||||
- pole: `Predmet`
|
||||
- operator: `neodpovida regularnimu vyrazu`
|
||||
- hodnota: `^(RE|Re|AW|Aw|FWD|Fwd)\s*:`
|
||||
|
||||
Prakticky vyznam: filtr se nespusti na predmety zacinajici odpovedi nebo preposlanim typu `RE:`, `Re:`, `AW:`, `Aw:`, `FWD:` nebo `Fwd:`.
|
||||
|
||||
## Rozsah
|
||||
|
||||
- Celkem filtru v SOGo: `61`
|
||||
- Filtru s doplnenym guardem: `60`
|
||||
- Filtru zamerne vynechano: `1`
|
||||
|
||||
Vynechany filtr:
|
||||
|
||||
- `18` - `99 Automaticky odfiltrovano - Spam domeny - blokovani`
|
||||
- Duvod: filtr pouziva rezim `odpovidaji nekteremu z nasledujicich pravidel` a obsahuje seznam spamovych odesilatelu/domen. Pridani stejne podminky do OR filtru by nebylo spolecnym AND guardem a mohlo by zmenit chovani spatnym smerem.
|
||||
|
||||
## Ulozeni a overeni
|
||||
|
||||
Po upravach bylo kliknuto hlavni `save` v SOGo. SOGo zobrazilo potvrzeni ulozeni a tlacitko `save` bylo nasledne znovu neaktivni.
|
||||
|
||||
Kontrolne overene vzorky:
|
||||
|
||||
- `1` - `99 Automaticky odfiltrovano - PKO/PayU - uznani konta`: guard pritomen
|
||||
- `15` - `02 Objednavky zakaznici - 9b-plus - nova objednavka`: guard pritomen
|
||||
- `18` - `99 Automaticky odfiltrovano - Spam domeny - blokovani`: guard nepritomen zamerne
|
||||
- `61` - `05 Dopravci dorucovani - Balikovna - vezeme balik`: guard pritomen
|
||||
|
||||
## Bezpecnostni poznamka
|
||||
|
||||
Pri teto fazi nebyly mazany zadne zpravy, nebyly mazany zadne filtry, nebyly odesilany zadne e-maily a nebylo zapnuto preposilani.
|
||||
@@ -0,0 +1,31 @@
|
||||
# SOGo spam workflow
|
||||
|
||||
Datum: 2026-08-06
|
||||
Ucet: `info@9b-plus.com`
|
||||
|
||||
## Vytvorena slozka
|
||||
|
||||
Pod `Dorucena posta` byla vytvorena slozka:
|
||||
|
||||
- `10 - Spam ke kontrole`
|
||||
|
||||
## Ucel
|
||||
|
||||
Slozka slouzi pouze jako rucni sberna slozka pro spamove e-maily.
|
||||
|
||||
Uzivatel do ni rucne presouva zpravy, ktere povazuje za spam. Tato slozka sama o sobe nema zadny automaticky filtr.
|
||||
|
||||
## Pravidla dalsi prace
|
||||
|
||||
- Agent muze slozku pravidelne analyzovat jako zdroj vzorku.
|
||||
- Agent ma hledat opakujici se adresy, domeny, predmety a fraze.
|
||||
- Agent ma nejdrive navrhnout upravu spam filtru.
|
||||
- Spam filtr se smi upravit az po vyslovnem potvrzeni uzivatele.
|
||||
- Nove zachycene spamy se mohou presouvat do `Kos`, ne mazat trvale.
|
||||
- Zpravy ze slozky `10 - Spam ke kontrole` se bez potvrzeni uzivatele nemazou.
|
||||
|
||||
## Pripominka
|
||||
|
||||
Byla zalozena tydenni pripominka `SOGo spam kontrola`, ktera ma navazat na tento workflow a pripomenout kontrolu slozky `10 - Spam ke kontrole`.
|
||||
|
||||
Pri automatickem navazani muze byt nutne, aby byl uzivatel prihlaseny v SOGo v prohlizeci.
|
||||
Generated
+1172
File diff suppressed because it is too large
Load Diff
+11
-1
@@ -7,9 +7,19 @@
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"dev": "node --watch server.js",
|
||||
"check": "node --check server.js && node --check public/widget.js && node --check public/admin.js"
|
||||
"check": "node --check server.js && node --check public/widget.js && node --check public/admin.js",
|
||||
"build:css": "tailwindcss -i ./src/styles/tailwind.css -o ./public/tailwind.css --minify",
|
||||
"build": "npm run build:css",
|
||||
"test:ui": "playwright test",
|
||||
"test:ui:headed": "playwright test --headed",
|
||||
"verify": "npm run check && npm run build && npm run test:ui"
|
||||
},
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^11.10.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.62.1",
|
||||
"@tailwindcss/cli": "^4.3.3",
|
||||
"tailwindcss": "^4.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
const { defineConfig, devices } = require("@playwright/test");
|
||||
|
||||
module.exports = defineConfig({
|
||||
testDir: "./tests/ui",
|
||||
timeout: 30_000,
|
||||
expect: {
|
||||
timeout: 5_000
|
||||
},
|
||||
fullyParallel: false,
|
||||
retries: 0,
|
||||
reporter: [["list"], ["html", { open: "never" }]],
|
||||
use: {
|
||||
baseURL: "http://127.0.0.1:3400",
|
||||
trace: "retain-on-failure",
|
||||
screenshot: "only-on-failure",
|
||||
video: "retain-on-failure"
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: "desktop",
|
||||
use: { ...devices["Desktop Chrome"], viewport: { width: 1366, height: 900 } }
|
||||
},
|
||||
{
|
||||
name: "mobile",
|
||||
use: { ...devices["Pixel 7"] }
|
||||
}
|
||||
],
|
||||
webServer: {
|
||||
command: "node server.js",
|
||||
url: "http://127.0.0.1:3400/health",
|
||||
reuseExistingServer: true,
|
||||
timeout: 20_000
|
||||
}
|
||||
});
|
||||
+31
-9
@@ -5,16 +5,16 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>MaalFlows Admin</title>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/admin.css">
|
||||
<link rel="stylesheet" href="/tailwind.css">
|
||||
</head>
|
||||
<body>
|
||||
<main class="shell">
|
||||
<section id="loginView" class="login">
|
||||
<form id="loginForm" class="panel">
|
||||
<h1>MaalFlows</h1>
|
||||
<label>Uzivatel <input name="username" autocomplete="username" required></label>
|
||||
<label>Heslo <input name="password" type="password" autocomplete="current-password" required></label>
|
||||
<button type="submit">Prihlasit</button>
|
||||
<section id="loginView" class="login mf-login-shell">
|
||||
<form id="loginForm" class="panel mf-login-card">
|
||||
<h1 class="mf-login-title">MaalFlows</h1>
|
||||
<label class="mf-field">Uzivatel <input class="mf-input" name="username" autocomplete="username" required></label>
|
||||
<label class="mf-field">Heslo <input class="mf-input" name="password" type="password" autocomplete="current-password" required></label>
|
||||
<button class="mf-ui-button-primary" type="submit">Prihlasit</button>
|
||||
<p id="loginError" class="error"></p>
|
||||
</form>
|
||||
</section>
|
||||
@@ -22,7 +22,7 @@
|
||||
<section id="appView" class="app hidden">
|
||||
<aside class="sidebar">
|
||||
<div class="brand">
|
||||
<h1>MaalFlows</h1>
|
||||
<h1 class="mf-toolbar-title">MaalFlows</h1>
|
||||
<div class="brand-actions">
|
||||
<label class="online-dot-toggle" title="Online stav chatu" aria-label="Online stav chatu">
|
||||
<input id="onlineToggle" type="checkbox">
|
||||
@@ -145,7 +145,7 @@
|
||||
<label>Info/GDPR <textarea name="copyInfoText" rows="2"></textarea></label>
|
||||
<div class="settings-actions">
|
||||
<button type="submit">Uložit a přeložit</button>
|
||||
<span id="settingsSaveStatus" class="settings-save-status" aria-live="polite"></span>
|
||||
<span id="settingsSaveStatus" class="settings-save-status" data-settings-save-status aria-live="polite"></span>
|
||||
</div>
|
||||
</fieldset>
|
||||
<label class="color-field">Barva
|
||||
@@ -173,6 +173,17 @@
|
||||
<label><input name="launcherBreathe" type="checkbox"> jemne dychani</label>
|
||||
<label><input name="launcherRing" type="checkbox"> svetelny prstenec</label>
|
||||
<label><input name="launcherHoverLabel" type="checkbox"> napis pri najeti</label>
|
||||
<label><input name="launcherStatusDot" type="checkbox"> stavova tecka</label>
|
||||
<label><input name="launcherPersistentLabel" type="checkbox"> stitek stale</label>
|
||||
<label><input name="launcherSway" type="checkbox"> zhoupnuti</label>
|
||||
<div class="launcher-preview-stage">
|
||||
<button id="launcherPreview" class="launcher-preview" type="button" aria-label="Nahled online tlacitka">
|
||||
<span class="launcher-preview-status" aria-hidden="true"></span>
|
||||
<span class="launcher-preview-icon" aria-hidden="true"></span>
|
||||
<span class="launcher-preview-label">Napiste nam</span>
|
||||
<span class="launcher-preview-badge" aria-hidden="true">1</span>
|
||||
</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="effect-settings">
|
||||
<legend>Efekt pri nove zprave</legend>
|
||||
@@ -180,7 +191,18 @@
|
||||
<label><input name="messageBadge" type="checkbox"> badge s poctem</label>
|
||||
<label><input name="messageLabel" type="checkbox"> kratky stitek</label>
|
||||
<label><input name="messageWiggle" type="checkbox"> zhoupnuti</label>
|
||||
<div class="launcher-preview-stage">
|
||||
<button id="messageEffectPreview" class="launcher-preview" type="button" aria-label="Nahled efektu nove zpravy">
|
||||
<span class="launcher-preview-icon" aria-hidden="true"></span>
|
||||
<span class="launcher-preview-label">Nova odpoved</span>
|
||||
<span class="launcher-preview-badge" aria-hidden="true">1</span>
|
||||
</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="settings-actions">
|
||||
<button type="submit">Ulozit widget</button>
|
||||
<span class="settings-save-status" data-settings-save-status aria-live="polite"></span>
|
||||
</div>
|
||||
</form>
|
||||
<h3>GTM snippet</h3>
|
||||
<pre id="snippet"></pre>
|
||||
|
||||
+68
-6
@@ -130,14 +130,27 @@ document.querySelectorAll("[data-settings-tab]").forEach((button) => {
|
||||
});
|
||||
$("#settingsForm").brand.addEventListener("input", (event) => {
|
||||
$("#settingsForm").brandHex.value = normalizeHexColor(event.target.value) || event.target.value;
|
||||
renderLauncherPreview();
|
||||
});
|
||||
$("#settingsForm").brandHex.addEventListener("input", (event) => {
|
||||
const color = normalizeHexColor(event.target.value);
|
||||
if (color) $("#settingsForm").brand.value = color;
|
||||
renderLauncherPreview();
|
||||
});
|
||||
$("#settingsForm").defaultLanguage.addEventListener("change", () => {
|
||||
updateDefaultLanguagePicker();
|
||||
renderWidgetCopyFields($("#settingsForm").defaultLanguage.value);
|
||||
renderLauncherPreview();
|
||||
});
|
||||
$("#settingsForm").addEventListener("input", (event) => {
|
||||
if (event.target.matches("[name='launcherShape'], [name='launcherBreathe'], [name='launcherRing'], [name='launcherHoverLabel'], [name='launcherStatusDot'], [name='launcherPersistentLabel'], [name='launcherSway'], [name='copyOnlineLabel'], [name='messagePulse'], [name='messageBadge'], [name='messageLabel'], [name='messageWiggle'], [name='copyNewReplyLabel']")) {
|
||||
renderLauncherPreview();
|
||||
}
|
||||
});
|
||||
$("#settingsForm").addEventListener("change", (event) => {
|
||||
if (event.target.matches("[name='launcherShape'], [name='launcherBreathe'], [name='launcherRing'], [name='launcherHoverLabel'], [name='launcherStatusDot'], [name='launcherPersistentLabel'], [name='launcherSway'], [name='messagePulse'], [name='messageBadge'], [name='messageLabel'], [name='messageWiggle']")) {
|
||||
renderLauncherPreview();
|
||||
}
|
||||
});
|
||||
$("#defaultLanguagePicker").addEventListener("click", (event) => {
|
||||
event.stopPropagation();
|
||||
@@ -168,7 +181,7 @@ $("#onlineToggle").addEventListener("change", async () => {
|
||||
|
||||
$("#settingsForm").addEventListener("submit", async (event) => {
|
||||
event.preventDefault();
|
||||
const submitButton = event.currentTarget.querySelector("button[type='submit']");
|
||||
const submitButtons = [...event.currentTarget.querySelectorAll("button[type='submit']")];
|
||||
setSettingsSaveStatus("saving", "Ukládám...");
|
||||
const form = new FormData(event.currentTarget);
|
||||
const settings = structuredClone(state.site.settings);
|
||||
@@ -208,14 +221,19 @@ $("#settingsForm").addEventListener("submit", async (event) => {
|
||||
shape: form.get("launcherShape") || "bubble",
|
||||
breathe: form.get("launcherBreathe") === "on",
|
||||
ring: form.get("launcherRing") === "on",
|
||||
hoverLabel: form.get("launcherHoverLabel") === "on"
|
||||
hoverLabel: form.get("launcherHoverLabel") === "on",
|
||||
statusDot: form.get("launcherStatusDot") === "on",
|
||||
persistentLabel: form.get("launcherPersistentLabel") === "on",
|
||||
sway: form.get("launcherSway") === "on"
|
||||
};
|
||||
settings.notifications = settings.notifications || {};
|
||||
settings.notifications.pulseOnAdminReply = form.get("messagePulse") === "on";
|
||||
settings.notifications.badgeOnAdminReply = form.get("messageBadge") === "on";
|
||||
settings.notifications.labelOnAdminReply = form.get("messageLabel") === "on";
|
||||
settings.notifications.wiggleOnAdminReply = form.get("messageWiggle") === "on";
|
||||
submitButton.disabled = true;
|
||||
submitButtons.forEach((button) => {
|
||||
button.disabled = true;
|
||||
});
|
||||
try {
|
||||
setSettingsSaveStatus("translating", "Překládám...");
|
||||
const data = await saveSite({ settings, isOnline: state.site.isOnline });
|
||||
@@ -232,7 +250,9 @@ $("#settingsForm").addEventListener("submit", async (event) => {
|
||||
} catch (error) {
|
||||
setSettingsSaveStatus("error", "Akce se nepodařila.");
|
||||
} finally {
|
||||
submitButton.disabled = false;
|
||||
submitButtons.forEach((button) => {
|
||||
button.disabled = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -519,6 +539,9 @@ function renderSite() {
|
||||
form.launcherBreathe.checked = s.launcherEffects?.breathe !== false;
|
||||
form.launcherRing.checked = s.launcherEffects?.ring !== false;
|
||||
form.launcherHoverLabel.checked = s.launcherEffects?.hoverLabel !== false;
|
||||
form.launcherStatusDot.checked = s.launcherEffects?.statusDot !== false;
|
||||
form.launcherPersistentLabel.checked = Boolean(s.launcherEffects?.persistentLabel);
|
||||
form.launcherSway.checked = Boolean(s.launcherEffects?.sway);
|
||||
form.messagePulse.checked = s.notifications?.pulseOnAdminReply !== false;
|
||||
form.messageBadge.checked = s.notifications?.badgeOnAdminReply !== false;
|
||||
form.messageLabel.checked = s.notifications?.labelOnAdminReply !== false;
|
||||
@@ -532,6 +555,7 @@ function renderSite() {
|
||||
renderModelOptions(s.translations?.model || "gpt-5-mini");
|
||||
renderPresenceSettings(s.adminPresence || {});
|
||||
renderTelegramSettings(s.telegram || {});
|
||||
renderLauncherPreview();
|
||||
}
|
||||
|
||||
function renderWidgetLanguageOptions(form, settings) {
|
||||
@@ -621,6 +645,44 @@ function renderWidgetCopyFields(language) {
|
||||
form.copyInfoText.value = copy.infoText || "";
|
||||
}
|
||||
|
||||
function renderLauncherPreview() {
|
||||
const preview = $("#launcherPreview");
|
||||
const messagePreview = $("#messageEffectPreview");
|
||||
const form = $("#settingsForm");
|
||||
if (!preview || !messagePreview || !form) return;
|
||||
const shape = ["circle", "bubble", "messenger", "whatsapp"].includes(form.launcherShape.value)
|
||||
? form.launcherShape.value
|
||||
: "bubble";
|
||||
const brand = normalizeHexColor(form.brandHex.value) || normalizeHexColor(form.brand.value) || "#0f8f6f";
|
||||
const baseClasses = [
|
||||
"launcher-preview",
|
||||
`preview-shape-${shape}`
|
||||
];
|
||||
preview.style.setProperty("--preview-brand", brand);
|
||||
messagePreview.style.setProperty("--preview-brand", brand);
|
||||
preview.className = [
|
||||
...baseClasses,
|
||||
$("#onlineToggle").checked ? "online" : "",
|
||||
form.launcherBreathe.checked ? "effect-breathe" : "",
|
||||
form.launcherRing.checked ? "effect-ring" : "",
|
||||
form.launcherStatusDot.checked ? "show-status" : "",
|
||||
form.launcherPersistentLabel.checked ? "label-always" : "",
|
||||
form.launcherSway.checked ? "effect-sway" : "",
|
||||
form.launcherHoverLabel.checked ? "show-label" : ""
|
||||
].filter(Boolean).join(" ");
|
||||
messagePreview.className = [
|
||||
...baseClasses,
|
||||
form.messagePulse.checked ? "notify-pulse" : "",
|
||||
form.messageBadge.checked ? "show-badge" : "",
|
||||
form.messageLabel.checked ? "show-label" : "",
|
||||
form.messageWiggle.checked ? "notify-wiggle" : ""
|
||||
].filter(Boolean).join(" ");
|
||||
const label = preview.querySelector(".launcher-preview-label");
|
||||
if (label) label.textContent = form.copyOnlineLabel.value || "Napiste nam";
|
||||
const messageLabel = messagePreview.querySelector(".launcher-preview-label");
|
||||
if (messageLabel) messageLabel.textContent = form.copyNewReplyLabel.value || "Nova odpoved";
|
||||
}
|
||||
|
||||
function widgetCopyForAdmin(settings, language) {
|
||||
const lang = language || "cs";
|
||||
const copy = settings.widgetCopy?.[lang] || {};
|
||||
@@ -1615,11 +1677,11 @@ async function saveSite(patch) {
|
||||
}
|
||||
|
||||
function setSettingsSaveStatus(type, text) {
|
||||
const status = $("#settingsSaveStatus");
|
||||
if (!status) return;
|
||||
for (const status of document.querySelectorAll("[data-settings-save-status]")) {
|
||||
status.className = `settings-save-status ${type || ""}`.trim();
|
||||
status.textContent = text || "";
|
||||
}
|
||||
}
|
||||
|
||||
function notify() {
|
||||
startAttention();
|
||||
|
||||
+20
-37
@@ -5,44 +5,27 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>MaalFlows Preview</title>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
color: #17211d;
|
||||
background: #f5f7f4;
|
||||
}
|
||||
main {
|
||||
max-width: 980px;
|
||||
margin: 0 auto;
|
||||
padding: 56px 20px;
|
||||
display: grid;
|
||||
gap: 22px;
|
||||
}
|
||||
h1 { margin: 0; font-size: clamp(32px, 5vw, 56px); }
|
||||
p { max-width: 680px; line-height: 1.6; color: #627067; }
|
||||
.demo {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
gap: 14px;
|
||||
}
|
||||
.demo div {
|
||||
background: white;
|
||||
border: 1px solid #dfe6e2;
|
||||
border-radius: 8px;
|
||||
padding: 18px;
|
||||
min-height: 120px;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="/tailwind.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<h1>9b-plus test stranka</h1>
|
||||
<p>Tahle stranka simuluje eshop, kam se widget vlozi pres GTM. Otevri bublinu vpravo dole, posli zpravu a sleduj ji v administraci.</p>
|
||||
<section class="demo">
|
||||
<div><strong>Produkt</strong><p>Ukazkova stranka produktu pro sbirani current URL.</p></div>
|
||||
<div><strong>Kosik</strong><p>Referrer, jazyk, timezone a device info se poslou do konverzace.</p></div>
|
||||
<div><strong>Podpora</strong><p>Zakaznik muze napsat hned, kontaktni udaje jsou volitelne.</p></div>
|
||||
<body class="mf-page-shell">
|
||||
<main class="mf-page-main">
|
||||
<header class="grid gap-4">
|
||||
<h1 class="mf-page-title">9b-plus test stranka</h1>
|
||||
<p class="mf-page-copy">Tahle stranka simuluje eshop, kam se widget vlozi pres GTM. Otevri bublinu vpravo dole, posli zpravu a sleduj ji v administraci.</p>
|
||||
</header>
|
||||
<section class="mf-card-grid">
|
||||
<div class="mf-card">
|
||||
<strong class="mf-card-title">Produkt</strong>
|
||||
<p class="mf-card-copy">Ukazkova stranka produktu pro sbirani current URL.</p>
|
||||
</div>
|
||||
<div class="mf-card">
|
||||
<strong class="mf-card-title">Kosik</strong>
|
||||
<p class="mf-card-copy">Referrer, jazyk, timezone a device info se poslou do konverzace.</p>
|
||||
</div>
|
||||
<div class="mf-card">
|
||||
<strong class="mf-card-title">Podpora</strong>
|
||||
<p class="mf-card-copy">Zakaznik muze napsat hned, kontaktni udaje jsou volitelne.</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
|
||||
File diff suppressed because one or more lines are too long
+18
-10
@@ -33,6 +33,7 @@
|
||||
<style>${styles(settings)}</style>
|
||||
<button class="mf-launcher ${launcherEffectClasses(settings, site.isOnline)}" type="button" aria-label="${escapeHtml(copy.title)}">
|
||||
<span class="mf-reply-pulse" aria-hidden="true"></span>
|
||||
<span class="mf-status-dot" aria-hidden="true"></span>
|
||||
<span class="mf-launcher-icon"></span>
|
||||
<span class="mf-launcher-label">${escapeHtml(site.isOnline ? copy.onlineLabel : copy.offlineLabel)}</span>
|
||||
<span class="mf-message-badge" hidden>0</span>
|
||||
@@ -546,6 +547,9 @@
|
||||
isOnline ? "mf-online" : "",
|
||||
isOnline && effects.breathe ? "mf-effect-breathe" : "",
|
||||
isOnline && effects.ring ? "mf-effect-ring" : "",
|
||||
effects.statusDot ? "mf-effect-status-dot" : "",
|
||||
effects.persistentLabel ? "mf-effect-persistent-label" : "",
|
||||
isOnline && effects.sway ? "mf-effect-sway" : "",
|
||||
effects.hoverLabel ? "mf-effect-hover-label" : "",
|
||||
].filter(Boolean).join(" ");
|
||||
}
|
||||
@@ -556,6 +560,7 @@
|
||||
|
||||
function applyAdminReplyEffects(launcher, settings, unreadCount) {
|
||||
const notifications = settings.notifications || {};
|
||||
launcher.classList.add("mf-has-message-alert");
|
||||
if (notifications.pulseOnAdminReply !== false) {
|
||||
launcher.classList.remove("mf-notify");
|
||||
void launcher.offsetWidth;
|
||||
@@ -565,21 +570,17 @@
|
||||
if (notifications.labelOnAdminReply !== false) {
|
||||
launcher.classList.add("mf-show-message-label");
|
||||
clearTimeout(applyAdminReplyEffects.labelTimer);
|
||||
applyAdminReplyEffects.labelTimer = setTimeout(() => launcher.classList.remove("mf-show-message-label"), 4200);
|
||||
}
|
||||
if (notifications.wiggleOnAdminReply !== false) {
|
||||
launcher.classList.remove("mf-wiggle");
|
||||
void launcher.offsetWidth;
|
||||
launcher.classList.add("mf-wiggle");
|
||||
clearTimeout(applyAdminReplyEffects.wiggleTimer);
|
||||
applyAdminReplyEffects.wiggleTimer = setTimeout(() => launcher.classList.remove("mf-wiggle"), 1400);
|
||||
}
|
||||
}
|
||||
|
||||
function clearMessageEffects(launcher) {
|
||||
launcher.classList.remove("mf-notify", "mf-wiggle", "mf-show-message-label");
|
||||
launcher.classList.remove("mf-notify", "mf-wiggle", "mf-show-message-label", "mf-has-message-alert");
|
||||
clearTimeout(applyAdminReplyEffects.labelTimer);
|
||||
clearTimeout(applyAdminReplyEffects.wiggleTimer);
|
||||
}
|
||||
|
||||
function updateMessageBadge(launcher, unreadCount) {
|
||||
@@ -638,16 +639,23 @@
|
||||
}
|
||||
.mf-launcher-label { position: absolute; ${labelOffset} top: 50%; transform: translateY(-50%) translateX(8px); opacity: 0; pointer-events: none; white-space: nowrap; border-radius: 999px; padding: 7px 10px; background: ${c.text}; color: white; font-size: 12px; box-shadow: 0 10px 24px rgb(0 0 0 / 18%); transition: opacity .18s ease, transform .18s ease; }
|
||||
.mf-online.mf-effect-hover-label:hover .mf-launcher-label { opacity: 1; transform: translateY(-50%) translateX(0); }
|
||||
.mf-effect-persistent-label .mf-launcher-label { opacity: 1; transform: translateY(-50%) translateX(0); }
|
||||
.mf-has-message-alert .mf-launcher-label { opacity: 0; transform: translateY(-50%) translateX(8px); }
|
||||
.mf-message-label { position: absolute; ${labelOffset} top: 50%; transform: translateY(-50%) translateX(8px); opacity: 0; pointer-events: none; white-space: nowrap; border-radius: 999px; padding: 7px 10px; background: ${c.text}; color: white; font-size: 12px; font-weight: 700; box-shadow: 0 10px 24px rgb(0 0 0 / 18%); transition: opacity .18s ease, transform .18s ease; }
|
||||
.mf-show-message-label .mf-message-label { opacity: 1; transform: translateY(-50%) translateX(0); }
|
||||
.mf-status-dot { position: absolute; top: 4px; right: 4px; width: 14px; height: 14px; display: none; border: 3px solid white; border-radius: 50%; background: #c9d4ce; box-shadow: 0 2px 6px rgb(0 0 0 / 14%); }
|
||||
.mf-effect-status-dot .mf-status-dot { display: block; }
|
||||
.mf-has-message-alert .mf-status-dot { display: none; }
|
||||
.mf-online .mf-status-dot { background: #2f9e44; }
|
||||
.mf-message-badge { position: absolute; top: -5px; right: -5px; min-width: 22px; height: 22px; display: grid; place-items: center; border-radius: 999px; border: 2px solid white; background: #ff3b30; color: white; font-size: 12px; font-weight: 800; line-height: 1; box-shadow: 0 8px 18px rgb(0 0 0 / 18%); }
|
||||
.mf-message-badge[hidden] { display: none !important; }
|
||||
.mf-reply-pulse { position: absolute; inset: 0; border-radius: 50%; pointer-events: none; opacity: 0; }
|
||||
.mf-online.mf-effect-breathe { animation: mfBreathe 2.8s ease-in-out infinite; }
|
||||
.mf-online.mf-effect-ring:before { position: absolute; inset: -5px; border: 2px solid ${c.brand}; border-radius: 50%; opacity: .62; content: ""; animation: mfRing 2.2s ease-out infinite; }
|
||||
.mf-online.mf-effect-sway .mf-launcher-icon { animation: mfWiggle 7.2s ease-in-out infinite; }
|
||||
.mf-offline { filter: grayscale(.2) saturate(.72); opacity: .86; }
|
||||
.mf-notify .mf-reply-pulse { animation: mfPulse 1.15s ease-out infinite; }
|
||||
.mf-wiggle .mf-launcher-icon { animation: mfWiggle .62s ease-in-out 2; }
|
||||
.mf-wiggle .mf-launcher-icon { animation: mfWiggle 7.2s ease-in-out infinite; }
|
||||
.mf-panel {
|
||||
position: fixed; z-index: 2147483001; ${desktop.side}: ${desktop.sideOffsetPx}px; bottom: ${desktop.bottomPx + 72}px;
|
||||
width: min(${desktop.widthPx}px, calc(100vw - 24px)); max-height: min(680px, calc(100vh - 110px)); display: none;
|
||||
@@ -704,10 +712,10 @@
|
||||
100% { transform: scale(.92); opacity: 0; }
|
||||
}
|
||||
@keyframes mfWiggle {
|
||||
0%, 100% { transform: translateY(0) rotate(0deg); }
|
||||
22% { transform: translateY(-3px) rotate(-4deg); }
|
||||
48% { transform: translateY(2px) rotate(3deg); }
|
||||
72% { transform: translateY(-1px) rotate(-2deg); }
|
||||
0%, 12%, 100% { transform: translateY(0) rotate(0deg); }
|
||||
3% { transform: translateY(-3px) rotate(-4deg); }
|
||||
6% { transform: translateY(2px) rotate(3deg); }
|
||||
9% { transform: translateY(-1px) rotate(-2deg); }
|
||||
}
|
||||
@media (max-width: 640px) {
|
||||
.mf-launcher {
|
||||
|
||||
@@ -71,6 +71,7 @@ async function route(req, res) {
|
||||
res.setHeader("Cache-Control", "no-store, max-age=0");
|
||||
return file(res, path.join(PUBLIC_DIR, "widget.js"), "application/javascript; charset=utf-8");
|
||||
}
|
||||
if (req.method === "GET" && url.pathname === "/tailwind.css") return file(res, path.join(PUBLIC_DIR, "tailwind.css"), "text/css; charset=utf-8");
|
||||
if (req.method === "GET" && url.pathname.startsWith("/admin.")) return servePublic(res, url.pathname);
|
||||
|
||||
if (url.pathname.match(/^\/api\/telegram\/webhook\/[^/]+$/) && req.method === "POST") return telegramWebhook(req, res, url);
|
||||
@@ -341,6 +342,9 @@ function defaultSettings() {
|
||||
breathe: true,
|
||||
ring: true,
|
||||
hoverLabel: true,
|
||||
statusDot: true,
|
||||
persistentLabel: false,
|
||||
sway: false,
|
||||
avatar: false
|
||||
},
|
||||
notifications: {
|
||||
@@ -1111,13 +1115,16 @@ async function translateStoredMessage(conversationId, messageId, senderType, bod
|
||||
|
||||
try {
|
||||
const result = await translateText(message.body, targetLanguage, settings.model, settings.openaiApiKey);
|
||||
const sourceLanguage = normalizeLanguage(result.sourceLanguage);
|
||||
const detectedSourceLanguage = normalizeDetectedLanguage(result.sourceLanguage);
|
||||
const sourceLanguage = senderType === "visitor"
|
||||
? stableVisitorLanguage(conversation, message.body, detectedSourceLanguage)
|
||||
: detectedSourceLanguage;
|
||||
const translatedText = String(result.translatedText || "").trim();
|
||||
const translatedLanguage = normalizeLanguage(result.translatedLanguage || targetLanguage);
|
||||
const translatedLanguage = normalizeDetectedLanguage(result.translatedLanguage || targetLanguage);
|
||||
const sameLanguage = sourceLanguage && translatedLanguage && sourceLanguage === translatedLanguage;
|
||||
|
||||
if (senderType === "visitor" && sourceLanguage) {
|
||||
db.prepare("UPDATE conversations SET customer_language = COALESCE(?, customer_language), updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(sourceLanguage, conversationId);
|
||||
db.prepare("UPDATE conversations SET customer_language = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(sourceLanguage, conversationId);
|
||||
}
|
||||
|
||||
if (!translatedText || sameLanguage) {
|
||||
@@ -1154,7 +1161,7 @@ async function translateText(text, targetLanguage, model, apiKey) {
|
||||
input: [
|
||||
{
|
||||
role: "system",
|
||||
content: "You translate live chat messages for an e-commerce support team. Return only compact JSON with keys sourceLanguage, translatedLanguage, translatedText. Preserve meaning, product terms, numbers, names, URLs, and tone. Do not answer the customer."
|
||||
content: "You translate live chat messages for an e-commerce support team. Return only compact JSON with keys sourceLanguage, translatedLanguage, translatedText. Preserve meaning, product terms, numbers, names, URLs, and tone. Do not answer the customer. If the source language is unclear because the text is a greeting, product name, SKU, brand, color, URL, or otherwise language-neutral, set sourceLanguage to unknown."
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
@@ -1765,6 +1772,53 @@ function normalizeLanguage(value) {
|
||||
return text.split("-")[0].slice(0, 8);
|
||||
}
|
||||
|
||||
function normalizeDetectedLanguage(value) {
|
||||
const language = normalizeLanguage(value);
|
||||
return ["unknown", "und", "auto", "n/a", "none"].includes(language) ? "" : language;
|
||||
}
|
||||
|
||||
function stableVisitorLanguage(conversation, text, detectedLanguage) {
|
||||
const currentLanguage = normalizeDetectedLanguage(conversation?.customer_language);
|
||||
const browserLanguage = normalizeDetectedLanguage(conversation?.language);
|
||||
if (!currentLanguage) {
|
||||
if (browserLanguage && weakLanguageEvidence(text)) return browserLanguage;
|
||||
return detectedLanguage;
|
||||
}
|
||||
if (!detectedLanguage || detectedLanguage === currentLanguage) return currentLanguage;
|
||||
return weakLanguageEvidence(text) ? currentLanguage : detectedLanguage;
|
||||
}
|
||||
|
||||
function weakLanguageEvidence(value) {
|
||||
const text = String(value || "").trim();
|
||||
if (!text) return true;
|
||||
|
||||
const words = text.match(/[\p{L}\p{N}][\p{L}\p{N}'-]*/gu) || [];
|
||||
const lowerWords = words.map((word) => word.toLowerCase());
|
||||
if (!words.length) return true;
|
||||
if (hasStrongLanguageEvidence(text, lowerWords)) return false;
|
||||
|
||||
const compact = lowerWords.join(" ");
|
||||
const weakPhrases = new Set([
|
||||
"hi", "hello", "hey", "ok", "okay", "yes", "no", "thanks", "thank you",
|
||||
"hallo", "servus", "danke", "ja", "nein", "bitte"
|
||||
]);
|
||||
if (weakPhrases.has(compact)) return true;
|
||||
if (words.length <= 2) return true;
|
||||
|
||||
const startsLikeProductName = /^[\p{Lu}\p{N}]/u.test(words[0]);
|
||||
const sentencePunctuation = /[?!.]/.test(text);
|
||||
return words.length <= 6 && startsLikeProductName && !sentencePunctuation;
|
||||
}
|
||||
|
||||
function hasStrongLanguageEvidence(text, lowerWords) {
|
||||
const strongWords = new Set([
|
||||
"i", "you", "we", "need", "want", "would", "could", "please", "what", "which", "size", "have", "has", "is", "are",
|
||||
"ich", "sie", "wir", "brauche", "benotige", "möchte", "mochte", "bitte", "welche", "welcher", "welches", "größe", "groesse", "hat", "haben", "ist", "sind", "wie", "was", "kann"
|
||||
]);
|
||||
const hits = lowerWords.filter((word) => strongWords.has(word)).length;
|
||||
return hits >= 2 || (hits >= 1 && /[?]/.test(text));
|
||||
}
|
||||
|
||||
function truncateText(value, maxLength) {
|
||||
const text = String(value || "").trim();
|
||||
if (!text) return null;
|
||||
|
||||
@@ -231,6 +231,255 @@ label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; }
|
||||
width: auto;
|
||||
margin: 0;
|
||||
}
|
||||
.launcher-preview-stage {
|
||||
grid-column: 1 / -1;
|
||||
min-height: 112px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 8px;
|
||||
background:
|
||||
linear-gradient(90deg, rgb(15 143 111 / 5%) 1px, transparent 1px),
|
||||
linear-gradient(rgb(15 143 111 / 5%) 1px, transparent 1px),
|
||||
#ffffff;
|
||||
background-size: 18px 18px;
|
||||
}
|
||||
.launcher-preview {
|
||||
--preview-brand: var(--brand);
|
||||
--preview-text: #ffffff;
|
||||
position: relative;
|
||||
width: 58px;
|
||||
height: 58px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border: 0;
|
||||
border-radius: 50%;
|
||||
background: var(--preview-brand);
|
||||
color: var(--preview-text);
|
||||
box-shadow: 0 12px 30px rgb(0 0 0 / 22%);
|
||||
cursor: default;
|
||||
overflow: visible;
|
||||
}
|
||||
.launcher-preview.effect-breathe {
|
||||
animation: launcherPreviewBreathe 2.8s ease-in-out infinite;
|
||||
}
|
||||
.launcher-preview.effect-ring::before {
|
||||
position: absolute;
|
||||
inset: -5px;
|
||||
border: 2px solid var(--preview-brand);
|
||||
border-radius: 50%;
|
||||
opacity: .62;
|
||||
content: "";
|
||||
animation: launcherPreviewRing 2.2s ease-out infinite;
|
||||
}
|
||||
.launcher-preview.notify-pulse::after {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
border-radius: 50%;
|
||||
pointer-events: none;
|
||||
content: "";
|
||||
animation: launcherPreviewPulse 1.15s ease-out infinite;
|
||||
}
|
||||
.launcher-preview.notify-wiggle .launcher-preview-icon {
|
||||
animation: launcherPreviewWiggle 7.2s ease-in-out infinite;
|
||||
}
|
||||
.launcher-preview.effect-sway .launcher-preview-icon {
|
||||
animation: launcherPreviewWiggle 7.2s ease-in-out infinite;
|
||||
}
|
||||
.launcher-preview-status {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border: 3px solid #ffffff;
|
||||
border-radius: 50%;
|
||||
background: #c9d4ce;
|
||||
box-shadow: 0 2px 6px rgb(0 0 0 / 14%);
|
||||
display: none;
|
||||
}
|
||||
.launcher-preview.show-status .launcher-preview-status {
|
||||
display: block;
|
||||
}
|
||||
.launcher-preview.online .launcher-preview-status {
|
||||
background: #2f9e44;
|
||||
}
|
||||
.launcher-preview-badge {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
right: -5px;
|
||||
min-width: 22px;
|
||||
height: 22px;
|
||||
display: none;
|
||||
place-items: center;
|
||||
border: 2px solid #ffffff;
|
||||
border-radius: 999px;
|
||||
background: #ff3b30;
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
box-shadow: 0 8px 18px rgb(0 0 0 / 18%);
|
||||
}
|
||||
.launcher-preview.show-badge .launcher-preview-badge {
|
||||
display: grid;
|
||||
}
|
||||
.launcher-preview-label {
|
||||
position: absolute;
|
||||
right: 68px;
|
||||
top: 50%;
|
||||
max-width: 150px;
|
||||
padding: 7px 10px;
|
||||
border-radius: 999px;
|
||||
background: var(--ink);
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
box-shadow: 0 10px 24px rgb(0 0 0 / 18%);
|
||||
opacity: 0;
|
||||
transform: translateY(-50%) translateX(8px);
|
||||
transition: opacity .18s ease, transform .18s ease;
|
||||
}
|
||||
.launcher-preview.show-label .launcher-preview-label {
|
||||
opacity: 1;
|
||||
transform: translateY(-50%) translateX(0);
|
||||
}
|
||||
.launcher-preview.label-always .launcher-preview-label {
|
||||
opacity: 1;
|
||||
transform: translateY(-50%) translateX(0);
|
||||
}
|
||||
.launcher-preview-icon,
|
||||
.launcher-preview-icon::before,
|
||||
.launcher-preview-icon::after {
|
||||
display: block;
|
||||
content: "";
|
||||
}
|
||||
.launcher-preview-icon {
|
||||
position: relative;
|
||||
margin: 0 auto;
|
||||
color: var(--preview-text);
|
||||
}
|
||||
.preview-shape-circle .launcher-preview-icon,
|
||||
.preview-shape-circle .launcher-preview-icon::before,
|
||||
.preview-shape-circle .launcher-preview-icon::after {
|
||||
height: 3px;
|
||||
border-radius: 4px;
|
||||
background: var(--preview-text);
|
||||
}
|
||||
.preview-shape-circle .launcher-preview-icon {
|
||||
width: 26px;
|
||||
}
|
||||
.preview-shape-circle .launcher-preview-icon::before {
|
||||
transform: translateY(-8px);
|
||||
}
|
||||
.preview-shape-circle .launcher-preview-icon::after {
|
||||
width: 18px;
|
||||
transform: translateY(5px);
|
||||
}
|
||||
.preview-shape-bubble .launcher-preview-icon {
|
||||
width: 30px;
|
||||
height: 23px;
|
||||
border: 3px solid var(--preview-text);
|
||||
border-radius: 13px;
|
||||
background: transparent;
|
||||
}
|
||||
.preview-shape-bubble .launcher-preview-icon::before {
|
||||
position: absolute;
|
||||
left: 5px;
|
||||
top: 7px;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border-radius: 50%;
|
||||
background: var(--preview-text);
|
||||
box-shadow: 8px 0 0 var(--preview-text), 16px 0 0 var(--preview-text);
|
||||
}
|
||||
.preview-shape-bubble .launcher-preview-icon::after {
|
||||
position: absolute;
|
||||
right: 2px;
|
||||
bottom: -8px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-left: 3px solid var(--preview-text);
|
||||
border-bottom: 3px solid var(--preview-text);
|
||||
border-bottom-left-radius: 8px;
|
||||
background: transparent;
|
||||
transform: rotate(-18deg);
|
||||
}
|
||||
.preview-shape-messenger .launcher-preview-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
background: var(--preview-text);
|
||||
}
|
||||
.preview-shape-messenger .launcher-preview-icon::before {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: 8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: var(--preview-brand);
|
||||
clip-path: polygon(0 56%, 42% 56%, 58% 22%, 100% 22%, 58% 78%, 42% 78%);
|
||||
}
|
||||
.preview-shape-messenger .launcher-preview-icon::after {
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
bottom: 1px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 0 0 8px 0;
|
||||
background: var(--preview-text);
|
||||
transform: rotate(25deg);
|
||||
}
|
||||
.preview-shape-whatsapp .launcher-preview-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border: 3px solid var(--preview-text);
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
}
|
||||
.preview-shape-whatsapp .launcher-preview-icon::before {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: 7px;
|
||||
width: 12px;
|
||||
height: 15px;
|
||||
border: 3px solid var(--preview-text);
|
||||
border-left-color: transparent;
|
||||
border-top-color: transparent;
|
||||
border-radius: 0 0 12px 0;
|
||||
transform: rotate(-35deg);
|
||||
}
|
||||
.preview-shape-whatsapp .launcher-preview-icon::after {
|
||||
position: absolute;
|
||||
left: 1px;
|
||||
bottom: -4px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-left: 3px solid var(--preview-text);
|
||||
border-bottom: 3px solid var(--preview-text);
|
||||
background: transparent;
|
||||
transform: rotate(12deg);
|
||||
}
|
||||
@keyframes launcherPreviewBreathe {
|
||||
0%, 100% { transform: scale(1); box-shadow: 0 12px 30px rgb(0 0 0 / 22%); }
|
||||
50% { transform: scale(1.035); box-shadow: 0 16px 36px rgb(0 0 0 / 20%), 0 0 0 8px rgb(15 143 111 / 10%); }
|
||||
}
|
||||
@keyframes launcherPreviewRing {
|
||||
0% { transform: scale(.92); opacity: .58; }
|
||||
70% { transform: scale(1.22); opacity: 0; }
|
||||
100% { transform: scale(.92); opacity: 0; }
|
||||
}
|
||||
@keyframes launcherPreviewPulse {
|
||||
0% { box-shadow: 0 0 0 0 rgb(255 59 48 / 46%); opacity: .9; transform: scale(1); }
|
||||
70% { box-shadow: 0 0 0 18px rgb(255 59 48 / 0%); opacity: 0; transform: scale(1.08); }
|
||||
100% { box-shadow: 0 0 0 0 rgb(255 59 48 / 0%); opacity: 0; transform: scale(1); }
|
||||
}
|
||||
@keyframes launcherPreviewWiggle {
|
||||
0%, 12%, 100% { transform: translateY(0) rotate(0deg); }
|
||||
3% { transform: translateY(-3px) rotate(-4deg); }
|
||||
6% { transform: translateY(2px) rotate(3deg); }
|
||||
9% { transform: translateY(-1px) rotate(-2deg); }
|
||||
}
|
||||
.widget-language-settings {
|
||||
grid-template-columns: 112px minmax(230px, 1fr);
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
@import "tailwindcss";
|
||||
@import "./admin.css";
|
||||
|
||||
@theme {
|
||||
--color-brand: #0f8f6f;
|
||||
--color-brand-ink: #ffffff;
|
||||
--color-surface: #ffffff;
|
||||
--color-ink: #17211d;
|
||||
--color-muted: #647067;
|
||||
--color-line: #dfe6e2;
|
||||
--color-page: #f5f7f4;
|
||||
}
|
||||
|
||||
@layer base {
|
||||
html {
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-page text-ink antialiased;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
textarea,
|
||||
select {
|
||||
font: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
.mf-page-shell {
|
||||
@apply min-h-screen bg-page text-ink;
|
||||
}
|
||||
|
||||
.mf-page-main {
|
||||
@apply mx-auto grid w-full max-w-5xl gap-6 px-5 py-12 sm:py-14;
|
||||
}
|
||||
|
||||
.mf-page-title {
|
||||
@apply m-0 text-4xl font-extrabold tracking-normal text-ink sm:text-5xl;
|
||||
}
|
||||
|
||||
.mf-page-copy {
|
||||
@apply max-w-2xl text-base leading-7 text-muted;
|
||||
}
|
||||
|
||||
.mf-card-grid {
|
||||
@apply grid gap-4 md:grid-cols-3;
|
||||
}
|
||||
|
||||
.mf-card {
|
||||
@apply min-h-32 rounded-lg border border-line bg-white p-5 shadow-sm;
|
||||
}
|
||||
|
||||
.mf-card-title {
|
||||
@apply mb-4 block text-sm font-bold text-ink;
|
||||
}
|
||||
|
||||
.mf-card-copy {
|
||||
@apply m-0 text-sm leading-6 text-muted;
|
||||
}
|
||||
|
||||
.mf-login-shell {
|
||||
@apply grid min-h-screen place-items-center bg-page p-6;
|
||||
}
|
||||
|
||||
.mf-login-card {
|
||||
@apply grid w-full max-w-sm gap-4 rounded-lg border border-line bg-white p-6 shadow-sm;
|
||||
}
|
||||
|
||||
.mf-login-title {
|
||||
@apply m-0 pb-1 text-3xl font-extrabold tracking-normal text-ink;
|
||||
}
|
||||
|
||||
.mf-field {
|
||||
@apply grid gap-1.5 text-sm font-medium text-muted;
|
||||
}
|
||||
|
||||
.mf-input {
|
||||
@apply h-10 w-full rounded-md border border-line bg-white px-3 text-sm text-ink shadow-sm outline-none transition focus:border-brand focus:ring-2 focus:ring-brand/25;
|
||||
}
|
||||
|
||||
.mf-textarea {
|
||||
@apply min-h-20 w-full rounded-md border border-line bg-white px-3 py-2 text-sm text-ink shadow-sm outline-none transition focus:border-brand focus:ring-2 focus:ring-brand/25;
|
||||
}
|
||||
|
||||
.mf-ui-button {
|
||||
@apply inline-flex h-10 items-center justify-center gap-2 rounded-md border border-slate-300 bg-white px-3 text-sm font-semibold text-slate-800 shadow-sm transition hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-brand/35;
|
||||
}
|
||||
|
||||
.mf-ui-button-primary {
|
||||
@apply inline-flex h-10 items-center justify-center gap-2 rounded-md border border-brand bg-brand px-4 text-sm font-semibold text-white shadow-sm transition hover:bg-brand/90 focus:outline-none focus:ring-2 focus:ring-brand/35;
|
||||
}
|
||||
|
||||
.mf-icon-button {
|
||||
@apply inline-grid h-8 w-8 place-items-center rounded-md border border-line bg-slate-50 text-ink transition hover:bg-slate-100 focus:outline-none focus:ring-2 focus:ring-brand/25;
|
||||
}
|
||||
|
||||
.mf-ui-panel-header {
|
||||
@apply flex min-h-14 items-center justify-between border-b border-slate-200 bg-white px-4 text-sm font-semibold text-slate-900;
|
||||
}
|
||||
|
||||
.mf-ui-select {
|
||||
@apply h-10 rounded-md border border-slate-300 bg-white px-3 text-sm text-slate-800 shadow-sm focus:border-brand focus:outline-none focus:ring-2 focus:ring-brand/25;
|
||||
}
|
||||
|
||||
.mf-toolbar {
|
||||
@apply flex h-14 items-center justify-between gap-3 border-b border-line bg-white px-3;
|
||||
}
|
||||
|
||||
.mf-toolbar-title {
|
||||
@apply m-0 text-lg font-extrabold tracking-normal text-ink;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
const { expect, test } = require("@playwright/test");
|
||||
|
||||
test("preview widget opens and sends a visitor message", async ({ page }, testInfo) => {
|
||||
await page.goto("/preview");
|
||||
|
||||
await expect(page.getByRole("heading", { name: /9b-plus test stranka/i })).toBeVisible();
|
||||
|
||||
const widget = page.locator("#maalflows-widget");
|
||||
await expect(widget).toBeAttached();
|
||||
|
||||
const launcher = page.locator("#maalflows-widget .mf-launcher");
|
||||
await expect(launcher).toBeVisible();
|
||||
await launcher.click({ force: true });
|
||||
|
||||
const panel = page.locator("#maalflows-widget .mf-panel");
|
||||
await expect(panel).toHaveClass(/open/);
|
||||
await expect(page.locator("#maalflows-widget textarea[name='message']")).toBeVisible();
|
||||
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath(`preview-open-${testInfo.project.name}.png`),
|
||||
fullPage: true
|
||||
});
|
||||
|
||||
const message = `Playwright smoke ${Date.now()}`;
|
||||
await page.locator("#maalflows-widget textarea[name='message']").fill(message);
|
||||
await page.locator("#maalflows-widget .mf-send").click();
|
||||
|
||||
await expect(page.locator("#maalflows-widget .mf-message.visitor").last()).toContainText(message);
|
||||
await expect(panel).toBeVisible();
|
||||
|
||||
const panelBox = await panel.boundingBox();
|
||||
expect(panelBox, "widget panel should have a measurable rendered box").toBeTruthy();
|
||||
expect(panelBox.width).toBeGreaterThan(250);
|
||||
expect(panelBox.height).toBeGreaterThan(250);
|
||||
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath(`preview-message-${testInfo.project.name}.png`),
|
||||
fullPage: true
|
||||
});
|
||||
});
|
||||
|
||||
test("admin login shell renders without layout breakage", async ({ page }, testInfo) => {
|
||||
await page.goto("/admin");
|
||||
|
||||
const loginForm = page.locator("#loginForm");
|
||||
await expect(page.locator("#loginView")).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "MaalFlows" })).toBeVisible();
|
||||
await expect(loginForm.locator("input[name='username']")).toBeVisible();
|
||||
await expect(loginForm.locator("input[name='password']")).toBeVisible();
|
||||
await expect(loginForm.getByRole("button", { name: /prihlasit/i })).toBeVisible();
|
||||
|
||||
const formBox = await loginForm.boundingBox();
|
||||
expect(formBox, "login form should have a measurable rendered box").toBeTruthy();
|
||||
expect(formBox.width).toBeGreaterThan(250);
|
||||
expect(formBox.height).toBeGreaterThan(180);
|
||||
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath(`admin-login-${testInfo.project.name}.png`),
|
||||
fullPage: true
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user