[ic] add fixed amount to shipping based on cart's total weight
Daniel Browning
db at endpoint.com
Wed Dec 10 21:37:35 UTC 2008
On Wednesday 10 December 2008 1:01:20 pm DB wrote:
> I need a way to add an additional, fixed amount to an order's shipping if
> the total weight of items in the cart exceeds a certain value.
I recently suggested the shipping_callout method to seomeone else. This
feature allows you to build a GlobalSub that takes the existing shipping
amount, checks the cart for applicable items, then adds the fee. Whatever
customizations you need will automatically apply to every shipping method.
I prefer it over [assign] because it takes effect everywhere automatically
without adding any code to the checkout pages.
For example (untested):
# A perly true value in 'products.oversized' field adds UPS fee.
AutoModifier oversized
Variable OVERWEIGHT_LIMIT 25
Variable OVERWEIGHT_FEE 10.00
Sub custom_shipping <<EOS
sub {
my ($final, $mode, $opt, $o) = @_;
my $total_weight = $Tag->weight({noformat=>1}) || 0;
$final += $Variable->{OVERWEIGHT_FEE}
if $total_weight > $Variable->{OVERWEIGHT_LIMIT};
return $final;
}
EOS
SpecialSub shipping_callout custom_shipping
The feature was added in 5.6.0, but the patch to older versions is pretty
simple:
http://www.icdevgroup.org/cgi-bin/cvsweb/interchange/lib/Vend/Ship.pm.diff?r1=text&tr1=2.26&r2=text&tr2=2.27
--
Daniel "the other DB" Browning
End Point Corporation
http://www.endpoint.com/
--- interchange/lib/Vend/Ship.pm 2007/08/09 13:40:54 2.26
+++ interchange/lib/Vend/Ship.pm 2008/04/11 07:47:16 2.27
@@ -1,8 +1,8 @@
# Vend::Ship - Interchange shipping code
#
-# $Id: Ship.pm,v 2.26 2007/08/09 13:40:54 pajamian Exp $
+# $Id: Ship.pm,v 2.27 2008/04/11 07:47:16 danb Exp $
#
-# Copyright (C) 2002-2007 Interchange Development Group
+# Copyright (C) 2002-2008 Interchange Development Group
# Copyright (C) 1996-2002 Red Hat, Inc.
#
# This program was originally based on Vend 0.2 and 0.3
@@ -909,6 +909,16 @@ sub shipping {
}
undef $opt->{default};
}
+ if (my $callout_name = $Vend::Cfg->{SpecialSub}
{shipping_callout}) {
+#::logDebug("Execute shipping callout '$callout_name(...)'");
+ my $sub = $Vend::Cfg->{Sub}{$callout_name}
+ || $Global::GlobalSub->{$callout_name};
+ eval {
+ my $callout_result = $sub->($final, $mode,
$opt, $o);
+ $final = $callout_result if defined
$callout_result;
+ };
+ ::logError("Shipping callout '$callout_name' died:
$@") if $@;
+ }
return $final unless $opt->{label};
my $number;
if($o->{free} and $final == 0) {
More information about the interchange-users
mailing list