[Jardin] ajout de la planification de Qrop à l’agenda

Ce logiciel open-source m’aide pour la planification de mon potager. Bien que le logiciel soit plutôt à destination des maraîchers, son usage est intéressant pour les amateurs. Certes Il est un peu rude au premier abord, mais il rend de fier service pour la planification et le rendement. Pour ceux qui veulent approfondir leur connaissance sur le logiciel, l’Atelier Paysan propose des formations. Pour les développeurs, la possibilité de participer à l’évolution du logiciel via le dépôt git.

Pour ma part, je ne suis ni maraîcher, ni développeur j’ai cependant besoin de ce logiciel pour mon potager. Bien qu’une application android soit en construction, j’ai besoin d’afficher, les événements dans mon agenda.

La méthodologie est plutôt simple, j’ai exporté la base de donnée au format csv :

J’ai sobrement nommé le fichier qrop.csv. Une fois cela fait, je fais tourner le script suivant :

<?php

# tuto : https://caillaud.fr/creer-un-fichier-icalendar-ics-en-php/

$qropDB = ouvrirTableau("qrop.csv", ";", true, false, null);

# parsage de l'export SQL
$ics ='';
foreach ($qropDB as $serie){

    # récupération des lignes
    $crop = $serie[1];
    $variety = $serie[3];
    $sowing_date = $serie[4];
    $planting_date = $serie[5];
    $beg_harvest_date = $serie[6]; 
    $end_harvest_date = $serie[7]; 
    $rows = $serie[14]; 
    $spacing_plants	= $serie[17]; 
    $plants_needed = $serie [18]; 

    print("\nSerie : $crop - $variety"); 

    # création du sommaire générique de l'évènement
    $title = $crop.' - '.$variety; 

    # description de l'évènement
    $comment =  'date de semis :'.$sowing_date.'\n'.
                'date de plantaton :'.$planting_date.'\n'.
                'récolte début :'.$beg_harvest_date.'\n'.
                'récolte fin :'.$end_harvest_date.'\n'.
                'rang :'.$rows.'\n'.
                'espacement entre les plants :'.$spacing_plants.'\n'. 
                'nombre de plants/graines :'.$plants_needed.'\n';

    # test si semis plants
    if($sowing_date != $planting_date){
        $ics .= "BEGIN:VEVENT\n";
        $ics .= "CREATED:".dateActuelle()."\n";
        $ics .= "LAST-MODIFIED:".dateActuelle()."\n";
        $ics .= "DTSTAMP:".dateActuelle()."\n";
        $ics .= "SUMMARY:".$title." - Semis des plants\n";
        $ics .= "X-WR-TIMEZONE:Europe/Paris\n";
        $ics .= "DTSTART:".dateQropToICS($sowing_date)."T080000Z\n";
        $ics .= "DTEND:".dateQropToICS($sowing_date)."T173000Z\n";
        $ics .= "DESCRIPTION:".$comment."\n";
        $ics .= "END:VEVENT\n"; 
    }

    # plantations / semis direct
    $ics .= "BEGIN:VEVENT\n";
    $ics .= "CREATED:".dateActuelle()."\n";
    $ics .= "LAST-MODIFIED:".dateActuelle()."\n";
    $ics .= "DTSTAMP:".dateActuelle()."\n";
    $ics .= "SUMMARY:".$title." - Plantation\n";
    $ics .= "X-WR-TIMEZONE:Europe/Paris\n";
    $ics .= "DTSTART:".dateQropToICS($planting_date)."T080000Z\n";
    $ics .= "DTEND:".dateQropToICS($planting_date)."T173000Z\n";
    $ics .= "DESCRIPTION:".$comment."\n";
    $ics .= "END:VEVENT\n"; 

    # recolte
    $ics .= "BEGIN:VEVENT\n";
    $ics .= "CREATED:".dateActuelle()."\n";
    $ics .= "LAST-MODIFIED:".dateActuelle()."\n";
    $ics .= "DTSTAMP:".dateActuelle()."\n";
    $ics .= "SUMMARY:".$title." - Récolte\n";
    $ics .= "X-WR-TIMEZONE:Europe/Paris\n";
    $ics .= "DTSTART:".dateQropToICS($beg_harvest_date)."T080000Z\n";
    $ics .= "DTEND:".dateQropToICS($end_harvest_date)."T173000Z\n";
    $ics .= "DESCRIPTION:".$comment."\n";
    $ics .= "END:VEVENT\n"; 

}

# sauvegarde du fichier
$ics = beginICS().$ics.endICS(); 
$fp = fopen("qrop.ics","wb"); 
fwrite($fp,$ics); 
fclose($fp);

## fonctions

function beginICS(){
    $ics = "BEGIN:VCALENDAR\n";
    $ics .= "PRODID:-//FZ\n";
    $ics .= "VERSION:2.0\n";
    $ics .= "METHOD:PUBLISH\n";
    $ics .= "CALSCALE:GREGORIAN\n";
    $ics .= "X-WR-TIMEZONE:Europe/Paris\n";
    $ics .= "X-WR-CALNAME:Plannification QROP\n";
    $ics .= "BEGIN:VTIMEZONE\n";
    $ics .= "TZID:Europe/Paris\n";
    $ics .= "LAST-MODIFIED:20210410T122212Z\n";
    $ics .= "X-LIC-LOCATION:Europe/Paris\n";
    $ics .= "BEGIN:DAYLIGHT\n";
    $ics .= "TZNAME:CEST\n";
    $ics .= "TZOFFSETFROM:+0100\n";
    $ics .= "TZOFFSETTO:+0200\n";
    $ics .= "DTSTART:19700329T020000\n";
    $ics .= "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\n";
    $ics .= "END:DAYLIGHT\n";
    $ics .= "BEGIN:STANDARD\n";
    $ics .= "TZNAME:CET\n";
    $ics .= "TZOFFSETFROM:+0200\n";
    $ics .= "TZOFFSETTO:+0100\n";
    $ics .= "DTSTART:19701025T030000\n";
    $ics .= "RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\n";
    $ics .= "END:STANDARD\n";
    $ics .= "END:VTIMEZONE\n";
    return $ics; 
}

function endICS(){
    return "END:VCALENDAR";
}

function dateQropToICS($date){
    return preg_replace("/-/", '', $date);
}

function dateActuelle(){
    $date  = getdate();
    $dateICS = $date['year'].$date['mon']. $date['mday'].'T'.$date['hours'].$date['minutes'].'00Z';
    return $dateICS;
}

function ouvrirTableau(string $path, string $separateur=";", bool $verification=true, bool $prendre_premiere_ligne=true, string $valeur_a_indexer=null){
	if (($handle = fopen($path, "r")) !== FALSE) {
		$tableau=array();
		$ligne=[];
		$premiere_ligne = 0; 
		print("\nChargement du tableau $path");
		while (($data=fgetcsv($handle, 0, $separateur)) !== FALSE) {
			if($verification == true){
				if(!isset($data[1])){
					print("\n$path Attention, le séparateur est-il correcte ?");
					die; 
				}
			}
			
			if($prendre_premiere_ligne == true and $premiere_ligne === 0){
	    		if (isset($valeur_a_indexer)) {
	    			$tableau[$data[$valeur_a_indexer]] = $data;
	    		} else {
		    		$tableau[] = $data;
		    	}
			}

	    	if($premiere_ligne !== 0){
	    		if (isset($valeur_a_indexer)) {
	    			$tableau[$data[$valeur_a_indexer]] = $data;
	    		} else {
		    		$tableau[] = $data;
		    	}
			}
			$premiere_ligne++;
	    }
	    fclose($handle);
	}else{
		print("\n$path non trouvé"); 
		die; 
	}
	print("\nChargement du tableau terminé"); 
	return $tableau; 
}

Ce qui aura pour conséquence de générer un fichier iCalendar (ics). Ce dernier peut être importé sur votre agenda (google calendar, owncloud) pour ma part sur protoncalendar ; une fois l’import fait, les évènements s’affichent dans l’agenda.