Example #1
0
	/**
	 * Save the updated tax settings.
	 */
	public function saveTaxSettingsAction()
	{
		$hasErrors = false;
		$stringSettings = array(
			'taxLabel'
		);

		foreach($stringSettings as $key => $setting) {
			if(empty($_POST[$setting])) {
				flashMessage(getLang('InvalidTaxSetting'.ucfirst($setting)), MSG_ERROR);
				$hasErrors = true;
			}
		}

		$enumSettings = array(
			'taxEnteredWithPrices' => array(
				TAX_PRICES_ENTERED_INCLUSIVE,
				TAX_PRICES_ENTERED_EXCLUSIVE
			),
			'taxCalculationBasedOn' => array(
				TAX_BASED_ON_BILLING_ADDRESS,
				TAX_BASED_ON_SHIPPING_ADDRESS,
				TAX_BASED_ON_STORE_ADDRESS
			),
			'taxDefaultTaxDisplayCatalog' => array(
				TAX_PRICES_DISPLAY_INCLUSIVE,
				TAX_PRICES_DISPLAY_EXCLUSIVE,
				TAX_PRICES_DISPLAY_BOTH
			),
			'taxDefaultTaxDisplayProducts' => array(
				TAX_PRICES_DISPLAY_INCLUSIVE,
				TAX_PRICES_DISPLAY_EXCLUSIVE,
				TAX_PRICES_DISPLAY_BOTH
			),
			'taxDefaultTaxDisplayCart' => array(
				TAX_PRICES_DISPLAY_INCLUSIVE,
				TAX_PRICES_DISPLAY_EXCLUSIVE,
			),
			'taxDefaultTaxDisplayOrders' => array(
				TAX_PRICES_DISPLAY_INCLUSIVE,
				TAX_PRICES_DISPLAY_EXCLUSIVE,
			),
			'taxChargesOnOrdersBreakdown' => array(
				TAX_BREAKDOWN_SUMMARY,
				TAX_BREAKDOWN_RATE,
			),
			'taxChargesInCartBreakdown' => array(
				TAX_BREAKDOWN_SUMMARY,
				TAX_BREAKDOWN_RATE,
			),
		);

		foreach($enumSettings as $setting => $options) {
			if(!isset($_POST[$setting]) || !in_array($_POST[$setting], $options)) {
				flashMessage(getLang('InvalidTaxSetting'.ucfirst($setting)), MSG_ERROR);
				$hasErrors = true;
			}
		}

		if(empty($_POST['taxDefaultCountry']) ||
			!getCountryById($_POST['taxDefaultCountry'])) {
				flashMessage(getLang('InvalidTaxSettingTaxDefaultCountry'), MSG_ERROR);
				$hasErrors = true;
		}

		if(!empty($_POST['taxDefaultState']) &&
			!getStateById($_POST['taxDefaultState'])) {
				flashMessage(getLang('InvalidTaxSettingTaxDefaultState'), MSG_ERROR);
				$hasErrors = true;
		}

		if($hasErrors) {
			$this->handleToDo('viewTaxSettings');
			return;
		}

		$allSettings = array_merge($stringSettings, array_keys($enumSettings));

		$allSettings[] = 'taxDefaultCountry';
		$allSettings[] = 'taxDefaultState';
		$allSettings[] = 'taxDefaultZipCode';
		$allSettings[] = 'taxShippingTaxClass';
		$allSettings[] = 'taxGiftWrappingTaxClass';

		foreach($allSettings as $setting) {
			if(isset($_POST[$setting])) {
				$GLOBALS['ISC_NEW_CFG'][$setting] = $_POST[$setting];
			}
		}

		// Determine if the product tax pricing needs to be rebuilt based
		// on which tax settings have changed.
		$rebuildSettings = array(
			'taxEnteredWithPrices',
			'taxDefaultCountry',
			'taxDefaultState',
			'taxDefaultZipCode',
		);
		$requiresPriceRebuild = false;
		foreach($rebuildSettings as $setting) {
			if(isset($GLOBALS['ISC_NEW_CFG']) &&
				getConfig($setting) != $GLOBALS['ISC_NEW_CFG'][$setting]) {
					$requiresPriceRebuild = true;
					break;
			}
		}

		// Mark it as requiring a price rebuild
		if($requiresPriceRebuild) {
			$this->markProductPricingRequiresRebuild();
		}

		$messages = array();
		if(!getClass('ISC_ADMIN_SETTINGS')->commitSettings($messages)) {
			flashMessage(getLang('TaxSettingsNotSaved'), MSG_ERROR);
			$this->viewTaxSettingsAction();
			return;
		}

		// Rebuild the default customer groups/tax cache
		$GLOBALS['ISC_CLASS_DATA_STORE']->UpdateDefaultTaxZones();

		// We've just configured tax - mark it as so.
		if(!in_array('taxSettings', getConfig('GettingStartedCompleted'))) {
			getClass('ISC_ADMIN_ENGINE')->markGettingStartedComplete('taxSettings');
		}

		$this->log->logAdminAction();
		flashMessage(getLang('TaxSettingsSaved'), MSG_SUCCESS,
			'index.php?ToDo=viewTaxSettings'
		);
	}
Example #2
0
	public function convertOldTaxRatesToNewTaxRates()
	{
		// Already done this. Don't do it again.
		if($this->columnExists('[|PREFIX|]tax_rates', 'tax_zone_id')) {
			return true;
		}

		$query = "TRUNCATE [|PREFIX|]tax_rates_new";
		if(!$GLOBALS['ISC_CLASS_DB']->query($query)) {
			$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
			return false;
		}

		$query = "
			SELECT *
			FROM [|PREFIX|]tax_rates
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		if(!$result) {
			$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
			return false;
		}

		while($rate = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$states = explode(',', trim($rate['taxratestates'], ','));
			if(!$rate['taxratecountry']) {
				// All countries - this is the default zone
				$taxZoneId = 1;
			}
			else {
				if(in_array(0, $states) || empty($states)) {
					$type = 'country';
					// All states in country
				}
				else {
					$type = 'state';
				}

				$newTaxZone = array(
					'name' => $rate['taxratename'],
					'type' => $type,
					'enabled' => $rate['taxratestatus'],
				);
				$taxZoneId = $GLOBALS['ISC_CLASS_DB']->insertQuery('tax_zones', $newTaxZone);
				if(!$taxZoneId) {
					$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
					return false;
				}

				// Insert locations
				if($type == 'country') {
					$newLocation = array(
						'tax_zone_id' => $taxZoneId,
						'type' => 'country',
						'value_id' => $rate['taxratecountry'],
						'value' => getCountryById($rate['taxratecountry']),
					);
					if(!$GLOBALS['ISC_CLASS_DB']->insertQuery('tax_zone_locations', $newLocation)) {
						$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
						return false;
					}
				}
				else if($type == 'state') {
					foreach($states as $state) {
						$newLocation = array(
							'tax_zone_id' => $taxZoneId,
							'type' => 'state',
							'value_id' => $state,
							'value' => getStateById($state),
							'country_id' => $rate['taxratecountry']
						);
						if(!$GLOBALS['ISC_CLASS_DB']->insertQuery('tax_zone_locations', $newLocation)) {
							$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
							return false;
						}
					}
				}
			}

			$newTaxRate = array(
				'tax_zone_id' => $taxZoneId,
				'name' => $rate['taxratename'],
				'default_rate' => $rate['taxratepercent'],
			);
			$taxRateId = $GLOBALS['ISC_CLASS_DB']->insertQuery('tax_rates_new', $newTaxRate);
			if(!$taxRateId) {
				$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
				return false;
			}

			// Insert the tax class rates
			$shippingRate = 0;
			if($rate['taxratebasedon'] == 'subtotal_and_shipping') {
				$shippingRate = $rate['taxratepercent'];
			}

			// Non-taxable
			$newTaxClassRate = array(
				'tax_rate_id' => $taxRateId,
				'tax_class_id' => 1,
				'rate' => 0
			);
			if(!$GLOBALS['ISC_CLASS_DB']->insertQuery('tax_rate_class_rates', $newTaxClassRate)) {
				$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
				return false;
			}

			// Shipping
			$newTaxClassRate = array(
				'tax_rate_id' => $taxRateId,
				'tax_class_id' => 2,
				'rate' => $shippingRate
			);
			if(!$GLOBALS['ISC_CLASS_DB']->insertQuery('tax_rate_class_rates', $newTaxClassRate)) {
				$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
				return false;
			}

			// Wrapping
			$newTaxClassRate = array(
				'tax_rate_id' => $taxRateId,
				'tax_class_id' => 3,
				'rate' => $rate['taxratepercent']
			);
			if(!$GLOBALS['ISC_CLASS_DB']->insertQuery('tax_rate_class_rates', $newTaxClassRate)) {
				$this->setError($GLOBALS['ISC_CLASS_DB']->getErrorMsg());
				return false;
			}
		}

		return true;
	}