3.5.0: «Qué va a pasar» se explica con una carpeta, y una barra dice por dónde va

Munka, con el plan de Diana Méndez delante: «se lee mucho pero se entiende poco», «lo de ordenar
por año y por mes, ¿me toca seleccionar uno a uno o lo hace todo?», y quería una barra para saber
por dónde va y si hace falta algo.

- Una frase arriba y un solo botón, «Aplicar los N cambios»: un clic lo hace todo, en orden.
- Tres fichas, una por paso, con cambios, peso y cuántos quedan sin marcar; se pulsa una y se ve.
- Un ejemplo animado: la fila más representativa del paso como dos ramas de carpetas, «Ahora» y
  «Después», y lo que se mueve vuela de una a otra; debajo, la frase y el porqué. «Otro ejemplo»
  recorre las filas.
- La lista, corta: de dónde → a dónde y la cuenta; el motivo solo con «ver por qué». Lo que no va
  solo queda aparte y contado (cosméticos «01 - Celular» → «01- Celular», y dudosos), con «marcar
  los cosméticos».
- Al aplicar, el servidor cuenta archivo a archivo (/api/aplicando) y la interfaz lo sondea: barra,
  qué se mueve ahora, y al acabar qué se hizo, qué falló y qué queda sin hacer.
- Los avisos van plegados bajo «N cosas que conviene mirar antes de aplicar».

Pruebas: probar 19, prueba_orden 33, prueba_funcional 30 (comprueba que el avance acaba en tantas
de tantas), prueba_ventana 18.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-10-10 10:59:16 -05:00
padre 50da026373
commit 22bf2a8657
Se han modificado 4 ficheros con 303 adiciones y 81 borrados

Ver fichero

@@ -235,11 +235,13 @@ def p_aplicar():
assert not r['errores'], r['errores']
assert r['movimientos'] > 0, 'no movió nada'
LOTES['orden'] = r['lote']
av = get('/api/aplicando')
assert av['lote'] == r['lote'] and av['fin'] and av['unidades'] == av['unidades_total'] > 0 and av['movidos'] == r['movimientos'], av
despues = arbol()
assert sorted(os.path.basename(x) for x in antes) == sorted(os.path.basename(x) for x in despues), 'se perdió algún archivo'
assert '10- Octubre' in os.listdir(os.path.join(RAIZ, '2026')), 'el mes sigue en minúsculas: %s' % os.listdir(os.path.join(RAIZ, '2026'))
assert not any('thumbs.db' in x and '_para borrar' not in x for x in despues), 'la basura sigue fuera'
return '%d movimientos, sin errores, «10- octubre» pasó a «10- Octubre»' % r['movimientos']
return '%d movimientos, sin errores, «10- octubre» pasó a «10- Octubre»; el avance acabó en %d de %d' % (r['movimientos'], av['unidades'], av['unidades_total'])
def p_deshacer():