From c07f91baa80b67ceac4eb5a38b36d92448a76e8d Mon Sep 17 00:00:00 2001 From: Carlos Garcia Gomez Date: Fri, 19 Apr 2024 18:45:43 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20proceso=20para=20actualizar=20lo?= =?UTF-8?q?s=20contadores=20de=20archivos=20adjuntos.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Controller/Cron.php | 117 +++++++++++++++++++++++++++++++----- Core/Table/cronjobs.xml | 1 - Core/Translation/gl_ES.json | 4 +- 3 files changed, 105 insertions(+), 17 deletions(-) diff --git a/Core/Controller/Cron.php b/Core/Controller/Cron.php index 102e6e5d37..d889b411dc 100644 --- a/Core/Controller/Cron.php +++ b/Core/Controller/Cron.php @@ -20,12 +20,23 @@ namespace FacturaScripts\Core\Controller; use Exception; +use FacturaScripts\Core\Base\DataBase\DataBaseWhere; use FacturaScripts\Core\Contract\ControllerInterface; use FacturaScripts\Core\Kernel; -use FacturaScripts\Core\Model\LogMessage; use FacturaScripts\Core\Plugins; use FacturaScripts\Core\Tools; use FacturaScripts\Core\WorkQueue; +use FacturaScripts\Dinamic\Model\AlbaranCliente; +use FacturaScripts\Dinamic\Model\AlbaranProveedor; +use FacturaScripts\Dinamic\Model\AttachedFileRelation; +use FacturaScripts\Dinamic\Model\CronJob; +use FacturaScripts\Dinamic\Model\FacturaCliente; +use FacturaScripts\Dinamic\Model\FacturaProveedor; +use FacturaScripts\Dinamic\Model\LogMessage; +use FacturaScripts\Dinamic\Model\PedidoCliente; +use FacturaScripts\Dinamic\Model\PedidoProveedor; +use FacturaScripts\Dinamic\Model\PresupuestoCliente; +use FacturaScripts\Dinamic\Model\PresupuestoProveedor; use FacturaScripts\Dinamic\Model\WorkEvent; class Cron implements ControllerInterface @@ -55,17 +66,15 @@ public function run(): void |_| END; - echo PHP_EOL . PHP_EOL . Tools::lang()->trans('starting-cron'); Tools::log('cron')->notice('starting-cron'); - + echo PHP_EOL . PHP_EOL . Tools::lang()->trans('starting-cron'); ob_flush(); // ejecutamos el cron de cada plugin $this->runPlugins(); - // eliminamos los logs antiguos - $this->removeOldLogs(); - $this->removeOldWorkEvents(); + // ejecutamos los trabajos del core + $this->runCoreJobs(); // si se está ejecutando en modo cli, ejecutamos la cola de trabajos, máximo 100 trabajos $max = 100; @@ -91,6 +100,7 @@ public function run(): void ob_flush(); } + // mensaje de finalización $context = [ '%timeNeeded%' => Kernel::getExecutionTime(3), '%memoryUsed%' => $this->getMemorySize(memory_get_peak_usage()) @@ -105,6 +115,21 @@ private function getMemorySize(int $size): string return round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . $unit[$i]; } + private function job(string $name): CronJob + { + $job = new CronJob(); + $where = [ + new DataBaseWhere('jobname', $name), + new DataBaseWhere('pluginname', null, 'IS') + ]; + if (false === $job->loadFromCode('', $where)) { + // no se había ejecutado nunca, lo creamos + $job->jobname = $name; + } + + return $job; + } + protected function removeOldLogs(): void { $maxDays = Tools::settings('default', 'days_log_retention', 90); @@ -114,6 +139,7 @@ protected function removeOldLogs(): void $minDate = Tools::dateTime('-' . $maxDays . ' days'); echo PHP_EOL . PHP_EOL . Tools::lang()->trans('removing-logs-until', ['%date%' => $minDate]) . ' ... '; + ob_flush(); $query = LogMessage::table() ->whereNotEq('channel', 'audit') @@ -125,17 +151,13 @@ protected function removeOldLogs(): void } Tools::log('cron')->notice('old-logs-delete-ok'); + + // eliminamos los eventos de trabajo antiguos + $this->removeOldWorkEvents($minDate); } - protected function removeOldWorkEvents(): void + protected function removeOldWorkEvents(string $minDate): void { - $maxDays = Tools::settings('default', 'days_log_retention', 90); - if ($maxDays <= 0) { - return; - } - - $minDate = Tools::dateTime('-' . $maxDays . ' days'); - $query = WorkEvent::table() ->whereEq('done', true) ->whereLt('creation_date', $minDate); @@ -148,6 +170,21 @@ protected function removeOldWorkEvents(): void Tools::log('cron')->notice('old-work-events-delete-ok'); } + protected function runCoreJobs(): void + { + $this->job('update-attached-relations') + ->every('1 day') + ->run(function () { + $this->updateAttachedRelations(); + }); + + $this->job('remove-old-logs') + ->every('1 week') + ->run(function () { + $this->removeOldLogs(); + }); + } + protected function runPlugins(): void { foreach (Plugins::enabled() as $pluginName) { @@ -175,4 +212,56 @@ protected function runPlugins(): void } } } + + protected function updateAttachedRelations(): void + { + echo PHP_EOL . PHP_EOL . Tools::lang()->trans('updating-attached-relations') . ' ... '; + ob_flush(); + + // si no hay relaciones con archivos adjuntos, terminamos + $relationModel = new AttachedFileRelation(); + if (0 === $relationModel->count()) { + return; + } + + // elegimos un modelo al azar + $models = [ + new AlbaranCliente(), new FacturaCliente(), new PedidoCliente(), new PresupuestoCliente(), + new AlbaranProveedor(), new FacturaProveedor(), new PedidoProveedor(), new PresupuestoProveedor() + ]; + shuffle($models); + echo $models[0]->modelClassName(); + ob_flush(); + + // recorremos todos los documentos + $limit = 100; + $offset = 0; + $orderBy = ['codigo' => 'ASC']; + $documents = $models[0]->all([], $orderBy, 0, $limit); + while (!empty($documents)) { + foreach ($documents as $doc) { + $where = [new DataBaseWhere('model', $doc->modelClassName())]; + $where[] = is_numeric($doc->primaryColumnValue()) ? + new DataBaseWhere('modelid|modelcode', $doc->primaryColumnValue()) : + new DataBaseWhere('modelcode', $doc->primaryColumnValue()); + + $num = $relationModel->count($where); + if ($num == $doc->numdocs) { + continue; + } + + $doc->numdocs = $num; + if (false === $doc->save()) { + Tools::log('cron')->error('record-save-error', [ + '%model%' => $doc->modelClassName(), + '%id%' => $doc->primaryColumnValue() + ]); + break; + } + } + + $offset += $limit; + $documents = $models[0]->all([], $orderBy, $offset, $limit); + } + } } diff --git a/Core/Table/cronjobs.xml b/Core/Table/cronjobs.xml index 0e5b8fbc97..d8ff482ae7 100644 --- a/Core/Table/cronjobs.xml +++ b/Core/Table/cronjobs.xml @@ -42,7 +42,6 @@ pluginname character varying(50) - NO cronjobs_pkey diff --git a/Core/Translation/gl_ES.json b/Core/Translation/gl_ES.json index 0d113a8e71..13360828c8 100644 --- a/Core/Translation/gl_ES.json +++ b/Core/Translation/gl_ES.json @@ -205,7 +205,7 @@ "cant-load-controller": "Non se pode cargar o controlador '%controllerName%'.", "cant-modify-reference": "Non se pode editar a referencia.", "cant-remove-accounting-entry": "Non se pode eliminar o asento", - "cant-remove-invoice-refund": "No se puede eliminar una factura que ya tiene rectificativa (devolución)", + "cant-remove-invoice-refund": "Non se pode eliminar unha factura que xa ten rectificativa (devolución)", "cant-remove-receipt": "Non se pode eliminar o recibo", "cant-update-audit-log": "Non se pode modificar un rexistro de auditoría", "card": "Tarxeta", @@ -1266,7 +1266,7 @@ "reloading": "Recargando...", "remove-filter": "Eliminar filtro", "remove-from-list": "Quitar da lista", - "removing-logs-until": "Eliminando logs hasta el %date%", + "removing-logs-until": "Eliminando logs ata o %date%", "renew": "Renovar", "renumber": "Renumerar", "renumber-accounting": "Renumerar asentos",