From 52f9bfc8e75db284991f2cbf2b10c4f426bccc00 Mon Sep 17 00:00:00 2001 From: Pablo Ferrandez Roca Date: Mon, 17 Aug 2026 09:18:58 +0200 Subject: [PATCH 1/2] =?UTF-8?q?se=20intent=C3=B3=20optimizar=20las=20consu?= =?UTF-8?q?ltas=20del=20informe=20de=20productos=20y=20se=20eliminaros=20l?= =?UTF-8?q?os=20filtros=20de=20agente=20de=20los=20documentos=20de=20prove?= =?UTF-8?q?edor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controller/ReportProducto.php | 16 +++++++++------- Model/Join/AlbaranClienteProducto.php | 2 +- Model/Join/AlbaranProveedorProducto.php | 2 +- Model/Join/FacturaClienteProducto.php | 2 +- Model/Join/FacturaProveedorProducto.php | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Controller/ReportProducto.php b/Controller/ReportProducto.php index a117221..b1dbe57 100644 --- a/Controller/ReportProducto.php +++ b/Controller/ReportProducto.php @@ -49,7 +49,7 @@ public function getPageData(): array /** * Filtros comunes a todos los documentos */ - private function addCommonFilters(string $viewName, string $dateField, string $warehouseField): void + private function addCommonFilters(string $viewName, string $dateField, string $warehouseField, bool $showAgent = true): void { // periodo $this->addFilterPeriod($viewName, 'fecha', 'date', $dateField); @@ -60,10 +60,12 @@ private function addCommonFilters(string $viewName, string $dateField, string $w $this->addFilterSelect($viewName, 'nick', 'user', 'nick', $users); } - // agente - $agents = Agentes::codeModel(); - if (count($agents) > 1) { - $this->addFilterSelect($viewName, 'codagente', 'agent', 'codagente', $agents); + // agente (solo aplica a documentos de venta, que son los que tienen codagente) + if ($showAgent) { + $agents = Agentes::codeModel(); + if (count($agents) > 1) { + $this->addFilterSelect($viewName, 'codagente', 'agent', 'codagente', $agents); + } } // empresa @@ -187,7 +189,7 @@ protected function createViewsSupplierDeliveryNotes(string $viewName = 'FacturaP ->addOrderBy(['stockfis'], 'stock'); // filtros - $this->addCommonFilters($viewName, 'albaranesprov.fecha', 'albaranesprov.codalmacen'); + $this->addCommonFilters($viewName, 'albaranesprov.fecha', 'albaranesprov.codalmacen', false); // proveedor $this->addFilterAutocomplete($viewName, 'codproveedor', 'supplier', 'codproveedor', 'Proveedor', 'codproveedor', 'nombre'); @@ -203,7 +205,7 @@ protected function createViewsSupplierInvoices(string $viewName = 'FacturaProvee ->addOrderBy(['cantidad'], 'quantity', 2); // filtros - $this->addCommonFilters($viewName, 'facturasprov.fecha', 'facturasprov.codalmacen'); + $this->addCommonFilters($viewName, 'facturasprov.fecha', 'facturasprov.codalmacen', false); // proveedor $this->addFilterAutocomplete($viewName, 'codproveedor', 'supplier', 'codproveedor', 'Proveedor', 'codproveedor', 'nombre'); diff --git a/Model/Join/AlbaranClienteProducto.php b/Model/Join/AlbaranClienteProducto.php index 8a49c81..6a249fd 100644 --- a/Model/Join/AlbaranClienteProducto.php +++ b/Model/Join/AlbaranClienteProducto.php @@ -33,9 +33,9 @@ class AlbaranClienteProducto extends FacturaClienteProducto protected function getSQLFrom(): string { return static::MAIN_TABLE + . ' JOIN albaranescli ON albaranescli.idalbaran = lineasalbaranescli.idalbaran' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' - . ' LEFT JOIN albaranescli ON albaranescli.idalbaran = lineasalbaranescli.idalbaran' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/AlbaranProveedorProducto.php b/Model/Join/AlbaranProveedorProducto.php index 6c6c55c..2b2a776 100644 --- a/Model/Join/AlbaranProveedorProducto.php +++ b/Model/Join/AlbaranProveedorProducto.php @@ -33,9 +33,9 @@ class AlbaranProveedorProducto extends FacturaProveedorProducto protected function getSQLFrom(): string { return static::MAIN_TABLE + . ' JOIN albaranesprov ON albaranesprov.idalbaran = lineasalbaranesprov.idalbaran' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' - . ' LEFT JOIN albaranesprov ON albaranesprov.idalbaran = lineasalbaranesprov.idalbaran' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/FacturaClienteProducto.php b/Model/Join/FacturaClienteProducto.php index 893ff02..18cb842 100644 --- a/Model/Join/FacturaClienteProducto.php +++ b/Model/Join/FacturaClienteProducto.php @@ -64,9 +64,9 @@ protected function getGroupFields(): string protected function getSQLFrom(): string { return static::MAIN_TABLE + . ' JOIN facturascli ON facturascli.idfactura = lineasfacturascli.idfactura' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' - . ' LEFT JOIN facturascli ON facturascli.idfactura = lineasfacturascli.idfactura' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/FacturaProveedorProducto.php b/Model/Join/FacturaProveedorProducto.php index 91f0385..83044e7 100644 --- a/Model/Join/FacturaProveedorProducto.php +++ b/Model/Join/FacturaProveedorProducto.php @@ -63,9 +63,9 @@ protected function getGroupFields(): string protected function getSQLFrom(): string { return static::MAIN_TABLE + . ' JOIN facturasprov ON facturasprov.idfactura = lineasfacturasprov.idfactura' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' - . ' LEFT JOIN facturasprov ON facturasprov.idfactura = lineasfacturasprov.idfactura' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } From 53ab6fd395eb10ac2a4b0ed1d53a76d8fe956b88 Mon Sep 17 00:00:00 2001 From: Pablo Ferrandez Roca Date: Tue, 18 Aug 2026 11:25:32 +0200 Subject: [PATCH 2/2] mejorada la optimizacion de las consultas a la base de datos --- Model/Join/AlbaranClienteProducto.php | 2 +- Model/Join/AlbaranProveedorProducto.php | 2 +- Model/Join/FacturaClienteProducto.php | 37 +++++++++++++++++++++++-- Model/Join/FacturaProveedorProducto.php | 37 +++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/Model/Join/AlbaranClienteProducto.php b/Model/Join/AlbaranClienteProducto.php index 6a249fd..8a49c81 100644 --- a/Model/Join/AlbaranClienteProducto.php +++ b/Model/Join/AlbaranClienteProducto.php @@ -33,9 +33,9 @@ class AlbaranClienteProducto extends FacturaClienteProducto protected function getSQLFrom(): string { return static::MAIN_TABLE - . ' JOIN albaranescli ON albaranescli.idalbaran = lineasalbaranescli.idalbaran' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' + . ' LEFT JOIN albaranescli ON albaranescli.idalbaran = lineasalbaranescli.idalbaran' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/AlbaranProveedorProducto.php b/Model/Join/AlbaranProveedorProducto.php index 2b2a776..6c6c55c 100644 --- a/Model/Join/AlbaranProveedorProducto.php +++ b/Model/Join/AlbaranProveedorProducto.php @@ -33,9 +33,9 @@ class AlbaranProveedorProducto extends FacturaProveedorProducto protected function getSQLFrom(): string { return static::MAIN_TABLE - . ' JOIN albaranesprov ON albaranesprov.idalbaran = lineasalbaranesprov.idalbaran' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' + . ' LEFT JOIN albaranesprov ON albaranesprov.idalbaran = lineasalbaranesprov.idalbaran' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/FacturaClienteProducto.php b/Model/Join/FacturaClienteProducto.php index 18cb842..d2ba4c1 100644 --- a/Model/Join/FacturaClienteProducto.php +++ b/Model/Join/FacturaClienteProducto.php @@ -20,6 +20,7 @@ namespace FacturaScripts\Plugins\Informes\Model\Join; use FacturaScripts\Core\Template\JoinModel; +use FacturaScripts\Core\Where; /** * Description of FacturaClienteProducto @@ -36,6 +37,37 @@ public function url(string $type = 'auto', string $list = 'List'): string return 'ReportProducto'; } + /** + * Carga la descripción aparte para que no entre en el GROUP BY (columna TEXT). + * + * @param Where[] $where + */ + public static function all(array $where = [], array $order = [], int $offset = 0, int $limit = 0): array + { + $result = parent::all($where, $order, $offset, $limit); + + $productIds = array_unique(array_filter( + array_map(fn($item) => $item->idproducto, $result), + fn($idproducto) => $idproducto !== null + )); + if (empty($productIds)) { + return $result; + } + + $descriptions = []; + $sql = 'SELECT idproducto, descripcion FROM productos WHERE idproducto IN (' + . implode(',', array_map('intval', $productIds)) . ')'; + foreach (self::db()->select($sql) as $row) { + $descriptions[$row['idproducto']] = $row['descripcion']; + } + + foreach ($result as $item) { + $item->descripcion = $descriptions[$item->idproducto] ?? null; + } + + return $result; + } + protected function getFields(): array { return [ @@ -46,7 +78,6 @@ protected function getFields(): array 'codfabricante' => 'productos.codfabricante', 'codfamilia' => 'productos.codfamilia', 'coste' => 'variantes.coste', - 'descripcion' => 'productos.descripcion', 'idproducto' => static::MAIN_TABLE . '.idproducto', 'precio' => 'variantes.precio', 'referencia' => static::MAIN_TABLE . '.referencia', @@ -58,15 +89,15 @@ protected function getGroupFields(): string { return static::DOC_TABLE . '.codalmacen, ' . static::MAIN_TABLE . '.idproducto, ' . static::MAIN_TABLE . '.referencia, productos.codfabricante, productos.codfamilia, variantes.coste, ' - . 'productos.descripcion, variantes.precio, stocks.cantidad'; + . 'variantes.precio, stocks.cantidad'; } protected function getSQLFrom(): string { return static::MAIN_TABLE - . ' JOIN facturascli ON facturascli.idfactura = lineasfacturascli.idfactura' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' + . ' LEFT JOIN facturascli ON facturascli.idfactura = lineasfacturascli.idfactura' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; } diff --git a/Model/Join/FacturaProveedorProducto.php b/Model/Join/FacturaProveedorProducto.php index 83044e7..a5ba3d8 100644 --- a/Model/Join/FacturaProveedorProducto.php +++ b/Model/Join/FacturaProveedorProducto.php @@ -20,6 +20,7 @@ namespace FacturaScripts\Plugins\Informes\Model\Join; use FacturaScripts\Core\Template\JoinModel; +use FacturaScripts\Core\Where; /** * Description of FacturaProveedorProducto @@ -36,6 +37,37 @@ public function url(string $type = 'auto', string $list = 'List'): string return 'ReportProducto'; } + /** + * Carga la descripción aparte para que no entre en el GROUP BY (columna TEXT). + * + * @param Where[] $where + */ + public static function all(array $where = [], array $order = [], int $offset = 0, int $limit = 0): array + { + $result = parent::all($where, $order, $offset, $limit); + + $productIds = array_unique(array_filter( + array_map(fn($item) => $item->idproducto, $result), + fn($idproducto) => $idproducto !== null + )); + if (empty($productIds)) { + return $result; + } + + $descriptions = []; + $sql = 'SELECT idproducto, descripcion FROM productos WHERE idproducto IN (' + . implode(',', array_map('intval', $productIds)) . ')'; + foreach (self::db()->select($sql) as $row) { + $descriptions[$row['idproducto']] = $row['descripcion']; + } + + foreach ($result as $item) { + $item->descripcion = $descriptions[$item->idproducto] ?? null; + } + + return $result; + } + protected function getFields(): array { return [ @@ -45,7 +77,6 @@ protected function getFields(): array 'codfabricante' => 'productos.codfabricante', 'codfamilia' => 'productos.codfamilia', 'coste' => 'variantes.coste', - 'descripcion' => 'productos.descripcion', 'idproducto' => static::MAIN_TABLE . '.idproducto', 'precio' => 'variantes.precio', 'referencia' => static::MAIN_TABLE . '.referencia', @@ -57,15 +88,15 @@ protected function getGroupFields(): string { return static::DOC_TABLE . '.codalmacen, ' . static::MAIN_TABLE . '.idproducto, ' . static::MAIN_TABLE . '.referencia, productos.codfabricante, productos.codfamilia, variantes.coste, ' - . 'productos.descripcion, variantes.precio, stocks.cantidad'; + . 'variantes.precio, stocks.cantidad'; } protected function getSQLFrom(): string { return static::MAIN_TABLE - . ' JOIN facturasprov ON facturasprov.idfactura = lineasfacturasprov.idfactura' . ' LEFT JOIN variantes ON ' . static::MAIN_TABLE . '.referencia = variantes.referencia' . ' LEFT JOIN productos ON variantes.idproducto = productos.idproducto' + . ' LEFT JOIN facturasprov ON facturasprov.idfactura = lineasfacturasprov.idfactura' . ' LEFT JOIN stocks ON stocks.referencia = ' . static::MAIN_TABLE . '.referencia' . ' AND stocks.codalmacen = ' . static::DOC_TABLE . '.codalmacen'; }