Commit Graph

1129 Commits

Author SHA1 Message Date
dadaloop82 20e7d2cbfc 📦 Backup database automatico - 2026-04-02 03:00 2026-04-02 03:00:01 +00:00
dadaloop82 6f81846942 Smart shopping: timestamp ultimo aggiornamento, CSS progress dots e timer bar; fix layout modalità cucina 2026-04-01 05:52:46 +00:00
dadaloop82 e18fb5839a Smart shopping: cron ogni 5min pre-calcola cache server-side, API serve da cache (risposta istantanea) 2026-04-01 05:52:17 +00:00
dadaloop82 200ec145d9 📦 Backup database automatico - 2026-04-01 03:00 2026-04-01 03:00:01 +00:00
dadaloop82 fb7bb4d675 Modalità cucina: timer multipli persistenti con etichetta, riprendi dal passo salvato, progress dots, pulsante Ricomincia; priorità ricette basata su scadenze con ingredienti obbligatori 2026-03-31 15:55:35 +00:00
dadaloop82 2be6643104 📦 Backup database automatico - 2026-03-31 03:00 2026-03-31 03:00:01 +00:00
dadaloop82 bcddba46d4 Remove kg/l units everywhere — only g (grammi) and ml (millilitri)
- HTML: removed kg/l options from all unit selector dropdowns
- JS detectUnitAndQuantity(): auto-converts kg→g (*1000) and l→ml (*1000)
- JS unit labels: removed all kg/l entries from unitLabels maps
- JS category defaults: frutta 1000g, verdura 500g, bevande 1000ml
- JS step/min logic: simplified for g/ml only (no more 0.01 steps)
- JS getSubUnitStep(): removed kg/l cases
- JS isLowStock(): removed kg/l threshold
- JS spec parser: labels now show g/ml instead of kg/L
- PHP recipe parser: converts kg→g and l→ml immediately on parse
- PHP AI prompt: updated to specify only g/ml/pz/conf units
- PHP migration endpoint available at ?action=migrate_units (no-op if DB already clean)
2026-03-30 14:13:11 +00:00
dadaloop82 c4938457ac Fix min quantity for kg/l units in use forms
- Normal mode (non-conf) now sets min=0.01 for kg/l, min=1 for g/ml
- +/- buttons use unit-aware steps: 0.01 for small kg/l values, 0.1 for
  values <1, 0.5 for values >=1 (instead of fixed 0.5)
- Same fix applied to recipe use form
- Allows inputting e.g. 0.07kg (70g) when product is tracked in kg
2026-03-30 13:45:02 +00:00
dadaloop82 c63faf56e4 Conservative Bring! cleanup + operations log
- cleanupObsoleteBringItems() now much more conservative:
  * Only removes items matching a known DB product (preserves manual additions)
  * Only removes if the product has current_qty > 0 (has stock)
  * AND item is no longer flagged by smart shopping
- Added logOperation() — stores all Bring! operations in localStorage '_opLog'
  (bring_auto_add, bring_cleanup, bring_found, bring_manual_remove)
  Capped at 200 entries, each with timestamp + action + details
- All Bring! add/remove paths now log their operations
2026-03-30 13:36:51 +00:00
dadaloop82 b954be4cac Fix smart shopping: skip one-time purchases, better frequency for short history
- Products bought only once (buy_count=1) and out of stock are skipped entirely
  (not enough history to predict repurchase need, e.g. piadelle)
- usesPerMonth for items tracked 7-30 days now normalized instead of using raw count
- usesPerMonth for items tracked <7 days halved to avoid inflation
- Critical urgency now requires buy_count >= 2
2026-03-29 19:58:43 +00:00
dadaloop82 4b3e5f2ce4 Cleanup obsolete Bring! items after smart shopping algorithm fix
- cleanupObsoleteBringItems(): one-time per session, removes items from Bring!
  that the updated smart shopping algorithm no longer considers relevant
- Cross-references shoppingItems vs smartShoppingItems using exact + token match
- Shows toast with count of removed items
- Called alongside autoAddCriticalItems after loading smart shopping data
2026-03-29 19:54:05 +00:00
dadaloop82 df32fa3441 fix: spesa intelligente - filtro frequenza e recency per urgenze
L'algoritmo ora calcola:
- usesPerMonth: utilizzi al mese (non piu solo useCount totale)
- daysSinceLastUse: giorni dall'ultimo utilizzo
- isFrequent: >= 1.5 utilizzi/mese
- isRegular: >= 0.5 utilizzi/mese (almeno 1 ogni 2 mesi)
- isRecent: usato/comprato negli ultimi 60 giorni

Nuova logica urgenze:
- CRITICAL (esaurito): solo se frequente E recente
- HIGH (esaurito): regolare E recente E storico consistente
- Quasi finito/scorta bassa: solo per prodotti regolari/recenti
- Previsione esaurimento: solo per frequenti E recenti
- Prodotti usati raramente o non di recente vengono esclusi
2026-03-29 19:50:04 +00:00
dadaloop82 7be6ae8cd7 feat: timer integrato nella modalita cucina
- Rileva automaticamente durate nel testo dello step (minuti, ore, secondi,
  mezz'ora, un quarto d'ora, qualche minuto, un paio di minuti, ecc.)
- Mostra countdown grande con Avvia/Pausa/Reset
- Ultimi 30 secondi in arancione, scaduto in rosso pulsante
- Allo scadere: vibrazione + TTS 'Tempo scaduto!'
- Timer continua a contare in overtime (+00:XX) dopo lo zero
- Timer si resetta automaticamente cambiando step o chiudendo
2026-03-29 16:09:12 +00:00
dadaloop82 2d754526a5 fix: TTS primo step con voce corretta, bottone Rileggi sempre visibile
- startCookingMode: attende voiceschanged prima di parlare il primo step
  cosi la voce Google (donna) viene usata subito, non il fallback robot
- _cookingTTS parte sempre true (attivato), icona 🔊
- Bottone Rileggi visibile di default senza display:none
- Cache buster aggiornato a v=20260329c
2026-03-29 16:00:24 +00:00
dadaloop82 23e8d9a6b8 fix: voce TTS migliore (Google/online) + cache buster aggiornato 2026-03-29 15:50:03 +00:00
dadaloop82 227c31d9f9 fix: TTS sincrono + pulsante Rileggi nella modalità cucina 2026-03-29 15:46:43 +00:00
dadaloop82 b4ee70862e fix: screensaver disabilitato durante la modalità cucina 2026-03-29 15:44:36 +00:00
dadaloop82 bba6551b37 fix: TTS cucina - gestione asincrona voci e delay dopo cancel() 2026-03-29 15:43:46 +00:00
dadaloop82 f87e2204a9 fix: cooking overlay fuori dallo screensaver (era nascosto da display:none) 2026-03-29 15:38:33 +00:00
dadaloop82 c7439cc858 fix: deduplicazione lista spesa quando prodotto sta finendo
- Aggiunta helper _nameTokens() + _findSimilarItem() per confronto
  per token tra nomi prodotto (gestisce marche diverse / varianti)
  1. Se un prodotto simile e' gia' nella lista Bring! (shoppingItems)
     → mostra solo un toast, non apre il modale
  2. Se la spesa intelligente prevede gia' il prodotto (smartShoppingItems)
     → mostra nota contestuale nel modale con urgenza
2026-03-29 15:34:20 +00:00
dadaloop82 917aa56001 feat: sezioni reparto lista spesa, gradient urgenza, modalità cucina con TTS
- renderShoppingItems: raggruppamento per reparto (sezioni), ordinamento
  per urgenza+frequenza, sfondo con gradiente colore urgenza
- renderSmartShopping: stesso raggruppamento per reparto in tab previsione
- Modalità Cucina: overlay fullscreen nero, step per step con navigazione,
  TTS italiano via Web Speech API, pulsante 'Usa' ingredienti per step
- CSS: modal z-index 600 in cooking-mode-active per sovrapposizione corretta
2026-03-29 15:30:55 +00:00
dadaloop82 a38a5d670f feat: lista spesa con tab Da comprare/In previsione, tag, frequenza, tap-to-scan
- Counter nei tab aggiornati dinamicamente
- Auto-aggiunta prodotti CRITICI a Bring! al caricamento (1x per sessione)
- Badge urgenza e frequenza sugli item in lista (cross-ref smart shopping)
- Tag locali per item (Urgente/Priorità/Verificare) con menu dropdown
- Ordinamento automatico per frequenza utilizzo (item più usati in cima)
- Tap su un item → scanner barcode, con banner 'Trovato! Rimuovi dalla lista'
- Fix pctLeft: usa max(1, qty) come fallback refQty per evitare falsi alert
- Fix daysLeft capped a 365gg per pulire stringhe di previsione
- Back button on action page → torna a shopping se aperto da lista
2026-03-29 14:12:37 +00:00
dadaloop82 5b11ab6493 📦 Backup database automatico - 2026-03-28 03:00 2026-03-28 03:00:01 +00:00
dadaloop82 dac1465c45 📦 Backup database automatico - 2026-03-27 03:00 2026-03-27 03:00:01 +00:00
dadaloop82 21e93a5546 📦 Backup database automatico - 2026-03-26 03:00 2026-03-26 03:00:01 +00:00
dadaloop82 df391df150 📦 Backup database automatico - 2026-03-25 03:00 2026-03-25 03:00:01 +00:00
dadaloop82 0835bc8b84 📦 Backup database automatico - 2026-03-21 03:00 2026-03-21 03:00:01 +00:00
dadaloop82 3037d64664 📦 Backup database automatico - 2026-03-20 03:00 2026-03-20 03:00:01 +00:00
dadaloop82 11a703d274 20260319a: Auto-refresh recipe archive after save, Bring spec uses product name not brand 2026-03-19 13:18:35 +00:00
dadaloop82 b8528f79a9 📦 Backup database automatico - 2026-03-19 03:00 2026-03-19 03:00:01 +00:00
dadaloop82 dae4c4d435 20260318b: Fix countdown bar color - was using non-existent CSS variable 2026-03-18 06:33:04 +00:00
dadaloop82 4536decfaf 20260318a: Bump cache busters 2026-03-18 06:16:11 +00:00
dadaloop82 3e284da7ad 📦 Backup database automatico - 2026-03-18 03:00 2026-03-18 03:00:01 +00:00
dadaloop82 9517225d32 20260317e: Persist recipe ingredient used state to DB 2026-03-17 14:18:25 +00:00
dadaloop82 66e175e863 20260317d: Auto-dismiss move modal after 15s with progress bar countdown 2026-03-17 14:15:16 +00:00
dadaloop82 7cc557d4df 20260317c: Torta->Dolce, Bring specification with brand for product variants 2026-03-17 13:55:30 +00:00
dadaloop82 d1df6a6862 20260317b: Replace Comfort Food with Priorita cose aperte in recipe options 2026-03-17 12:06:14 +00:00
dadaloop82 9491cf0e0b 20260317a: Replace Break Mattutino/Spuntino Serale with Torta/Succo di Frutta in recipe meals 2026-03-17 06:28:42 +00:00
dadaloop82 c154f94b05 📦 Backup database automatico - 2026-03-17 03:00 2026-03-17 03:00:01 +00:00
dadaloop82 b4b68d6579 20260316i: Low-stock Bring prompt after use
- API returns total_remaining, product_name, unit, default_qty after use
- isLowStock() detects when inventory is running low (pz<=2, conf<=1, weight/vol<=25% of default)
- After using a product, if low stock detected, shows prompt asking to add to Bring shopping list
- Works in main USE form, USE ALL, and recipe ingredient USE
- Prompt chains properly: low-stock then move-after-use (if applicable)
- Skips prompt when product is fully depleted (already auto-added to Bring)
2026-03-16 14:59:55 +00:00
dadaloop82 1d8fb55f58 20260316h: Recipe ingredient USE popup with qty/location controls
- Clicking 'Usa' on a recipe ingredient now opens a modal popup instead of
  directly consuming. Shows location selector, quantity controls (+/- buttons),
  conf/sub-unit mode, and 'Usa TUTTO' option.
- Quantity is pre-filled with the recipe's suggested amount
- Auto-selects location with opened package
- After use, shows move-after-use modal (stays on recipe page, not dashboard)
- Separate recipe-context move functions (showRecipeMoveModal, confirmRecipeMove)
- Modal overlay z-index 250 to appear above recipe dialog
2026-03-16 12:42:12 +00:00
dadaloop82 134e5dfa4e 20260316g: Fix conf anomaly detection + auto-split opened packages
- Fixed isSuspiciousDefaultQty: for conf products, checks package_unit thresholds
  (375g is fine for g-max=10000, not checked against conf-max=50)
- Auto-split on use: when using from a conf product with whole+fractional qty,
  automatically separates whole confs from opened part
  e.g. Panna 2.6conf → use 5g → 2conf (sealed) + 0.56conf (opened)
- Move modal now moves only the opened row (via opened_id)
- Use query prefers fractional rows (opened packages) first
- Non-conf products still get standard move-after-use behavior
2026-03-16 08:07:17 +00:00
dadaloop82 5ca809b31f 20260316f: Fix Cracker integrali default_qty (500→16) + detect absurd package sizes
- Fixed Cracker integrali default_quantity from 500 to 16 (was weight in grams, should be pieces)
- Review system now also flags products with absurd default_quantity (package size)
  e.g. a 'pz' product claiming 500pz per package gets flagged as '📦 Conf. sospetta'
- Uses same QTY_THRESHOLDS max values for detection
2026-03-16 08:01:58 +00:00
dadaloop82 74d99a11bf 20260316e: Fix quick recipe + use from opened packages first
- Quick recipe: prompt now specifies 1 persona, excludes freezer products
- USE form: auto-selects location with opened package as default
  (deducts from already-opened packages before sealed ones)
- Move-after-use modal verified working (shows after partial use)
2026-03-16 07:59:56 +00:00
dadaloop82 4d9fd8638e 20260316d: Sort dashboard sections - opened by remaining qty asc, expiring/expired already correct 2026-03-16 07:51:05 +00:00
dadaloop82 c6a3ae6e63 20260316c: Dashboard quick recipe button + waste chart
- Added 'Ricetta veloce' button between stat cards and expired section
  (navigates to chat and auto-asks Gemini for a recipe with expiring products)
- Added waste vs consumption mini chart between expiring and opened sections
  (horizontal bar showing used/wasted ratio from last 30 days)
- API: getStats() now returns used_30d and wasted_30d counts
- Cache busters updated to 20260316c
2026-03-16 07:49:10 +00:00
dadaloop82 eb5ee60dd7 Sposta prodotto dopo l'uso + fix prodotti aperti
- Dopo aver usato un prodotto, se rimane quantità mostra modal con opzione
  di spostarlo in un'altra posizione (es. dispensa→frigo dopo apertura)
- La scadenza viene ricalcolata per la nuova posizione
- Fix marmellata: default_quantity era 0 → non appariva tra prodotti aperti
- Auto-set default_quantity al primo add per prodotti g/ml/kg/l senza pkg size
- Versione: 20260316b
2026-03-16 06:48:48 +00:00
dadaloop82 458206b39f Rimuovi sezione 'Sposta il resto' dal form USA
Lo spostamento si fa già cambiando la posizione nell'edit inventario.
Rimossa UI duplicata e relative funzioni JS.
- Versione: 20260316a
2026-03-16 06:38:04 +00:00
dadaloop82 d0ecbff5bc 📦 Backup database automatico - 2026-03-16 03:00 2026-03-16 03:00:01 +00:00
dadaloop82 68dd7810f0 Fix ricalcolo scadenza per freezer e sotto vuoto
- selectPurchaseType: non usa più date hardcoded, ricalcola sempre in base
  alla posizione e stato sotto vuoto corrente
- Edit inventario: cambiare posizione o toggle sotto vuoto ricalcola la scadenza
- Spostamento prodotto: ricalcola scadenza per la nuova posizione
- Fix DB: fusi di pollo freezer 120gg, Bel Paese vacuum 21gg, Speck vacuum 75gg
- Versione: 20260315j
2026-03-15 19:15:22 +00:00