Tarea #910

CORE v2023

Rediseñar el ListController. La nueva versión se colocaría en la carpeta Template, de acuerdo a la nueva estructura de carpetas del Core. La versión original permanecería en Core/Lib/ExtendedController para mantener compatibilidad durante unos meses.

Ejemplo de uso

<?php
namespace FacturaScripts\Plugins\MyNewPlugin\Controller;

class ListProject extends \FacturaScripts\Core\Template\ListController
{
    const MENU  = 'sales';
    const TITLE = 'projects';
    const ICON  = 'fas fa-folders';

    protected function init()
    {
        $this->addTabProjects();
    }

    protected function addTabProject(string $tabName = 'ListProject')
    {
        // llamamos a addListTab() en lugar de addView() para que sea igual que en los EditController
        // también nos dejamos la puerta a añadir más tipos de pestañas
        $this->addListTab($tabName, 'Project')
                    ->addOrderBy(['name'], 'name')
                    ->addSearchFields(['name']);

        // tanto la función addListTab() como las funciones AddOrderBy() y addSearchField()
        // deben devolver siempre $this->tabs[$tabName]
        // así podemos encadenarlas
    }
}

Constantes en lugar de getPageData()

El uso de contantes permite al IDE autocompletar, mientras que con la función que devuelve un array te tienes que saber los nombres de los campos. Para mayor compatibilidad, la clase Controller tendrá una función getPageData() que devolverá un array usando los valores de estas constantes.

init() en lugar de createViews()

Esta sería la primera función de nuestro código que ejecute el ListController. Aquí podemos añadir las pestañas y botones y variables que necesitemos, pero también comprobar permisos. Por ejemplo, podríamos impedir la ejecución para un usuario no administrador:

protected function init()
{
    if($this->user->admin === false) {
       throw new KernelException('AccessDenied', 'access-denied');
    }

    $this->addTabProjects();
}

El flujo de ejecución del controlador sería:

  • init()
  • execPreviousAction()
  • loadData()
  • execAfterAction()
  • html() : la función que finalmente devuelve el HTML, ya que ahora este paso lo hace el controlador.

Tabs en lugar de Views

ListView, EditView, EditListView, etc son realmente pestañas, por lo que es mejor llamarlos tabs. Además deberíamos implementar las funciones tab() y deleteTab(), para mayor comodidad:

// añadimos una pestaña de listado
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

// añadimos otra opción de ordenación a una pestaña existente
$this->tab($tabName)->addOrderBy(['creationdate'], 'date');

// desactivamos la pestaña
$this->tab($tabName)->settings('active', false);

// eliminamos la pestaña
$this->deleteTab($tabName);

setPosition(int $pos)

Necesitamos poder añadir o mover pestañas a cierta posición, por ejemplo en segunda posición o en última posición. Para ello podemos añádir la función setPosition().

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setPosition(99)
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

setTitle(string $title)

Aunque se puede asignar el título de la pestaña al hacer el addListTab(), si lo ofrecemos también en una función independiente, podemos granar expresividad.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setTitle('projects')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

setIcon(string $icon)

Aunque se puede asignar el icono de la pestaña al hacer el addListTab(), si lo ofrecemos también en una función independiente, podemos granar expresividad.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setIcon('fas fa-folders')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

addColor(string $field, string $value, string $color, string $title)

Pintamos de ese color las filas del listado cuyo campo $field tenga el valor $value, o lo que es lo mismo, añadimos el option color al row status.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addColor('name', 'test', 'danger', 'test');

addFilter(ListFilterInterface $filter)

Aunque ya tengamos las funciones para añadir filtros concretos, como selectores, filtros de fechas, etc. Si ofrecemos la función para añadir cualquier filtro, facilitamos la inclusión de nuevos filtros mediante plugins, haciendo que sean como otro cualquiera.

$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addFilter(new FilterColor('colorvalue', 'color'));

Botones

Debemos poder añadir botones a la pestaña, como ya tenemos ahora:

// añadimos el botón a la vez que la pestaña
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addButton([
                    'action' => 'test-action',
                    'icon' => 'fas fa-question',
                    'label' => 'test'
            ]);

// añadimos el botón después de añadir la pestaña
$this->tab($tabName)->addButton([
    'action' => 'test-action',
    'icon' => 'fas fa-question',
    'label' => 'test'
]);

Pero también debemos poder añadir botones a la propia página, fuera de la pestaña.

$this->addButton([
    'action' => 'test-action',
    'icon' => 'fas fa-question',
    'label' => 'test'
]);

boceto

Validación de token automática

Para prevenir ataques CSRF en cualquier controlador, la clase EditController debería lanzar una excepción cuando recibe datos por POST pero no hay un token asociado o el token no es válido. De este modo nos evitamos tener que hacer esta comprobación en cada método.

Widgets y filtros

Algunos widgets o filtros de las pestañas pueden necesitar enviar y recibir datos del controlador. Para estos casos lo correcto es estandarizar estas llamadas, por ejemplo, que envíen siempre el action=tab-actions, y desde execPreviousAction() podemos llamar al método tabAction(), que recorrería todos los widgets y todos los filtros de la pestaña seleccionada y ejecutaría su método action().

Posibles problemas de permisos

Existen varias situaciones relacionadas con permisos que hay que tener en cuenta:

  • El programador puede querer personalizar los permisos de visualización, modificación o eliminación para ese controlador, por ejemplo, puede querer que solamente los usuarios en determinada lista puedan eliminar registros, independientemente de los permisos configurados en el grupo.
  • En los widgets o filtros autocomplete, un usuario malintencionado puede modificar el html para cambiar la columna o la tabla sobre la que se hace el autcomplete y robar información de la empresa.

Sugerencia

Esto es una sugerencia a debatir. Está abierta a comentarios, votación y debate en la reunión semanal. Si se aprueba pasará a estado pendiente.

Comentarios

Solamente autorizados y patrocinadores pueden comentar.

Tarea #3155

En ocasiones tenemos documentos de compra que tienen ligeros cambios en la forma de calcular los impuestos, con variaciones de un céntimo en neto, IVA o ambos. Para estos casos la solución es modificar una de las líneas y añadirle o restarle medio céntimo hasta cuadrar...

CORE - Pendiente 21-02-2024
Tarea #3119

(BUG) al agrupar documentos, el listado de más documentos está mostrando documentos que no son compatibles: Tienen otra serie. Tienen otra divisa. Tienen otro descuento global.

CORE - Pendiente 12-02-2024
Tarea #3064

Al agrupar documentos, en las líneas tenemos que poner las cantidades. Sería muy cómodo tener un botón todo para poner automáticamente el máximo de la línea. También sería interesante añadir un checkbox para indicar si incluir la línea o no. De esta forma podemos...

CORE - Pendiente 23-01-2024
Tarea #3059

Modificar el instalador para poder leer los datos de configuración de variables de entorno. Issue relacionada https://github.com/truecharts/charts/issues/16824

CORE - Pendiente 20-01-2024
Tarea #3024

En la pestaña de stock del menú almacén, productos, faltan filtros para: reservado >= reservado <= pendiente recepción >= pendiente recepción <= disponible >= disponible <=

CORE - Pendiente 16-01-2024
Tarea #3007

(Posible bug) Se puede producir un bucle al ejecutar más de 5000 consultas SQL, ya que estas se añaden como debug al canal database y cada 5000 entradas se guarda en la base de datos, lo que hace que se vuelvan a añadir consultas SQL ...

CORE - Pendiente 12-01-2024
Tarea #3000

Necesitamos poder marcar una factura como pagada desde la API. Ahora mismo si desde la API modificamos el campo pagada a true, lo vuelve a dejar a false, ya que ese campo se actualiza al guardar, comprobando que los recibos de la factura estén pagados. Hay que añadir un...

CORE - Pendiente 11-01-2024
Tarea #2996

Añadir al ejercicio un botón para copiar las cuentas y subcuentas de otro ejercicio. Al hacer clic debe mostrar un modal para seleccionar el ejercicio del que copiar los datos.

CORE - Pendiente 10-01-2024
Tarea #2972

En el formulario de edición de facturas, en el botón impagado, cuando marcamos pagado, debería mostrar un modal donde podamos seleccionar la forma de pago y la fecha de pago (por defecto hoy). De esta forma podemos pagar con una forma de pago y fecha distinta a la actual,...

CORE - Pendiente 19-12-2023
Tarea #2970

Añadir un worker para actualizar el número de productos de las familias, cuando se crea, modifica o elimina un producto.

CORE - Pendiente 19-12-2023
Tarea #2968

Añadir un worker para actualizar el saldo, debe y haber de las cuentas, cuando se modifica una subcuenta.

CORE - Pendiente 19-12-2023
Tarea #2962

Al enviar un email con la clase NewMail no se vacían las listas de direcciones de correos, por lo que si queremos enviar el mismo correo a miles de emails, nos toca hacerlo varias veces. Si añadimos funciones para vaciar las direcciones de correo, podemos reducir código....

CORE - Pendiente 19-12-2023
Tarea #2966

Añadir un worker para actualizar el saldo de la partida, cuando se crea o modifica una partida.

CORE - Pendiente 19-12-2023
Tarea #2955

Añadir a los balances un botón imprimir para genera el PDF con la librería del core, en lugar de PlantillasPDF (si está activado). Implementación Llamar al exportManager del core en lugar del dinamic.

CORE - Pendiente 12-12-2023
Tarea #2947

Necesitamos poder filtrar los asientos que no tienen un canal, es decir, que el canal es cero. Implementación Ahora mismo hay un filtro select, quizás es mejor un filtro select where donde pongamos que "ningún canal" o "canal 0" muestre efectivamente los...

CORE - Pendiente 12-12-2023
Tarea #2940

Añadir un cron para generar cada diario y almacenarlo en MyFiles. Así ver el diario, si tenemos este archivo ya generado, podemos descargar este archivo en lugar de generarlo al momento.

CORE - Pendiente 05-12-2023
Tarea #2937

En el nuevo TabCalendar hay que poder dar de alta varias fuentes de eventos, ya sean urls o calendarios de google. Requiere Este cambio requiere los nuevos controladores UI.

CORE - Pendiente 01-12-2023
Tarea #2934

Modificar la clases de Core/Base/AjaxForms para poner la mayoría de métodos estáticos como públicos, para poder llamarlos desde fuera en los mods (para cuando solamente queremos añadir algo después, o modificar levemente el html).

CORE - Pendiente 29-11-2023
Tarea #2933

(Posible bug) Parece que se puede hacer una devolución de la misma línea varias veces, es decir, tienes una línea con cantidad 1, haces la rectificativa de eso y vuelves a hacerla igual. Te deja.

CORE - Pendiente 28-11-2023
Tarea #2932

En la página del plugin, en la pestaña de zips, añadir el campo observaciones a los zips, para poder anutar ahí algo, de cara al propio programador.

CORE - Pendiente 28-11-2023
Tarea #2896

Añadir al asistente para agrupar o partir la opción de agrupar líneas (por referencia y descripción) de forma que si tienes 50 líneas del producto 1, te genere una sola línea con la cantidad sumada de las 50.

CORE - Pendiente 13-11-2023
Tarea #2762

Añadir la opción de evitar añadir la descripción de atributos al añadir una variante a un documento. Motivación En ocasiones usamos atributos que luego no queremos que se impriman sus nombres o valores.

CORE - Pendiente 25-09-2023
Tarea #2749

Necesitamos poder añadir una imagen por familia de productos, para cuando es la misma imagen para todos los productos de la familia.

CORE - Pendiente 19-09-2023
Tarea #2576

Necesitamos guardar en cada cliente el total facturado y el total pendiente de cobro (almacenado en la propia tabla) para poder mostrarlo y filtrarlo en listados e informes. Implementación Añadir las columnas total_facturado y pte_pago a la tabla, modelo y xmlviews. Añadir...

CORE - Pendiente 20-06-2023
Tarea #2493

Añadir el régimen especial para agricultores a la lista de regímenes de IVA.

CORE - Pendiente 18-05-2023
Tarea #2392

Al añadir líneas a un asiento, se coloca automáticamente en el debe o el haber el resto correspondiente, es decir, si has añadido una línea con 50 en el debe, al añadir la segunda línea colocará 50 en el haber. Problema: si estás añadiendo varias alíneas con debe,...

CORE - Pendiente 13-04-2023
Tarea #2172

Modificar el widget Money para que, cuando el nombre del campo contine la palabra euro, mostrarlo en euros.

CORE - Pendiente 14-02-2023
Tarea #2442

En muchos listados, por ejemplo el de líneas de facturas, aparecen unos campos en el listado y en el PDF que luego no aparecen al exportar a excel, como es el caso del código de la factura. El motivo es que tanto el listado como el PDF muestran los valores a través de los...

CORE - Pendiente 26-04-2023
Tarea #2370

En ocasiones es necesario hacer facturas a cero, por distintos motivos. El problema es que estas facturas no están generando asientos y por tanto no aparecen en los informes de impuestos, ni los modelos fiscales. Hay que dar soporte a este tipo de facturas para que si...

CORE - Pendiente 05-04-2023
Tarea #878

Modificar el actualizador para que la acción de actualizar, una vez se ha descargado el zip, sea una llamada ajax, al igual que la acción de actualizar el dinamic. Motivación Hay que mejorar la tolerancia a errores del actualizador. No puede ser que cada vez que hagamos un...

CORE - Pendiente 19-04-2022
Tarea #2313

(BUG) cuando abrimos un presupuesto, pedido, albarán o factura, pulsamos cambiar el cliente y pulsamos en el botón nuevo, al guardar el cliente realmente nos ha creado un presupuesto nuevo (o lo que sea), en lugar de asignar ese nuevo cliente al documento original.

CORE - Pendiente 26-03-2023
Tarea #2273

Las miniaturas de imágenes de productos tienen mala resolución al incluirlas en los PDF (PlantillasPDF). Necesitamos aumentar la calidad de las miniaturas. Cliente interesado [email protected]

CORE - Pendiente 17-03-2023
Tarea #614

Necesitamos poder mostrar los totales en listados incluso aunque sea un JoinModel y no un modelo normal. Problema Ahora mismo el ListView solamente calcula los totales de un listado si es un modelo normal, excluyendo a los JoinModel de esta funcionalidad. El problema es que...

CORE - Pendiente 03-03-2022
Tarea #2233

Parece que hay un problema al calcular el importe del asiento de cierre del ejercicio. Issue relacionada https://facturascripts.com/issues/6286

CORE - Pendiente 07-03-2023
Tarea #2186

Necesitamos controlar cuando la devolución es por rotura y no queremos que se devuelva al stock.

CORE - Pendiente 20-02-2023
Tarea #2153

El filtro periodo solamente está preparado para campos date, no para datetime. Necesitamos una forma sencilla de indicarle que vamos a filtrar por un campo datetime. Problema Este filtro añade los filtros de fecha desde y hasta. Cuando seleccionamos hoy (10-02-2023), está...

CORE - Pendiente 10-02-2023
Tarea #1996

Modificar el informe de impuestos para incluir la columna País, para poder saber de qué país viene cada factura (para las ventas).

CORE - Pendiente 09-01-2023
Tarea #1893

Hay que definir claramente en los modelos de documentos de compras y ventas qué campos son realmente no editables, para que no se permita modificar esos, peri el resto.

CORE - Pendiente 13-12-2022
Tarea #1892

Al pasar una factura de venta a emitida, ya no se debería volver a pasar a boceto, es decir, al pasar a emitida hay que marcar internamente la factura para no dejar cambiarla, ni eliminarla después.

CORE - Pendiente 13-12-2022
Tarea #1682

Modificar el modelo Partida para poder desactivar la comprobación de si el asiento o el ejercicio está bloqueado. Necesitamos poder modificar el saldo de una partida independientemente de si el asiento está bloqueado. Nota No es toy seguro de si el modelo está comprobando...

CORE - Pendiente 11-10-2022
Tarea #1676

Crear un test unitario para el modelo Impuesto. Comprobar Se puede crear un impuesto y borrarlo. Se pueden crear dos impuestos con el mismo iva. Si se crea un impuesto de tipo porcentaje y 10 de iva, al hacer una compra con una línea con ese impuesto, cantidad 2 y precio 50,...

CORE - Pendiente 10-10-2022
Tarea #1668

Necesitamos poder ver todos los emails enviados generados por una notificación (EmailNotification). Es decir, cuando vamos al menú administrador, emails, notificaciones y hacemos clic en una, que aparezcan los emails enviados relacionados con esa notificación. Estas...

CORE - Pendiente 06-10-2022
Tarea #851

Modificar el formulario de devoluciones para poder indicar al crear si las 2 facturas (la rectificada y la nueva) se van a marcar como pagadas y con qué forma de pago. Motivación Cuando te devuelven una factura entera que no te han pagado, además de la rectificativa tienes...

CORE - Pendiente 12-04-2022
Tarea #2209

A la hora de visualizar una Factura rectificativa de una factura previa es muy facil confundirse ya que el titulo sigue llamándose Factura y debería llamarse Factura Rectificativa. Lo unico que la diferencia es que sale un boton en amarillo con dos << delante que no...

CORE - Pendiente 24-02-2023
Tarea #2789

Mostrar el título empresa/almacén en el selector de almacén de los formularios de edición de documentos de compra y de venta.

CORE - Pendiente 03-10-2023
Tarea #2724

En los asientos se está colocando un enlace para abrir el documento relacionado solamente cuando es factura, pero tenemos asientos que son de recibos, asientos que son de remesas, etc. En todos estos casos deberíamos poder ir igualmente al modelo original. Implementación...

CORE - Pendiente 28-08-2023
Tarea #2585

Necesitamos una función para asignar una fecha a la factura siempre que no haya facturas con fechas anteriores, para mantener la correlación. Motivación Al importar pedidos desde tiendas online, marketplaces, etc, nos encontramos que puede que el pedio a facturar tenga...

CORE - Pendiente 27-06-2023
Tarea #2533

(BUG) al poner una fecha de pago para la cual todavía no existe ejercicio, se genera el pago, pero no se genera el asiento porque el ejercicio no existe. La única forma de solucionar esto es por sql. Necesitamos poder hacerlo desde la interfaz. Necesitamos Poder generar el...

CORE - Pendiente 05-06-2023
Tarea #2519

Añadir al test de los documentos de compra y venta, la comprobación del idempresa de la forma de pago con el idempresa del almacen. No se puede añadir una forma de pago con un idempresa diferente al idempresa del almacen del documento. Tests Añadir el correspondiente test...

CORE - Pendiente 30-05-2023
Tarea #2501

(BUG) en los recibos de las facturas. Creas una factura con una serie X, guardas. Se crean los recibos y se rellena el campo codigofactura. Cambias la serie de la factura y guardas. No se actualiza el campo codigofactura del recibo

CORE - Pendiente 25-05-2023
Cookies
Usamos cookies en nuestro sitio web para brindarte la experiencia más relevante recordando tus preferencias y visitas repetidas. Al hacer clic en "Aceptar", aceptas el uso de TODAS las cookies necesarias.
Copyright (c) 2013-2024 FacturaScripts
0.10604s

Soporte