trinion_mrp-1.0.x-dev/src/Controller/ProizvodstvenniyKalendarController.php
src/Controller/ProizvodstvenniyKalendarController.php
<?php
declare(strict_types=1);
namespace Drupal\trinion_mrp\Controller;
use Drupal\Core\Controller\ControllerBase;
/**
* Returns responses for Trinion MRP routes.
*/
final class ProizvodstvenniyKalendarController extends ControllerBase {
/**
* Builds the response.
*/
public function __invoke(): array {
$calendar_data = \Drupal::state()->get('trinion_mrp_proizvodstvenniy_kalendar');
$calendar_start_day = $calendar_data['start_date'] ?? date('j.m.Y');
$length_days = $calendar_data['length_days'] ?? 100;
$ne_rabochie = \Drupal::state()->get('trinion_mrp_ne_rabochie_dni');
$calendar = $this->createCalendar($calendar_start_day, $length_days, $ne_rabochie);
$build['form'] = \Drupal::formBuilder()->getForm('Drupal\trinion_mrp\Form\ProizvodstvenniyKalendarForm', $calendar);
$grouped_days = [];
foreach ($calendar as $day) {
$group_name = date('F Y', strtotime($day['date']));
if (!isset($grouped_days[$group_name])) {
for ($i = 1; $i < $day['week_day']; $i++) {
$grouped_days[$group_name][] = [];
}
}
$grouped_days[$group_name][] = $day;
}
$build['content'] = [
'#theme' => 'proizvodstvenniy_kalendar',
'#days' => $grouped_days,
];
return $build;
}
public function createCalendar($start_date, $length_days, $ne_rabochie) {
$calendar = [];
$num = $j = $i = 0;
$mon_date = $start_date;
while (date('N', strtotime($mon_date)) != 1) {
$mon_date = (date('Y-m-d', strtotime('-1 day', strtotime($mon_date))));
}
$start_time_stamp = strtotime($mon_date);
do {
$year = date('Y', strtotime($i . ' days', $start_time_stamp));
$month = date('n', strtotime($i . ' days', $start_time_stamp));
$day = date('j', strtotime($i . ' days', $start_time_stamp));
$date = date('Y-m-d', strtotime($i . ' days', $start_time_stamp));
$cal = [
'date' => $date,
'day' => $day,
'year' => $year,
'month' => $month,
'week_day' => date('N', strtotime($i . ' days', $start_time_stamp)),
'num' => '',
];
$i++;
if (isset($ne_rabochie[$year][$month][$day])) {
$calendar[] = $cal;
continue;
}
if ($date >= $start_date) {
$cal['num'] = $num;
$num++;
if ($num == 1000)
$num = 0;
$j++;
}
$calendar[] = $cal;
} while ($j < $length_days);
$first_day = TRUE;
$last_work_key = 0;
foreach ($calendar as $key => $day) {
if ($day['week_day'] == 1) {
$first_day = TRUE;
}
if ($first_day && $day['num'] != '') {
$calendar[$key]['w_start'] = TRUE;
$first_day = FALSE;
}
if ($day['num'] != '')
$last_work_key = $key;
if ($day['week_day'] == 7) {
$calendar[$last_work_key]['w_end'] = TRUE;
}
}
return $calendar;
}
}
