[ic] Custom shipping

Bill Carr interchange-users@icdevgroup.org
Tue Jul 9 06:40:02 2002


On Mon, 2002-07-08 at 21:16, Interchange user wrote:
> Can anyone help me out with this? I guess the 4th of July was a bad time to 
> post to the list.
In shipping.asc hard code the zone (and perhaps other parameters) in the
shipping_calc tag untill you get it too work. Maybe you have a quoting
issue there.


> 
> 
> On Thursday 04 July 2002 01:30 am, you wrote:
> > Bill,
> >
> > Thanks for your fast and helpful reply last month. I have put something
> > together, but cannot get it to work. I get the following message on the
> > checkout page:
> >
> > "Shipping mode 'DEFAULT': bad formula. Returning 0.No match found for mode
> > 'DEFAULT', quantity '1', returning 0."
> >
> > Probably a syntax error somewhere. Could you (or someone else) please help
> > me get this working? Here are the details:
> >
> > In catalog.cfg:
> >
> > UserTag calc_shipping Order weight zone
> > UserTag calc_shipping Routine <<EOF
> > sub {
> >     my ($weight, $zone) = @_;
> >     $zone = 'zone'.$zone;
> >     my $qty_packtype_a = 0;
> >     my $qty_packtype_b = 0;
> >     my $qty_packtype_c = 0;
> >     my $qty_packtype_d = 0;
> >
> >     my $shipping_charge = $Tag->query(sql="SELECT $zone FROM shipping WHERE
> > weight = $weight");
> >
> >     for (@$Items) {
> >       if ($Tag->query(sql="SELECT packaging_type FROM products WHERE sku =
> > '$_->{sku}'") == 'A')
> >         $qty_packtype_a ++;
> >       else if ($Tag->query(sql="SELECT packaging_type FROM products WHERE
> > sku = '$_->{sku}'") == 'B')
> >         $qty_packtype_b ++;
> >       else if ($Tag->query(sql="SELECT packaging_type FROM products WHERE
> > sku = '$_->{sku}'") == 'C')
> >         $qty_packtype_c ++;
> >       else if ($Tag->query(sql="SELECT packaging_type FROM products WHERE
> > sku = '$_->{sku}'") == 'D')
> >         $qty_packtype_d ++;
> >     }
> >
> >     my $packaging_charge = 0;
> >
> >     if ($qty_packtype_a)
> >       $packaging_charge += $Tag->query(sql="SELECT packtype_a FROM
> > packaging WHERE quantity = $qty_packtype_a");
> >     if ($qty_packtype_b)
> >       $packaging_charge += $Tag->query(sql="SELECT packtype_b FROM
> > packaging WHERE quantity = $qty_packtype_b");
> >     if ($qty_packtype_c)
> >       $packaging_charge += $Tag->query(sql="SELECT packtype_c FROM
> > packaging WHERE quantity = $qty_packtype_c");
> >     if ($qty_packtype_d)
> >       $packaging_charge += $Tag->query(sql="SELECT packtype_d FROM
> > packaging WHERE quantity = $qty_packtype_d");
> >
> >     return $shipping_charge + $packaging_charge;
> >     }
> > EOF
> >
> >
> >
> > In shipping.asc:
> >
> > DEFAULT: Default Shipping
> > 	criteria	weight
> > 	min	0
> > 	max	0
> > 	cost	e Nothing to ship!
> >
> > 	min	1
> > 	max	150
> > 	cost	f [calc_shipping weight=@@TOTAL@@ zone=[query sql="SELECT zone FROM
> > country WHERE code = '[value country]'"][/query]]
> >
> > 	min	151
> > 	max	99999
> > 	cost	e @@TOTAL@@ lb too heavy - please contact us.
> >
> >
> >
> > In dbconf/mysql/shipping.mysql:
> >
> > Database  shipping shipping.txt  __SQLDSN__
> > ifdef SQLUSER
> > Database  shipping  USER         __SQLUSER__
> > endif
> > ifdef SQLPASS
> > Database  shipping  PASS         __SQLPASS__
> > endif
> > Database  shipping  COLUMN_DEF   "weight=CHAR(4) DEFAULT '0'"
> > Database  shipping  COLUMN_DEF   "zone1=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  shipping  COLUMN_DEF   "zone2=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  shipping  COLUMN_DEF   "zone3=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  shipping  COLUMN_DEF   "zone4=DECIMAL(4,2) DEFAULT '0.00'"
> >
> >
> > In dbconf/mysql/packaging.mysql:
> >
> > Database  packaging packaging.txt  __SQLDSN__
> > ifdef SQLUSER
> > Database  packaging  USER         __SQLUSER__
> > endif
> > ifdef SQLPASS
> > Database  packaging  PASS         __SQLPASS__
> > endif
> > Database  packaging  COLUMN_DEF   "quantity=CHAR(4) DEFAULT '0'"
> > Database  packaging  COLUMN_DEF   "packtype_a=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  packaging  COLUMN_DEF   "packtype_b=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  packaging  COLUMN_DEF   "packtype_c=DECIMAL(4,2) DEFAULT '0.00'"
> > Database  packaging  COLUMN_DEF   "packtype_d=DECIMAL(4,2) DEFAULT '0.00'"
> >
> >
> > Added to dbconf/mysql/products.mysql:
> >
> > Database  products  COLUMN_DEF   "packaging_type=CHAR(1)"
> >
> >
> > Added to dbconf/mysql/country.mysql:
> >
> > Database  country  COLUMN_DEF   "zone=CHAR(1)"
> >
> >
> > Thank you.
> >
> > On Thursday 13 June 2002 11:01 pm, you wrote:
> > > On Thu, 2002-06-13 at 17:23, Interchange user wrote:
> > > > Hello,
> > > >
> > > > I've been trying to come up with a solution for a custom shipping
> > > > routine, and would appreciate any comments or help implementing this.
> > > > I'm not sure whether this can be done using IC tags in 'shipping.asc',
> > > > or if I will need to define a user tag, in which case, I am most
> > > > comfortable with C-style Perl.
> > > >
> > > > OK, here's the deal:
> > > >
> > > > Shipping cost will be calculated by weight and zone (there are 4
> > > > zones), but items will have different packaging types. For example,
> > > > posters will use poster tubes, and books will use boxes. Also, there
> > > > are limits to how many items will fit into any given packaging type.
> > > > For example, up to 5 posters can fit into a tube. An item can also have
> > > > more than one packaging type. For example, on their own, a set of
> > > > postcards would probably go in a padded envelope, but if they were
> > > > ordered with a book, everything would go into a single box.
> > > >
> > > > A rough idea of the steps required (I'm using MySQL):
> > > >
> > > > - Loop through each item in cart,
> > > > - Add weight of all items together,
> > > > - Count the quantities of each packing type required from a
> > > > 'packaging_type' field in the 'products' table,
> > > > - Index into a 'shipping' table to find a price for the 'weight/zone'
> > > > pair,
> > > > - Index into a 'packaging' table to find a price for the
> > > > 'quantity/packaging_type' pair, for each required packaging type,
> > > > - Add the looked up shipping cost and packaging cost(s) together
> > > >
> > > > This method is not perfect, but it's the best I have come up with so
> > > > far. For example, if more than two packaging types are required (say, a
> > > > poster tube and a box), it does not account for the fact that it is
> > > > more expensive to send split orders than just one of the same weight.
> > > > Then there is the situation where someone orders items from various
> > > > categories, that together use a different packaging type than they
> > > > would individually, and the customer could be charged for packaging
> > > > they don't need. Again, taking the above example; on their own, a set
> > > > of postcards would probably go in a padded envelope, but if they were
> > > > ordered with a book, everything would go into a single box.
> > > >
> > > > However, I think it will be better to lose some here and gain some
> > > > there, than to have a horribly complicated and cycle-hogging routine
> > > > that takes into consideration every possible combination of items
> > > > ordered.
> > >
> > > Here is a set up I use for a Wine merchant. It is simpler than your
> > > setup but it should help.
> > >
> > > My checkout page sets scratch weight.
> > >
> > > catalog.cfg:
> > > UserTag shipping_cost Order mode weight zip country
> > > UserTag shipping_cost Routine <<EOR
> > > sub {
> > >         my ($mode, $weight, $zip, $country) = @_;
> > >         $mode = $Variable->{SHIPPING_DEFAULT_MODE} unless $mode;
> > >         if ($Values->{zip} =~ /^(\d{5})/) {
> > >            $zip = $1;
> > >         } else {
> > >           $zip = $Variable->{SHIP_DEFAULT_ZIP};
> > >         }
> > >         my $ups_charge  = $Tag->ups_query( {
> > >                                          zip => $zip,
> > >                                          mode => $mode,
> > >                                          weight => $weight,
> > >                                          country => $country
> > >                             } );
> > >         return $ups_charge + &container_charge();
> > >         sub container_charge {
> > >                 my $bottles = 0;
> > >                 for (@$Items) {
> > >                         next if $_->{mv_ib} eq 'products';
> > >                         $bottles += $_->{quantity} * $_->{pack};
> > >                 }
> > >                 return 3 if $bottles <= 1;
> > >                 return 4 if $bottles <= 2;
> > >                 return 5 if $bottles <= 3;
> > >                 return 6 if $bottles <= 6;
> > >                 return 12 if $bottles <= 12;
> > >                 return $bottles * 1.30;
> > >         }
> > > }
> > > EOR
> > >
> > > shipping.asc:
> > > 1DA: UPS Next Day Air
> > >         criteria        [scratch weight]
> > >         min             1
> > >         max             150
> > >         at_least        5
> > >         cost            f [shipping_cost mode=1DA weight=@@TOTAL@@
> > > zip='[value zip]']
> > >
> > > 2DA: 2nd Day Air
> > >         criteria        [scratch weight]
> > >         min             1
> > >         max             150
> > >         at_least        5
> > >         cost            f [shipping_cost mode=2DA weight=@@TOTAL@@
> > > zip='[value zip]']
> > >
> > > GNDRES: UPS Ground
> > >         criteria        [scratch weight]
> > >         min             1
> > >         max             150
> > >         at_least        5
> > >         cost            f [shipping_cost mode=GNDRES weight=@@TOTAL@@
> > > zip='[value zip]']
> > >
> > > XPD: UPS Worldwide Expedited
> > >         criteria        [scratch weight]
> > >         min             1
> > >         max             150
> > >         at_least        5
> > >         cost            f [shipping_cost mode=XPD weight=@@TOTAL@@
> > > zip='[value zip]' country='[value country]']
> > >
> > > XPR: UPS Worldwide Express
> > >         criteria        [scratch weight]
> > >         min             1
> > >         max             150
> > >         at_least        5
> > >         cost            f [shipping_cost mode=XPR weight=@@TOTAL@@
> > > zip='[value zip]' country='[value country]']
> > >
> > > > Thank you in advance!
> _______________________________________________
> interchange-users mailing list
> interchange-users@icdevgroup.org
> http://www.icdevgroup.org/mailman/listinfo/interchange-users
> 
-- 
Bill Carr
Worldwide Impact
bill@worldwideimpact.com
413-253-6700