Skip to content

Agrupa las pestañas de la ficha del proyecto y revisa la seguridad de sus acciones - #55

Open
abdedarghal111 wants to merge 16 commits into
masterfrom
tarea5231
Open

abdedarghal111 wants to merge 16 commits into
masterfrom
tarea5231

Conversation

@abdedarghal111

@abdedarghal111 abdedarghal111 commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

https://facturascripts.com/roadmap/5231

Nota: se sube la versión del plugin a 5.22 y la versión mínima del core a 2026.7, necesaria para los grupos de pestañas.

Qué pasaba

  • Las pestañas de la ficha del proyecto salían sueltas.
  • Se usaban llamadas antiguas del core.

Qué cambia

  • Pestañas agrupadas en Ventas y Compras.
  • Llamadas antiguas sustituidas por las actuales.
  • El buscador de vincular documentos ahora delega en el core lo que no es suyo. Revisar con calma.

Fixes

  • La pestaña de recibos salía vacía y el botón de pagado no hacía nada.
  • No se podía buscar por número de cliente al vincular documentos.
  • Desvincular decía que había actualizado aunque no quitara nada.
  • Botones de vincular y desvincular visibles sin permiso.
  • El kanban no dejaba arrastrar: se restaura su dependencia, borrada por error en la PR #47. Hay que instalar dependencias con npm o pnpm.
  • Reordenar en la misma fase del kanban enviaba peticiones inútiles.

Fallos de seguridad del plugin arreglados

  • Acciones sin comprobar token o permisos.
  • Acciones posibles sobre proyectos privados ajenos y sus documentos.
  • Kanban sin token y con acceso a proyectos ajenos.
  • El nombre de un proyecto privado se veía al denegar el acceso.
  • Regenerar el stock reactivaba tokens ya usados.

Bugs del core

  • En PostgreSQL no funcionan los buscadores con código numérico, entre ellos los de vincular documentos.
  • El inicio de sesión a veces da petición no válida al cambiar de usuario.

Tests

  • Todos los cambios se han probado exhaustivamente desde la interfaz.
  • Los bugs del core no se han tocado y se han dejado tal cual.

…aseWhere

Atención: cambio a revisar y probar con cuidado.

autocompleteAction() era una copia completa del método de BaseController
para añadir la búsqueda por numproveedor/numero2 al vincular documentos.
Ahora sigue el mismo patrón que Modelo303 y Servicios: solo trata el campo
linkupcode y para todo lo demás delega en parent::autocompleteAction().

Se elimina lo que en este caso no tenía efecto:
- el bucle de fieldfilter con DataBaseWhere::applyOperation(), ya que
  ningún widget linkupcode define fieldfilter. DataBaseWhere está obsoleta
  y no tiene sustituto en Where (Where::parseFieldFilter() se añadió y se
  revirtió en el core el 13/05/2026).
- la rama de source vacío, que ahora resuelve el parent.
- la rama de strict, porque ningún widget lo cambia y por defecto es true.

Probar los 9 modales de vincular documento (cliente, proveedor y asiento)
y el resto de autocompletados de la ficha del proyecto.
…ones

Atención: cambio de seguridad que requiere pruebas exhaustivas.

- Todas las acciones propias validan allowUpdate y el token del formulario;
  vincular y desvincular comprueban además el permiso de modificación sobre
  el tipo de documento (Edit<Modelo>).
- rebuild-stock no comprobaba nada: ahora exige ser administrador, permiso
  de modificación y token válido.
- Antes de ejecutar cualquier acción se comprueba que el usuario puede ver
  el proyecto, porque la denegación de acceso de loadData() llega después
  de las acciones y permitía modificar proyectos privados ajenos.
- Importar tareas exige poder ver también el proyecto de origen.
- Vincular rechaza peticiones sin documento seleccionado.
- Se usa la clave de traducción not-allowed-modify (not-allowed-to-update
  no existe) y desvincular devuelve true si falla el SQL para que la página
  cargue y muestre el error.
Atención: cambio de seguridad que requiere pruebas exhaustivas.

- move-task valida el token del formulario además de allowUpdate.
- Solo se mueven tareas de proyectos que el usuario puede ver y que son
  editables.
- Cada respuesta devuelve un token nuevo, que el JS usa en el siguiente
  movimiento, ya que el core no permite reutilizar un token.
- Abrir el tablero con ?idproyecto= de un proyecto privado ajeno ya no
  muestra sus tareas.

Probar varios movimientos seguidos sin recargar, usuario sin permiso de
modificación, proyecto no editable y proyecto privado ajeno por URL.
La pestaña de recibos se añadió en la PR #43 copiando createReceiptView()
de ComercialContactController, pero sin la carga de datos ni la acción del
botón, por lo que siempre salía vacía y "Pagado" no hacía nada.

- loadData() carga los recibos de las facturas de cliente vinculadas al
  proyecto, igual que EditCliente con sus líneas de factura.
- pay-receipt usa payReceiptAction() de ListBusinessActionTrait y exige
  permiso de modificación en el proyecto y en EditReciboCliente.

Probar con datos reales, con y sin permiso sobre recibos, y en MySQL y
PostgreSQL.
… de cliente

Las tablas de documentos de cliente terminan en 'cli', no en 'clie', por lo que la búsqueda adicional por numero2 nunca se ejecutaba. Probar los cuatro modales de vincular documento de cliente.
…desvincular

Atención: cambio de seguridad que requiere pruebas exhaustivas.

El UPDATE solo filtraba por la clave del documento, así que desde un
proyecto visible se podía quitar o mover un documento de un proyecto
privado ajeno.

- Desvincular solo afecta a documentos del proyecto actual.
- Vincular rechaza documentos de otro proyecto que el usuario no puede ver
  y, si lo puede ver, recalcula también el stock y los totales del
  proyecto de origen.
Cache::clear() borraba también la lista de tokens usados de MultiRequestProtection, por lo que un token ya gastado volvía a ser válido. No hace falta: los gestores de stock y totales guardan con save(), que ya limpia la caché del modelo.
…el acceso

El parent añade la descripción del modelo al título, por lo que la página de acceso denegado mostraba el nombre del proyecto privado.
Desvincular respondía "Registro actualizado correctamente" aunque ningún documento perteneciera al proyecto. Ahora se salta cada documento que no existe o es de otro proyecto y, si no se desvincula ninguno, se avisa con "Registro no encontrado".
…la PR #47

En la revisión de la PR #47 se pidió quitar solo apexcharts del
package.json, pero se borró el fichero entero y con él sortablejs, por lo
que el kanban daba 404 al cargar la librería y no se podía arrastrar.

Se restaura el package.json original. Requiere instalar las dependencias
del plugin (npm install o pnpm install). Probar también en táctil.
… la misma fase

El orden de las tareas dentro de una fase no se guarda, así que reordenar enviaba un move-task con la misma fase sin efecto. Ahora solo se envía cuando la tarea cambia de fase.
…ficación

Los usuarios sin permiso de modificación veían los botones aunque el servidor rechazaba la acción. Ahora solo se añaden con allowUpdate.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant