Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion src/CronExpression.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ class CronExpression
*/
protected string $timezone;

/**
* Le fuseau horaire global à utiliser.
*/
private string $globalTimezone;

/**
* La date/heure actuelle. Utilisée pour les tests.
*/
Expand All @@ -46,9 +51,25 @@ class CronExpression
*/
public function __construct(?string $timezone = null)
{
$this->timezone = $timezone ?? config('app.timezone');
if (null === $globalTimezone = config('tasks.timezone')) {
$globalTimezone = config('app.timezone');
}

$this->globalTimezone = $globalTimezone;

$this->setTimezone($timezone);
}

/**
* Définit le fuseau horaire global pour toutes les tâches de construction.
*/
public function setTimezone(?string $timezone = null): self
{
$this->timezone = $timezone ?? $this->globalTimezone;

return $this;
}

/**
* Vérifie si l'expression cron doit être exécutée. Permet d'utiliser un fuseau horaire personnalisé pour une tâche spécifique
*
Expand Down
174 changes: 158 additions & 16 deletions src/FrequenciesTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

namespace BlitzPHP\Tasks;

use BlitzPHP\Utilities\Date;

/**
* Fournit les méthodes permettant d'attribuer des fréquences à des tâches individuelles.
*
Expand Down Expand Up @@ -59,6 +61,14 @@ public function getExpression(): string
}

/**
* S'exécute tous les jours à l'heure indiquée
*/
public function at(string $time): self
{
return $this->daily($time);
}

/**
* S'exécute tous les jours à minuit, sauf si une chaîne d'heure est transmise (comme 04:08pm)
*/
public function daily(?string $time = null): self
Expand All @@ -75,6 +85,20 @@ public function daily(?string $time = null): self
return $this;
}

/**
* S'execute entre une temps de debut et de fin
*/
public function between(string $startTime, string $endTime): self
{
[$minStart, $hourStart] = array_map('intval', $this->parseTime($startTime));
[$minEnd, $hourEnd] = array_map('intval', $this->parseTime($endTime));

$this->betweenHours($hourStart, $hourEnd);
$this->betweenMinutes($minStart, $minEnd);

return $this;
}

/**
* S'execute à une heure précise de la journée
*/
Expand All @@ -89,14 +113,11 @@ public function time(string $time): self
}

/**
* S'exécute au début de chaque heure ou à une minute précise.
* S'exécute au début de chaque heure à une minute précise.
*/
public function hourly(?int $minute = null): self
{
$this->expression['min'] = $minute ?? '00';
$this->expression['hour'] = '*';

return $this;
return $this->everyHour(1, $minute);
}

/**
Expand All @@ -112,6 +133,57 @@ public function everyHour(int $hour = 1, $minute = null): self
return $this;
}

/**
* S'exécute toutes les 2 heures
*
* @param int|string|null $minute
*/
public function everyTwoHours($minute = null): self
{
return $this->everyHour(2, $minute);
}

/**
* S'exécute toutes les 3 heures
*
* @param int|string|null $minute
*/
public function everyThreeHours($minute = null): self
{
return $this->everyHour(3, $minute);
}

/**
* S'exécute toutes les 4 heures
*
* @param int|string|null $minute
*/
public function everyFourHours($minute = null): self
{
return $this->everyHour(4, $minute);
}

/**
* S'exécute toutes les 6 heures
*
* @param int|string|null $minute
*/
public function everySixHours($minute = null): self
{
return $this->everyHour(6, $minute);
}

/**
* S'execute toutes les heures impaires
*/
public function everyOddHour($minute = null): self
{
$this->expression['min'] = $minute ?? '0';
$this->expression['hour'] = '1-23/2';

return $this;
}

/**
* S'execute dans une plage horaire spécifique
*/
Expand Down Expand Up @@ -150,6 +222,30 @@ public function everyMinute($minute = null): self
return $this;
}

/**
* S'execute toutes les 2 minutes
*/
public function everyTwoMinutes(): self
{
return $this->everyMinute(2);
}

/**
* S'execute toutes les 3 minutes
*/
public function everyThreeMinutes()
{
return $this->everyMinute(3);
}

/**
* S'execute toutes les 4 minutes
*/
public function everyFourMinutes()
{
return $this->everyMinute(4);
}

/**
* S'execute toutes les 5 minutes
*/
Expand All @@ -158,6 +254,14 @@ public function everyFiveMinutes(): self
return $this->everyMinute(5);
}

/**
* S'execute toutes les 10 minutes
*/
public function everyTenMinutes(): self
{
return $this->everyMinute(10);
}

/**
* S'execute toutes les 15 minutes
*/
Expand Down Expand Up @@ -221,61 +325,71 @@ public function days($days): self
*/
public function sundays(?string $time = null): self
{
return $this->setDayOfWeek(0, $time);
return $this->setDayOfWeek(Scheduler::SUNDAY, $time);
}

/**
* S'execute tous les lundi à minuit, sauf si l'heure est transmise.
*/
public function mondays(?string $time = null): self
{
return $this->setDayOfWeek(1, $time);
return $this->setDayOfWeek(Scheduler::MONDAY, $time);
}

/**
* S'execute tous les mardi à minuit, sauf si l'heure est transmise.
*/
public function tuesdays(?string $time = null): self
{
return $this->setDayOfWeek(2, $time);
return $this->setDayOfWeek(Scheduler::TUESDAY, $time);
}

/**
* S'execute tous les mercredi à minuit, sauf si l'heure est transmise.
*/
public function wednesdays(?string $time = null): self
{
return $this->setDayOfWeek(3, $time);
return $this->setDayOfWeek(Scheduler::WEDNESDAY, $time);
}

/**
* S'execute tous les jeudi à minuit, sauf si l'heure est transmise.
*/
public function thursdays(?string $time = null): self
{
return $this->setDayOfWeek(4, $time);
return $this->setDayOfWeek(Scheduler::THURSDAY, $time);
}

/**
* S'execute tous les vendredi à minuit, sauf si l'heure est transmise.
*/
public function fridays(?string $time = null): self
{
return $this->setDayOfWeek(5, $time);
return $this->setDayOfWeek(Scheduler::FRIDAY, $time);
}

/**
* S'execute tous les samedi à minuit, sauf si l'heure est transmise.
*/
public function saturdays(?string $time = null): self
{
return $this->setDayOfWeek(6, $time);
return $this->setDayOfWeek(Scheduler::SATURDAY, $time);
}

/**
* Devrait être exécuté le premier jour de chaque mois.
*/
public function monthly(?string $time = null): self
{
return $this->monthlyOn(1, $time);
}

/**
* S'execute mensuellement à un jour et une heure donnés.
*
* @param int<1, 31> $dayOfMonth
*/
public function monthlyOn(int $dayOfMonth = 1, ?string $time = null): self
{
$min = $hour = 0;

Expand All @@ -285,7 +399,7 @@ public function monthly(?string $time = null): self

$this->expression['min'] = $min;
$this->expression['hour'] = $hour;
$this->expression['dayOfMonth'] = 1;
$this->expression['dayOfMonth'] = $dayOfMonth;

return $this;
}
Expand All @@ -306,6 +420,16 @@ public function daysOfMonth($days): self
return $this;
}

/**
* S'execute le dernier jours du mois
*/
public function lastDayOfMonth(?string $time = null)
{
$this->daily($time);

return $this->daysOfMonth(Date::now()->endOfMonth()->getDay());
}

/**
* Définissez le temps d'exécution sur tous les mois ou tous les x mois.
*
Expand Down Expand Up @@ -349,6 +473,14 @@ public function months(array $months = []): self
*/
public function quarterly(?string $time = null): self
{
return $this->quarterlyOn(1, $time);
}

/**
* S'execute tous les trimestres à un jour et une heure donnés.
*/
public function quarterlyOn(int $dayOfQuarter = 1, ?string $time = null)
{
$min = $hour = 0;

if (! empty($time)) {
Expand All @@ -357,7 +489,7 @@ public function quarterly(?string $time = null): self

$this->expression['min'] = $min;
$this->expression['hour'] = $hour;
$this->expression['dayOfMonth'] = 1;
$this->expression['dayOfMonth'] = $dayOfQuarter;

$this->everyMonth(3);

Expand All @@ -368,6 +500,16 @@ public function quarterly(?string $time = null): self
* Devrait s'executer le premier jour de l'annee.
*/
public function yearly(?string $time = null): self
{
return $this->yearlyOn(1, 1, $time);
}

/**
* S'execute chaque année à un mois, un jour et une heure donnés.
*
* @param int<1, 31> $dayOfMonth
*/
public function yearlyOn(int $month = 1, int $dayOfMonth = 1, ?string $time = null): self
{
$min = $hour = 0;

Expand All @@ -377,8 +519,8 @@ public function yearly(?string $time = null): self

$this->expression['min'] = $min;
$this->expression['hour'] = $hour;
$this->expression['dayOfMonth'] = 1;
$this->expression['month'] = 1;
$this->expression['dayOfMonth'] = $dayOfMonth;
$this->expression['month'] = $month;

return $this;
}
Expand Down
Loading
Loading