00001 <?php
00002
00006 class oxDiscount extends oxI18n
00007 {
00013 protected $_sClassName = 'oxdiscount';
00014
00020 protected $_dAmount = null;
00021
00027 protected $_sBasketIdent = null;
00028
00032 public function __construct()
00033 {
00034 parent::__construct();
00035 $this->init( 'oxdiscount' );
00036 }
00037
00045 public function delete( $sOXID = null )
00046 {
00047 if ( !$sOXID ) {
00048 $sOXID = $this->getId();
00049 }
00050 if ( !$sOXID ) {
00051 return false;
00052 }
00053
00054
00055 $oDB = oxDb::getDb();
00056 $oDB->execute( 'delete from oxobject2discount where oxobject2discount.oxdiscountid = "'.$sOXID.'"' );
00057
00058 return parent::delete( $sOXID );
00059 }
00060
00068 public function isForArticle( $oArticle )
00069 {
00070
00071 if ( $this->oxdiscount__oxaddsumtype->value == 'itm' ) {
00072 return false;
00073 }
00074
00075 if ( $this->oxdiscount__oxamount->value || $this->oxdiscount__oxprice->value ) {
00076 return false;
00077 }
00078
00079 if ( $this->oxdiscount__oxpriceto->value && ($this->oxdiscount__oxpriceto->value < $oArticle->getBasePrice()) ) {
00080 return false;
00081 }
00082
00083 $myDB = oxDb::getDb();
00084
00085
00086 $sQ = "select 1 from oxobject2discount where oxdiscountid = '{$this->oxdiscount__oxid->value}' and ( oxtype = 'oxarticles' or oxtype = 'oxcategories')";
00087 $blOk = (bool) $myDB->getOne( $sQ );
00088
00089 if ( !$blOk ) {
00090 return true;
00091 }
00092
00093
00094 $sArticleID = "";
00095 if ($oArticle->oxarticles__oxparentid->value) {
00096 $sArticleID = "(oxobjectid = '".$oArticle->getId()."' or oxobjectid = '{$oArticle->oxarticles__oxparentid->value}')";
00097 } else {
00098 $sArticleID = "oxobjectid = '".$oArticle->getId()."'";
00099 }
00100
00101 $sQ = "select 1 from oxobject2discount where oxdiscountid = '{$this->oxdiscount__oxid->value}' and $sArticleID and oxtype = 'oxarticles'";
00102 $blOk = (bool) $myDB->getOne( $sQ );
00103 if ( $blOk ) {
00104 return true;
00105 } else {
00106
00107 $aCatIds = $oArticle->getCategoryIds();
00108 if (!$aCatIds || !count($aCatIds)) {
00109
00110 return false;
00111 }
00112 $sCatIds = "('".implode("','", $aCatIds)."')";
00113
00114 $sQ = "select oxobjectid from oxobject2discount where oxdiscountid = '{$this->oxdiscount__oxid->value}' and oxobjectid in $sCatIds and oxtype = 'oxcategories'";
00115 if ( ( bool ) $myDB->getOne( $sQ ) ) {
00116 return true;
00117 }
00118 }
00119 return false;
00120 }
00121
00129 public function isForBasketItem( $oArticle )
00130 {
00131 if ( $this->oxdiscount__oxamount->value == 0 && $this->oxdiscount__oxprice->value == 0 ) {
00132 return false;
00133 }
00134
00135
00136 if ( $this->oxdiscount__oxaddsumtype->value == 'itm' ) {
00137 return false;
00138 }
00139
00140 $myDB = oxDb::getDb();
00141
00142 $sArticleID = "";
00143 if ( $oArticle->oxarticles__oxparentid->value ) {
00144 $sArticleID = "(oxobjectid = '".$oArticle->getId()."' or oxobjectid = '{$oArticle->oxarticles__oxparentid->value}')";
00145 } else {
00146 $sArticleID = "oxobjectid = '".$oArticle->getId()."'";
00147 }
00148 $sQ = "select 1 from oxobject2discount where oxdiscountid = '{$this->oxdiscount__oxid->value}' and $sArticleID and oxtype = 'oxarticles'";
00149 if ( !( $blOk = ( bool ) $myDB->getOne( $sQ ) ) ) {
00150
00151
00152 $blOk = $this->_checkForArticleCategories( $oArticle );
00153 }
00154 return $blOk;
00155 }
00156
00164 public function isForBasketAmount( $oBasket )
00165 {
00166 $dAmount = 0;
00167 $aBasketItems = $oBasket->getContents();
00168 foreach ( $aBasketItems as $oBasketItem ) {
00169
00170 $oBasketArticle = $oBasketItem->getArticle();
00171
00172 $blForBasketItem = false;
00173 if ( $this->oxdiscount__oxaddsumtype->value != 'itm' ) {
00174 $blForBasketItem = $this->isForBasketItem( $oBasketArticle );
00175 } else {
00176 $blForBasketItem = $this->isForBundleItem( $oBasketArticle );
00177 }
00178
00179 if ( $blForBasketItem ) {
00180 if ( $this->oxdiscount__oxprice->value ) {
00181 $dAmount += $oBasketArticle->getPrice()->getBruttoPrice() * $oBasketItem->getAmount();
00182 } elseif ( $this->oxdiscount__oxamount->value ) {
00183 $dAmount += $oBasketItem->getAmount();
00184 }
00185 }
00186 }
00187
00188 return $this->isForAmount( $dAmount );
00189 }
00190
00198 public function isForAmount( $dAmount )
00199 {
00200 $blIs = true;
00201 if ( $this->oxdiscount__oxprice->value &&
00202 ( $dAmount < $this->oxdiscount__oxprice->value || $dAmount > $this->oxdiscount__oxpriceto->value ) ) {
00203 $blIs = false;
00204 } elseif ( $this->oxdiscount__oxamount->value &&
00205 ( $dAmount < $this->oxdiscount__oxamount->value || $dAmount > $this->oxdiscount__oxamountto->value ) ) {
00206 $blIs = false;
00207 }
00208 return $blIs;
00209 }
00210
00218 public function isForBasket( $oBasket )
00219 {
00220
00221 if ( $this->oxdiscount__oxamount->value == 0 && $this->oxdiscount__oxprice->value == 0 ) {
00222 return false;
00223 }
00224
00225 $oSummary = $oBasket->getBasketSummary();
00226
00227 if ( $this->oxdiscount__oxamount->value && ( $oSummary->iArticleCount < $this->oxdiscount__oxamount->value || $oSummary->iArticleCount > $this->oxdiscount__oxamountto->value ) ) {
00228 return false;
00229
00230 } elseif ( $this->oxdiscount__oxprice->value && ( $oSummary->dArticlePrice < $this->oxdiscount__oxprice->value || $oSummary->dArticlePrice > $this->oxdiscount__oxpriceto->value ) ) {
00231 return false;
00232 }
00233
00234
00235 $sQ = 'select 1 from oxobject2discount where oxdiscountid = "'.$this->oxdiscount__oxid->value.'" and oxtype in ("oxarticles", "oxcategories" ) ';
00236
00237 return !( (bool) oxDb::getDb()->getOne( $sQ ) );
00238 }
00239
00247 public function isForBundleItem( $oArticle )
00248 {
00249 if ( $this->oxdiscount__oxaddsumtype->value != 'itm' ) {
00250 return false;
00251 }
00252
00253 $sSelect = "select 1 from oxobject2discount where oxdiscountid='".$this->getId()."' and oxobjectid='".$oArticle->getId()."' ";
00254 if ( !( $blOk = (bool) oxDb::getDb()->getOne( $sSelect ) ) ) {
00255
00256 $blOk = $this->_checkForArticleCategories( $oArticle );
00257 }
00258 return $blOk;
00259 }
00260
00268 public function isForBundleBasket( $oBasket )
00269 {
00270 if ( $this->oxdiscount__oxaddsumtype->value != 'itm' ) {
00271 return false;
00272 }
00273
00274 return $this->isForBasket( $oBasket );
00275 }
00276
00285 public function getAbsValue( $dPrice, $dAmount = 1 )
00286 {
00287 if ( $this->oxdiscount__oxaddsumtype->value == '%' ) {
00288 return $dPrice * ( $this->oxdiscount__oxaddsum->value / 100 );
00289 } else {
00290 $oCur = $this->getConfig()->getActShopCurrencyObject();
00291 return $this->oxdiscount__oxaddsum->value * $dAmount * $oCur->rate;
00292 }
00293 }
00294
00303 public function applyDiscount( $oPrice, $dAmount = 1 )
00304 {
00305 if ( $this->oxdiscount__oxaddsumtype->value == 'abs' ) {
00306
00307 $oCur = $this->getConfig()->getActShopCurrencyObject();
00308
00309 $oDiscountPrice = oxNew( 'oxprice' );
00310 $oDiscountPrice->setBruttoPriceMode();
00311 $oDiscountPrice->setPrice( $this->oxdiscount__oxaddsum->value * $oCur->rate, $oPrice->getVat() );
00312 } else {
00313
00314 $oDiscountPrice = oxNew( 'oxprice' );
00315 $oDiscountPrice->setBruttoPriceMode();
00316 $oDiscountPrice->setPrice( $oPrice->getBruttoPrice() / 100 * $this->oxdiscount__oxaddsum->value, $oPrice->getVat() );
00317 }
00318
00319 $oDiscountPrice->multiply( $dAmount * -1 );
00320 $oPrice->addPrice( $oDiscountPrice );
00321 }
00322
00330 public function getBundleAmount( $dAmount )
00331 {
00332 $dItemAmount = $this->oxdiscount__oxitmamount->value;
00333
00334
00335 if ( $this->oxdiscount__oxitmmultiple->value && $this->oxdiscount__oxamount->value > 0 ) {
00336 $dItemAmount = floor( $dAmount / $this->oxdiscount__oxamount->value ) * $this->oxdiscount__oxitmamount->value;
00337 }
00338
00339 return $dItemAmount;
00340 }
00341
00349 protected function _checkForArticleCategories( $oArticle )
00350 {
00351
00352 $aCatIds = $oArticle->getCategoryIds();
00353 if (!$aCatIds || !count($aCatIds)) {
00354
00355 return false;
00356 }
00357
00358 $sCatIds = "('".implode("','", $aCatIds)."')";
00359
00360 $sQ = "select oxobjectid from oxobject2discount where oxdiscountid = '{$this->oxdiscount__oxid->value}' and oxobjectid in $sCatIds and oxtype = 'oxcategories'";
00361
00362 return oxDb::getDb()->getOne( $sQ );
00363 }
00364
00370 public function getSimpleDiscount()
00371 {
00372 $oDiscount = new OxStdClass();
00373 $oDiscount->sOXID = $this->getId();
00374 $oDiscount->sDiscount = $this->oxdiscount__oxtitle->value;
00375 $oDiscount->sType = $this->oxdiscount__oxaddsumtype->value;
00376
00377 return $oDiscount;
00378 }
00379
00380 }