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 #2173

Al crear un cliente o proveedor, si existe el Plan Contable, crear subcuenta automáticamente y relacionarla. Añadir también un botón a la pestaña de subcuentas, en la página del cliente o proveedor, para poder crear la subcuenta del cliente, si no existe.

CORE - Pendiente 14-02-2023
Tarea #3448

Al cambiar el estado de un documento, cuando ese nuevo estado genera otro documento (por ejemplo al marcar un albarán como facturado), debería mostrar un modal donde poder seleccionar la fecha del nuevo documento. De esta forma al aprobar un albarán de compra podemos...

CORE - Pendiente 03-07-2024
Tarea #3445

Hay que marcar formas de pago como activas o inactivas. Ahora mismo tenemos claves ajenas hacia las formas de pago en facturas, albaranes, pedidos y presupuestos, por lo que no es posible eliminarlas. Hay que marcar las que no están activas para no mostrarla en los...

CORE - Pendiente 02-07-2024
Tarea #3447

(BUG) cuando tenemos una factura impagada y emitida, es decir, bloqueada. Si la marcamos como pagada nos aparece el modal donde seleccionar forma de pago y fecha, pero los campos aparecen bloqueados. Nunca deben estar bloqueados. Implementación Originalmente se usó...

CORE - Pendiente 03-07-2024
Tarea #3399

(BUG) al aprobar documentos de compra, no debería copiar el campo numproveedor al siguiente documento, ya que si apruebas el albarán 123, puede que la factura no sea la 123.

CORE - Pendiente 28-05-2024
Tarea #3435

Hay que mover la clase PluginDeploy fuera de Core/Base, y reemplazar las llamadas a funciones obsoletas.

CORE - Pendiente 27-06-2024
Tarea #3423

Cuando la opción google_tag_manager no está activa en el panel de control, hay que añadir un card en el Updater para preguntar al usuario si la quiere activar.

CORE - Pendiente 19-06-2024
Tarea #3425

Necesitamos poder filtrar por país, provincia y ciudad en los listados de venta (facturas, albaranes, pedidos y presupuestos). Para ello hay que añadir esos filtros: Selector de país. Autocomplete de provincia. Autocomplete de ciudad.

CORE - Pendiente 19-06-2024
Tarea #3417

Ahora mismo para cada pantalla de error fatal se genera a su vez un archivo crash_XXX en la carpeta MyFiles. Necesitamos enviar esos archivos a facturascripts.com y eliminarlos. Para ello, en el actualizador, si hay archivos de crash debe aparecer una sección nueva (un card...

CORE - Pendiente 12-06-2024
Tarea #3389

Añadir las funciones necesarias a PDFExport para poder añadir texto, etc, en lugar de llamar a $this->pdf->ezText(). Así se puede reemplazar completamente en PlantillasPDF y otros plugins ganan compatibilidad.

CORE - Pendiente 24-05-2024
Tarea #3356

En la tabla de productosprov es posible añadir varios productos con la misma referencia del proveedor al mismo proveedor, y eso no se debería de poder hacer. Se debe añadir un restricción única sobre las columnas codproveedor y refproveedor.

CORE - Pendiente 06-05-2024
Tarea #3363

Tenemos textos traducibles para facturas, albaranes, pedidos y presupuestos, pero no para el resto. El controlador SendMail debería crear textos predeterminados para cualquier modelo, así los podemos personalizar.

CORE - Pendiente 08-05-2024
Tarea #3305

Necesitamos poder tener textos distintos para cada idioma en las notificaciones de email. Para ello hay que añadir la columna lang al modelo, y modificar la función para enviar las notificaciones de forma que podamos especificar un idioma (opcional). Prioridades Si...

CORE - Pendiente 09-04-2024
Tarea #3304

En las notificaciones de email tenemos unos parámetros disponibles siempre: fecha, nombre, etc. Y luego tenemos una serie de parámetros que son exclusivos de la notificación (instance_uuid, price...). Hay que añadirle la columna (param_list) al modelo para poder apuntar la...

CORE - Pendiente 09-04-2024
Tarea #3285

Añadir la opción de generar un historial de cambios: tendremos un modelo de historial, un worker para rellenarlo, un trait para mostrar la pestaña de historial en los controladores que queramos, la pestaña de listado de ListLogMessages y el correspondiente EditController....

CORE - Pendiente 02-04-2024
Tarea #3282

(BUG) al hacer un asiento de venta (pasa lo mismo en compras), en ocasiones tenemos líneas a 0 en la cuenta 700.0. Esto es porque en la instalación hay una 700.1 y todos los productos vinculados a ella, pero cuando hacemos una compra o venta y metemos alguna líne de texto,...

CORE - Pendiente 29-03-2024
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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #3281

(BUG) al guardar filtros, cuando tenemos un filtro de periodo, se guardan las fechas, en lugar de guardar solamente el selector y calcular las fechas cada vez. Ejemplo Cuando en el listado de facturas filtramos las de 'el mes pasado' y guardamos el filtro, lo que se espera es...

CORE - Cancelado 29-03-2024
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 #2968

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

CORE - Cancelado 19-12-2023
Tarea #3459

(Bug) al crear o modificar un asiento estamos revisando si hay una regularización en esa fecha, pero no tenemos en cuenta el ejercicio o empresa, por lo que recibimos un falso positivo cuando la regularización está en otra empresa distinta.

CORE - Pendiente 17-07-2024
Tarea #3374

En TPVneo, si añades una línea en negativo y otra en positivo, con el mismo importe. (Típico caso de cambio de producto). El botón de cobrar desaparece. Si lo haces a la inversa. Es decir, primero añades el positivo y luego negativo, funciona correctamente. Sería...

CORE - Pendiente 14-05-2024
Tarea #2944

(Bug) el widget datetime en safari no rellena automáticamente la hora y minutos. Además, si el usuario cambia la fecha con el teclado, puede pulsar intro y enviar el formulario sin rellenar completamente la fecha. Posible solución Añadir una función onchange() al input...

CORE - Pendiente 11-12-2023
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 #2060

En los formularios de facturas, albaranes, etc. A la hora de añadir una línea libre, cambiarlo por un dropdown donde puedas elegir línea de texto, es decir, líneas en las que está marcado lo de "no imprimir cantidad" y "no imprimir precio".

CORE - Pendiente 17-01-2023
Tarea #2493

Añadir el régimen especial para agricultores a la lista de regímenes de IVA. Y modificar el Calculator para soportar este nuevo régimen. Test Añadir el correspondiente test unitario.

CORE - Pendiente 18-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.13017s

Soporte