diff --git a/Core/Controller/Cron.php b/Core/Controller/Cron.php
index 102e6e5d3..d889b411d 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 0e5b8fbc9..d8ff482ae 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 0d113a8e7..13360828c 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",