Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

PHP-функция для выбора оптимальной брони (заказа) работы подразделений организации распределённой на некоторой территории. Может использоваться например для бронирования времени для сети распределённых СТО или отелей и т. д.

FreeOrganization(40, 60.54, 30.40, 60.42, '2019-07-09 15:15:00', 10800);

function FreeOrganization($lat_min, $lat_max, $lon_min, $lon_max, $start_finding_tatetime, $time_len_sec)

{

$link=mysqli_connect("localhost","root","","time_location_org")

or die("Ошибка " . mysqli_error($link));

$result=mysqli_query($link, "SELECT organizations.org_id, organizations.name

FROM organizations JOIN locations ON organizations.org_id = locations.org_id 

WHERE (locations.latitude>=$lat_min)AND(locations.latitude

   (locations.longitude>=$lon_min)AND(locations.longitude

");

while ($RowORG = mysqli_fetch_assoc($result)) 

{

$id_org=$RowORG['org_id'];

$FreeTime=strtotime($start_finding_tatetime);

$FreeTime=Day_Org($link, $id_org, $FreeTime, $time_len_sec); // проверка корректности даты и интервала. Если дата не корректна выбирается другая как начало следующего дня

$result2=mysqli_query($link, "SELECT orders.date_start, orders.date_end, org_timework.day_num, org_timework.time_start, org_timework.time_end 

  FROM orders LEFT JOIN org_timework ON orders.org_id=org_timework.org_id

      WHERE (orders.org_id=$id_org)AND

(orders.date_end>='$start_finding_tatetime')AND

(orders.status=1)AND

(org_timework.day_num=WEEKDAY(orders.date_start)+1)

  ORDER BY orders.date_start

");

while ($RowOrders = mysqli_fetch_assoc($result2)) 

{

if (strtotime($RowOrders['date_start'])-$FreeTime

$FreeTime=strtotime($RowOrders['date_end']); 

$Ts=strtotime($RowOrders['time_end']);

$Date_end=mktime(date("H",$Ts), date("i",$Ts), date("s",$Ts), date("n",$FreeTime), date("j",$FreeTime), date("Y",$FreeTime)); // сборка даты и времени окончания рабочего дня

if ($Date_end-$FreeTime

}

else break; // время найдено !!! (выход из цикла перебора брони, осуществляется когда интервал укладывается в промежуток до следующей брони

} // конец перебора брони

mysqli_free_result($result2);

echo '

'.$id_org.' -- '.$RowORG['name'].' -- '.date('Y.m.d H:i:s', $FreeTime).'

';

$json_data=array($id_org, $FreeTime);

file_put_contents('Results/'.date('d-H-i-s', time()).'.json', json_encode($json_data), FILE_APPEND); 

} // конец перебора организаций

return 1;

} // конец функции

function Day_Org($link1, $id_org, $DateR, $Interval) // проверка даты и поиск следующей рабочей даты-времени для организации

{

$result3=mysqli_query($link1, "SELECT day_num, time_start, time_end  FROM org_timework WHERE org_id=$id_org ORDER BY day_num");

$TabelTime = array(0,6);

while ($row = mysqli_fetch_assoc($result3)) { 

$i=$row['day_num']; 

$TabelTime[$i] = $row;

}

$DayW=date('w', $DateR);

if (isset($TabelTime[$DayW]['day_num'])) {

$TimeStart=strtotime($TabelTime[$DayW]['time_start']);

$TimeEnd=strtotime($TabelTime[$DayW]['time_end']);

$DateTimeStart=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("n",$DateR), date("j",$DateR), date("Y",$DateR));

$DateTimeEnd=mktime(date("H",$TimeEnd), date("i", $TimeEnd), date("s",$TimeEnd), date("n",$DateR), date("j",$DateR), date("Y",$DateR));

if (($DateR>=$DateTimeStart)AND($DateR

($DateR+$Interval>=$DateTimeStart)AND($DateR+$Interval

return $DateR;

}

//echo $TabelTime[$DayW]['day_num'];

if (($DateR=$Interval))// частный случай когда введено раннее время (до начала рабочего дня)

{

$NewDay=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("m", $DateR), date("d", $DateR), date("Y", $DateR));

return $NewDay;

}

}

$NewDay=$DateR;

for ($i=0; $i

if ($DayW

$NewDay=mktime(0,0,0, date("m", $NewDay), date("d", $NewDay)+1, date("Y", $NewDay));

//echo '

'.$DayW.'

';

if (isset($TabelTime[$DayW]['day_num'])) {

$TimeStart=strtotime($TabelTime[$DayW]['time_start']);

$TimeEnd=strtotime($TabelTime[$DayW]['time_end']);

$NewDay=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("m", $NewDay), date("d", $NewDay), date("Y", $NewDay));

if ($TimeEnd-$TimeStart>=$Interval) return $NewDay;  

}

} //конец цикла

return NULL;

}

?>