06b-correccion
Úsala cuando el estudiante pida la skill 06b o la parte de corrección de R10 (corregir una lectura pendiente de envío y bloquear la corrección de una ya enviada). Agrega el botón Corregir en la lista
SKILL.md.github/skills/06b-correccion/SKILL.md
GitHubSkill 06b: Corrección de lecturas pendientes (R10)
Lee antes
docs/CONTRATO.md secciones 1, 5 y 6 (R10). Antes de modificarlos, lee src/db/readings.ts, src/store/draft.ts, src/services/photos.ts, src/app/(tecnico)/index.tsx, buscar.tsx y las pantallas de src/app/(tecnico)/lectura/.
Instala
Nada.
Crea o modifica
- src/db/readings.ts:
getReadingByClientId(db, clientId).updateReading(db, row):UPDATE ... WHERE client_id = ? AND sync_status = 'pending', con parámetros preparados. Devuelve cuántas filas cambió. Si cambió 0, la lectura ya no es corregible (enviada o enviándose).
- src/store/draft.ts: agrega
editingClientId: string | null(persistido) y la acciónstartEditDraft(row), que carga el borrador desde la fila: mismo clientId, meterCode, condition, readingText, reasonOrDamage, anomalyConfirmed, photoUri, step = 1. Parameter: si row.previousReading no es null, arma un MeterDTO con code, lastReading = previousReading y averageMonthlyConsumption = averageMonthly, y '' en los demás campos de texto; si es null, meter = null.clearDrafttambién limpia editingClientId. - src/services/photos.ts:
takePhotonombra el archivoevidencia-<clientId>-<Date.now()>.jpgpara que una foto nueva nunca pise la original. Actualiza la nota correspondiente en el contrato (R7). - src/store/draft.ts,
setPhotoUri: sieditingClientIdno es null, NO borra la foto anterior (sigue siendo la de la base de datos hasta guardar). - src/app/(tecnico)/index.tsx: cada lectura con sync_status 'pending' muestra el botón "Corregir". Al pulsarlo: a. Relee la fila con getReadingByClientId. Si ya no está 'pending', muestra "Esta lectura ya no se puede corregir" y refresca la lista. b. Si hay un borrador sin terminar, pregunta con Alert "Hay un registro sin terminar. ¿Reemplazarlo?" (Cancelar / Reemplazar). c. Llama startEditDraft(row) y navega a /lectura/paso-1. Las lecturas 'sent' muestran "Enviada (no editable)" y las 'sending' "Enviando…", ambas sin botón.
- src/app/(tecnico)/buscar.tsx: cuando ya existe una lectura de ese medidor en el mes: si está 'pending', el mensaje mantiene el rechazo de un segundo registro y agrega el botón "Corregir lectura pendiente" (mismo flujo del punto 5); si no, solo "Ya enviada: no se puede modificar".
- Pantallas de lectura/ en modo edición (
editingClientIdno es null):- paso-1 resalta el estado actual y permite cambiarlo. Si setCondition ya limpia los campos que dejan de aplicar, no lo cambies.
- paso-3 muestra "Guardar corrección" en lugar de "Guardar lectura" y no chequea duplicado. Al pulsarlo: relee la fila; arma la fila corregida conservando clientId, monthYear, createdAt y sentAt; actualiza updatedAt; recalcula consumo, isAnomalous y la foto con las mismas reglas de la skill 06.
verificationqueda 'pending_verification' si ya lo era; si no, (online && meter !== null) ? 'verified' : 'pending_verification'. - Llama updateReading. Si cambió 0 filas, muestra "Esta lectura ya no se puede corregir" y no borra nada. Si salió bien: si la foto cambió, borra la foto anterior con deletePhoto; luego clearDraft() y navega a "/".
- docs/CONTRATO.md: agrega
editingClientIdystartEditDrafta la sección 5 y la regla de nombre de foto a R7. Avísame.
Reglas
- Solo readings.ts escribe SQL. La corrección jamás crea una fila nueva ni cambia client_id, meter_code ni month_year.
- No enviar a MockAPI ni tocar la red (skill 08). El descarte de borradores llega en la skill 07.
- Estilos solo desde src/theme/tokens.ts.
Checklist
- npx tsc --noEmit sin errores.
- Ninguna dependencia nueva.
- Guardo MED-000001 con 182 y la corrijo a 183: aparecen la advertencia y la foto obligatoria; al guardar la lista muestra consumo 55 y sigue habiendo UNA sola fila de ese medidor.
- Corrijo una lectura normal a "dañado" con la lectura vacía: se guarda.
- Cambio la foto en una corrección: la miniatura muestra la nueva.
- Empiezo una corrección y salgo sin guardar: la lectura original conserva sus datos y su foto.
- En buscar, un segundo registro del mismo medidor se rechaza y ofrece corregir la pendiente.
- Pídeme probar los casos anteriores.
Al terminar
Actualiza MEMORY.md, escribe la explicación para la defensa y sugiere el mensaje de commit.