diff --git a/composer.json b/composer.json index 62c02aa3..eb328350 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,9 @@ "georgringer/news": "^7.2", "gridelementsteam/gridelements": "^9.2", "helhum/typo3-console": "^5.6", + "kigkonsult/icalcreator": "^2.29", "league/csv": "^9.2", + "league/period": "^4.9", "pixelant/pxa-social-feed": "^2.0", "symfony/http-client": "^4.3", "symfony/options-resolver": "^4.2", diff --git a/composer.lock b/composer.lock index d5dc9cb1..56fa0ef8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5ee4c536b0be04461f96a14634b32be3", + "content-hash": "bb5a69b6fd8737b6af09a7beaaa27b89", "packages": [ { "name": "algo26-matthias/idna-convert", @@ -1266,6 +1266,71 @@ ], "time": "2018-12-09T12:06:13+00:00" }, + { + "name": "kigkonsult/icalcreator", + "version": "v2.29.14", + "source": { + "type": "git", + "url": "https://github.com/iCalcreator/iCalcreator.git", + "reference": "af69b2c08a871d65d64c486b4b3c1a4ca8ebfa35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/iCalcreator/iCalcreator/zipball/af69b2c08a871d65d64c486b4b3c1a4ca8ebfa35", + "reference": "af69b2c08a871d65d64c486b4b3c1a4ca8ebfa35", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-simplexml": "*", + "ext-zlib": "*", + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "6.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ], + "psr-4": { + "Kigkonsult\\Icalcreator\\": [ + "src/", + "src/Util/", + "src/Traits/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Kjell-Inge Gustafsson", + "email": "ical@kigkonsult.se" + } + ], + "description": "iCalcreator is the PHP implementation of rfc2445/rfc5545, management of calendar information", + "keywords": [ + "calendar", + "daylight", + "management", + "rfc2445", + "rfc5545", + "rfc6321", + "standard", + "vCalendar", + "valarm", + "vevent", + "vfreebusy", + "vjournal", + "vtimezone", + "vtodo" + ], + "time": "2019-09-04T00:00:00+00:00" + }, { "name": "league/csv", "version": "9.4.1", @@ -1335,6 +1400,82 @@ ], "time": "2019-10-17T06:05:32+00:00" }, + { + "name": "league/period", + "version": "4.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/period.git", + "reference": "b30d2cb474939beaeae8b45ea5aac0edd3ffbf78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/period/zipball/b30d2cb474939beaeae8b45ea5aac0edd3ffbf78", + "reference": "b30d2cb474939beaeae8b45ea5aac0edd3ffbf78", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "infection/infection": "^0.13", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0|^8.0", + "symfony/var-dumper": "^4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Period\\": "src" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "Time range API for PHP", + "homepage": "http://period.thephpleague.com", + "keywords": [ + "boundaries", + "calendar", + "collection", + "date", + "dateinterval", + "dateperiod", + "datetime", + "gap", + "intersections", + "interval", + "period", + "range", + "schedule", + "sequence", + "time", + "timeline", + "unions" + ], + "time": "2019-09-02T06:27:10+00:00" + }, { "name": "nikic/php-parser", "version": "v4.3.0", diff --git a/public/typo3conf/ext/ep_products/Classes/Controller/AjaxContingentController.php b/public/typo3conf/ext/ep_products/Classes/Controller/AjaxContingentController.php index 252aad59..1e36d0d7 100644 --- a/public/typo3conf/ext/ep_products/Classes/Controller/AjaxContingentController.php +++ b/public/typo3conf/ext/ep_products/Classes/Controller/AjaxContingentController.php @@ -27,10 +27,13 @@ namespace EP\EpProducts\Controller; * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ +use EP\EpProducts\Domain\Model\Contingent; use EP\EpProducts\Domain\Model\Hotel; use EP\EpProducts\Domain\Model\Product; use EP\EpProducts\Domain\Repository\ContingentRepository; use EP\EpProducts\Service\ContingentDataService; +use Kigkonsult\Icalcreator\Vcalendar; +use League\Period\Period; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class AjaxContingentController extends ActionController @@ -100,4 +103,52 @@ class AjaxContingentController extends ActionController return \json_encode($rooms); } + /** + * @param Hotel $hotel + * @param string $year + * @param string $month + * @param int $months + */ + public function icalAction(Hotel $hotel) + { + $range = Period::after(new \DateTime('now'), '1 year'); + + $events = $this->contingentRepository->getEvents( + \DateTime::createFromImmutable($range->getStartDate()), + \DateTime::createFromImmutable($range->getEndDate()), + ['hotel' => $hotel] + ); + + $vcalendar = Vcalendar::factory([ Vcalendar::UNIQUE_ID => 'www.ep-reisen.de' ]); + + foreach ($events as $event) { + /** @var Contingent $event */ + $paxTotal = $event->getPax(); + $paxAvaiable = $event->getAvailable(); + + if ($paxTotal > 0) { + $percentageBooked = round($paxAvaiable / $paxTotal * 100); + } else { + $percentageBooked = 100; + } + + if ($percentageBooked >= 75) { + $dtStart = $event->getBegin(); + $dtEnd = clone $event->getBegin(); + $dtEnd->modify('+1 day'); + $vcalendar + ->newVevent() + ->setDtstart($dtStart) + ->setDtend($dtEnd) + ->setSummary('Unavailable') + ->setDescription(sprintf('Unavailable on %s', $dtStart->format('d M Y'))) + ; + } + } + + + + return $vcalendar->vtimezonePopulate()->createCalendar(); + } + } diff --git a/public/typo3conf/ext/ep_products/Configuration/TypoScript/setup.typoscript b/public/typo3conf/ext/ep_products/Configuration/TypoScript/setup.typoscript index 286ff92e..8a241ef6 100644 --- a/public/typo3conf/ext/ep_products/Configuration/TypoScript/setup.typoscript +++ b/public/typo3conf/ext/ep_products/Configuration/TypoScript/setup.typoscript @@ -128,6 +128,7 @@ tx_epproducts_ajax_json { AjaxContingent { 1 = list 2 = rooms + 3 = ical } AjaxWatchlist { 1 = list @@ -144,6 +145,37 @@ tx_epproducts_ajax_html < tx_epproducts_ajax_json tx_epproducts_ajax_html.typeNum = 1702 tx_epproducts_ajax_html.config.additionalHeaders.10.header = Content-type:text/html +tx_epproducts_ical = PAGE +tx_epproducts_ical { + typeNum = 1710 + config { + disableAllHeaderCode = 1 + disablePrefixComment = 1 + additionalHeaders.1.header = Cache-Control: no-cache, no-store, must-revalidate + additionalHeaders.10.header = Content-type: text/calendar + additionalHeaders.20.header = Content-disposition: attachment; filename=ep-reisen.ical + xhtml_cleaning = 0 + admPanel = 0 + debug = 0 + no_cache = 1 + } + + 10 = USER_INT + 10 { + userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run + extensionName = EpProducts + pluginName = ical + vendorName = EP + controller = AjaxContingent + action = ical + switchableControllerActions { + AjaxContingent { + 1 = ical + } + } + } +} + lib.bookingWidget = USER lib.bookingWidget { userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run diff --git a/public/typo3conf/ext/ep_products/ext_localconf.php b/public/typo3conf/ext/ep_products/ext_localconf.php index 055f9900..dece1da6 100644 --- a/public/typo3conf/ext/ep_products/ext_localconf.php +++ b/public/typo3conf/ext/ep_products/ext_localconf.php @@ -358,6 +358,17 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\EP\EpProducts\T ] ); +\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( + 'EP.' . $_EXTKEY, + 'ical', + [ + 'AjaxContingent' => 'ical', + ], + [ + 'AjaxContingent' => 'ical', + ] +); + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']['ep_products'] = \EP\EpProducts\Hook\PageLayoutView::class;