Go to the documentation of this file.00001 <?php
00002
00007 class oxVatSelector extends oxSuperCfg
00008 {
00009
00010
00016 protected static $_instance = null;
00017
00023 public static function getInstance()
00024 {
00025 if ( !self::$_instance instanceof oxVatSelector ) {
00026 self::$_instance = oxNew('oxVatSelector');
00027 }
00028 return self::$_instance;
00029 }
00030
00036 protected static $_aUserVatCache = array();
00037
00047 public function getUserVat(oxUser $oUser, $blCacheReset = false)
00048 {
00049 if (!$blCacheReset) {
00050 if (self::$_aUserVatCache[$oUser->getId()] !== null) {
00051 return self::$_aUserVatCache[$oUser->getId()];
00052 }
00053 }
00054
00055 $ret = false;
00056
00057 $sCountryId = $this->_getVatCountry($oUser);
00058
00059 if ($sCountryId) {
00060 $oCountry = oxNew('oxcountry');
00061 if (!$oCountry->load($sCountryId)) {
00062 throw new oxObjectException();
00063 }
00064 if ($oCountry->isForeignCountry()) {
00065 $ret = $this->_getForeignCountryUserVat($oUser, $oCountry);
00066 }
00067 }
00068
00069 self::$_aUserVatCache[$oUser->getId()] = $ret;
00070 return $ret;
00071 }
00072
00081 protected function _getForeignCountryUserVat(oxUser $oUser, oxCountry $oCountry )
00082 {
00083 if ($oCountry->isInEU()) {
00084 if ($oUser->oxuser__oxustid->value) {
00085 return 0;
00086 }
00087 return false;
00088 }
00089
00090 return 0;
00091 }
00092
00100 protected function _getVatForArticleCategory(oxArticle $oArticle)
00101 {
00102
00103
00104
00105
00106
00107 $oDb = oxDb::getDb();
00108 $sCatT = getViewName('oxcategories');
00109 $sSelect = "SELECT oxid
00110 FROM $sCatT
00111 WHERE oxvat IS NOT NULL LIMIT 1";
00112
00113
00114
00115 $iCount = $oDb->getOne($sSelect);
00116 if (!$iCount) {
00117 return false;
00118 }
00119
00120 $sO2C = getViewName('oxobject2category');
00121 $sSql = "SELECT c.oxvat
00122 FROM $sCatT AS c, $sO2C AS o2c
00123 WHERE c.oxid=o2c.oxcatnid AND
00124 o2c.oxobjectid = ".$oDb->quote( $oArticle->getId() )." AND
00125 c.oxvat IS NOT NULL
00126 ORDER BY o2c.oxtime ";
00127
00128
00129
00130 $fVat = $oDb->getOne($sSql);
00131 if ($fVat !== false && $fVat !== null) {
00132 return $fVat;
00133 }
00134
00135
00136 return false;
00137 }
00138
00146 public function getArticleVat(oxArticle $oArticle)
00147 {
00148 startProfile("_assignPriceInternal");
00149
00150
00151 if ( ( $dArticleVat = $oArticle->getCustomVAT() ) !== null ) {
00152 stopProfile("_assignPriceInternal");
00153 return $dArticleVat;
00154 }
00155 if ( ( $dArticleVat = $this->_getVatForArticleCategory($oArticle) ) !== false ) {
00156 stopProfile("_assignPriceInternal");
00157 return $dArticleVat;
00158 }
00159
00160 stopProfile("_assignPriceInternal");
00161 return $this->getConfig()->getConfigParam( 'dDefaultVAT' );
00162 }
00163
00174 public function getBasketItemVat(oxArticle $oArticle, $oBasket )
00175 {
00176 return $this->getArticleVat( $oArticle );
00177 }
00178
00186 public function getArticleUserVat(oxArticle $oArticle)
00187 {
00188 if ( ( $oUser = $oArticle->getArticleUser() ) ) {
00189 return $this->getUserVat( $oUser );
00190 }
00191 return false;
00192 }
00193
00194
00203 protected function _getVatCountry(oxUser $oUser = null)
00204 {
00205 $blUseShippingCountry = $this->getConfig()->getConfigParam("blShippingCountryVat");
00206
00207 if ($blUseShippingCountry) {
00208 $aAddresses = $oUser->getUserAddresses($oUser->getId());
00209 $sSelectedAddress = $oUser->getSelectedAddressId();
00210
00211 if (isset($aAddresses[$sSelectedAddress])) {
00212 return $aAddresses[$sSelectedAddress]->oxaddress__oxcountryid->value;
00213 }
00214 }
00215
00216 return $oUser->oxuser__oxcountryid->value;
00217 }
00218
00219 }