Skip to content

Commit

Permalink
Añadido proceso para actualizar los contadores de archivos adjuntos.
Browse files Browse the repository at this point in the history
  • Loading branch information
NeoRazorX committed Apr 19, 2024
1 parent 0e73f24 commit c07f91b
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 17 deletions.
117 changes: 103 additions & 14 deletions Core/Controller/Cron.php
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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())
Expand All @@ -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);
Expand All @@ -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')
Expand All @@ -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);
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
}
}
}
1 change: 0 additions & 1 deletion Core/Table/cronjobs.xml
Expand Up @@ -42,7 +42,6 @@
<column>
<name>pluginname</name>
<type>character varying(50)</type>
<null>NO</null>
</column>
<constraint>
<name>cronjobs_pkey</name>
Expand Down
4 changes: 2 additions & 2 deletions Core/Translation/gl_ES.json
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down

0 comments on commit c07f91b

Please sign in to comment.