reglas: los avisos se calculan del plan actual, no de una marca guardada

Un plato aparecia en la lista de incumplimientos sin explicacion (captura
del usuario: "Ensalada campera"): findViolations listaba los slots con
isRuleOverridden, una marca puesta al asignar que quedaba obsoleta cuando
el conflicto ya se habia resuelto. Y al reves, editar una regla despues
de planificar no detectaba nada.

- findViolations recorre el plan y reporta solo lo que incumple AHORA,
  siempre con sus razones (nunca una entrada vacia)
- MealSlot.isRuleIgnored: "Ignorar" pasa a ser persistente, porque si no
  el aviso recalculado volveria enseguida; se resetea al cambiar o
  quitar el plato del hueco
- El triangulo del calendario usa tambien el estado real
- Campo en el payload KV (opcional, retrocompatible) y en el esquema
  CloudKit de Development
- 3 tests: marca obsoleta no se lista, regla endurecida despues se
  detecta, y lo ignorado no reaparece

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-10 21:54:37 +02:00
parent 7b340be305
commit 24a6743ed2
8 changed files with 83 additions and 9 deletions
+5 -2
View File
@@ -119,7 +119,8 @@ final class ICloudSyncService {
calendarEventId: $0.calendarEventId,
isRuleOverridden: $0.isRuleOverridden,
isEatingOut: $0.isEatingOut,
isSkipped: $0.isSkipped
isSkipped: $0.isSkipped,
isRuleIgnored: $0.isRuleIgnored
)
}
)
@@ -217,7 +218,8 @@ final class ICloudSyncService {
calendarEventId: slotPayload.calendarEventId,
isRuleOverridden: slotPayload.isRuleOverridden,
isEatingOut: slotPayload.isEatingOut ?? false,
isSkipped: slotPayload.isSkipped ?? false
isSkipped: slotPayload.isSkipped ?? false,
isRuleIgnored: slotPayload.isRuleIgnored ?? false
)
slot.weekPlan = plan
plan.slotList.append(slot)
@@ -301,4 +303,5 @@ private struct MealSlotPayload: Codable {
let isRuleOverridden: Bool
var isEatingOut: Bool?
var isSkipped: Bool?
var isRuleIgnored: Bool?
}