To są ścieżki do kodu w drugim projekcie na pulpicie — webapp w przyszłości będzie te skrypty triggerował automatycznie zamiast wymagać uruchomienia z `.bat`.
Szczegółowa instrukcja procesu
6automatycznych
0manualnych
Łącznie:~30min-2h (zależy od liczby produktów × batch_delay 15s)
4.2 FILAR I: SKŁAD (max +15) — Natural Mix (+10), ingredientCount 1-3 (+10) lub 4-6 (+5), brak E-numerów (+5)
4.3 FILAR II: POCHODZENIE (max +15) — BIO (+10), Local (+5). UWAGA: GMO (-10) jest w `bioshi_score.py` ale `gmo` nie istnieje w RESPONSE_SCHEMA → `product.get('gmo', False)` zawsze False → martwy kod, GMO nigdy nie obniża score
4.4 FILAR III: NOVA (max -15) — NOVA 3 (-5), NOVA 4 (-15)
5.4 Resume support: istniejące produkty wczytane z `products.json`, przetwarzane tylko nowe/zmienione
📥 Input
Produkty z raw CSV + Gemini data + score
📤 Output
`products.json` — dane scalone w `exporter.merge_product()` (~24 pola: raw CSV + 15 Gemini + grade/color/label)
`products-data.js` — frontend-safe (~24 pola, bez score liczbowego)
⚠️ Ryzyka
Brak dysku → export failuje
JSON zbyt duży → timeout przy zapisie
💾 Archiwum:products.jsonproducts-data.js
6
Raport i archiwizacja🤖 auto⏱ ~30 sec
📥 1 input(ów) · 📤 2 output(ów) · 📝 5 sub-kroków
▼
📝 Sub-kroki
6.1 `exporter.print_report(products)` — Counter per grade
6.2 Druk tabeli: grade | count | % | progress bar
6.3 Top 3 (A) i bottom 3 (E) jako przykłady
6.4 Lista produktów z błędami
6.5 Raport zapisany do `final_report.txt`
📥 Input
Lista produktów z finalnym score
📤 Output
Stdout raport: rozkład klas (A/B/C/D/E + %)
`final_report.txt` — raport do archiwum
⚠️ Ryzyka
Zbyt wiele błędów (>20%) → czerwony alert na Slack
🔔 Slack:Summary w #bioshi-score-logs — grade distribution + błędy.
💾 Archiwum:final_report.txt
💡
Tryb manualny ma cooldown 1h przed pierwszym przypomnieniem, potem co 1h. W godzinach ciszy (18:00-08:00) bot czeka do rana, chyba że włączony Tryb Boguś Pracoholik w Ustawieniach.
Diagram przepływu danych
DFD
flowchart LR
OP([Operator]):::ext
CSV[(input.csv z IdoSell)]:::store
GEM([Gemini multimodal]):::ext
OUT[(score_output.csv)]:::store
OP -->|upload CSV| P1((Wczytaj CSV))
P1 --> CSV
CSV --> P2((Gemini extract 15 pól))
P2 --> GEM
GEM --> P2
P2 --> P3((calculate bioshi_score))
P3 -->|grade A-E| P4((Merge wynik))
P4 --> OUT
OUT -->|download| OP
classDef ext fill:#d1fae5,stroke:#10b981,color:#065f46;
classDef store fill:#f1f5f9,stroke:#94a3b8,color:#334155;