* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 8861 $ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AdminShipping extends AdminTab { private $_fieldsHandling; public function __construct() { $this->table = 'delivery'; $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); $this->_fieldsHandling = array( 'PS_SHIPPING_HANDLING' => array('title' => $this->l('Handling charges'), 'suffix' => $currency, 'validation' => 'isPrice', 'cast' => 'floatval'), 'PS_SHIPPING_FREE_PRICE' => array('title' => $this->l('Free shipping starts at'), 'suffix' => $currency, 'validation' => 'isPrice', 'cast' => 'floatval'), 'PS_SHIPPING_FREE_WEIGHT' => array('title' => $this->l('Free shipping starts at'), 'suffix' => Configuration::get('PS_WEIGHT_UNIT'), 'validation' => 'isUnsignedFloat', 'cast' => 'floatval'), 'PS_SHIPPING_METHOD' => array('title' => $this->l('Billing'), 'validation' => 'isBool', 'cast' => 'intval')); parent::__construct(); } public function postProcess() { global $currentIndex; /* Handling settings */ if (isset($_POST['submitHandling'.$this->table])) { if ($this->tabAccess['edit'] === '1') { /* Check required fields */ foreach ($this->_fieldsHandling AS $field => $values) if (($value = Tools::getValue($field)) == false AND (string)$value != '0') $this->_errors[] = Tools::displayError('field').' '.$values['title'].' '.Tools::displayError('is required.'); /* Check field validity */ foreach ($this->_fieldsHandling AS $field => $values) if (Tools::getValue($field)) { $function = $values['validation']; if (!Validate::$function(Tools::getValue($field))) $this->_errors[] = Tools::displayError('field').' '.$values['title'].' '.Tools::displayError('is invalid.'); } /* Update configuration values */ if (!sizeof($this->_errors)) { foreach ($this->_fieldsHandling AS $field => $values) { $function = $values['cast']; Configuration::updateValue($field, call_user_func($function, Tools::getValue($field))); } Tools::redirectAdmin($currentIndex.'&conf=6'.'&token='.$this->token); } } else $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } /* Shipping fees */ elseif (isset($_POST['submitFees'.$this->table])) { if ($this->tabAccess['edit'] === '1') { /* @Override Antadis */ if (Tools::isSubmit('submitFeesImportCSV')) { $this->processFeesImportCsv(); if (!count($this->_delivery_prices)){ $this->_errors[] = Tools::displayError('Les données du fichier ne correspondent pas au transporteur.'); return; } } elseif(Tools::isSubmit('exportFeesImportCSV')) { $this->processFeesExportCsv(); /* @End Override Antadis */ } else { if (($id_carrier = (int)(Tools::getValue('id_carrier'))) AND $id_carrier == ($id_carrier2 = (int)(Tools::getValue('id_carrier2')))) { $carrier = new Carrier($id_carrier); if (Validate::isLoadedObject($carrier)) { /* Get configuration values */ $shipping_method = $carrier->getShippingMethod(); $rangeTable = $carrier->getRangeTable(); $carrier->deleteDeliveryPrice($rangeTable); /* Build prices list */ $priceList = ''; foreach ($_POST AS $key => $value) if (strstr($key, 'fees_')) { $tmpArray = explode('_', $key); $priceList .= '('.($shipping_method == Carrier::SHIPPING_METHOD_PRICE ? (int)($tmpArray[2]) : 'NULL').', '.($shipping_method == Carrier::SHIPPING_METHOD_WEIGHT ? (int)($tmpArray[2]) : 'NULL').', '.(int)$carrier->id.', '.(int)$tmpArray[1].', '.number_format(abs(preg_replace("#,#", '.', $value)), 6, '.', '').'),'; unset($tmpArray); } $priceList = rtrim($priceList, ','); /* Update delivery prices */ $carrier->addDeliveryPrice($priceList); Tools::redirectAdmin($currentIndex.'&conf=6'.'&token='.$this->token); } else $this->_errors[] = Tools::displayError('An error occurred while updating fees (cannot load carrier object).'); } elseif (isset($id_carrier2)) { $_POST['id_carrier'] = $id_carrier2; } else $this->_errors[] = Tools::displayError('An error occurred while updating fees (cannot load carrier object).'); } } else $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } } public function processFeesExportCsv(){ $id_carrier = Tools::getValue('id_carrier2'); $carrier = new Carrier((int) $id_carrier); $rangeObj = $carrier->getRangeObject(); $ranges = $rangeObj->getRanges($id_carrier); $delivery = Carrier::getDeliveryPriceByRanges('range_weight', $id_carrier); header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Type: application/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=export_insurances.csv;'); header('Content-Transfer-Encoding: binary'); $headers = array('id_zone'); foreach ($ranges as $range) { $headers[] = $range['delimiter1'] . 'kg ' . $this->l('to') . ' ' . $range['delimiter2'] . 'kg'; } $range_prices = array(); foreach ($delivery as $price) { if (!isset($range_prices[$price['id_zone']])) { $range_prices[$price['id_zone']] = array(); } $range_prices[$price['id_zone']][$price['id_range_weight']] = $price; } ob_clean(); $f = fopen('php://output', 'w'); fputcsv($f, $headers, ';', '"'); foreach ($range_prices as $id_zone => $prices) { $row_data = array($id_zone); foreach ($ranges as $range) { if (isset($prices[$range['id_range_weight']])) { $row_data[] = (float) $prices[$range['id_range_weight']]['price']; } else { $row_data[] = 0.00; } } fputcsv($f, $row_data, ';', '"'); } fclose($f); exit; } public function processFeesImportCsv(){ if (!isset($_FILES['feesImportCsvFile']) || !$_FILES['feesImportCsvFile']['tmp_name']){ $this->_errors[] = Tools::displayError('No file.'); return false; } $id_carrier = Tools::getValue('id_carrier2'); $carrier = new Carrier((int) $id_carrier); $rangeObj = $carrier->getRangeObject(); $ranges = $rangeObj->getRanges($id_carrier); $zones = $carrier->getZones(); $filename = dirname(__FILE__) . '/../' . uniqid() . '_' . Tools::encrypt($id_carrier) . '.csv'; if (!move_uploaded_file( $_FILES['feesImportCsvFile']['tmp_name'], $filename )) { $this->_errors[] = Tools::displayError('Erreur lors du téléchargement du fichier'); return false; } $i = 0; $this->_delivery_prices = array(); $handle = fopen($filename, 'r'); while(($delivery_info = fgetcsv($handle, 0, ';') ) !== FALSE) { $i++; if ($i <= 1) continue; if (!isset($delivery_info[0]) || !Validate::isUnsignedId($delivery_info[0])) continue; if (count($ranges) +1 != count($delivery_info)) continue; $_id_zone = $delivery_info[0]; $this->_delivery_prices[$_id_zone] = array(); unset($delivery_info[0]); foreach ($delivery_info as $price) $this->_delivery_prices[$_id_zone][] = $price; } if (file_exists($filename)) unlink($filename); return $this->_delivery_prices; } public function display() { $this->displayFormHandling(); $this->displayFormFees(); } public function displayFormHandling() { global $currentIndex; $confKeys = $this->_fieldsHandling; foreach ($confKeys AS $key => $confKey) $getConf[] = $key; $confValues = Configuration::getMultiple($getConf); unset($confKeys['PS_SHIPPING_METHOD']); echo '
'; } public function displayFormFees() { global $currentIndex; $carrierArray = array(); $id_carrier = Tools::getValue('id_carrier'); $carriers = Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), true , false,false, NULL, Carrier::PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); foreach ($carriers AS $carrier) if (!$carrier['is_free']) $carrierArray[] = array( 'id' => $carrier['id_carrier'], 'display' => '' ); if (count($carrierArray)) { if (!$id_carrier) $id_carrier = (int)$carrierArray[0]['id']; $carrierSelected = new Carrier($id_carrier); } echo '