<?php declare(strict_types=1); /* * This file is part of contao-weinanlieferung-bundle. * * (c) vonRotenberg * * @license commercial */ namespace vonRotenberg\WeinanlieferungBundle\Model; use Contao\Controller; use Contao\Database; use Contao\Date; use Contao\FrontendUser; use Contao\Model; use Contao\Model\Registry; use Contao\StringUtil; use Doctrine\DBAL\Connection; class WeinanlieferungSlotsModel extends Model { /** * Table name * @var string */ protected static $strTable = 'tl_vr_wa_slot'; /** * Get allowed standort IDs for the current frontend user * @return array */ protected static function getAllowedStandortIds(): array { // If no frontend user is logged in, return empty array if (!FrontendUser::getInstance()->id) { return []; } // Get member groups $memberGroups = StringUtil::deserialize(FrontendUser::getInstance()->groups, true); if (empty($memberGroups)) { return []; } // Get allowed standorts from member groups $db = Database::getInstance(); $allowedStandorts = []; foreach ($memberGroups as $groupId) { $group = $db->prepare("SELECT standorts FROM tl_member_group WHERE id=?") ->execute($groupId); if ($group->standorts) { $groupStandorts = StringUtil::deserialize($group->standorts, true); $allowedStandorts = array_merge($allowedStandorts, $groupStandorts); } } return array_unique($allowedStandorts); } public static function findPublishedById($intId, array $arrOptions=array()) { $time = time(); $t = static::$strTable; $arrColumns = array("$t.id=?"); // Skip unsaved elements (see #2708) $arrColumns[] = "$t.tstamp!=0"; $arrColumns[] = "$t.published='1'"; $arrColumns[] = "($t.buchbar_ab<=$time OR $t.buchbar_ab = 0 OR $t.buchbar_ab IS NULL) AND $t.buchbar_bis>$time"; // Check standort permissions $allowedStandortIds = static::getAllowedStandortIds(); if (!empty($allowedStandortIds)) { $arrColumns[] = "$t.pid IN (" . implode(',', $allowedStandortIds) . ")"; } if (!isset($arrOptions['order'])) { $arrOptions['order'] = "$t.time ASC"; } return static::findOneBy($arrColumns, $intId, $arrOptions); } public static function findPublishedByPid($intPid, array $arrOptions=array()) { $time = time(); $t = static::$strTable; $arrColumns = array("$t.pid=?"); // Skip unsaved elements (see #2708) $arrColumns[] = "$t.tstamp!=0"; $arrColumns[] = "$t.published='1'"; $arrColumns[] = "($t.buchbar_ab<=$time OR $t.buchbar_ab = 0 OR $t.buchbar_ab IS NULL) AND $t.buchbar_bis>$time"; // Check standort permissions $allowedStandortIds = static::getAllowedStandortIds(); if (!empty($allowedStandortIds) && !in_array($intPid, $allowedStandortIds)) { return null; // Return null if the requested standort is not allowed } if (!isset($arrOptions['order'])) { $arrOptions['order'] = "$t.time ASC"; } return static::findBy($arrColumns, $intPid, $arrOptions); } public static function findMultiplePublishedByPids(array $arrPids, array $arrOptions=array()) { if (empty($arrPids) || !\is_array($arrPids)) { return null; } $arrPids = array_filter($arrPids, function($var) { return is_numeric($var); }); if (empty($arrPids)) { return null; } // Check standort permissions $allowedStandortIds = static::getAllowedStandortIds(); if (!empty($allowedStandortIds)) { // Filter the provided PIDs by the allowed standort IDs $arrPids = array_intersect($arrPids, $allowedStandortIds); if (empty($arrPids)) { return null; // Return null if none of the requested standorts are allowed } } $time = time(); $t = static::$strTable; $arrColumns = array("$t.pid IN (".implode(',',$arrPids).")"); // Skip unsaved elements (see #2708) $arrColumns[] = "$t.tstamp!=0"; $arrColumns[] = "$t.published='1'"; $arrColumns[] = "($t.buchbar_ab<=$time OR $t.buchbar_ab = 0 OR $t.buchbar_ab IS NULL) AND $t.buchbar_bis>$time"; if (!isset($arrOptions['order'])) { $arrOptions['order'] = "$t.time ASC"; } if (isset($arrOptions['column'])) { $arrColumns = array_merge($arrColumns,$arrOptions['column']); $arrOptions = array_diff_key($arrOptions,['column'=>true]); } return static::findBy($arrColumns,null,$arrOptions); } public static function findAllFuturePublished(array $arrOptions=array()) { $t = static::$strTable; $time = Date::floorToMinute(); // Check standort permissions $allowedStandortIds = static::getAllowedStandortIds(); $arrColumns = array("$t.time >= ?", "$t.tstamp!=0", "$t.published='1' AND ($t.buchbar_ab<=$time OR $t.buchbar_ab = 0 OR $t.buchbar_ab IS NULL) AND $t.buchbar_bis > ?"); $arrValues = [$time, $time, $time]; if (!empty($allowedStandortIds)) { $arrColumns[] = "$t.pid IN (" . implode(',', $allowedStandortIds) . ")"; } if (!isset($arrOptions['order'])) { $arrOptions['order'] = "$t.time ASC"; } return static::findBy($arrColumns, $arrValues, $arrOptions); } public function getAvailableBehaelter(bool $inclOvercapacity = false, ?int $intOffset=null) { /** @var Connection $db */ $db = Controller::getContainer()->get('database_connection'); $ReservedBehaelter = $db->prepare("SELECT SUM(behaelter) FROM tl_vr_wa_reservation WHERE pid = ?") ->executeQuery([$this->id]); $intReserved = $ReservedBehaelter->fetchOne(); $intOvercapacity = 0; if ($inclOvercapacity) { $intOvercapacity = $this->getOvercapacityBehaelter(); } if ($intReserved === null) { $intReserved = 0; } if ($intOffset > 0) { $intReserved += $intOffset; } return (int) max(0,$this->behaelter + $intOvercapacity - $intReserved); } public function getOvercapacityBehaelter(bool $blnGross=false) { $intOvercapacity = round($this->behaelter/100*$this->overcapacity); if ($blnGross) { return $intOvercapacity; } /** @var Connection $db */ $db = Controller::getContainer()->get('database_connection'); $ReservedBehaelter = $db->prepare("SELECT SUM(behaelter) FROM tl_vr_wa_reservation WHERE pid = ?") ->executeQuery([$this->id]); $intReserved = $ReservedBehaelter->fetchOne(); $intAmount = min($intOvercapacity,$this->behaelter+$intOvercapacity-$intReserved); return $intAmount; } }