Sorry, ho letto il post solo ieri. Ed in effetti serviva anche a me risolvere il problema, prima spedivamo solo con corriere espresso, adesso invece abbiamo introdotto anche poste italiane-pacco ordinario. Così ieri mi son messo un paio d'ore sul codice.
Riassumiamo i vari problemi:
- Osc utilizza un'unica variabile per il peso. E se supera il massimo spedibile semplicemente divide il peso totale in più pacchi. Ma se ho un prodotto che da solo supera il peso massimo, mi deve scrivere che non posso spedire quel pacco Invece Osc fa partire ugualmente la spedizione.
- Da admin -> Configurazione -> Shipping/Packaging posso impostare la variabile "Peso massimo". Ma non va bene solo una variabile per tutti i tipi di spedizioni. Ad esempio il pacco ordinario è fino a 20 kg per italia e resto del mondo. SDA invece ha come limite 30 kg per l'Italia e 10 per il resto del mondo. Bel casino.
Ecco come risolvere tutti i problemi.
Prima però qualche appunto:
- Osc non gestisce il peso di più pacchi (peso inteso come imballaggio). Lo aggiunge solo una volta, oppure se il peso totale dei prodotti va oltre un certo valore aggiunge al peso dei prodotti una percentuale che indicate voi. Secondo me pessimo metodo. SE NON AVETE CAPITO COSA HO APPENA SCRITTO, impostate a
0 la variabile "Larger packages - percentage increase" e la variabile "Package Tare Weight" (In questo modo vale solo il peso dei prodotti e Osc non fa schifezze con il peso degli imballaggi).
Considerate che i miei file sono pesantemente modificati, cercherò comunque di spiegare dove e cosa modificare.
Nel file /includes/classes/shipping.php
trovate (a me riga 61):
Codice: Seleziona tutto
if ($shipping_weight > SHIPPING_MAX_WEIGHT) { // Split into many boxes
$shipping_num_boxes = ceil($shipping_weight/SHIPPING_MAX_WEIGHT);
$shipping_weight = $shipping_weight/$shipping_num_boxes;
}
commentate tutte le righe.
Nel file /includes/modules/shipping/postepaccoordinario.php
riga 66 del file originario sostituite questo codice:
Codice: Seleziona tutto
if ($dest_zone == 0) {
$error = true;
$error_text = MODULE_SHIPPING_POSTEPACCOORDINARIO_INVALID_ZONE;
} else {
$shipping = -1;
$postepaccoordinario_cost = constant('MODULE_SHIPPING_POSTEPACCOORDINARIO_COST_' . $dest_zone);
$postepaccoordinario_table = split("[:,]" , $postepaccoordinario_cost);
$size = sizeof($postepaccoordinario_table);
for ($i=0; $i<$size; $i+=2) {
if ($shipping_weight <= $postepaccoordinario_table[$i]) {
$shipping = $postepaccoordinario_table[$i+1];
$shipping_method = MODULE_SHIPPING_POSTEPACCOORDINARIO_TEXT_WAY;
break;
}
}
if ($shipping == -1) {
$shipping_cost = 0;
$error = true;
$error_text = MODULE_SHIPPING_POSTEPACCOORDINARIO_UNDEFINED_RATE;
} else {
$shipping_cost = ($shipping * $shipping_num_boxes) + constant('MODULE_SHIPPING_POSTEPACCOORDINARIO_HANDLING_' . $dest_zone);
}
}
con questo:
Codice: Seleziona tutto
if ($dest_zone == 0) {
$error = true;
$error_text = MODULE_SHIPPING_POSTEPACCOORDINARIO_INVALID_ZONE;
} else {
$postepaccoordinario_cost = constant('MODULE_SHIPPING_POSTEPACCOORDINARIO_COST_' . $dest_zone);
$postepaccoordinario_table = split("[:,]" , $postepaccoordinario_cost);
$size = sizeof($postepaccoordinario_table);
$zones_max_weight = $postepaccoordinario_table[$size-2];
foreach ($order->products as $prodotto) {
if ($prodotto['weight'] > $zones_max_weight) {
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_UNDEFINED_RATE;
}
}
if (!$error) {
$shipping = -1;
$shipping_num_boxes = 1;
$shipping_weight_postepaccoordinario = $shipping_weight;
if ($shipping_weight_postepaccoordinario > $zones_max_weight) { // Split into many boxes
$shipping_num_boxes = ceil($shipping_weight_postepaccoordinario/$zones_max_weight);
$shipping_weight_postepaccoordinario = $shipping_weight_postepaccoordinario/$shipping_num_boxes;
}
for ($i=0; $i<$size; $i+=2) {
if ($shipping_weight_postepaccoordinario <= $postepaccoordinario_table[$i]) {
$shipping = $postepaccoordinario_table[$i+1];
$shipping_method = MODULE_SHIPPING_POSTEPACCOORDINARIO_TEXT_WAY;
break;
}
}
if ($shipping == -1) {
$shipping_cost = 0;
$error = true;
$error_text = MODULE_SHIPPING_POSTEPACCOORDINARIO_UNDEFINED_RATE;
} else {
$shipping_cost = ($shipping * $shipping_num_boxes) + constant('MODULE_SHIPPING_POSTEPACCOORDINARIO_HANDLING_' . $dest_zone);
}
}
}
Stessa cosa con il file /includes/modules/shipping/corriere1.php
Sostituite questo pezzo
Codice: Seleziona tutto
if ($dest_zone == 0) {
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_INVALID_ZONE;
} else {
$shipping = -1;
$zones_cost = constant('MODULE_SHIPPING_CORRIERE1_COST_' . $dest_zone);
$zones_table = split("[:,]" , $zones_cost);
$size = sizeof($zones_table);
for ($i=0; $i<$size; $i+=2) {
if ($shipping_weight <= $zones_table[$i]) {
$shipping = $zones_table[$i+1];
$shipping_method = MODULE_SHIPPING_CORRIERE1_TEXT_WAY;
break;
}
}
if ($shipping == -1) {
$shipping_cost = 0;
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_UNDEFINED_RATE;
} else {
$shipping_cost = ($shipping * $shipping_num_boxes) + constant('MODULE_SHIPPING_CORRIERE1_HANDLING_' . $dest_zone);
}
}
con questo:
Codice: Seleziona tutto
if ($dest_zone == 0) {
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_INVALID_ZONE;
} else {
$zones_cost = constant('MODULE_SHIPPING_CORRIERE1_COST_' . $dest_zone);
$zones_table = split("[:,]" , $zones_cost);
$size = sizeof($zones_table);
$zones_max_weight = $zones_table[$size-2];
foreach ($order->products as $prodotto) {
if ($prodotto['weight'] > $zones_max_weight) {
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_UNDEFINED_RATE;
}
}
if (!$error) {
$shipping = -1;
$shipping_num_boxes = 1;
$shipping_weight_corriere1 = $shipping_weight;
if ($shipping_weight > $zones_max_weight) { // Split into many boxes
$shipping_num_boxes = ceil($shipping_weight_corriere1/$zones_max_weight);
$shipping_weight_corriere1 = $shipping_weight_corriere1/$shipping_num_boxes;
}
for ($i=0; $i<$size; $i+=2) {
if ($shipping_weight_corriere1 <= $zones_table[$i]) {
$shipping = $zones_table[$i+1];
$shipping_method = MODULE_SHIPPING_CORRIERE1_TEXT_WAY;
break;
}
}
if ($shipping == -1) {
$shipping_cost = 0;
$error = true;
$error_text = MODULE_SHIPPING_CORRIERE1_UNDEFINED_RATE;
} else {
$shipping_cost = ($shipping * $shipping_num_boxes) + constant('MODULE_SHIPPING_CORRIERE1_HANDLING_' . $dest_zone);
}
}
}
Se avete impostati altri metodi di spedizione dovete fare lo stesso per tutti i moduli impostati.
Con queste modifichè però sarà tutto automatico, in teoria potreste anche eliminare la variabile generale "peso massimo" di osc. Il peso se lo va a prendere direttamente dal tipo di spedizione.
IMPORTANTE: questo codice funziona solo se avete impostato in modo crescente i costi della spedizione.
Esempio (10€ fino ad 1kg, 20€ fino a 3kg e 50€ fino a 5kg:
1:10,3:20,5:50
Ciao