... |
... |
@@ -26,6 +26,7 @@ use Contao\FileTree;
|
26 |
26 |
use Contao\FrontendUser;
|
27 |
27 |
use Contao\Image;
|
28 |
28 |
use Contao\Input;
|
|
29 |
+use Contao\Message;
|
29 |
30 |
use Contao\SelectMenu;
|
30 |
31 |
use Contao\StringUtil;
|
31 |
32 |
use Contao\System;
|
... |
... |
@@ -103,6 +104,7 @@ class WeinanlieferungSlotAssistantController extends AbstractController
|
103 |
104 |
}
|
104 |
105 |
|
105 |
106 |
$arrData['fields'] = $this->getWidgets();
|
|
107 |
+ $arrData['messages'] = Message::generateUnwrapped() . Backend::getSystemMessages();
|
106 |
108 |
|
107 |
109 |
// Handle ajax request post actions
|
108 |
110 |
if ($_POST && Environment::get('isAjaxRequest'))
|
... |
... |
@@ -424,6 +426,8 @@ class WeinanlieferungSlotAssistantController extends AbstractController
|
424 |
426 |
$StartDate = new Date($timeframe['date_start'], Date::getNumericDatimFormat());
|
425 |
427 |
$EndDate = new Date($timeframe['date_end'], Date::getNumericDatimFormat());
|
426 |
428 |
|
|
429 |
+ $now = time();
|
|
430 |
+ $intNewSlots = 0;
|
427 |
431 |
$intStart = $StartDate->tstamp;
|
428 |
432 |
$intEnd = $EndDate->tstamp;
|
429 |
433 |
$intBuffer = intval(Input::post('buffer')) * 60;
|
... |
... |
@@ -433,7 +437,7 @@ class WeinanlieferungSlotAssistantController extends AbstractController
|
433 |
437 |
$arrEndTimes = [];
|
434 |
438 |
|
435 |
439 |
// Get existing slots in the timeframe
|
436 |
|
- $ExistingSlots = $this->db->prepare("SELECT id, date, time as 'start', time+duration as 'end', duration FROM tl_vr_wa_slot WHERE pid = ? AND (time >= ? OR time+$intDuration+$intBuffer >= ?) AND (time <= ? OR time+$intDuration+$intBuffer <= ?) ORDER BY time")
|
|
440 |
+ $ExistingSlots = $this->db->prepare("SELECT id, date, time as 'start', (time+duration*60) as 'end', duration FROM tl_vr_wa_slot WHERE pid = ? AND (time >= ? OR time+$intDuration+$intBuffer >= ?) AND (time <= ? OR time+$intDuration+$intBuffer <= ?) ORDER BY time")
|
437 |
441 |
->executeQuery([$Standort->id, $intStart, $intStart, $intEnd, $intEnd]);
|
438 |
442 |
|
439 |
443 |
if ($ExistingSlots->rowCount())
|
... |
... |
@@ -449,20 +453,70 @@ class WeinanlieferungSlotAssistantController extends AbstractController
|
449 |
453 |
}
|
450 |
454 |
}
|
451 |
455 |
|
|
456 |
+ // Create all possible timeslots for given timeframe
|
452 |
457 |
$intTime = $intStart;
|
453 |
458 |
while ($intTime < $intEnd-$intDuration)
|
454 |
459 |
{
|
455 |
|
- dump(Date::parse(Date::getNumericDatimFormat(),$intTime));
|
456 |
|
- $intTime = $intTime + $intDuration + $intBuffer;
|
|
460 |
+ $arrConflicts = [];
|
457 |
461 |
|
458 |
|
- /** Todo:
|
459 |
|
- * Check time against start and stop times and take buffer into account.
|
460 |
|
- * If theres a conflict, determine the next possible start time and check again.
|
461 |
|
- */
|
462 |
|
- }
|
|
462 |
+ foreach ($arrStartTimes as $check_start)
|
|
463 |
+ {
|
|
464 |
+ $checkslot = $arrTimes[$check_start];
|
|
465 |
+ if (
|
|
466 |
+ (
|
|
467 |
+ $intTime >= $checkslot['start']
|
|
468 |
+ && $intTime <= $checkslot['end']
|
|
469 |
+ )
|
|
470 |
+ || (
|
|
471 |
+ $intTime + $intDuration + $intBuffer > $checkslot['start']
|
|
472 |
+ && $intTime + $intDuration + $intBuffer < $checkslot['end']
|
|
473 |
+ )
|
|
474 |
+ ) {
|
|
475 |
+// dump('Konflikt Start: ' . Date::parse(Date::getNumericDatimFormat(),$checkslot['start']));
|
|
476 |
+// dump('Konflikt Ende: ' . Date::parse(Date::getNumericDatimFormat(),$checkslot['end']));
|
|
477 |
+
|
|
478 |
+ $arrConflicts[] = $checkslot['end'];
|
|
479 |
+ }
|
|
480 |
+ }
|
463 |
481 |
|
464 |
|
- //$ExistingSlots = $this->db->prepare("SELECT id, date, time, duration FROM tl_vr_wa_slot WHERE pid = ? AND (time >= ? OR time+duration*60+$intBuffer >= ?) AND (time <= ? OR time+duration*60+$intBuffer <= ?)")
|
|
482 |
+ if (\count($arrConflicts) > 0)
|
|
483 |
+ {
|
|
484 |
+ $intTime = max($arrConflicts) + $intBuffer;
|
|
485 |
+ continue;
|
|
486 |
+ }
|
465 |
487 |
|
|
488 |
+// dump(Date::parse(Date::getNumericDatimFormat(),$intTime));
|
|
489 |
+
|
|
490 |
+ $NewDateTime = new Date($intTime);
|
|
491 |
+ $NewSlot = new WeinanlieferungSlotsModel();
|
|
492 |
+ $NewSlot->setRow([
|
|
493 |
+ 'pid' => $SlotType->pid,
|
|
494 |
+ 'tstamp' => $now,
|
|
495 |
+ 'date' => $NewDateTime->dayBegin,
|
|
496 |
+ 'time' => $intTime,
|
|
497 |
+ 'duration' => $intDuration/3600,
|
|
498 |
+ 'behaelter' => $SlotType->containers,
|
|
499 |
+ 'anmerkungen' => Input::post('annotation'),
|
|
500 |
+ 'buchbar_ab' => (int) $intTime-intval(Input::post('bookableFrom'))*3600,
|
|
501 |
+ 'buchbar_bis' => (int) $intTime-intval(Input::post('bookableTill'))*3600,
|
|
502 |
+ 'published' => '1'
|
|
503 |
+ ]);
|
|
504 |
+
|
|
505 |
+ if (Input::post('enclosure'))
|
|
506 |
+ {
|
|
507 |
+ $NewSlot->addEnclosure = '1';
|
|
508 |
+ $NewSlot->enclosure = explode(',',Input::post('enclosure'));
|
|
509 |
+ }
|
|
510 |
+
|
|
511 |
+ $NewSlot->save();
|
|
512 |
+ $intNewSlots++;
|
|
513 |
+
|
|
514 |
+ $intTime = $intTime + $intDuration + $intBuffer;
|
|
515 |
+
|
|
516 |
+ }
|
466 |
517 |
}
|
|
518 |
+
|
|
519 |
+ Message::addConfirmation(sprintf('Es wurden %s neue Zeitslots angelegt.',$intNewSlots));
|
|
520 |
+// Backend::reload();
|
467 |
521 |
}
|
468 |
522 |
}
|