reglas: plato fijo por dia y comida (ej. tortilla los viernes de cena)

- Dish.fixedDayOfWeek/fixedMealType (opcionales, aditivos para CloudKit)
- Toggle + pickers de dia/comida en el formulario de plato
- AutocompleteEngine: pre-pasada que asigna los platos fijos a su hueco
  antes del bucle MRV, de modo que cuentan para el resto de reglas
- Evento analytics dish_fixed_slot_set; strings en 6 idiomas

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013H6bXqGX1ygwib1Dm3n3UG
This commit is contained in:
alexandrev-tibco
2026-09-01 11:22:34 +02:00
parent 47daab9e51
commit 7193234024
10 changed files with 120 additions and 2 deletions
+19 -1
View File
@@ -7,6 +7,9 @@ final class DishViewModel: ObservableObject {
@Published var descriptionText: String = ""
@Published var selectedTagIds: Set<UUID> = []
@Published var isPriority: Bool = false
@Published var hasFixedSlot: Bool = false
@Published var fixedDayOfWeek: Int = 4 // Friday
@Published var fixedMealType: MealType = .dinner
@Published var ingredients: [String] = []
@Published var photoData: Data?
@Published var isGeneratingIngredients: Bool = false
@@ -29,6 +32,13 @@ final class DishViewModel: ObservableObject {
descriptionText = dish.descriptionText ?? ""
selectedTagIds = Set(dish.tagIds)
isPriority = dish.isPriority
if let day = dish.fixedDayOfWeek, let meal = dish.fixedMealType.flatMap(MealType.init) {
hasFixedSlot = true
fixedDayOfWeek = day
fixedMealType = meal
} else {
hasFixedSlot = false
}
ingredients = dish.ingredients
photoData = dish.photoData
}
@@ -39,6 +49,9 @@ final class DishViewModel: ObservableObject {
descriptionText = ""
selectedTagIds = []
isPriority = false
hasFixedSlot = false
fixedDayOfWeek = 4
fixedMealType = .dinner
ingredients = []
photoData = nil
}
@@ -93,6 +106,8 @@ final class DishViewModel: ObservableObject {
dish.descriptionText = descriptionText.isEmpty ? nil : descriptionText
dish.tagIds = Array(selectedTagIds)
dish.isPriority = isPriority
dish.fixedDayOfWeek = hasFixedSlot ? fixedDayOfWeek : nil
dish.fixedMealType = hasFixedSlot ? fixedMealType.rawValue : nil
dish.ingredients = cleanIngredients
dish.photoData = photoData
} else {
@@ -102,11 +117,14 @@ final class DishViewModel: ObservableObject {
tagIds: Array(selectedTagIds),
isPriority: isPriority,
ingredients: cleanIngredients,
photoData: photoData
photoData: photoData,
fixedDayOfWeek: hasFixedSlot ? fixedDayOfWeek : nil,
fixedMealType: hasFixedSlot ? fixedMealType.rawValue : nil
)
context.insert(dish)
AnalyticsService.logDishAdded(tagCount: selectedTagIds.count)
}
if hasFixedSlot { AnalyticsService.logEvent("dish_fixed_slot_set") }
try? context.save()
reset()