You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
11 KiB
308 lines
11 KiB
<?php |
|
|
|
namespace Drupal\reserve\Form; |
|
|
|
use Drupal\Core\Form\ConfigFormBase; |
|
use Drupal\Core\Form\FormStateInterface; |
|
|
|
module_load_include('inc', 'reserve', 'reserve.admin'); |
|
|
|
/** |
|
* Class ReserveCategorySettingsForm. |
|
* |
|
* @package Drupal\reserve\Form |
|
* |
|
* @ingroup reserve |
|
*/ |
|
|
|
class ReserveDefaultHoursForm extends ConfigFormBase { |
|
|
|
/** |
|
* Returns a unique string identifying the form. |
|
* |
|
* @return string |
|
* The unique string identifying the form. |
|
*/ |
|
public function getFormId() { |
|
return 'ReserveDefaultHours'; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
protected function getEditableConfigNames() { |
|
return [ |
|
'reserve.default_hours', |
|
'reserve.monthly_hours', |
|
]; |
|
} |
|
|
|
/** |
|
* Defines the settings form for reservation categories. |
|
* |
|
* @param array $form |
|
* An associative array containing the structure of the form. |
|
* @param \Drupal\Core\Form\FormStateInterface $form_state |
|
* The current state of the form. |
|
* |
|
* @return array |
|
* Form definition array. |
|
*/ |
|
public function buildForm(array $form, FormStateInterface $form_state) { |
|
$default_hours = $this->config('reserve.default_hours')->get('data'); |
|
|
|
$hours = reserve_hours(); |
|
|
|
// Select box options. |
|
$options = array(); |
|
$options['9999'] = t('Select the time'); |
|
$options['0000'] = t('Midnight - start of day'); |
|
foreach ($hours as $hour) { |
|
$time = $hour['time']; |
|
$display = t($hour['display']); |
|
if ($time != '0000') { |
|
$options[$time] = $display; |
|
} |
|
} |
|
$options['2400'] = t('Midnight - end of day'); |
|
// Get saved default hours. |
|
if (!$default_hours) { |
|
for ($x = 0; $x < 28; $x++) { |
|
$default_hours[$x] = '9999'; |
|
} |
|
} |
|
$days = array( |
|
t('Sunday'), |
|
t('Monday'), |
|
t('Tuesday'), |
|
t('Wednesday'), |
|
t('Thursday'), |
|
t('Friday'), |
|
t('Saturday'), |
|
); |
|
$form['#tree'] = TRUE; |
|
for ($day = 0; $day < 7; $day++) { |
|
$day_hours = array(); |
|
$day_hours[] = $default_hours[($day * 4)]; |
|
$day_hours[] = $default_hours[($day * 4) + 1]; |
|
$day_hours[] = $default_hours[($day * 4) + 2]; |
|
$day_hours[] = $default_hours[($day * 4) + 3]; |
|
$display_hours = reserve_hours_display($day_hours); |
|
$form['day_' . $day] = array( |
|
'#type' => 'details', |
|
'#title' => $days[$day] . ' (' . $display_hours . ')', |
|
'#open' => FALSE, |
|
'#weight' => -90 + ($day * 10), |
|
); |
|
$form['day_' . $day]['first_shift_open_' . $day] = array( |
|
'#title' => t('First shift open'), |
|
'#type' => 'select', |
|
'#options' => $options, |
|
'#default_value' => $default_hours[($day * 4)], |
|
'#weight' => -90 + ($day * 10) + 1, |
|
); |
|
$form['day_' . $day]['first_shift_close_' . $day] = array( |
|
'#title' => t('First shift close'), |
|
'#type' => 'select', |
|
'#options' => $options, |
|
'#default_value' => $default_hours[($day * 4) + 1], |
|
'#weight' => -90 + ($day * 10) + 2, |
|
); |
|
$form['day_' . $day]['second_shift_open_' . $day] = array( |
|
'#title' => t('Second shift open'), |
|
'#type' => 'select', |
|
'#options' => $options, |
|
'#default_value' => $default_hours[($day * 4) + 2], |
|
'#weight' => -90 + ($day * 10) + 3, |
|
); |
|
$form['day_' . $day]['second_shift_close_' . $day] = array( |
|
'#title' => t('Second shift close'), |
|
'#type' => 'select', |
|
'#options' => $options, |
|
'#default_value' => $default_hours[($day * 4) + 3], |
|
'#weight' => -90 + ($day * 10) + 4, |
|
); |
|
} |
|
$form['save'] = array( |
|
'#type' => 'submit', |
|
'#value' => t('Save configuration'), |
|
'#weight' => 100, |
|
'#name' => 'save', |
|
); |
|
$form['reset'] = array( |
|
'#type' => 'submit', |
|
'#value' => t('Reset to defaults'), |
|
'#weight' => 101, |
|
'#name' => 'reset', |
|
); |
|
|
|
return $form; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function validateForm(array &$form, FormStateInterface $form_state) { |
|
$values = $form_state->getValues(); |
|
$days = array( |
|
t('Sunday'), |
|
t('Monday'), |
|
t('Tuesday'), |
|
t('Wednesday'), |
|
t('Thursday'), |
|
t('Friday'), |
|
t('Saturday'), |
|
); |
|
if ($form_state->getTriggeringElement()['#name'] == 'save') { |
|
for ($day = 0; $day < 7; $day++) { |
|
$open = TRUE; |
|
$second_shift = FALSE; |
|
$first_shift_open = $values['day_' . $day]['first_shift_open_' . $day]; |
|
$first_shift_close = $values['day_' . $day]['first_shift_close_' . $day]; |
|
$second_shift_open = $values['day_' . $day]['second_shift_open_' . $day]; |
|
$second_shift_close = $values['day_' . $day]['second_shift_close_' . $day]; |
|
$int_first_shift_open = intval($values['day_' . $day]['first_shift_open_' . $day]); |
|
$int_first_shift_close = intval($values['day_' . $day]['first_shift_close_' . $day]); |
|
$int_second_shift_open = intval($values['day_' . $day]['second_shift_open_' . $day]); |
|
$int_second_shift_close = intval($values['day_' . $day]['second_shift_close_' . $day]); |
|
// Closed. |
|
if (($int_first_shift_open == 9999) && ($int_first_shift_close == 9999) && ($int_second_shift_open == 9999) && ($int_second_shift_close == 9999)) { |
|
$open = FALSE; |
|
} |
|
// First shift. |
|
if ($open) { |
|
if ($int_first_shift_open == 9999) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['first_shift_open_' . $day]; |
|
$message = t('%day - First shift open is required.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_first_shift_close == 9999) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['first_shift_close_' . $day]; |
|
$message = t('%day - First shift close is required.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_first_shift_open >= $int_first_shift_close) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['first_shift_close_' . $day]; |
|
$message = t('%day - First shift close must be later than first shift open.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
} |
|
// Second shift. |
|
if ($open) { |
|
if (($int_second_shift_open != 9999) || ($int_second_shift_close != 9999)) { |
|
$second_shift = TRUE; |
|
} |
|
} |
|
if ($second_shift) { |
|
if (($int_first_shift_open == 9999) && ($int_first_shift_close == 9999)) { |
|
$field = 'day_' . $day . '][second_shift_open_' . $day; |
|
$field = $form_state->getCompleteForm()['day_' . $day]['second_shift_open_' . $day]; |
|
$message = t('%day - Cannot have a second shift without a first shift.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_second_shift_open == 9999) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['second_shift_open_' . $day]; |
|
$message = t('%day - Second shift open is missing.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_second_shift_close == 9999) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['second_shift_close_' . $day]; |
|
$message = t('%day - Second shift close is missing.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_second_shift_open <= $int_first_shift_close) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['second_shift_open_' . $day]; |
|
$message = t('%day - Second shift open must be later than first shift close.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
elseif ($int_second_shift_open >= $int_second_shift_close) { |
|
$field = $form_state->getCompleteForm()['day_' . $day]['second_shift_close_' . $day]; |
|
$message = t('%day - Second shift close must be later than second shift opten.', array('%day' => $days[$day])); |
|
$form_state->setError($field, $message); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Form submission handler. |
|
* |
|
* @param array $form |
|
* An associative array containing the structure of the form. |
|
* @param \Drupal\Core\Form\FormStateInterface $form_state |
|
* The current state of the form. |
|
*/ |
|
public function submitForm(array &$form, FormStateInterface $form_state) { |
|
$values = $form_state->getValues(); |
|
|
|
$default_hours = array(); |
|
if ($form_state->getTriggeringElement()['#name'] == 'save') { |
|
for ($day = 0; $day < 7; $day++) { |
|
$default_hours[] = $values['day_' . $day]['first_shift_open_' . $day]; |
|
$default_hours[] = $values['day_' . $day]['first_shift_close_' . $day]; |
|
$default_hours[] = $values['day_' . $day]['second_shift_open_' . $day]; |
|
$default_hours[] = $values['day_' . $day]['second_shift_close_' . $day]; |
|
} |
|
$confirmation = t(RESERVE_SAVE_CONFIRMATION_MSG); |
|
} |
|
if ($form_state->getTriggeringElement()['#name'] == 'reset') { |
|
for ($day = 0; $day < 7; $day++) { |
|
$default_hours[] = '9999'; |
|
$default_hours[] = '9999'; |
|
$default_hours[] = '9999'; |
|
$default_hours[] = '9999'; |
|
} |
|
$confirmation = t(RESERVE_RESET_CONFIRMATION_MSG); |
|
} |
|
|
|
// Update monthly hours based on changes to defaults. |
|
$monthly_hours = \Drupal::config('reserve.monthly_hours')->get('data'); |
|
foreach ($monthly_hours as $yyyy_mm => $mo_hours) { |
|
// this shouldnt be required; but just here until i figure out where monthly hours is being corrupted |
|
if (!is_array($mo_hours)) { |
|
unset($monthly_hours[$yyyy_mm]); |
|
continue; |
|
} |
|
$month = intval(substr($yyyy_mm, 5)); |
|
$year = substr($yyyy_mm, 0, 4); |
|
// Days in the month. |
|
$days = date('t', mktime(0, 0, 0, $month, 1, (int) $year)); |
|
$updated_mo_hours = array(); |
|
for ($day = 0; $day < $days; $day++) { |
|
$default_ind = $mo_hours[($day * 5)]; |
|
if ($default_ind == 'D') { |
|
// Update monthly hours with default day of week hours. |
|
// Day of the week. |
|
$dow = date('w', mktime(0, 0, 0, $month, $day + 1, (int) $year)); |
|
$updated_mo_hours[($day * 5)] = 'D'; |
|
$updated_mo_hours[($day * 5) + 1] = $default_hours[($dow * 4)]; |
|
$updated_mo_hours[($day * 5) + 2] = $default_hours[($dow * 4) + 1]; |
|
$updated_mo_hours[($day * 5) + 3] = $default_hours[($dow * 4) + 2]; |
|
$updated_mo_hours[($day * 5) + 4] = $default_hours[($dow * 4) + 3]; |
|
} |
|
elseif ($default_ind == 'O') { |
|
// Leave monthly hours unchanged. |
|
$updated_mo_hours[($day * 5)] = 'O'; |
|
$updated_mo_hours[($day * 5) + 1] = $mo_hours[($day * 5) + 1]; |
|
$updated_mo_hours[($day * 5) + 2] = $mo_hours[($day * 5) + 2]; |
|
$updated_mo_hours[($day * 5) + 3] = $mo_hours[($day * 5) + 3]; |
|
$updated_mo_hours[($day * 5) + 4] = $mo_hours[($day * 5) + 4]; |
|
} |
|
} |
|
$monthly_hours[$yyyy_mm] = $updated_mo_hours; |
|
} |
|
|
|
$this->config('reserve.default_hours') |
|
->set('data', $default_hours) |
|
->save(); |
|
\Drupal::messenger()->addStatus ($confirmation); |
|
|
|
// save updated monthly override hours |
|
$this->config('reserve.monthly_hours') |
|
->set('data', $monthly_hours) |
|
->save(); |
|
\Drupal::messenger()->addStatus(t('Daily overrides updated with new defaults.')); |
|
} |
|
|
|
}
|
|
|