Ajout via scénario d'un 'specific_day'

Il va ajouter une Date(s) particulière(s) de ramassage.

Capture d’écran du 2021-05-15 21-45-08

ah bah du coup ca n’a pas fonctionné

Peux-tu donner les logs du scénario ?

c’est bon je n’avais pas fait executé :pensive: je suis un boulet !!!

1 « J'aime »

Un exemple hebdomadaire avec plusieurs plages dans l’année.

// Tous les mardis, deuxième quinzaine de mars
// Tous les mardis, première quinzaine de décembre

$maPoubelle = 'Poubelle Rouge'; //Nom de l'équipement My Bin
$nextTuesday = strtotime('next tuesday');
$miMarch = strtotime('15 march');
$endMarch = strtotime('31 march');
$firstDecember = strtotime('1 december');
$miDecember = strtotime('16 december');
$scenario->setLog('Prochain Mardi : ' . date('d/m/Y H:i:s', $nextTuesday));
$scenario->setLog('Mi-mars : ' . date('d/m/Y H:i:s', $miMarch));
$scenario->setLog('Fin mars : ' . date('d/m/Y H:i:s', $endMarch));
$scenario->setLog('Début décembre : ' . date('d/m/Y H:i:s', $firstDecember));
$scenario->setLog('Mi-décembre : ' . date('d/m/Y H:i:s', $miDecember));

$dateRedBin = date('Y-m-d', $nextTuesday);
if (($nextTuesday > $miMarch && $nextTuesday <= $endMarch) || ($nextTuesday >= $firstDecember && $nextTuesday < $miDecember)) {
  $mybinLogics = eqLogic::byType('mybin');
  foreach($mybinLogics as $mybinLogic) {
    if ($mybinLogic->getName() == $maPoubelle) {
      $scenario->setLog($mybinLogic->getEqType_name() . ' - ' . $mybinLogic->getHumanName() . ' - ' . $mybinLogic->getName());
      $dates = $mybinLogic->getConfiguration()['specific_day'];
      $ajout = true;
      foreach($dates as $date) {
        $scenario->setLog($date['myday']);
        if ($date['myday'] == $dateRedBin) {
          $ajout = false;
          $scenario->setLog('Pas d\'ajout ' . $date['myday'] . ' date existante');
        }
      }
      $scenario->setLog('------------------------------------------------------------------------------------------');
      if ($ajout) {
        array_push($dates, array("myday" => $dateRedBin));
        sort($dates);
        foreach($dates as $date) {
          $scenario->setLog($date['myday']);
        }
        $mybinLogic->setConfiguration('specific_day', $dates)->save();
      }
    }
  }  
} else {
  $scenario->setLog('Date hors limite : ' . $dateRedBin);
}
1 « J'aime »

Hello,

si ca peut aider, j’ai ajouté une commande Ajouter une date spéciale dans la prochaine version :slight_smile:
qui prend en param une ou N dates, format AAAA-MM-JJ séparées par une virgule

:wink:

1 « J'aime »

Super, cela permettra pour certains 'specific_day' d’éviter le bloc code.

Mention spéciale pour toi, pour la prise en compte sur d’autres sujets de vieilles demandes d’autres utilisateurs. :+1:

1 « J'aime »

tomitomas aime bien voir des « résolus » sur l’ensemble de ses plugins, et il a bien raison ! Déformation professionnel surment, il doit avoir un chef casse pied :wink:

1 « J'aime »

C est surtout + pratique pour savoir ce qui te reste a faire !!

Et ici l idee est bonne et c est quand meme + simple d avoir une commande qui fait tout, plutot qu un bloc code que les utilisateurs copieront mal, ne comprendront pas, etc…!

L objectif c est justement bien de progresser ensemble ! :wink:

C est moi le chef casse pied qui enquiquine tout le monde …!
Du coup j essaie d appliquer a moi meme ce que je demande a mes equipes ! :wink:

En 100% sans bloc code, je n’y arrive pas.

dateBin, 1 february 2023
N, 3
tag_01, strtotime(tag(dateBin))
tag_02, intdiv(strtotime("now")-strtotime(tag(dateBin)),86400*tag(N))+1
tag_03, tag(tag_02)*86400*tag(N)
tag_04, tag(tag_01)+tag(tag_03)
tag_05, "date('Y-m-d',tag(tag_04))"
specific_day, str_replace('"','',"tag(tag_05)")
[2023-02-08 19:28:44][SCENARIO] -- Start : Scenario lance manuellement.
[2023-02-08 19:28:44][SCENARIO] - Exécution du sous-élément de type [action] : action
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #dateBin# => 1 february 2023
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #N# => 3
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #tag_01# => 1675206000
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #tag_02# => 3
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #tag_03# => 777600
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #tag_04# => 1675983600
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #tag_05# => "2023-02-10"
[2023-02-08 19:28:44][SCENARIO] Mise à jour du tag #specific_day# => 2011
[2023-02-08 19:28:44][SCENARIO] Exécution de la commande  [Aucun][Poubelle Test][Ajouter une date spéciale] avec comme option(s) : {"background":"0","title":"","message":"2011"}

EDIT - Une solution serait que la commande action accepte les dates cotées.

dans mon précédent msg, je ne pensais pas forcément à supprimer tout le bloc code, mais peut etre juste le simplifier qu’il fasse un peu moins peur à des moins expérimentés :slight_smile:

// Une semaine sur N, X fois
$maPoubelleID = '1624'; // l'identifiant de l'équipement My Bin
$dernierRamassage = '2023-01-11';
$cycleRamassage = 3; // N
$nombreRamassage = 6; // X prochaines fois

// ------------------------------------

$dateEncombrants = array();
for ($i = 0; $i < $nombreRamassage; $i++) {
  $timestamp = strtotime($dernierRamassage) + (intdiv(strtotime("now") - strtotime($dernierRamassage), 7 * 86400 * $cycleRamassage ) + 1) * 7 * 86400 * $cycleRamassage  * ($i+1);
  $dateEncombrants[] =  date('Y-m-d', $timestamp);
}

$scenario->setLog('All next dates : ' . json_encode($dateEncombrants));

$cmdAdd = cmd::byEqLogicIdAndLogicalId($maPoubelleID, 'addSpecificDay');
if (!is_object($cmdAdd)) {
  $scenario->setLog('La fonctionnalité n\'existe pas');
  return;
}
$cmdAdd->execCmd(array('message' => implode(',', $dateEncombrants)));

(pas certain de la formule, que je n’ai pas épluchée en détail, puisque j’ai des dates en double, mais tu as compris l’idée :slight_smile: )

Hello @Jeandhom

est ce que tu aurais eu le temps de jeter un oeil sur cette derniere proposition ?

Je n’avais pas compris que tu voulais une relecture.

// Une semaine sur N, X fois
$maPoubelleID = '1397'; // l'identifiant de l'équipement My Bin
$dernierRamassage = '2023-03-22 noon';
$cycleRamassage = 3; // N
$nombreRamassage = 6; // X prochaines fois

// ------------------------------------

$dateEncombrants = array();
for ($i = 0; $i < $nombreRamassage; $i++) {
  $timestamp = strtotime($dernierRamassage) + (intdiv(strtotime("now") - strtotime($dernierRamassage), 7 * 86400 * $cycleRamassage ) + 1) * 7 * 86400 * $cycleRamassage  + ($i * 7 * 86400 * $cycleRamassage);
  $dateEncombrants[] =  date('Y-m-d', $timestamp);
}
$scenario->setLog('All next dates : ' . json_encode($dateEncombrants));

// ------------------------------------

$cmdAdd = cmd::byEqLogicIdAndLogicalId($maPoubelleID, 'addSpecificDay');
if (!is_object($cmdAdd)) {
  $scenario->setLog('La fonctionnalité n\'existe pas');
  return;
}
$cmdAdd->execCmd(array('message' => implode(',', $dateEncombrants)));

juste sur la ligne $timestamp qui ne me semblait pas forcément ultra bonne.
à priori mon doute était raisonnable :slight_smile:
merci


ca pourrait donc être une bonne version réduite de comment réaliser l’insertion de une semaine sur N, X fois

1 « J'aime »

Oui, il y avait juste ça

Oui, cela simplifie grandement le code.

[Mode gros sabots]
Il ne reste plus qu’à l’inclure dans le plugin. :grin:
[Fin de mode gros sabots]

en mode one shot, ca suffirait ?
genre mettre 3 input au niveau de la conf de la poubelle : dernière date / cycle / nombre + 1 bouton « générer » → ca ajoute les dates en spécifique et basta

Le plus efficace serait (à mon avis) 2 inputs, la date de référence et un nombre.
Le nombre étant un nombre de jours. Cela permet de faire un jour sur deux, sur trois, etc… et avec un multiple de sept de faire une semaine sur deux, sur trois, etc…
Le plugin calculant chaque jour la prochaine date et l’ajoute au specific_day si elle n’existe pas.

Lorsque l’on calcule une date avant le changement d’heure et que cette future date est après le changement d’heure, il peut y avoir un décalage d’un jour (suivant le sens du changement d’heure) car le timestamp de la date est à minuit. Afin d’éviter ce décalage, il vaut mieux choisir la date de référence à midi.

bon j’ai mis un peu bcp de temps désolé …
… mais ca y est : c’est dispo en beta :slight_smile:

edit : je te laisse le soin de tester et me dire si c’est OK :wink:

1 « J'aime »

Je te tiens au courant après le retour de vacances.

1 « J'aime »