1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Rogervila\ArrayDiffMultidimensional;
use ICal\ICal;
use App\Booking;
use App\House;
use App\HouseLinked;
class IcalController extends Controller
{
public function read() {
//Récupère toutes les maisons
$house = House::all();
foreach($house as $houses){
//récupère les agences qui gèrent les maisons concernées et disposent d'un import ICAL
$agency = HouseLinked::managedHouses($houses->id) //retrieve managed houses by agencies
->where('import','!=',null)
//->where('agency_id',9)
->get();
foreach($agency as $agencies){
$ical = new ICal($agencies->import, array(
'defaultSpan' => 2, // Default value
'defaultTimeZone' => 'UTC',
'defaultWeekStart' => 'MO', // Default value
'disableCharacterReplacement' => false, // Default value
'filterDaysAfter' => null, // Default value
'filterDaysBefore' => null, // Default value
'httpUserAgent' => null, // Default value
'skipRecurrence' => false, // Default value
));
$events = $ical->eventsFromInterval('1 year');
//events from ICAL
//place les events dans un array en vue d'une comparaison
$a = array();
foreach ($events as $key => $event) {
$dtstart = $ical->iCalDateToDateTime($event->dtstart_array[3]);
$dtend = $ical->iCalDateToDateTime($event->dtend_array[3]);
$created = $ical->iCalDateToDateTime($event->created);
$a[$created->format('Y-m-d H:i:s')] = [ //l'ID de l'array est un DateTime
'start' => $dtstart->format('Y-m-d'),
'end' => $dtend->format('Y-m-d'),
'created' => $created->format('Y-m-d H:i:s'),
];
}
ksort($a); //trie l'array par ordre décroissant
//events already present in BDD
$data = Booking::select('arrival', 'departure','created_at')
->where('house_id',$agencies->house_id)
->where('agency_id',$agencies->agency_id)
->orderBy('created_at', 'ASC')
->get()->toArray();
//place les events de la BDD dans un array en vue d'une comparaison
$b= array();
foreach($data as $key=> $v){
$created = date('Y-m-d H:i:s',strtotime($v['created_at']));
$b[$created] = [ //l'ID de l'array est un DateTime
'start' => $v['arrival'],
'end' => $v['departure'],
'created' => $created,
];
}
ksort($b); //trie l'array par ordre décroissant
//dd($a,$b);
$insert = ArrayDiffMultidimensional::compare($a, $b);
//dd($insert);
$delete = ArrayDiffMultidimensional::compare($b, $a);
//dd($a,$b,$insert,$delete);
foreach($insert as $key => $value){
Booking::updateOrCreate([
'arrival'=> $value['start'],
'departure' => $value['end'],
'house_id' => $agencies->house_id,
'agency_id' => $agencies->agency_id,
'status_id' => 2,
'event_id' => 1,
'customer_id'=> 1,
'created_at' => $value['created'],
]);
}
foreach($delete as $key => $value){
Booking::where('arrival',$value['start'])
->where('departure', $value['end'])
->where('house_id',$agencies->house_id)
->where('agency_id',$agencies->agency_id)
->delete();
}
}
}
}
} |
Partager