Community Add-Ons
Individual Product Shipping Prices - v1.0
for osCommerce Online Merchant v2.2
This shipping module will allow you to set an individual shipping price for each product. This module is kind of like the 'Shipping rate per product', or 'prodrate' shipping module designed by Joe Janos, except this module does not use the 'weight' field. Instead, this module adds a new field to your products table to hold the individual shipping price data. This means that you can use this module with any other module if you like. Intigration with the contribution 'multi-vendor shipping' is also explained.
Support forum thread at: http://forums.oscommerce.com/viewtopic.php?t=50221
Previous version did not download the complete product to xcel, only product that has indv price was set.
This is a complete updated instruction which will export all products including the one that does not have the shipping price set...
This package is for those who use easy populate w/ attribute contribution to import and export products into excel.
This have added two field, products_ship_price and products_ship_price_two.
What's not included:
method_id, and zip code...
Tested and work with OSC,R2a
Hi All,
This is same as file below, except this one will work if you have the ajax order editor installed http://addons.oscommerce.com/info/1435
Steve
Hi i manged to combine http://addons.oscommerce.com/info/5965 with Individual Shipping you can now have a surcharge on say states like Hawaii and Alaska.
This adds 2 new fields in admin, where you enter the states and the surcharge.
simply upload file to catalog/includes/modules/shipping folder thats it,
Remember to remove Individual Shipping module before you upload it then install it after upload
Failure to do above wll result in it not working for state surcharge
All credits to Authors of both contributions
When I was trying to use it I got some error such as other shipping options were not shown/worked and there was no option to integrate it with Onepage checkout addons (http://addons.oscommerce.com/info/6646).
I have changed two files in classes directory.
1. shipping.php
2. onepage_checkout.php (you have to add this file if you use onepage checkout contribution).
Other files are remaining same for both of the addons.
2 files uploaded.
Paypal Standard won't take the total to paypal portal.
open: catalogincludesmodulespaymentpaypal_standard.php
find:
function process_button() {
below you should see:
global $customer_id, $order, $sendto, $currency, $cart_PayPal_Standard_ID, $shipping;
if you only see: global $customer_id, $order, $sendto, $currency, $cart_PayPal_Standard_ID;
then replace $cart_PayPal_Standard_ID; with $cart_PayPal_Standard_ID, $shipping;
find:
'shipping' => $this->format_raw($order->info['shipping_cost']),
change to:
'shipping' => $this->format_raw($shiptotal),
find:
'amount' => $this->format_raw($order->info['total'] - $order->info['shipping_cost'] - $order->info['tax']),
replace it with:
'amount' => $this->format_raw($order->info['total'] - $shiptotal - $order->info['tax']),
an oscommerce member found a fix for paypal.php that won't take the total to paypal checkout page, here's the fix...
includes/modules/payment/paypal.php
find:
function process_button() {
global $order, $currencies, $currency;
change to:
function process_button() {
global $order, $currencies, $currency, $shipping;
find:
tep_draw_hidden_field('amount', number_format(($order->info['total'] - $order->info['shipping_cost']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
tep_draw_hidden_field('shipping', number_format($order->info['shipping_cost'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
change to:
tep_draw_hidden_field('amount', number_format(($order->info['total'] ) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
tep_draw_hidden_field('shipping', number_format(0 * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
if you cannot find the above code, then you may have incorrect paypal version...
I found that it is inconvient to use tep_not null becuase if you removed the amount and there still be a 0 left where it still notnull. so.
simple changed from:
if (tep_not_null($shiptotal) || tep_not_null($indvcount) || $shiptotal == '0'){
to:
if ($shiptotal != '0'){
so if $shiptotal is not equal to 0, meaning if there is an amount, it will show Shipping Total, then if shiptotal is 0, then it will show Free Shipping.
Previous version cannot apply to this case.
Please change if you have better idea....
included complete addon....
Simple idea to show free shipping if total is 0, and show Shipping Total if price is not null...
Not a complete package, just addon!
Through support thread, reported won't show all shipping option...
found the following block in catalog/includes/classes/shipping.php
// start indvship
//while (list(, $value) = each($this->modules)) {
// $class = substr($value, 0, strrpos($value, '.'));
// $include_modules[] = array('class' => $class, 'file' => $value);
//}
//}
if($indvcount==sizeof($products)){
if ((tep_get_configuration_key_value('MODULE_SHIPPING_INDVSHIP_STATUS')) && ((tep_not_null($shiptotal)) || $shiptotal == 0)) {
$include_modules[] = array('class'=> 'indvship', 'file' => 'indvship.php');
}
} else {
if(sizeof($products)>$indvcount){
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if (($class !='freeshipper') && ($class != 'indvship')) { // comment to show all ship options
// if ($class !='freeshipper') { // uncomment to show all ship options
$include_modules[] = array('class' => $class, 'file' => $value);
}
}
}
}
}
// end indvship
where you can uncomment and comment the line:
if (($class !='freeshipper') && ($class != 'indvship')) { // comment to show all ship options
// if ($class !='freeshipper') { // uncomment to show all ship options
to show all shipping option, however, it doesn't work, so i remove that whole block seems like it doesn't needed to be there. and it shows all shipping option.
see below is the complete shipping.php for catalog/includes/classes/shipping.php
if anyone can find a better fix, please added to this...
you can compare for which part to modify!
<?php
/*
$Id: shipping.php,v 1.23 2003/06/29 11:22:05 hpdl Exp $
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2003 osCommerce
Released under the GNU General Public License
*/
class shipping {
var $modules;
// class constructor
function shipping($module = '') {
// start indvship
// global $language, $PHP_SELF;
global $language, $PHP_SELF, $cart;
// New to fix attributes bug
$cart_products = $cart->get_products();
if (tep_not_null($cart_products)) {
$real_ids = array();
foreach($cart_products as $prod){
$real_ids[] = tep_get_prid($prod['id']);
}
$sql = "SELECT products_ship_methods_id FROM ".TABLE_PRODUCTS_SHIPPING." WHERE products_id IN (".implode(',',$real_ids).") AND products_ship_methods_id IS NOT NULL AND products_ship_methods_id <> ''";
$query = mysql_query($sql);
// End new bug fix
$allow_mod_array = array();
while($rec = mysql_fetch_array($query)){
if(empty($allow_mod_array)) $startedempty = true;
$methods_array = array();
$methods_array = explode(';',$rec['products_ship_methods_id']);
if(!empty($methods_array)){
foreach($methods_array as $method){
$allow_mod_array[] = $method;
}
}
if($startedempty){
$startedempty = false;
}else{
$temp_array = array();
foreach($allow_mod_array as $val){
$temp_array[$val]++;
}
$allow_mod_array = array();
foreach($temp_array as $key => $val){
if($val > 1){
$allow_mod_array[] = $key;
}
}
}
}
}
// INDIV_SM END
if (defined('MODULE_SHIPPING_INSTALLED') && tep_not_null(MODULE_SHIPPING_INSTALLED)) {
$this->modules = explode(';', MODULE_SHIPPING_INSTALLED);
// INDIV_SM START
if (tep_not_null($cart_products)) {
$temp_array = $this->modules;
$this->modules = array();
foreach($temp_array as $val){
if(mysql_num_rows($query)==0 || in_array(str_replace('.php','',$val),$allow_mod_array)) {
$this->modules[] = $val;
}
}
}
// INDIV_SM END
$include_modules = array();
if ( (tep_not_null($module)) && (in_array(substr($module['id'], 0, strpos($module['id'], '_')) . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)), $this->modules)) ) {
$include_modules[] = array('class' => substr($module['id'], 0, strpos($module['id'], '_')), 'file' => substr($module['id'], 0, strpos($module['id'], '_')) . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)));
} else {
reset($this->modules);
//// original block >>>>
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
$include_modules[] = array('class' => $class, 'file' => $value);
}
}
//// end original block <<<<
/* >>>> below where it doesn't show all option, and doesn't seem nessecarily needed <<<<<<<<<<<
// start indvship
//while (list(, $value) = each($this->modules)) {
// $class = substr($value, 0, strrpos($value, '.'));
// $include_modules[] = array('class' => $class, 'file' => $value);
//}
//}
if($indvcount==sizeof($products)){
if ((tep_get_configuration_key_value('MODULE_SHIPPING_INDVSHIP_STATUS')) && ((tep_not_null($shiptotal)) || $shiptotal == 0)) {
$include_modules[] = array('class'=> 'indvship', 'file' => 'indvship.php');
}
} else {
if(sizeof($products)>$indvcount){
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if (($class !='freeshipper') && ($class != 'indvship')) { // comment to show all ship options
// if ($class !='freeshipper') { // uncomment to show all ship options
$include_modules[] = array('class' => $class, 'file' => $value);
}
}
}
}
}
// end indvship
*/
for ($i=0, $n=sizeof($include_modules); $i<$n; $i++) {
include(DIR_WS_LANGUAGES . $language . '/modules/shipping/' . $include_modules[$i]['file']);
include(DIR_WS_MODULES . 'shipping/' . $include_modules[$i]['file']);
$GLOBALS[$include_modules[$i]['class']] = new $include_modules[$i]['class'];
}
}
}
function quote($method = '', $module = '') {
global $total_weight, $shipping_weight, $shipping_quoted, $shipping_num_boxes;
$quotes_array = array();
if (is_array($this->modules)) {
$shipping_quoted = '';
$shipping_num_boxes = 1;
$shipping_weight = $total_weight;
if (SHIPPING_BOX_WEIGHT >= $shipping_weight*SHIPPING_BOX_PADDING/100) {
$shipping_weight = $shipping_weight+SHIPPING_BOX_WEIGHT;
} else {
$shipping_weight = $shipping_weight + ($shipping_weight*SHIPPING_BOX_PADDING/100);
}
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;
}
$include_quotes = array();
reset($this->modules);
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if (tep_not_null($module)) {
if ( ($module == $class) && ($GLOBALS[$class]->enabled) ) {
$include_quotes[] = $class;
}
} elseif ($GLOBALS[$class]->enabled) {
$include_quotes[] = $class;
}
}
$size = sizeof($include_quotes);
for ($i=0; $i<$size; $i++) {
$quotes = $GLOBALS[$include_quotes[$i]]->quote($method);
if (is_array($quotes)) $quotes_array[] = $quotes;
}
}
return $quotes_array;
}
//start indvship
function get_shiptotal() {
global $cart, $order;
$this->shiptotal = '';
$products = $cart->get_products();
for ($i=0, $n=sizeof($products); $i<$n; $i++) {
if (tep_not_null($products[$i]['products_ship_price'])) {
$products_ship_price = $products[$i]['products_ship_price'];
$products_ship_price_two = $products[$i]['products_ship_price_two'];
$products_ship_zip = $products[$i]['products_ship_zip'];
$qty = $products[$i]['quantity'];
if(tep_not_null($products_ship_price) ||tep_not_null($products_ship_price_two)){
$this->shiptotal += ($products_ship_price);
if ($qty > 1) {
if (tep_not_null($products_ship_price_two)) {
$this->shiptotal += ($products_ship_price_two * ($qty-1));
} else {
$this->shiptotal += ($products_ship_price * ($qty-1));
}
}/////////////NOT HERE <<------------
}
}
}// CHECK TO SEE IF SHIPPING TO HOME COUNTRY, IF NOT INCREASE SHIPPING COSTS BY AMOUNT SET IN ADMIN/////////////move back here <<------------
if (($order->delivery['country']['id']) != INDIVIDUAL_SHIP_HOME_COUNTRY) {
if(INDIVIDUAL_SHIP_INCREASE > '0' || $this->shiptotal > '0') {
$this->shiptotal *= INDIVIDUAL_SHIP_INCREASE;
} else {
$this->shiptotal += INDIVIDUAL_SHIP_INCREASE * $this->get_indvcount();
}
return $this->shiptotal;
// not sure why this is needed, but it now works correctly for home country - by Ed
} else {
$this->shiptotal *= 1;
return $this->shiptotal;
}
}
function get_indvcount() {
global $cart;
$this->indvcount = '';
$products = $cart->get_products();
for ($i=0, $n=sizeof($products); $i<$n; $i++) {
if (tep_not_null($products[$i]['products_ship_price'])) {
$products_ship_price = $products[$i]['products_ship_price'];//}
$products_ship_price_two = $products[$i]['products_ship_price_two'];
if(is_numeric($products_ship_price)){
$this->indvcount += '1';
}
}
}
return $this->indvcount;
}
// end indvship
function cheapest() {
if (is_array($this->modules)) {
$rates = array();
reset($this->modules);
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if ($GLOBALS[$class]->enabled) {
$quotes = $GLOBALS[$class]->quotes;
for ($i=0, $n=sizeof($quotes['methods']); $i<$n; $i++) {
if (isset($quotes['methods'][$i]['cost']) && tep_not_null($quotes['methods'][$i]['cost'])) {
$rates[] = array('id' => $quotes['id'] . '_' . $quotes['methods'][$i]['id'],
'title' => $quotes['module'] . ' (' . $quotes['methods'][$i]['title'] . ')',
'cost' => $quotes['methods'][$i]['cost']);
}
}
}
}
$cheapest = false;
for ($i=0, $n=sizeof($rates); $i<$n; $i++) {
if (is_array($cheapest)) {
if ($rates[$i]['cost'] < $cheapest['cost']) {
$cheapest = $rates[$i];
}
} else {
$cheapest = $rates[$i];
}
}
return $cheapest;
}
}
}
?>
Important, this is not a complete package, only fix!
sorry, i messed up alittle bit at the product listing sql query, for product listing,
Erase this if you already install:
$product_query = tep_db_query("select products_description, shipping_description from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$listing['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
$product = tep_db_fetch_array($product_query);
$new_products['products_description, shipping_description'] = $product['products_description, shipping_description'];
Find or replace the above with this:
$product_query = tep_db_query("select products_description from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$listing['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
$product = tep_db_fetch_array($product_query);
$new_products['products_description'] = $product['products_description'];
and add this below:
$product_query = tep_db_query("select shipping_description from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$listing['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
$product = tep_db_fetch_array($product_query);
$shipping_description['shipping_description'] = $product['shipping_description'];
then use this: instead of the one in the instruction.
<!-- this block of code -->
<tr><td>
';
if(tep_not_null($shipping_description['shipping_description'])) echo '•'; else echo '• Carrier information is not available.'; echo $shipping_description['shipping_description'];
echo '
</td></tr>
<!-- this block of code -->
This addon is for putting a short shipping description under products_info, products_listing or anywhere you want.
This is being duplicated by products_name to add a new field of shipping description.
Screen shot included.
This is not a complete package, just addon...
this file includes all the fixes, this package should fixed the $0.00, the problem showing at the checkout_shipping.php, and the sql syntax, if you install it correctly!
use winmerge and becareful when replacing the code!
this is a full package....
sorry, i missed a part of it, this file should be complete one!
Hello, this file fixed the sql syntax error from below, and should show the correct price instead of 0.00 if you installed correctly, also, should show at the checkout_shipping as it does not show with the Home Country fixed bug.
catelog/includes/classes/shipping.php
Use winmerge to compare or simply just replace it if you don't have anyother contribution installed.
if no products exists in the shopping-box and if then the user like to pop-up the shipping-cost information - an sql-error are displayed.
I corrected the code so that the individual shipping methods (defined within the product) only displayed if the box is not empty.
=============================
backup backup backup backup backup
=============================
catalog/includes/classes/shipping.php
---------------------------------------
Find (around row 20-58):
// INDIV_SM BEGIN (this is messy i know)
global $cart;
// New to fix attributes bug
$cart_products = $cart->get_products();
$real_ids = array();
foreach($cart_products as $prod){
$real_ids[] = tep_get_prid($prod['id']);
}
$sql = "SELECT shipping_methods FROM ".TABLE_PRODUCTS." WHERE products_id IN (".implode(',',$real_ids).") AND shipping_methods IS NOT NULL AND shipping_methods <> ''";
$query = mysql_query($sql);
// End new bug fix
$allow_mod_array = array();
while($rec = mysql_fetch_array($query)){
if(empty($allow_mod_array)) $startedempty = true;
$methods_array = array();
$methods_array = explode(';',$rec['shipping_methods']);
if(!empty($methods_array)){
foreach($methods_array as $method){
$allow_mod_array[] = $method;
}
}
if($startedempty){
$startedempty = false;
}else{
$temp_array = array();
foreach($allow_mod_array as $val){
$temp_array[$val]++;
}
$allow_mod_array = array();
foreach($temp_array as $key => $val){
if($val > 1){
$allow_mod_array[] = $key;
}
}
}
}
// INDIV_SM END
and replaced it with:
// INDIV_SM BEGIN (this is messy i know)
global $cart;
// New to fix attributes bug
$cart_products = $cart->get_products();
if (tep_not_null($cart_products)) {
$real_ids = array();
foreach($cart_products as $prod){
$real_ids[] = tep_get_prid($prod['id']);
}
$sql = "SELECT shipping_methods FROM ".TABLE_PRODUCTS." WHERE products_id IN (".implode(',',$real_ids).") AND shipping_methods IS NOT NULL AND shipping_methods <> ''";
$query = mysql_query($sql);
// End new bug fix
$allow_mod_array = array();
while($rec = mysql_fetch_array($query)){
if(empty($allow_mod_array)) $startedempty = true;
$methods_array = array();
$methods_array = explode(';',$rec['shipping_methods']);
if(!empty($methods_array)){
foreach($methods_array as $method){
$allow_mod_array[] = $method;
}
}
if($startedempty){
$startedempty = false;
}else{
$temp_array = array();
foreach($allow_mod_array as $val){
$temp_array[$val]++;
}
$allow_mod_array = array();
foreach($temp_array as $key => $val){
if($val > 1){
$allow_mod_array[] = $key;
}
}
}
}
}
// INDIV_SM END
second change (around row 63-73):
Find:
// INDIV_SM START
$temp_array = $this->modules;
$this->modules = array();
foreach($temp_array as $val){
if(mysql_num_rows($query)==0 || in_array(str_replace('.php','',$val),$allow_mod_array)) {
$this->modules[] = $val;
}
}
// INDIV_SM END
and replace it with:
// INDIV_SM START
if (tep_not_null($cart_products)) {
$temp_array = $this->modules;
$this->modules = array();
foreach($temp_array as $val){
if(mysql_num_rows($query)==0 || in_array(str_replace('.php','',$val),$allow_mod_array)) {
$this->modules[] = $val;
}
}
}
// INDIV_SM END
Thats all. Hope this solve it for everyone, within my shop it works. ;-))
I've attached my shipping.php -- use winmerge or other tools to compare it with your own version! I've installed some other contribution that changed this file.
kind regards
peter
This is a full file set again, with updated instructions and a bug fix to the home country Indvidual Ship Rate.
I forgot to include the sinstructions to install the module and setup some admin configurations. Here is the full set of files with these included.
Ed
I have included a full file set, tested and working which can be unzipped and uploaded to a new install, based on the post prior to mine. That's it! The instructions include info to install in a modified OSC site.
Look luck, Ed
This is to fix a bug in the install
10-categories.php
a missing ')' causes a mysql error when you try to duplicate an item in your catalog.
I was asked by a client to get this working for him as the initial instructions were sketchy.
This takes the mod right back to V2.0 MS2.2 by Farrukh Saeed. After successful installation the upgrade path should not be difficult if you need it.
You can upload the packaged files to a FRESH MS2.2 and need to alter no files, just follow the read.me to add a table to the DB then set it up in admin.
Bug fix and language file included.
Bug fix1
classes/shipping
changed and moved
if (($order->delivery['country']['id']) != INDIVIDUAL_SHIP_HOME_COUNTRY) {
if(INDIVIDUAL_SHIP_INCREASE > '0' || $this->shiptotal > '0') //NEW
$this->shiptotal *= INDIVIDUAL_SHIP_INCREASE;
else $this->shiptotal += INDIVIDUAL_SHIP_INCREASE; //NEW
}
#2 forgot to add to new install instructions
'invcost' => $shipping_modules->get_shiptotal()
in checkout_shipping
This has homewetbar changes, some bug fixes and ability to add '0' shipping price.
There are changes to indvship.php.
Includes
Instructions for 4.1/4.2 and new install.
indvship.php file (goes in modules/shipping)
Individual Ship v4.2a
CHANGES
- Minor bug fix in order.php now it will display the shipping method + the amount of additional shipping in the order confirmation screen.
TO UPGRADE:
classesorder.php
FIND:
'shipping_method' => $shipping['title'],
CHANGE TO:
'shipping_method' => $shipping_title, //individual ship
CHANGE
Individual Ship v4.2
ADDITIONS:
- You can now set in admin a default country and an amount to charge extra if shipping outside the default country.
- Code to display how much the extra freight will be to your customers in your product_info.php
CHANGES:
- Removed shipping.php from application_top.php, and it now works in conjunction with other ship methods. Previously if you tried to use other ship methods with this contribution it make them unusable. All credit goes to Frank M. for this change to the code.
This is the update for Advanced Individual Shipping which supports other shipping methods.
If you have a problem
1-check posts first
2-then ask for help
here http://forums.oscommerce.com/index.php?showtopic=50221
2 Steps forgot to add in instructions.
starting at step 7
7- catalog/checkout_confirmation.php
8- catalog/checkout_process.php --new
9- catalog/checkout_paypalipn.php --new
If you have
require(DIR_WS_CLASSES . 'shipping.php');
$shipping_modules = new shipping($shipping);
comment out
//require(DIR_WS_CLASSES . 'shipping.php');
//$shipping_modules = new shipping($shipping);
That is the only change here. Fix in download
Updated download.
Includes language file from original release.
I have added my classes/ files here. DO NOT ADD THE TO YOUR CATALOG. Just use as a reference. There are other contributions here and you WILL get an error if you use these.
Note I am using a loaded version of osc I tried to make the instructions apply to both. No instructions here see previous files.
WHAT V4.1 does?
If product count = 1 and indvship
Shows only invdship for that product.
If product count = 1 and no indvship
Show all other methods
If product count > 1 and none are indvship
show all other methods
If product count >1 and one or more has invship
show invship total and all other methods
at checkout shipping
If product count >1 and one or more has invship
show all other methods to choose from with statement
"You have x products with individual shipping value of $y. This will be added to the method you select"
If only indv shipping only shows total shipping no choices.
At checkout adds all shipping methods to total shipping.
http://forums.oscommerce.com/index.php?showtopic=50221
Credit
D. M. Gremlin for starting this and creating the original contribution.
Farrukh Saeed for updating it.
1 file to add/replace
1 table to add
8 files to modify
I have changed several things from the original release of indv shipping.
Major changes
Created separate table for products TABLE_PRODUCTS_SHIPPING (products_shipping), you do not need to ceate a separate table if you have already installed this, however I do recommend it. If you do not create a table when that table TABLE_PRODUCTS_SHIPPING is mentioned replace TABLE_PRODUCTS. Note: Having one table with too many fields slows performance and the table will heave high Overhead and need to be optimized frequently.
Moved several items out of shopping_cart and into shipping class (this is a shipping contribution).
If you have the older indv shipping contribution I suggest you go through the original steps and remove it.
I was planning on adding multiple individual shipping options like express, two day and international but I think Rick Wise beat me to it. I have not tried it yet. http://www.oscommerce.com/community/contributions,2918 but will look into it and see if I can add it here. Also I may add Eyal Shoabi addition to display price at a later date.
This works on all sites I have tried.
HOWEVER I might have forgotten to add steps in instructions.
If you have problems email (see file)
This will simply add a line with the current ship price of an item so customers will have an idea on total price of the item.
Some minor bug fixes.
Fixed some minor bugs.
Now it also supports Additional Shipping Prices per product.
This adds the ability for each additional product after the first to have a lower or different shipping price. (By chuck)
Discuss here:
http://forums.oscommerce.com/viewtopic.php?t=56123
Hi
I have just updated the Individual Product Shipping Prices v1.0 by dm.gremlin for Milestone 2.2
I have added all the necessary files.
Added Feature:
If the Individual Shipping Prices is enabled and the price set in the Admin => Categories => Products
At checkout_shipping.pho page, only Individual Shipping Module will be visible and available. And if the Individual Price is not set for a product. You will get other Shipping Modules which you might be running besides Individual Shipping Mod.
Discussion here: http://forums.oscommerce.com/viewtopic.php?t=56123
This shipping module will allow you to set an individual shipping price for each product. This module is kind of like the 'Shipping rate per product', or 'prodrate' shipping module designed by Joe Janos, except this module does not use the 'weight' field. Instead, this module adds a new field to your products table to hold the individual shipping price data. This means that you can use this module with any other module if you like. Intigration with the contribution 'multi-vendor shipping' is also explained.
Support forum thread at: http://forums.oscommerce.com/viewtopic.php?t=50221
