feat: native shopping list — decouple from Bring! (#105)

- New shopping_list SQLite table (migration in migrateDB)
- shoppingGetList/Add/Remove — delegates to Bring! or internal DB
  based on SHOPPING_MODE env var (default: internal)
- isShoppingBringMode() guard: requires mode=bring + BRING credentials
- bringQuickSyncProduct updated to support both modes
- All bring_* JS calls replaced with shopping_* (bring_migrate_names kept)
- New settings tab 'Lista spesa' (tab-bring) with:
  - Enable/disable shopping list toggle
  - Provider radio: internal vs Bring!
  - Bring! sub-section (shown only when mode=bring)
  - AI smart suggestions toggle
  - Forecast toggle
  - Auto-add threshold (qty slider)
  - Price estimation section
- _applyShoppingSettingsUI, onShoppingEnabledChange, onShoppingModeChange
- SHOPPING_* env vars documented in .env.example
- cron_smart_shopping respects SHOPPING_MODE and SHOPPING_SMART_SUGGESTIONS
- Translations: 12 new keys in all 5 languages (it/en/de/fr/es)
- DB busy_timeout=5000ms + WAL pragma in getDB() (fixes #95)
This commit is contained in:
dadaloop82
2026-05-19 16:05:49 +00:00
parent c07439fea4
commit fa0442e2f6
12 changed files with 454 additions and 58 deletions
+16 -1
View File
@@ -849,7 +849,22 @@
"currency_title": "Valuta",
"currency_hint": "La valuta usata per tutti i costi e i prezzi nell'app."
},
"tab_general": "Generali"
"tab_general": "Generali",
"shopping": {
"tab": "Lista spesa",
"title": "Lista della spesa",
"hint": "Configura la lista della spesa integrata o collega Bring!.",
"enable_label": "Abilita lista della spesa",
"mode_label": "Provider",
"mode_internal": "Interno (senza Bring!)",
"mode_bring": "Bring! (app esterna)",
"bring_section_title": "Configurazione Bring!",
"ai_section_title": "Assistenza AI",
"smart_suggestions_label": "Suggerimenti AI",
"forecast_label": "Previsione prodotti in esaurimento",
"auto_add_label": "Aggiungi automaticamente quando",
"auto_add_suffix": "rimasto in magazzino (0 = solo quando esaurito)"
}
},
"expiry": {
"today": "OGGI",