Bonjour, il me semble que j’ai peut-être bien trouvé un bug dans la fonction calendar_event::calculOccurrence() du plugin Agenda.
Suite à la discussion Occurrence d'event dans calendar à la date de Demain pour anticiper si un event « aura lieu demain » (e.g. pour rallumer le chauffage la veille
, j’ai implémenté:
public static function isTomorrow($_id) {
$event = calendar_event::byId($_id);
$startDate = (new DateTime('tomorrow'))->format('Y-m-d H:i:s');
$endDate = (new DateTime('tomorrow +1 day - 1 second'))->format('Y-m-d H:i:s');
$results = $event->calculOccurrence($startDate, $endDate);
return count($results);
}
et je peux l’utiliser dans un bloc-code:
require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
$result= userFunction::isTomorrow(76);
Il me semble que cette fonction ne fonctionne pas correctement si on l’appelle avec un event qui inclue des dates comme l’exemple suivant:
Mon constat est que la fonction ne tient pas compte dns ce cas des paramètres startDate/endDate ; Dans l’exemple, si vous l’appellez sur la date du 21/12 elle renvoie les 8 dates comprises entre le 24 et le 31 décembre.
Je suis allé voir le code de plugin-calendar/core/class/calendar.class.php at beta · jeedom/plugin-calendar · GitHub
Je suis loin d’être un expert en php, ni sur le code de jeedom, aussi je sollicite la communauté et/ou les devs de jeedom pour valider une proposition de modif:
Il me semble que dans:
630 public function calculOccurrence($_startDate, $_endDate, $_max = 9999999999, $_recurence = 0) {
à la ligne 845, dans la boucle qui traite les includeDate il faudrait rajouter un test:
845 foreach ($includeDate as $date) {
pour ne pas ajouter quand ce n’est pas dans la plage de dates, sous cette forme par exemple
if ((strtotime($date) > strtotime($_endDate)) || (strtotime($date) < strtotime($_startDate))) {
continue;
}
foreach ($return as $value) {
if ($value['start'] == $date . ' ' . $initStartTime && $value['end'] == $date . ' ' . $initEndTime) {
continue (2);
}
}
if ($diff_day > 0) {
$return[] = array(
'start' => $date . ' ' . $initStartTime,
'end' => date('Y-m-d H:i:s', strtotime($date . ' ' . $initEndTime) + ($diff_day * 86400)),
);
} else {
$return[] = array(
'start' => $date . ' ' . $initStartTime,
'end' => $date . ' ' . $initEndTime,
);
}
}
Je veux bien des avis sur la proposition avant d’essayer de faire une PR sur le plugin.
PS: Merci à @kiboost pour sa doc Jeedom v4 Petits codes entre amis | Jeedom by KiboOst
