<?php
namespace FlexApp\Service;
use Exception;
use FlexApp\Events\Style43\GeneralErrorEvent;
use Psr\Cache\InvalidArgumentException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use WebBundle\Exception\PortalHelperException;
use WebBundle\Helper\PortalHelper;
class ConsSchedule
{
private $schedule;
/**
* @var PortalHelper
*/
private $portalHelper;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var ParametersProvider
*/
private $parametersProvider;
/**
* @var TranslatorWrapper
*/
private $translatorWrapper;
/**
* @var ChatBCachePool
*/
private $chatBCachePool;
public function __construct(
PortalHelper $portalHelper,
EventDispatcherInterface $eventDispatcher,
ParametersProvider $parametersProvider,
TranslatorWrapper $translatorWrapper,
ChatBCachePool $chatBCachePool
) {
$this->portalHelper = $portalHelper;
$this->eventDispatcher = $eventDispatcher;
$this->parametersProvider = $parametersProvider;
$this->translatorWrapper = $translatorWrapper;
$this->chatBCachePool = $chatBCachePool;
}
/**
* @return array
*
* @throws PortalHelperException
*/
private function getScheduleFromPortal()
{
//Получаем график работы всех консультантов с портала и смены одинаковых записей, но с разным временем
return $this->schedule = $this->selfUnion($this->portalHelper->getConsultantsSchedule());
}
/**
* Если один раз получили расписание именно с портала (а не из файлового кеша) - записываем в файловый кеш, чтобы в следующий раз за время жизни кеша (оптимально варьировать от 5 до 60 минут) не дергать портал. И сразу же достаем из файлового кеша.
* Если один раз получили расписание из файлового кеша - записываем расписание в свойство объекта, чтоб в следующий раз за период отработки скрипта не дергать файловый кеш. Это будет аналогом кеша в оперативной памяти на время жизни скрипта, а точнее - на время жизни php-объекта. Но в данном случае объект живет до тех пор, пока не завершится дочерний процесс чата - обычно это не больше 2 секунд. Но за одну отработку скрипта получение расписание из объекта может идти несколько раз (приветственное сообщение + для расчета признака онлайн/оффлайн в обычных сообщениях консультанта).
*
* @throws PortalHelperException
* @throws InvalidArgumentException
*/
public function getSchedule()
{
if (null === $this->schedule) {
if ($this->parametersProvider->getParameter('enable_consultants_schedule_caching')) {
$scheduleCacheItem = $this->chatBCachePool->getPool()->getItem('schedule');
//Если нет кеша с расписанием или он истёк - получаем расписание с портала и кешируем в файловой системе
if (!$scheduleCacheItem->isHit()) {
$scheduleCacheItem->set($this->getScheduleFromPortal());
$this->chatBCachePool->getPool()->save($scheduleCacheItem);
$scheduleCacheItem = $this->chatBCachePool->getPool()->getItem('schedule');
}
$this->schedule = $scheduleCacheItem->get();
} else {
$this->schedule = $this->getScheduleFromPortal();
}
}
$timezones = [];
foreach ($this->schedule['result']['consultData'] ?? [] as $data) {
$timezones[] = $data['timezone'] ?? null;
}
$timezones = array_unique($timezones);
return $this->schedule;
}
private function getFirstScheduleArrayByOnlyConsLogin(array $initialConsultData, string $consLogin): ?array
{
foreach ($initialConsultData as $val) {
if ($val['login'] === $consLogin) {
return $val;
}
}
return null;
}
/**
* @return array - возвращает массив c 3 парами ключ-значение. Ключи: work_hours_string, work_days_string, timezone_string
*
* @throws InvalidArgumentException
*/
public function getScheduleByConsLoginAndCountry(string $consLogin, string $country, string $countryByIp, string $locale): array
{
$defaultData = [ //на случай, если в портальном массиве не будет этих данных или вообще не получится получить данные с портала
'work_hours_string' => '',
'work_days_string' => '',
'timezone_string' => '',
];
$country = $this->modifyCountry($country, $countryByIp);
try {
$schedule = $this->getSchedule();
} catch (PortalHelperException $e) {
return $defaultData;
}
$consultData = $schedule['result']['consultData'] ?? [];
list($initialConsultData, $consultData, $key) = $this->modifyConsultDataArrayContent($consLogin, $country, $consultData);
if (!isset($consultData[$key])) {
//В этом случае (когда не нашли по логину+стране) надо сначала проверить есть ли расписание по логину хотя бы по какой-то стране. Если есть - то взять по первой в списке стране.
$scheduleArrayByConsLogin = $this->getFirstScheduleArrayByOnlyConsLogin($initialConsultData, $consLogin);
if (is_array($scheduleArrayByConsLogin) && count($scheduleArrayByConsLogin)) {
$consultData[$key] = $scheduleArrayByConsLogin;
} else {
return $defaultData;
}
}
$consSchedule = $consultData[$key];
if (!isset($consSchedule['localWt'])) {
$this->eventDispatcher->dispatch(new GeneralErrorEvent(new Exception("Портал не вернул параметр localWt в методе API получения графика консультантов для конс_страна: '$key'. Подставляем по умолчанию с 10 до 18")));
}
$this->modifyWorkTimeIfNeed($consLogin, $country, $initialConsultData, $consSchedule);
/*
* Вс - 0-й день, пн - 1-й, вт - 2-й, ...
*/
$workDaysNumbers = $consSchedule['dayOfWeek'];
$workDaysString = $this->getWorkDaysStringByWorkDaysArray($workDaysNumbers, $locale);
/*
* wt: время по портальному серверу (на нем используется часовой пояс МСК)
* timezone: часовой пояс по стране клиента
* localWt: время по стране клиента
* wtTimezone: часовой пояс по серверу (на нем используется часовой пояс МСК)
*/
//Отображаем в приветственном сообщении время и часовой пояс по стране клиента.
return [
'work_hours_string' => $consSchedule['localWt'] ?? 'work_hours_not_defined',
'work_days_string' => $workDaysString,
'timezone_string' => $consSchedule['timezone'] ?? 'timezone_not_defined',
];
}
private function getWorkDaysStringByWorkDaysArray(array $workDaysArray, string $locale): string
{
$workDaysArrayStrings = [];
foreach ($workDaysArray as $workDayNumber) {
$workDaysArrayStrings[] = $this->translatorWrapper->translate("weekday.$workDayNumber.short", $locale);
}
return implode(', ', $workDaysArrayStrings);
}
protected function modifyConsultDataArrayContent(string $consLogin, string $country, ?array $consultData): array
{
$initialConsultData = $consultData;
foreach ($consultData as &$val) {
if (is_array($val['country'])) {
$subArr = $val['country'];
$val['country'] = $subArr[0] ?? 'en';
}
if ('en2' === $val['country']) {
$val['country'] = 'en';
}
$consultData[($val['login'] ?? 'no_login') . '_' . $val['country'] ?? 'no_country'] = $val;
}
$key = $consLogin . '_' . $country;
return [$initialConsultData, $consultData, $key];
}
protected function modifyCountry(string $country, string $countryByIp): string
{
if ('en' === $country) {
$country = $countryByIp;
if ('en' === $country) {
$country = 'gb';
}
}
return $country;
}
/**
* Объединяет графики работы консов по одинаковой стране, если их график работы пн - пт, а также время конца одного совпадает со временем начала другого.
*
* @param $consSchedule
*/
private function modifyWorkTimeIfNeed(string $consLogin, string $country, array $initialConsultData, &$consSchedule)
{
//Если график конса не пн-пт - ничего не меняем
if (!$this->consWorkFromMondayTillFriday($consSchedule)) {
return;
}
$consultantsWithTheSameCountryAndMondayTillFridayWorkingDays = [$consSchedule];
foreach ($initialConsultData as $element) {
if ($element['login'] !== $consLogin && $element['country'] === $country && $this->consWorkFromMondayTillFriday($element)) {
$consultantsWithTheSameCountryAndMondayTillFridayWorkingDays[] = $element;
}
}
$earliestCons = $this->getEarliest($consultantsWithTheSameCountryAndMondayTillFridayWorkingDays);
foreach ($consultantsWithTheSameCountryAndMondayTillFridayWorkingDays as $element) {
if ($element === $earliestCons) {
continue;
}
if (substr($earliestCons['localWt'], 6, 5) === substr($element['localWt'], 0, 5)) {
$consSchedule['localWt'] = substr($earliestCons['localWt'], 0, 5) . '-' . substr($element['localWt'], 6, 5);
$consSchedule['wt'] = substr($earliestCons['wt'], 0, 5) . '-' . substr($element['wt'], 6, 5);
return;
}
}
}
private function consWorkFromMondayTillFriday(array $consSchedule): bool
{
return empty(array_diff($consSchedule['dayOfWeek'], [1, 2, 3, 4, 5])) && empty(array_diff([1, 2, 3, 4, 5], $consSchedule['dayOfWeek']));
}
private function getEarliest($consultantsWithTheSameCountryAndMondayTillFridayWorkingDays)
{
$minElement = $consultantsWithTheSameCountryAndMondayTillFridayWorkingDays[0];
$min = ['localWt'] ?? '02:00'; //если портал не прислал (что неправильно) - ставим дефолтное значение
foreach ($consultantsWithTheSameCountryAndMondayTillFridayWorkingDays as $element) {
if ($element['localWt'] < $min) {
$minElement = $element;
$min = $element['localWt'];
}
}
return $minElement;
}
private function selfUnion(array $consultantsSchedule): array
{
if (false) {
$consultantsSchedule = $this->getStubArray();
}
$resultArray = [];
foreach ($consultantsSchedule['result']['consultData'] ?? [] as $sourceRecord) {
if ($resultArrayRecordWithTheSameLoginAndCountry = $this->getRecordFromResultArrayWithTheSameLoginAndCountry($resultArray,
$sourceRecord)) {
$this->mergeSourceRecordToResultArray($resultArray, $resultArrayRecordWithTheSameLoginAndCountry, $sourceRecord);
} else {
$resultArray[] = $sourceRecord;
}
}
$consultantsSchedule['result']['consultData'] = $resultArray;
return $consultantsSchedule;
}
private function getRecordFromResultArrayWithTheSameLoginAndCountry(array $resultArray, array $sourceRecord): ?array
{
foreach ($resultArray as $resultArrayRecord) {
if ($resultArrayRecord['login'] === $sourceRecord['login'] && $resultArrayRecord['country'] === $sourceRecord['country']) {
return $resultArrayRecord;
}
}
return null;
}
private function mergeSourceRecordToResultArray(array &$resultArray, array $oldRecord, array $newRecord)
{
$key = array_search($oldRecord, $resultArray);
$resultArray[$key] = $this->mergeTwoConsRecords($oldRecord, $newRecord);
}
private function getStubArray(): array
{
return [
'success' => true,
'result' => [
'consultData' => [
0 => [
'wt' => '09:00-14:30',
'login' => 'dfilinkova',
'country' => 'de',
'timezone' => 'Europe/Berlin',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '08:00-13:30',
'wtTimezone' => 'Europe/Moscow',
],
1 => [
'wt' => '09:00-14:30',
'login' => 'dfilinkova',
'country' => 'at',
'timezone' => 'Europe/Vienna',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '08:00-13:30',
'wtTimezone' => 'Europe/Moscow',
],
2 => [
'wt' => '14:30-20:00',
'login' => 'akroyshner',
'country' => 'de',
'timezone' => 'Europe/Berlin',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '13:30-19:00',
'wtTimezone' => 'Europe/Moscow',
],
3 => [
'wt' => '14:30-20:00',
'login' => 'akroyshner',
'country' => 'at',
'timezone' => 'Europe/Vienna',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '13:30-19:00',
'wtTimezone' => 'Europe/Moscow',
],
4 => [
'wt' => '16:00-01:00',
'login' => 'iyarosh',
'country' => 'us',
'timezone' => 'America/New_York',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
5 => [
'wt' => '16:00-01:00',
'login' => 'iyarosh',
'country' => 'ca',
'timezone' => 'America/Toronto',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
6 => [
'wt' => '11:00-19:00',
'login' => 'akuznetsova',
'country' => 'es',
'timezone' => 'Europe/Madrid',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
7 => [
'wt' => '14:30-19:00',
'login' => 'mshevchuk4618',
'country' => 'fr',
'timezone' => 'Europe/Paris',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '13:30-18:00',
'wtTimezone' => 'Europe/Moscow',
],
8 => [
'wt' => '09:00-18:00',
'login' => 'ylipezin',
'country' => 'nl',
'timezone' => 'Europe/Amsterdam',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '08:00-17:00',
'wtTimezone' => 'Europe/Moscow',
],
9 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'en',
'timezone' => 'Europe/Tallinn',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
10 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'en2',
'timezone' => 'Europe/Tallinn',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
11 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'dk',
'timezone' => 'Europe/Copenhagen',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
12 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'lv',
'timezone' => 'Europe/Riga',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
13 => [
'wt' => '09:00-18:00',
'login' => 'akadurkina17519',
'country' => 'lt',
'timezone' => 'Europe/Vilnius',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
14 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'se',
'timezone' => 'Europe/Stockholm',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
15 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'ee',
'timezone' => 'Europe/Tallinn',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
16 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'bg',
'timezone' => 'Europe/Sofia',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
17 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'hu',
'timezone' => 'Europe/Budapest',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
18 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'gr',
'timezone' => 'Europe/Athens',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
19 => [
'wt' => '14:30-19:00',
'login' => 'mshevchuk4618',
'country' => 'lu',
'timezone' => 'Europe/Luxembourg',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '13:30-18:00',
'wtTimezone' => 'Europe/Moscow',
],
20 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'mt',
'timezone' => 'Europe/Malta',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
21 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'cy',
'timezone' => 'Asia/Nicosia',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
22 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'no',
'timezone' => 'Europe/Oslo',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
23 => [
'wt' => '13:00-22:00',
'login' => 'akadurkina17519',
'country' => 'pt',
'timezone' => 'Europe/Lisbon',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '11:00-20:00',
'wtTimezone' => 'Europe/Moscow',
],
24 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'ro',
'timezone' => 'Europe/Bucharest',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
25 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'sk',
'timezone' => 'Europe/Bratislava',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
26 => [
'wt' => '11:00-20:00',
'login' => 'akadurkina17519',
'country' => 'si',
'timezone' => 'Europe/Ljubljana',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
27 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'cz',
'timezone' => 'Europe/Prague',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
28 => [
'wt' => '09:00-18:00',
'login' => 'ylipezin',
'country' => 'be',
'timezone' => 'Europe/Brussels',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '08:00-17:00',
'wtTimezone' => 'Europe/Moscow',
],
29 => [
'wt' => '11:00-20:00',
'login' => 'tkonyukhova',
'country' => 'ie',
'timezone' => 'Europe/Dublin',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
30 => [
'wt' => '11:00-20:00',
'login' => 'tkonyukhova',
'country' => 'gb',
'timezone' => 'Europe/London',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
31 => [
'wt' => '09:00-14:30',
'login' => 'dfilinkova',
'country' => 'ch',
'timezone' => 'Europe/Zurich',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '08:00-13:30',
'wtTimezone' => 'Europe/Moscow',
],
32 => [
'wt' => '14:30-20:00',
'login' => 'akroyshner',
'country' => 'ch',
'timezone' => 'Europe/Zurich',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '13:30-19:00',
'wtTimezone' => 'Europe/Moscow',
],
33 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'fi',
'timezone' => 'Europe/Helsinki',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '10:00-19:00',
'wtTimezone' => 'Europe/Moscow',
],
34 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'pl',
'timezone' => 'Europe/Warsaw',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
35 => [
'wt' => '07:00-21:00',
'login' => 'vpenkov6618',
'country' => 'ru',
'timezone' => 'Europe/Moscow',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '07:00-21:00',
'wtTimezone' => 'Europe/Moscow',
],
36 => [
'wt' => '07:00-00:00',
'login' => 'atarasov',
'country' => 'ru',
'timezone' => 'Europe/Moscow',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 0,
1 => 6,
],
'localWt' => '07:00-00:00',
'wtTimezone' => 'Europe/Moscow',
],
37 => [
'wt' => '10:00-14:30',
'login' => 'mshevchuk4618',
'country' => 'fr',
'timezone' => 'Europe/Paris',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-13:30',
'wtTimezone' => 'Europe/Moscow',
],
38 => [
'wt' => '10:00-14:30',
'login' => 'mshevchuk4618',
'country' => 'lu',
'timezone' => 'Europe/Luxembourg',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-13:30',
'wtTimezone' => 'Europe/Moscow',
],
39 => [
'wt' => '10:00-19:00',
'login' => 'akadurkina17519',
'country' => 'hr',
'timezone' => 'Europe/Zagreb',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
40 => [
'wt' => '10:00-19:00',
'login' => 'nostanina25719',
'country' => 'it',
'timezone' => 'Europe/Rome',
'onFreeTime' => false,
'dayOfWeek' => [
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
],
'localWt' => '09:00-18:00',
'wtTimezone' => 'Europe/Moscow',
],
],
],
];
}
private function mergeTwoConsRecords(array $record1, array $record2): array
{
$localWtBeginOfRecord1 = substr($record1['localWt'], 0, 5);
$localWtEndOfRecord1 = substr($record1['localWt'], 6, 5);
$localWtBeginOfRecord2 = substr($record2['localWt'], 0, 5);
$localWtEndOfRecord2 = substr($record2['localWt'], 6, 5);
if ($localWtBeginOfRecord1 < $localWtBeginOfRecord2) {
if ($localWtEndOfRecord1 === $localWtBeginOfRecord2) {
$record1['localWt'] = $localWtBeginOfRecord1 . '-' . $localWtEndOfRecord2;
$record1['wt'] = substr($record1['wt'], 0, 5) . '-' . substr($record2['wt'], 6, 5);
}
return $record1;
}
if ($localWtEndOfRecord2 === $localWtBeginOfRecord1) {
$record2['localWt'] = $localWtBeginOfRecord2 . '-' . $localWtEndOfRecord1;
$record2['wt'] = substr($record2['wt'], 0, 5) . '-' . substr($record1['wt'], 6, 5);
}
return $record2;
}
}