<?php
/**
* Custom extension for Isotope for Contao
*
* Copyright (c) 2014 Benjamin Roth [http://www.esales-media.de]
*
* @package eSM_isotope_custom
* @link http://www.esales-media.de
* @license commercial
*/
namespace eSM_isotope_custom;
use Isotope\Interfaces\IsotopePrice;
use Isotope\Interfaces\IsotopeProductCollection;
use Isotope\Model\ProductCollection\Order;
use eSM_isotope_custom\Model\AffentalerRule as Rule;
use Isotope\Isotope;
use Isotope\Model\ProductCollection\Cart;
//use Isotope\Module\Cart;
use eSM_isotope_custom\Model\ProductCollectionSurcharge\AffentalerRule as RuleSurcharge;
class IsotopeHooks extends \Controller
{
public function addProductToCollection($objProduct, $intQuantity, $ProductCollection)
{
if ($objProduct->not_buyable)
{
return 0;
}
return $intQuantity;
}
/**
* Calculate the price for a product, applying rules and coupons
*
* @param float
* @param object
* @param string
* @param int
* @return float
*/
public function calculatePrice($fltPrice, $objSource, $strField, $intTaxClass)
{
// RRP
if ($strField === 'original_price' && ($objProduct = $objSource->getRelated('pid')) !== null)
{
if ($objProduct->price_rrp > $fltPrice)
{
return $objProduct->price_rrp;
}
}
if ($objSource instanceof IsotopePrice && ('price' === $strField || 'low_price' === $strField || 'net_price' === $strField || 'gross_price' === $strField)) {
// @todo try not to use getRelated() because it loads variants
$objRules = Rule::findByProduct($objSource->getRelated('pid'), $strField, $fltPrice);
if (null !== $objRules) {
while ($objRules->next()) {
// Check cart quantity
if ($objRules->minItemQuantity > 0 || $objRules->maxItemQuantity >= 0) {
if ('cart_products' === $objRules->quantityMode) {
$intTotal = Isotope::getCart()->countItems();
} elseif ('cart_items' === $objRules->quantityMode) {
$intTotal = Isotope::getCart()->sumItemsQuantity();
} else {
$objItem = Isotope::getCart()->getItemForProduct($objSource->getRelated('pid'));
$intTotal = (null === $objItem) ? 0 : $objItem->quantity;
}
if (($objRules->minItemQuantity > 0 && $objRules->minItemQuantity > $intTotal) || $objRules->maxItemQuantity < $intTotal) {
continue;
}
}
// We're unable to apply variant price rules to low_price (see #3189)
if ('low_price' === $strField && 'variants' === $objRules->productRestrictions) {
continue;
}
if ($objRules->current()->isPercentage()) {
$fltDiscount = 100 + $objRules->current()->getPercentage();
$fltDiscount = round($fltPrice - ($fltPrice / 100 * $fltDiscount), 10);
$precision = Isotope::getConfig()->priceRoundPrecision;
$factor = pow(10, 2);
$up = $fltDiscount > 0 ? 'ceil' : 'floor';
$down = $fltDiscount > 0 ? 'floor' : 'ceil';
switch ($objRules->rounding) {
case Rule::ROUND_NORMAL:
$fltDiscount = round($fltDiscount, $precision);
break;
case Rule::ROUND_UP:
$fltDiscount = $up($fltDiscount * $factor) / $factor;
break;
case Rule::ROUND_DOWN:
default:
$fltDiscount = $down($fltDiscount * $factor) / $factor;
break;
}
$fltPrice = $fltPrice - $fltDiscount;
} else {
$fltPrice = $fltPrice + $objRules->discount;
}
}
}
}
return $fltPrice;
}
/**
* Pattern for bulk image file import
*
* @param $arrPattern
* @param $objProducts
* @return array
*/
public function addAssetImportRegexp($arrPattern, $objProducts)
{
$arrPattern[] = $objProducts->sku ? '[0]*'.$objProducts->sku : null;
return $arrPattern;
}
public function modifyAddressFields($arrFields, $objAddress, $objStep)
{
foreach ($arrFields as $fieldName=>$field)
{
if ($fieldName == 'dateOfBirth')
{
$arrFields[$fieldName]['dca']['eval']['rgxp'] = 'date_age16';
}
}
return $arrFields;
}
public function addCustomRegexp($strRegexp, &$varInput, \Widget $objWidget)
{
switch ($strRegexp)
{
case 'date_age16':
if (!\Validator::isDate($varInput))
{
$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['date'], \Date::getInputFormat(\Date::getNumericDateFormat())));
return true;
}
else
{
// Validate the date (see #5086)
try
{
new \Date($varInput, \Date::getNumericDateFormat());
}
catch (\OutOfBoundsException $e)
{
$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['invalidDate'], $varInput));
}
// Age >= 16
$Date = new \Date($varInput, \Date::getNumericDateFormat());
$MinDate = new \Date(mktime(0,0,0,idate('m'),idate('d'),(idate('Y')-16)));
if ($Date->tstamp > $MinDate->tstamp)
{
$objWidget->addError($GLOBALS['TL_LANG']['ERR']['date_age16']);
return true;
}
}
break;
}
return false;
}
public function getAttributesFromDca($arrAttributes, $objDca)
{
// modify $arrAttributes as needed
// Convert timestamps
if ($arrAttributes['value'] != '' && in_array($arrAttributes['rgxp'], array('date_age16')))
{
$objDate = new \Date($arrAttributes['value'], \Date::getFormatFromRgxp('date'));
$arrAttributes['value'] = $objDate->date;
}
return $arrAttributes;
}
/**
* Add cart rules to surcharges
*/
public function findSurcharges(IsotopeProductCollection $objCollection)
{
$objCart = $objCollection;
// The checkout review pages shows an order, but we need the cart
// Only the cart contains coupons etc.
if ($objCollection instanceof Order) {
$objCart = $objCollection->getRelated('source_collection_id');
}
// Rules should only be applied to Cart, not any other product collection
if (!($objCart instanceof Cart)) {
return array();
}
$arrSurcharges = array();
$objRules = Rule::findForCart();
if (null !== $objRules) {
while ($objRules->next()) {
$objSurcharge = RuleSurcharge::createForRuleInCollection($objRules->current(), $objCollection);
if (null !== $objSurcharge) {
$arrSurcharges[] = $objSurcharge;
}
}
}
return $arrSurcharges;
}
}