diff --git a/assets/css/style.css b/assets/css/style.css index e769989..62263a4 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -2712,6 +2712,18 @@ body { flex-shrink: 0; } +.btn-link-small { + background: none; + border: none; + color: var(--text-muted); + font-size: 0.8rem; + cursor: pointer; + padding: 4px 8px; + border-radius: 6px; + text-decoration: underline; + text-underline-offset: 2px; +} + /* ===== PRODUCT DETAILS CARD (Action Page) ===== */ .product-details-card { background: var(--bg-card); diff --git a/assets/js/app.js b/assets/js/app.js index 50c492a..53fcd74 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -2884,7 +2884,6 @@ function showProductAction() {
${invHtml}
-

Tocca una riga per modificare

`; btnsContainer.className = 'action-buttons-4col'; @@ -2901,11 +2900,16 @@ function showProductAction() { πŸ—‘οΈ BUTTA
butta il prodotto
- `; + // Secondary: catalog edit link below the buttons + const catalogLink = document.createElement('div'); + catalogLink.style.cssText = 'text-align:center;margin-top:6px'; + catalogLink.innerHTML = ``; + btnsContainer.after(catalogLink); } else { // Product NOT in inventory - show only AGGIUNGI statusBar.style.display = 'none'; @@ -3002,6 +3006,47 @@ function editProductFromAction() { } // === EDIT INVENTORY ITEM FROM ACTION PAGE === +// === OPEN INVENTORY EDIT β€” picks item or shows location picker === +function openInventoryEdit() { + const items = _actionInventoryItems; + if (!items || items.length === 0) { + showToast('Nessuna voce di inventario trovata', 'error'); + return; + } + if (items.length === 1) { + editActionInventoryItem(items[0].id); + return; + } + // Multiple locations β†’ let user pick which one to edit + const contentEl = document.getElementById('modal-content'); + contentEl.innerHTML = ` + +

Scegli la posizione da modificare:

+
+ ${items.map(inv => { + const locInfo = LOCATIONS[inv.location] || { icon: 'πŸ“¦', label: inv.location }; + const qtyStr = formatQuantity(inv.quantity, inv.unit, inv.default_quantity, inv.package_unit); + let expiryStr = ''; + if (inv.expiry_date) { + const d = daysUntilExpiry(inv.expiry_date); + expiryStr = ` Β· ${d < 0 ? '⚠️ Scaduto' : 'πŸ“… ' + formatDate(inv.expiry_date)}`; + } + const vacuumStr = inv.vacuum_sealed ? ' πŸ«™' : ''; + return ``; + }).join('')} +
+ `; + document.getElementById('modal-overlay').style.display = 'flex'; +} + function editActionInventoryItem(inventoryId) { const item = _actionInventoryItems.find(i => i.id === inventoryId); if (!item) return; diff --git a/data/cron.log b/data/cron.log index 6d3f673..ace626e 100644 --- a/data/cron.log +++ b/data/cron.log @@ -1803,3 +1803,10 @@ [2026-04-07 12:05:02] OK β€” 31 items cached [2026-04-07 12:10:01] OK β€” 30 items cached [2026-04-07 12:15:02] OK β€” 30 items cached +[2026-04-07 12:20:02] OK β€” 32 items cached +[2026-04-07 12:25:02] OK β€” 33 items cached +[2026-04-07 12:30:02] OK β€” 33 items cached +[2026-04-07 12:35:01] OK β€” 33 items cached +[2026-04-07 12:40:02] OK β€” 33 items cached +[2026-04-07 12:45:01] OK β€” 33 items cached +[2026-04-07 12:50:02] OK β€” 33 items cached diff --git a/data/dispensa.db b/data/dispensa.db index 66283bc..0bf38b6 100644 Binary files a/data/dispensa.db and b/data/dispensa.db differ diff --git a/data/smart_shopping_cache.json b/data/smart_shopping_cache.json index f925a8c..3e2180a 100644 --- a/data/smart_shopping_cache.json +++ b/data/smart_shopping_cache.json @@ -1 +1 @@ -{"success":true,"items":[{"product_id":70,"name":"Latte Parzialmente Scremato Uht","brand":"Latteria","category":"bevande","unit":"conf","current_qty":0,"default_qty":500,"package_unit":"ml","pct_left":0,"use_count":13,"buy_count":3,"daily_rate":6.04,"uses_per_month":13.9,"days_since_last_use":12,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito","Uso frequente (13x)"],"score":135,"on_bring":false,"locations":""},{"product_id":10,"name":"Passata di pomodoro","brand":"Primia","category":"en:condiments","unit":"g","current_qty":0,"default_qty":700,"package_unit":"","pct_left":0,"use_count":8,"buy_count":3,"daily_rate":47.08,"uses_per_month":8.6,"days_since_last_use":1,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito","Uso frequente (8x)"],"score":135,"on_bring":false,"locations":""},{"product_id":115,"name":"Aglio rosso","brand":"Duoccio","category":"condimenti","unit":"pz","current_qty":0,"default_qty":0,"package_unit":"","pct_left":0,"use_count":2,"buy_count":2,"daily_rate":0.12,"uses_per_month":2.4,"days_since_last_use":18,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito"],"score":100,"on_bring":false,"locations":""},{"product_id":152,"name":"Muesli Frutta Secca","brand":"Crownfield","category":"altro","unit":"g","current_qty":0,"default_qty":750,"package_unit":"","pct_left":0,"use_count":4,"buy_count":2,"daily_rate":29.13,"uses_per_month":5.9,"days_since_last_use":12,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito"],"score":100,"on_bring":false,"locations":""},{"product_id":69,"name":"Cipolla Dorata","brand":"","category":"verdura","unit":"pz","current_qty":1.8,"default_qty":0,"package_unit":"","pct_left":19,"use_count":15,"buy_count":1,"daily_rate":0.37,"uses_per_month":16.1,"days_since_last_use":1,"days_left":5,"expiry_date":"2026-04-13","days_to_expiry":5,"is_opened":false,"urgency":"high","reasons":["Finisce tra ~5gg"],"score":90,"on_bring":false,"locations":"frigo"},{"product_id":3,"name":"Cracker integrali","brand":"Barilla,Mulino Bianco","category":"en:snacks","unit":"conf","current_qty":2,"default_qty":25,"package_unit":"g","pct_left":12,"use_count":6,"buy_count":1,"daily_rate":0.5,"uses_per_month":6.4,"days_since_last_use":9,"days_left":4,"expiry_date":"2026-04-28","days_to_expiry":20,"is_opened":true,"urgency":"high","reasons":["Quasi finito (12%)"],"score":90,"on_bring":false,"locations":"dispensa"},{"product_id":47,"name":"Lenticchie","brand":"Primia","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":400,"package_unit":"g","pct_left":1,"use_count":5,"buy_count":4,"daily_rate":32.16,"uses_per_month":5.4,"days_since_last_use":3,"days_left":0,"expiry_date":"2029-12-13","days_to_expiry":1345,"is_opened":false,"urgency":"high","reasons":["Quasi finito (1%)"],"score":90,"on_bring":false,"locations":"dispensa"},{"product_id":161,"name":"Yogurt agrumi","brand":"Vipiteno","category":"latticini","unit":"conf","current_qty":0.3,"default_qty":500,"package_unit":"g","pct_left":26,"use_count":2,"buy_count":1,"daily_rate":0.65,"uses_per_month":1,"days_since_last_use":1,"days_left":0,"expiry_date":"2026-04-09","days_to_expiry":1,"is_opened":true,"urgency":"medium","reasons":["Finisce tra ~0gg","Scade tra 1gg"],"score":90,"on_bring":false,"locations":"frigo"},{"product_id":154,"name":"Mela Rossa","brand":"","category":"frutta","unit":"pz","current_qty":6,"default_qty":1,"package_unit":"","pct_left":27,"use_count":6,"buy_count":1,"daily_rate":0.8,"uses_per_month":9,"days_since_last_use":3,"days_left":8,"expiry_date":"2026-04-15","days_to_expiry":7,"is_opened":false,"urgency":"medium","reasons":["Finisce tra ~8gg"],"score":60,"on_bring":false,"locations":"frigo"},{"product_id":144,"name":"Pancetta Dolce","brand":"Negroni","category":"en:meats-and-their-products","unit":"conf","current_qty":1,"default_qty":80,"package_unit":"g","pct_left":50,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.3,"days_since_last_use":8,"days_left":23,"expiry_date":"2026-09-11","days_to_expiry":156,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":true,"locations":"frigo"},{"product_id":29,"name":"Sale marino iodato","brand":"Primia","category":"","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":56,"name":"Tonno all'Olio di Oliva","brand":"Rio Mare","category":"conserve","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":50,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.1,"days_since_last_use":26,"days_left":28,"expiry_date":"2029-12-31","days_to_expiry":1363,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":163,"name":"Yogurt vaniglia","brand":"Vipiteno","category":"latticini","unit":"conf","current_qty":1,"default_qty":500,"package_unit":"g","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-05-19","days_to_expiry":41,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":false,"locations":"frigo"},{"product_id":106,"name":"Zuppalatte","brand":"Colussi","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":1,"default_qty":250,"package_unit":"g","pct_left":33,"use_count":1,"buy_count":1,"daily_rate":0.08,"uses_per_month":1.2,"days_since_last_use":25,"days_left":12,"expiry_date":"2027-06-01","days_to_expiry":419,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":166,"name":"mix energia","brand":"","category":"","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-11-29","days_to_expiry":235,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":132,"name":"Noci sgusciate","brand":"Fruttbella","category":"conserve","unit":"g","current_qty":60,"default_qty":200,"package_unit":"","pct_left":30,"use_count":4,"buy_count":1,"daily_rate":6.15,"uses_per_month":5.3,"days_since_last_use":3,"days_left":10,"expiry_date":"2026-04-29","days_to_expiry":21,"is_opened":true,"urgency":"medium","reasons":["Finisce tra ~10gg"],"score":50,"on_bring":true,"locations":"dispensa"},{"product_id":130,"name":"Uova Sfoglia Gialla","brand":"Naturelle","category":"latticini","unit":"pz","current_qty":4,"default_qty":1,"package_unit":"","pct_left":67,"use_count":5,"buy_count":2,"daily_rate":0.35,"uses_per_month":6.6,"days_since_last_use":1,"days_left":11,"expiry_date":"2026-04-09","days_to_expiry":1,"is_opened":false,"urgency":"medium","reasons":["Scade tra 1gg"],"score":50,"on_bring":false,"locations":"frigo"},{"product_id":87,"name":"Aroma per dolci e creme Rum","brand":"Dr. Oetker, Cameo, Paneangeli","category":"en:food-additives","unit":"pz","current_qty":2,"default_qty":5,"package_unit":"","pct_left":40,"use_count":3,"buy_count":1,"daily_rate":0.11,"uses_per_month":3.4,"days_since_last_use":3,"days_left":18,"expiry_date":"2028-09-28","days_to_expiry":904,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":86,"name":"Arome Orange Pour Gateaux","brand":"Dr. Oetker, Cameo, Paneangeli","category":"","unit":"pz","current_qty":2,"default_qty":1,"package_unit":"","pct_left":67,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.1,"days_since_last_use":7,"days_left":54,"expiry_date":"2027-02-01","days_to_expiry":299,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":170,"name":"Avocado Hass","brand":"Alce nero","category":"en:plant-based-foods-and-beverages","unit":"pz","current_qty":2,"default_qty":2,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-10-03","days_to_expiry":178,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":8,"name":"Condoro Sugo Al Pomodoro Sauce Le Conserve Della Nonna","brand":"Fini, Le conserve della nonna","category":"en:condiments","unit":"conf","current_qty":2,"default_qty":350,"package_unit":"g","pct_left":1,"use_count":0,"buy_count":2,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2028-07-31","days_to_expiry":845,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":1,"name":"Grissini","brand":"GrissinBon","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":500,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2026-07-09","days_to_expiry":92,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":129,"name":"Latte di Montagna","brand":"Mila","category":"en:dairies","unit":"conf","current_qty":4.8,"default_qty":1000,"package_unit":"ml","pct_left":192,"use_count":14,"buy_count":6,"daily_rate":0.45,"uses_per_month":18.4,"days_since_last_use":0,"days_left":11,"expiry_date":"2026-04-11","days_to_expiry":3,"is_opened":true,"urgency":"low","reasons":["Previsto esaurimento tra ~11gg"],"score":40,"on_bring":false,"locations":"frigo"},{"product_id":92,"name":"Lievito istantaneo","brand":"Paneangeli","category":"altro","unit":"g","current_qty":5,"default_qty":15,"package_unit":"","pct_left":33,"use_count":1,"buy_count":1,"daily_rate":0.37,"uses_per_month":1.1,"days_since_last_use":27,"days_left":13,"expiry_date":"2026-04-10","days_to_expiry":2,"is_opened":true,"urgency":"medium","reasons":["Scade tra 2gg"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":55,"name":"Mais Dolce","brand":"Despar","category":"conserve","unit":"conf","current_qty":2,"default_qty":160,"package_unit":"g","pct_left":0,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2028-12-31","days_to_expiry":998,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":39,"name":"Panna da cucina","brand":"Chef, Parmalat","category":"altro","unit":"conf","current_qty":2,"default_qty":125,"package_unit":"g","pct_left":67,"use_count":2,"buy_count":1,"daily_rate":0.01,"uses_per_month":2.1,"days_since_last_use":8,"days_left":138,"expiry_date":"2026-04-29","days_to_expiry":21,"is_opened":true,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":2,"name":"Pera Italiana Succo e polpa frutta","brand":"Conserve Italia, Valfrutta","category":"bevande","unit":"conf","current_qty":2,"default_qty":200,"package_unit":"ml","pct_left":50,"use_count":3,"buy_count":1,"daily_rate":0.11,"uses_per_month":3.2,"days_since_last_use":2,"days_left":19,"expiry_date":"2027-02-01","days_to_expiry":299,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":127,"name":"Polpa di pomodoro finissima","brand":"Primia","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":500,"package_unit":"g","pct_left":1,"use_count":0,"buy_count":2,"daily_rate":0,"uses_per_month":0,"days_since_last_use":23,"days_left":365,"expiry_date":"2028-03-14","days_to_expiry":706,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":114,"name":"Vino bianco Trebbiano igt Rubicone","brand":"Vesoletto","category":"bevande","unit":"conf","current_qty":2,"default_qty":250,"package_unit":"ml","pct_left":100,"use_count":1,"buy_count":1,"daily_rate":0,"uses_per_month":1.2,"days_since_last_use":4,"days_left":365,"expiry_date":"2027-04-03","days_to_expiry":360,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"frigo"},{"product_id":136,"name":"Biscotti Pastefrolle","brand":"Balocco","category":"snack","unit":"g","current_qty":350,"default_qty":700,"package_unit":"","pct_left":67,"use_count":4,"buy_count":2,"daily_rate":30.73,"uses_per_month":5.3,"days_since_last_use":3,"days_left":11,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"low","reasons":["Previsto esaurimento tra ~11gg"],"score":25,"on_bring":false,"locations":"dispensa"}],"cached_at":"2026-04-07T12:15:02+00:00","cached_ts":1775564102} \ No newline at end of file +{"success":true,"items":[{"product_id":70,"name":"Latte Parzialmente Scremato Uht","brand":"Latteria","category":"bevande","unit":"conf","current_qty":0,"default_qty":500,"package_unit":"ml","pct_left":0,"use_count":13,"buy_count":3,"daily_rate":6.04,"uses_per_month":13.9,"days_since_last_use":12,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito","Uso frequente (13x)"],"score":135,"on_bring":false,"locations":""},{"product_id":10,"name":"Passata di pomodoro","brand":"Primia","category":"en:condiments","unit":"g","current_qty":0,"default_qty":700,"package_unit":"","pct_left":0,"use_count":8,"buy_count":3,"daily_rate":47.04,"uses_per_month":8.6,"days_since_last_use":1,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito","Uso frequente (8x)"],"score":135,"on_bring":false,"locations":""},{"product_id":115,"name":"Aglio rosso","brand":"Duoccio","category":"condimenti","unit":"pz","current_qty":0,"default_qty":0,"package_unit":"","pct_left":0,"use_count":2,"buy_count":2,"daily_rate":0.12,"uses_per_month":2.4,"days_since_last_use":18,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito"],"score":100,"on_bring":false,"locations":""},{"product_id":152,"name":"Muesli Frutta Secca","brand":"Crownfield","category":"altro","unit":"g","current_qty":0,"default_qty":750,"package_unit":"","pct_left":0,"use_count":4,"buy_count":2,"daily_rate":29.1,"uses_per_month":5.9,"days_since_last_use":12,"days_left":0,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"critical","reasons":["Esaurito"],"score":100,"on_bring":false,"locations":""},{"product_id":69,"name":"Cipolla Dorata","brand":"","category":"verdura","unit":"pz","current_qty":1.8,"default_qty":0,"package_unit":"","pct_left":19,"use_count":15,"buy_count":1,"daily_rate":0.37,"uses_per_month":16.1,"days_since_last_use":1,"days_left":5,"expiry_date":"2026-04-13","days_to_expiry":5,"is_opened":false,"urgency":"high","reasons":["Finisce tra ~5gg"],"score":90,"on_bring":false,"locations":"frigo"},{"product_id":3,"name":"Cracker integrali","brand":"Barilla,Mulino Bianco","category":"en:snacks","unit":"conf","current_qty":2,"default_qty":25,"package_unit":"g","pct_left":12,"use_count":6,"buy_count":1,"daily_rate":0.5,"uses_per_month":6.4,"days_since_last_use":9,"days_left":4,"expiry_date":"2026-04-28","days_to_expiry":20,"is_opened":true,"urgency":"high","reasons":["Quasi finito (12%)"],"score":90,"on_bring":false,"locations":"dispensa"},{"product_id":47,"name":"Lenticchie","brand":"Primia","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":400,"package_unit":"g","pct_left":1,"use_count":5,"buy_count":4,"daily_rate":32.13,"uses_per_month":5.4,"days_since_last_use":3,"days_left":0,"expiry_date":"2029-12-13","days_to_expiry":1345,"is_opened":false,"urgency":"high","reasons":["Quasi finito (1%)"],"score":90,"on_bring":false,"locations":"dispensa"},{"product_id":161,"name":"Yogurt agrumi","brand":"Vipiteno","category":"latticini","unit":"conf","current_qty":0.3,"default_qty":500,"package_unit":"g","pct_left":26,"use_count":2,"buy_count":1,"daily_rate":0.64,"uses_per_month":1,"days_since_last_use":1,"days_left":0,"expiry_date":"2026-04-09","days_to_expiry":1,"is_opened":true,"urgency":"medium","reasons":["Finisce tra ~0gg","Scade tra 1gg"],"score":90,"on_bring":false,"locations":"frigo"},{"product_id":154,"name":"Mela Rossa","brand":"","category":"frutta","unit":"pz","current_qty":6,"default_qty":1,"package_unit":"","pct_left":27,"use_count":6,"buy_count":1,"daily_rate":0.8,"uses_per_month":9,"days_since_last_use":3,"days_left":8,"expiry_date":"2026-04-15","days_to_expiry":7,"is_opened":false,"urgency":"medium","reasons":["Finisce tra ~8gg"],"score":60,"on_bring":false,"locations":"frigo"},{"product_id":144,"name":"Pancetta Dolce","brand":"Negroni","category":"en:meats-and-their-products","unit":"conf","current_qty":1,"default_qty":80,"package_unit":"g","pct_left":50,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.3,"days_since_last_use":8,"days_left":23,"expiry_date":"2026-09-11","days_to_expiry":156,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":true,"locations":"frigo"},{"product_id":196,"name":"Pizza Regina Alta Margherita","brand":"Cameo","category":"surgelati","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":0,"days_left":365,"expiry_date":"2026-10-04","days_to_expiry":179,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"freezer"},{"product_id":29,"name":"Sale marino iodato","brand":"Primia","category":"","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":56,"name":"Tonno all'Olio di Oliva","brand":"Rio Mare","category":"conserve","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":50,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.1,"days_since_last_use":26,"days_left":28,"expiry_date":"2029-12-31","days_to_expiry":1363,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":163,"name":"Yogurt vaniglia","brand":"Vipiteno","category":"latticini","unit":"conf","current_qty":1,"default_qty":500,"package_unit":"g","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-05-19","days_to_expiry":41,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":false,"locations":"frigo"},{"product_id":106,"name":"Zuppalatte","brand":"Colussi","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":1,"default_qty":250,"package_unit":"g","pct_left":33,"use_count":1,"buy_count":1,"daily_rate":0.08,"uses_per_month":1.2,"days_since_last_use":25,"days_left":12,"expiry_date":"2027-06-01","days_to_expiry":419,"is_opened":false,"urgency":"high","reasons":["Solo 1 confezione rimasta"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":166,"name":"mix energia","brand":"","category":"","unit":"pz","current_qty":1,"default_qty":1,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-11-29","days_to_expiry":235,"is_opened":false,"urgency":"high","reasons":["Solo 1 pezzo rimasto"],"score":60,"on_bring":false,"locations":"dispensa"},{"product_id":132,"name":"Noci sgusciate","brand":"Fruttbella","category":"conserve","unit":"g","current_qty":60,"default_qty":200,"package_unit":"","pct_left":30,"use_count":4,"buy_count":1,"daily_rate":6.14,"uses_per_month":5.3,"days_since_last_use":3,"days_left":10,"expiry_date":"2026-04-29","days_to_expiry":21,"is_opened":true,"urgency":"medium","reasons":["Finisce tra ~10gg"],"score":50,"on_bring":true,"locations":"dispensa"},{"product_id":130,"name":"Uova Sfoglia Gialla","brand":"Naturelle","category":"latticini","unit":"pz","current_qty":4,"default_qty":1,"package_unit":"","pct_left":67,"use_count":5,"buy_count":2,"daily_rate":0.35,"uses_per_month":6.6,"days_since_last_use":1,"days_left":11,"expiry_date":"2026-04-09","days_to_expiry":1,"is_opened":false,"urgency":"medium","reasons":["Scade tra 1gg"],"score":50,"on_bring":false,"locations":"frigo"},{"product_id":87,"name":"Aroma per dolci e creme Rum","brand":"Dr. Oetker, Cameo, Paneangeli","category":"en:food-additives","unit":"pz","current_qty":2,"default_qty":5,"package_unit":"","pct_left":40,"use_count":3,"buy_count":1,"daily_rate":0.11,"uses_per_month":3.3,"days_since_last_use":3,"days_left":18,"expiry_date":"2028-09-28","days_to_expiry":904,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":195,"name":"Aroma vaniglia","brand":"Dr. Oetker, Cameo, Paneangeli","category":"en:food-additives","unit":"conf","current_qty":2,"default_qty":4,"package_unit":"ml","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":0,"days_left":365,"expiry_date":"2026-10-04","days_to_expiry":179,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":86,"name":"Arome Orange Pour Gateaux","brand":"Dr. Oetker, Cameo, Paneangeli","category":"","unit":"pz","current_qty":2,"default_qty":1,"package_unit":"","pct_left":67,"use_count":1,"buy_count":1,"daily_rate":0.04,"uses_per_month":1.1,"days_since_last_use":7,"days_left":54,"expiry_date":"2027-02-01","days_to_expiry":299,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":170,"name":"Avocado Hass","brand":"Alce nero","category":"en:plant-based-foods-and-beverages","unit":"pz","current_qty":2,"default_qty":2,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":1,"days_left":365,"expiry_date":"2026-10-03","days_to_expiry":178,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":8,"name":"Condoro Sugo Al Pomodoro Sauce Le Conserve Della Nonna","brand":"Fini, Le conserve della nonna","category":"en:condiments","unit":"conf","current_qty":2,"default_qty":350,"package_unit":"g","pct_left":1,"use_count":0,"buy_count":2,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2028-07-31","days_to_expiry":845,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":190,"name":"Finocchio Biologico","brand":"Alce Nero","category":"verdura","unit":"pz","current_qty":2,"default_qty":2,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":0,"days_left":365,"expiry_date":"2026-04-21","days_to_expiry":13,"is_opened":false,"urgency":"medium","reasons":["Solo 2 pezzi rimasti"],"score":40,"on_bring":false,"locations":"frigo"},{"product_id":1,"name":"Grissini","brand":"GrissinBon","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":500,"package_unit":"","pct_left":100,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2026-07-09","days_to_expiry":92,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":129,"name":"Latte di Montagna","brand":"Mila","category":"en:dairies","unit":"conf","current_qty":4.8,"default_qty":1000,"package_unit":"ml","pct_left":192,"use_count":14,"buy_count":6,"daily_rate":0.45,"uses_per_month":18.4,"days_since_last_use":0,"days_left":11,"expiry_date":"2026-04-11","days_to_expiry":3,"is_opened":true,"urgency":"low","reasons":["Previsto esaurimento tra ~11gg"],"score":40,"on_bring":false,"locations":"frigo"},{"product_id":92,"name":"Lievito istantaneo","brand":"Paneangeli","category":"altro","unit":"g","current_qty":5,"default_qty":15,"package_unit":"","pct_left":33,"use_count":1,"buy_count":1,"daily_rate":0.37,"uses_per_month":1.1,"days_since_last_use":27,"days_left":13,"expiry_date":"2026-04-10","days_to_expiry":2,"is_opened":true,"urgency":"medium","reasons":["Scade tra 2gg"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":55,"name":"Mais Dolce","brand":"Despar","category":"conserve","unit":"conf","current_qty":2,"default_qty":160,"package_unit":"g","pct_left":0,"use_count":0,"buy_count":1,"daily_rate":0,"uses_per_month":0,"days_since_last_use":28,"days_left":365,"expiry_date":"2028-12-31","days_to_expiry":998,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":39,"name":"Panna da cucina","brand":"Chef, Parmalat","category":"altro","unit":"conf","current_qty":2,"default_qty":125,"package_unit":"g","pct_left":67,"use_count":2,"buy_count":1,"daily_rate":0.01,"uses_per_month":2.1,"days_since_last_use":8,"days_left":138,"expiry_date":"2026-04-29","days_to_expiry":21,"is_opened":true,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":2,"name":"Pera Italiana Succo e polpa frutta","brand":"Conserve Italia, Valfrutta","category":"bevande","unit":"conf","current_qty":2,"default_qty":200,"package_unit":"ml","pct_left":50,"use_count":3,"buy_count":1,"daily_rate":0.11,"uses_per_month":3.2,"days_since_last_use":2,"days_left":19,"expiry_date":"2027-02-01","days_to_expiry":299,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":127,"name":"Polpa di pomodoro finissima","brand":"Primia","category":"en:plant-based-foods-and-beverages","unit":"conf","current_qty":2,"default_qty":500,"package_unit":"g","pct_left":1,"use_count":0,"buy_count":2,"daily_rate":0,"uses_per_month":0,"days_since_last_use":23,"days_left":365,"expiry_date":"2028-03-14","days_to_expiry":706,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"dispensa"},{"product_id":114,"name":"Vino bianco Trebbiano igt Rubicone","brand":"Vesoletto","category":"bevande","unit":"conf","current_qty":2,"default_qty":250,"package_unit":"ml","pct_left":100,"use_count":1,"buy_count":1,"daily_rate":0,"uses_per_month":1.2,"days_since_last_use":4,"days_left":365,"expiry_date":"2027-04-03","days_to_expiry":360,"is_opened":false,"urgency":"medium","reasons":["Solo 2 confezioni rimaste"],"score":40,"on_bring":false,"locations":"frigo"},{"product_id":136,"name":"Biscotti Pastefrolle","brand":"Balocco","category":"snack","unit":"g","current_qty":350,"default_qty":700,"package_unit":"","pct_left":67,"use_count":4,"buy_count":2,"daily_rate":30.7,"uses_per_month":5.3,"days_since_last_use":3,"days_left":11,"expiry_date":null,"days_to_expiry":999,"is_opened":false,"urgency":"low","reasons":["Previsto esaurimento tra ~11gg"],"score":25,"on_bring":false,"locations":"dispensa"}],"cached_at":"2026-04-07T12:50:02+00:00","cached_ts":1775566202} \ No newline at end of file