Jump to content

Costo de envio por articulos por ciudad


raul.chuky

Recommended Posts

Hola a todos, les dejo mi aporte. Consiste en aplicar un costo de envio(transporte) por producto para un determinado grupo de ciudades.
Primero tenemos que agregar el costo de envio por producto, y para hacerlo me base en el siguiente tutorial: Shipping cost per item. Esta hecho para la version 1.1, pero yo lo hice sin problemas en la 1.3.1.
Ahora vamos a validar para que el costo de envio solo se aplique a las ciudades definidas por nosotros. Les explico mejor, Para la ciudad que usted quiera el costo de envio es 0 y para el resto de las ciudades que se aplique el costo de envio definidos por nosotros para cada articulo. Supongamos que tenemos una notebook de $500 con costo de envio de $10. A la hora de comprar si estoy registrado en la ciudad definida, en el carrito solo figurara $500 como total a pagar. Y si estoy registrado fuera de las ciudades definidas, en el carrito figurara $510 como total a pagar. Desglosando seria: Notebook $500, Transporte $10, Total $510.
Buscamos el archivo cart.php que se encuentra dentro de classes, le agregamos la siguiente funcion donde mejor nos parezca

public function getCity()
   {

   $customer = $this->id_customer;
   $sql = "SELECT `city` FROM `address` a JOIN `customer` c ON c.`id_customer` = a.`id_customer` WHERE a.`id_customer` = $customer";    

   $result = Db::getInstance()->getRow($sql);



       return $result['city'];    
   }


Con esta funcion obtenemos la ciudad de la tabla address del cliente logueado.

Continuando dentro del archivo buscamos la funcion getTotalShipping() agregada en el tutorial de Shipping cost per item

function getTotalShipping()
   {
       if (!$this->id)
           return 0;

       $products = $this->getProducts();
       $order_total = 0;
       $maximum = 0;
       foreach ($products AS $product)
       {
               //$order_total = $order_total + $product['shipping_peritem']; //
               //('1.1' * intval($product['quantity']));

               if ($product['shipping_peritem'] > $maximum) {
                   $maximum = $product['shipping_peritem'];
               }


           }

       return $maximum;
   } 


y la cambiamos por

function getTotalShipping()
   {
       if (!$this->id)
           return 0;

           $products = $this->getProducts();
           $bd_ciudad = strtolower(trim($this->getCity()));
           $order_total = 0;
           $city = array('asuncion'=>'asuncion','asunción'=>'asunción','asuncoin'=>'asuncoin', 'asuncóin'=>'asuncóin');
           $ciudad = array_search($bd_ciudad, $city);
           $maximum = 0;
           foreach ($products AS $product)
           {
                   if (strtolower(trim($bd_ciudad)) != strtolower(trim($ciudad)))
                   {
                           //$order_total = $order_total + $product['shipping_peritem']; 
                           //('1.1' * intval($product['quantity']));

                       if ($product['shipping_peritem'] > $maximum) {
                           $maximun += $product['shipping_peritem'];
                       }
                   }else{ 
                       $maximun += floatval(Tools::ps_round(floatval($shipping_cost), 2));
                   }

           }
                   return $maximun;
   }


Esto es todo para tener el costo de envio por articulos para las ciudades que queramos.

pero les explico mejor las lineas de cogido que le agregue a la funcion getTotalShipping()
$bd_ciudad = strtolower(trim($this->getCity())); /Con esta linea obtengo la ciudad conseguida en la funcion getCity() y la almacenamos en la variable $bd_ciudad.
$city = array('asuncion'=>'asuncion','asunción'=>'asunción','asuncoin'=>'asuncoin', 'asuncóin'=>'asuncóin'); / Aca cree un array de las ciudades para comparar con la variable de arriba. Por que tantas variaciones de asunción, es por si el usuario a la hora de registrarse haya introducido mal el nombre de la ciudad. Esto se podria solucionar con un combo list, pero no me quice meter en mas problemas. En esta variable tenemos que introducir las ciudades que querramos comparar con la ciudad introducida por el usuario para nuestra comparacion.
$ciudad = array_search($bd_ciudad, $city); / array_search($bd_ciudad, $city), esta funcion array_search lo que hace es comparar un valor con el array para ver si existe en el, si existe devuelve el indice del valor encontrado sino nada.
if (strtolower(trim($bd_ciudad)) != strtolower(trim($ciudad))) / en este if comparamos el valor traido de la BD con la resultado de la funcion array_search son distintos para poder sumar el costo de envio por articulo en la compras realizadas fuera de las ciudades definidas con costo 0.
Y si la comparacion resulto ser igual ejecutara la siguiente linea
$maximun += floatval(Tools::ps_round(floatval($shipping_cost), 2));
que no sumara ninguna costo de envio para los productos añadidos.

Cualquier error comuniquenme.

AHHHHH y para poder hacer todo esto hay que definir a nuestro transportista en el BACKOFFICE con coste 0 para todo. Si dejamos un costo de envio para nuestro transportistas en el BACKOFFICE, al realizar la comparacion, si la ciudad defenida es igual a la introducida por el user va a ejecutar [$maximun += floatval(Tools::ps_round(floatval($shipping_cost), 2));] esa linea sumando por ende los costos para los transportistas definidos y no 0

Link to comment
Share on other sites

  • 3 months later...

es lo que necesitaba sirve para 1.3.7 ? o para el 1.4 ? podrias subir una imagen para saber como queda, lo que mas me interesa seria costo de envio por pais, sabes si se puede modificar para esta opcion?

Link to comment
Share on other sites

  • 2 months later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...