Ajout via scénario d'un 'specific_day'

Je propose une esquisse de code pour ajouter via un scénario des Jour(s) particulier(s) de ramassage.
Je lance ce scénario, par cron, une fois par jour.
Pour l’instant, je ne gère que le ramassage des encombrants, une fois par mois, le dernier jeudi du mois.
N’hésitez pas à l’améliorer et partager vos jours particuliers.

if (strtotime("last thursday of this month") < strtotime("now")) {
  $dateEncombrants = date('Y-m-d', strtotime("last thursday of next month"));
} else {
  $dateEncombrants = date('Y-m-d', strtotime("last thursday of this month"));
}
$scenario->setLog('Date encombrants : ' . $dateEncombrants);
// ----------------------------------------Ajout du ‘specific_day’----------------------------------------
$mybinLogics = eqLogic::byType('mybin');
foreach($mybinLogics as $mybinLogic) {
  if ($mybinLogic->getName() == 'Encombrants') {
    $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'] == $dateEncombrants) {
        $ajout = false;
        $scenario->setLog('Pas d\'ajout ' . $date['myday'] . ' date existante');
      }
    }
    $scenario->setLog('------------------------------------------------------------------------------------------');
    if ($ajout) {
      array_push($dates, array("myday" => $dateEncombrants));
      sort($dates);
      foreach($dates as $date) {
        $scenario->setLog($date['myday']);
      }
      $mybinLogic->setConfiguration('specific_day', $dates)->save();
    }
  }
}
6 « J'aime »
// Une semaine sur N

$dernierRamassage = '10 december 2020';
$cycleRamassage = 6; // N
$timestamp = strtotime($dernierRamassage);
do {
  $timestamp += 7 * 86400 * $cycleRamassage;
} while ($timestamp <= strtotime("now"));
$dateEncombrants = date('Y-m-d', $timestamp);
$scenario->setLog('Date encombrants : ' . $dateEncombrants);
// ----------------------------------------Ajout du ‘specific_day’----------------------------------------

Sans la boucle do while.

// Une semaine sur N

$dernierRamassage = '10 december 2020';
$cycleRamassage = 6; // N
$timestamp = strtotime($dernierRamassage) + (intdiv(strtotime("now") - strtotime($dernierRamassage), 7 * 86400 * $cycleRamassage) + 1) * 7 * 86400 * $cycleRamassage;
$dateEncombrants = date('Y-m-d', $timestamp);
$scenario->setLog('Date encombrants : ' . $dateEncombrants);
// ----------------------------------------Ajout du ‘specific_day’----------------------------------------
1 « J'aime »

Ajout dans le premier post.

Hello,

merci pour ce script.
ça met bien une date spécifique (pour moi 1er mardi de chaque mois), mais elle n’est pas indiquée dans les informations de prochaines dates de notification et de ramassage.
Est-ce normal ?
dois-je cocher autre chose (j’ai tout décoché, les mois, les semaines paires/impaires et les jours)

mulb

As-tu mis à jour ton dashboard ?

EDIT: ou sauvegarder l’équipement ?

je viens de comprendre, le 1er mardi du mois en cours, pour l’instant il est dans le passé (2 mars), mais le suivant n’est pas encore ciblé par le script… donc pas de prochaine alerte :slight_smile:

Bizarre, le script, aujourd’hui, devrait générer le 1er mardi du mois suivant.

Peux-tu partager les 6 premières lignes de ton script ?

1 « J'aime »

merci, j’ai résolu… j’ai du fait un mauvais copier/coller… j’ai adapté au premier mercredi du mois, et je crois que j’avais this month dans les 2 cas :frowning:

if (strtotime(« first wednesday of this month ») > strtotime(« now »)) {
$dateEncombrants = date(‹ Y-m-d ›, strtotime(« first wednesday of this month »));
} else {
$dateEncombrants = date(‹ Y-m-d ›, strtotime(« first wednesday of next month »));
}
$scenario->setLog('Date encombrants : ’ . $dateEncombrants);

1 « J'aime »

Merci c’est top, je cherchais comment faire, car j’ai la même date d’encombrants :slight_smile:
j’ai une question un peu idiote, mais ensuite comment tu mets dans ta date dans l’objet encombrants ?
merci

Dans cette ligne Encombrants est le nom de mon équipement.
Par contre, maintenant, le dernier jeudi du mois peut être géré directement par le cron du plugin.

1 « J'aime »

Ok merci.
C’est à dire le dernier jeudi du mois peut-être géré par le plugin ?
Plus besoin de ton scénario tu veux dire ?
Comment on gère directement dans le plugin ?

Personnellement, j’utilise mon scénario qui est plus juste, dans ce cas, que le mode expert (cron).

Pour le dernier jeudi du mois en mode expert, je ne vois pas d’autre solution que de faire 3 crons.
Toutefois, tu auras une erreur en février 2024.

0 12 25-31 1,3,5,7,8,10,12 4
0 12 24-30 4,6,9,11 4
0 12 22-29 2 4

Capture d’écran du 2021-04-21 10-42-43 Capture d’écran du 2021-04-21 10-54-11

je préfère ta solution aussi dans ce cas :slight_smile:

1 « J'aime »

j’ai modifié le script pour créer aussi un ramassage du 2ème jeudi pour les déchets verts.
je vois qu’il ajoute les dates spécifiques dans l’equipement mybin.
est-ce qu’il nettoie aussi par la suite ? ou ça va faire que s’ajouter au fur et à mesure ?
en tout cas c’est top ! merci pour ton script !

1 « J'aime »

C’est le plugin qui fait le job.

1 « J'aime »

ok :wink: merci

2 « J'aime »

J’ai un pb avec une poubelle que j’ai créé, la commande info poubelle à sortir ne renvoie aucune valeur. ni 0 ni 1
j’utilise le scenario specific day qui renvoie bien une valeur .
Est-ce qu’il faut arriver à une première notification avant d’avoir une valeur ?
je ne comprends pas pourquoi.
la config est similaire aux autres poubelles

Ta question n’a aucun rapport avec le script de ce sujet.
Dans ce cas, il vaut mieux ouvrir un autre sujet en n’oubliant pas de le taguer #plugin-mybin.

je me demandais si d’autres avait eu le pb en utilisant le specific day .
car je n’ai pas eu le pb sur mes autres poubelles.
donc potentiellement il y avait un rapport. car la seule différence que je vois est que la 1ère date générée est dans 1 mois. alors que les autres ont déjà eu des occurences passées cette semaine