У меня есть приложение CakePHP, которое используется в качестве центра портала для повседневной деятельности нашей компании. Они состоят из различных систем бронирования и информации, таких как сотрудники и их отделы. Системные запуски CakePHP 2.2Разделительный диапазон дат за выходные
В настоящее время я внедряю систему, в которой лицо, проводящее тендер, может подать заявку на заключение контракта. Этот контракт имеет различные изменения, которые будут зависеть от того, как задолго до крайнего срока (тендера) проект контракта должен быть передан юридическому лицу, составить официальный контракт. Затем система «заказывает» юридическое лицо в течение нескольких дней, когда этот контракт устанавливается. В те дни никаких других заказов нельзя делать.
Система работает отлично, но она не расколола контракт на выходные. Он движется все дни до выходных. Скажем, ради аргументов, я заказываю проект контракта для завершения 18 июня. Система определяет, что общее время контракта составит 3 дня. Это означает, что контракт должен упасть за выходные, и он должен блокировать 13, 14 и 17 июня (а не 18-го, так как мне нужно иметь готовый документ к тому времени). ОДНАКО, система блокирует 12-14 июня.
Извините, что долго читал, но я бы предпочел, чтобы вы знали всю историю, а не просто кусочки. Вот мой код системы:
$tenderDocument = $this->TenderDocument->read(null,$id);
$deadline = $tenderDocument['TenderDocument']['required_date'];
$deadline = $start = date('Y-m-d',strtotime('-1 day',strtotime($deadline)));
$start = date('Y-m-d',strtotime('-' . $tenderDocument['ContractForm']['time'],strtotime($deadline)));
$dates[] = $current = $start;
while($current < $deadline){
$current = date('Y-m-d',strtotime('+1 day',strtotime($current)));
$dates[] = $current;
}
$is_available = array();
$is_available = $this->TenderDocument->find('first',
array(
'conditions' => array(
'(TenderDocument.start_date >= "' . $start . '" AND
TenderDocument.start_date < "' . $deadline . '" OR
TenderDocument.start_date <= "' . $deadline . '" AND
TenderDocument.required_date > "' . $deadline . '") AND
TenderDocument.id != ' . $id
)
)
);
$is_weekend = false;
foreach($dates as $date) {
if(date('l',strtotime($date)) == 'Sunday' || date('l',strtotime($date)) == 'Saturday') {
$is_weekend = true;
}
}
while(!empty($is_available) || $is_weekend) {
$is_weekend = false;
$dates = array();
$deadline = date('Y-m-d',strtotime('-1 day',strtotime($deadline)));
$start = date('Y-m-d',strtotime('-1 day',strtotime($start)));
$dates[] = $current = $start;
while($current < $deadline){
$current = date('Y-m-d',strtotime('+1 day',strtotime($current)));
$dates[] = $current;
}
foreach($dates as $date) {
if(date('l',strtotime($date)) == 'Sunday' || date('l',strtotime($date)) == 'Saturday') {
$is_weekend = true;
}
}
$is_available = $this->TenderDocument->find('first',
array(
'conditions' => array(
'(TenderDocument.start_date >= "' . $start . '" AND
TenderDocument.start_date < "' . $deadline . '" OR
TenderDocument.start_date <= "' . $deadline . '" AND
TenderDocument.required_date > "' . $deadline . '") AND
TenderDocument.id != ' . $id
)
)
);
}
На несвязанной ноте, есть ли способ я могу упростить/минимизировать этот код?
Вы находитесь на правильном пути, однако необходимо отметить эти даты, не отмечая выходных. Поэтому он должен в основном сделать чек, чтобы проверить, падает ли контракт на выходные, а затем отмечают (ради аргументов) пятница и понедельник на двухдневный контракт вместо пятницы и субботы. – Albert
Я не уверен, что вы подразумеваете под «знаком». Вы ищете множество дней? Из уравнения уже выходят выходные. – vascowhite
Массив дней будет работать. Я уверен, что этот кусок кода будет работать, поэтому я сделаю это. :) Спасибо – Albert