Jump to content
edtiger

[CONTRIBUTION] product setup fee

Recommended Posts

I needed a solution for one of my shops where I could charge a one_time set-up fee for products irregardless of product quantity. I created this contribution to solve my problem using product attributes. After this contribution is installed set your Price Prefix in the attribute section to # instead of - or +. Once set, the setup fee is added only once insted of being multiplied by the quantity.

 

It is possible there are bugs in the code and it has not been tested with any sites which use advanced attribute contributions.

 

Enjoy, and I will try to help if I can.

Share this post


Link to post
Share on other sites
Product Setup Fee Contribution may be found here:Product Setup Fee

 

Hi, Ed!

 

I need the exact same thing, but am having a little trouble following the instructions...

 

I can't even find the lines

if ($attribute_price['price_prefix'] == '+') {

$attributes_price += $attribute_price['options_values_price'];

... in STEP 5: admin/includes/classes/order.php...

 

It says around line 245, and I only have 126 lines in my (albeit modified) file...

 

I'm brand new it this, so "gross stupidity" isn't beyond my capacity!

 

Thanks,

Lou

Share this post


Link to post
Share on other sites

Sorry so long to reply. For some reason, I never received an email that there was a post to this forum. If you still need help, please post your file here and I will see what I can do.

Share this post


Link to post
Share on other sites
Sorry so long to reply.  For some reason, I never received an email that there was a post to this forum.  If you still need help, please post your file here and I will see what I can do.

 

 

No problem, Ed... I got distracted by my hosting service's inability to keep php up and running...

 

Still have an interest, and here's the file, THANKS!

Lou

 

<?php
/*
 $Id: order.php,v 1.7 2003/06/20 16:23:08 hpdl Exp $

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright (c) 2003 osCommerce

 Released under the GNU General Public License
*/

 class order {
   var $info, $totals, $products, $customer, $delivery;

   function order($order_id) {
     $this->info = array();
     $this->totals = array();
     $this->products = array();
     $this->customer = array();
     $this->delivery = array();

     $this->query($order_id);
   }

   function query($order_id) {
     //begin PayPal_Shopping_Cart_IPN
   $order_query = tep_db_query("select customers_name, customers_company, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified, customers_id, payment_id from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
//end PayPal_Shopping_Cart_IPN
     $order = tep_db_fetch_array($order_query);

     $totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");
     while ($totals = tep_db_fetch_array($totals_query)) {
       $this->totals[] = array('title' => $totals['title'],
                               'text' => $totals['text']);
     }

     $this->info = array('currency' => $order['currency'],
                         'currency_value' => $order['currency_value'],
                         'payment_method' => $order['payment_method'],
                         'cc_type' => $order['cc_type'],
                         'cc_owner' => $order['cc_owner'],
                         'cc_number' => $order['cc_number'],
                         'cc_expires' => $order['cc_expires'],
                         'date_purchased' => $order['date_purchased'],
//begin PayPal_Shopping_Cart_IPN
       'payment_id' => $order['payment_id'],
//end PayPal_Shopping_Cart_IPN
                         'orders_status' => $order['orders_status'],
                         'last_modified' => $order['last_modified']);

     $this->customer = array('name' => $order['customers_name'],
//begin PayPal_Shopping_Cart_IPN
                           'id' => $order['customers_id'],
//end PayPal_Shopping_Cart_IPN
                             'company' => $order['customers_company'],
                             'street_address' => $order['customers_street_address'],
                             'suburb' => $order['customers_suburb'],
                             'city' => $order['customers_city'],
                             'postcode' => $order['customers_postcode'],
                             'state' => $order['customers_state'],
                             'country' => $order['customers_country'],
                             'format_id' => $order['customers_address_format_id'],
                             'telephone' => $order['customers_telephone'],
                             'email_address' => $order['customers_email_address']);

     $this->delivery = array('name' => $order['delivery_name'],
                             'company' => $order['delivery_company'],
                             'street_address' => $order['delivery_street_address'],
                             'suburb' => $order['delivery_suburb'],
                             'city' => $order['delivery_city'],
                             'postcode' => $order['delivery_postcode'],
                             'state' => $order['delivery_state'],
                             'country' => $order['delivery_country'],
                             'format_id' => $order['delivery_address_format_id']);

     $this->billing = array('name' => $order['billing_name'],
                            'company' => $order['billing_company'],
                            'street_address' => $order['billing_street_address'],
                            'suburb' => $order['billing_suburb'],
                            'city' => $order['billing_city'],
                            'postcode' => $order['billing_postcode'],
                            'state' => $order['billing_state'],
                            'country' => $order['billing_country'],
                            'format_id' => $order['billing_address_format_id']);

     $index = 0;
     //begin PayPal_Shopping_Cart_IPN
   $orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price, products_id from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");
//end PayPal_Shopping_Cart_IPN
     while ($orders_products = tep_db_fetch_array($orders_products_query)) {
       $this->products[$index] = array('qty' => $orders_products['products_quantity'],
//begin PayPal_Shopping_Cart_IPN
                                   'id' => $orders_products['products_id'],
                                   'orders_products_id' => $orders_products['orders_products_id'],
//end PayPal_Shopping_Cart_IPN
                                       'name' => $orders_products['products_name'],
                                       'model' => $orders_products['products_model'],
                                       'tax' => $orders_products['products_tax'],
                                       'price' => $orders_products['products_price'],
                                       'final_price' => $orders_products['final_price']);

       $subindex = 0;
       //begin PayPal_Shopping_Cart_IPN
   $attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix, products_options_id, products_options_values_id from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "' and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");
//end PayPal_Shopping_Cart_IPN
       if (tep_db_num_rows($attributes_query)) {
         while ($attributes = tep_db_fetch_array($attributes_query)) {
           $this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],
//begin PayPal_Shopping_Cart_IPN
                                                           'option_id' => $attributes['products_options_id'],
                                                           'value_id' => $attributes['products_options_values_id'],
//end PayPal_Shopping_Cart_IPN
                                                                    'value' => $attributes['products_options_values'],
                                                                    'prefix' => $attributes['price_prefix'],
                                                                    'price' => $attributes['options_values_price']);

           $subindex++;
         }
       }
       $index++;
     }
   }
 }
?>

Share this post


Link to post
Share on other sites

This is what your order.php *should* look like. It appears the file you posted has been corrupted and is missing quite a bit of code. Use a tool like Beyond Compare to compare your order.php to the one posted here. Use the file below as your new order.php, add back in your paypal IPN contribution, and you should be good to go.

 

<?php

/*

  $Id: order.php,v 1.33 2003/06/09 22:25:35 hpdl Exp $

 

  osCommerce, Open Source E-Commerce Solutions

  http://www.oscommerce.com

 

  Copyright © 2003 osCommerce

 

  Released under the GNU General Public License

*/

 

  class order {

    var $info, $totals, $products, $customer, $delivery, $content_type;

 

    function order($order_id = '') {

      $this->info = array();

      $this->totals = array();

      $this->products = array();

      $this->customer = array();

      $this->delivery = array();

 

      if (tep_not_null($order_id)) {

        $this->query($order_id);

      } else {

        $this->cart();

      }

    }

 

    function query($order_id) {

      global $languages_id;

 

      $order_id = tep_db_prepare_input($order_id);

 

      $order_query = tep_db_query("select customers_id, customers_name, customers_company, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

      $order = tep_db_fetch_array($order_query);

 

      $totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");

      while ($totals = tep_db_fetch_array($totals_query)) {

        $this->totals[] = array('title' => $totals['title'],

                                'text' => $totals['text']);

      }

 

      $order_total_query = tep_db_query("select text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' and class = 'ot_total'");

      $order_total = tep_db_fetch_array($order_total_query);

 

      $shipping_method_query = tep_db_query("select title from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' and class = 'ot_shipping'");

      $shipping_method = tep_db_fetch_array($shipping_method_query);

 

      $order_status_query = tep_db_query("select orders_status_name from " . TABLE_ORDERS_STATUS . " where orders_status_id = '" . $order['orders_status'] . "' and language_id = '" . (int)$languages_id . "'");

      $order_status = tep_db_fetch_array($order_status_query);

 

      $this->info = array('currency' => $order['currency'],

                          'currency_value' => $order['currency_value'],

                          'payment_method' => $order['payment_method'],

                          'cc_type' => $order['cc_type'],

                          'cc_owner' => $order['cc_owner'],

                          'cc_number' => $order['cc_number'],

                          'cc_expires' => $order['cc_expires'],

                          'date_purchased' => $order['date_purchased'],

                          'orders_status' => $order_status['orders_status_name'],

                          'last_modified' => $order['last_modified'],

                          'total' => strip_tags($order_total['text']),

                          'shipping_method' => ((substr($shipping_method['title'], -1) == ':') ? substr(strip_tags($shipping_method['title']), 0, -1) : strip_tags($shipping_method['title'])));

 

      $this->customer = array('id' => $order['customers_id'],

                              'name' => $order['customers_name'],

                              'company' => $order['customers_company'],

                              'street_address' => $order['customers_street_address'],

                              'suburb' => $order['customers_suburb'],

                              'city' => $order['customers_city'],

                              'postcode' => $order['customers_postcode'],

                              'state' => $order['customers_state'],

                              'country' => $order['customers_country'],

                              'format_id' => $order['customers_address_format_id'],

                              'telephone' => $order['customers_telephone'],

                              'email_address' => $order['customers_email_address']);

 

      $this->delivery = array('name' => $order['delivery_name'],

                              'company' => $order['delivery_company'],

                              'street_address' => $order['delivery_street_address'],

                              'suburb' => $order['delivery_suburb'],

                              'city' => $order['delivery_city'],

                              'postcode' => $order['delivery_postcode'],

                              'state' => $order['delivery_state'],

                              'country' => $order['delivery_country'],

                              'format_id' => $order['delivery_address_format_id']);

 

      if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {

        $this->delivery = false;

      }

 

      $this->billing = array('name' => $order['billing_name'],

                            'company' => $order['billing_company'],

                            'street_address' => $order['billing_street_address'],

                            'suburb' => $order['billing_suburb'],

                            'city' => $order['billing_city'],

                            'postcode' => $order['billing_postcode'],

                            'state' => $order['billing_state'],

                            'country' => $order['billing_country'],

                            'format_id' => $order['billing_address_format_id']);

 

      $index = 0;

      $orders_products_query = tep_db_query("select orders_products_id, products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price, setup_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");

      while ($orders_products = tep_db_fetch_array($orders_products_query)) {

        $this->products[$index] = array('qty' => $orders_products['products_quantity'],

                                'id' => $orders_products['products_id'],

                                        'name' => $orders_products['products_name'],

                                        'model' => $orders_products['products_model'],

                                        'tax' => $orders_products['products_tax'],

                                        'price' => $orders_products['products_price'],

                                        'final_price' => $orders_products['final_price'],

                                        'setup_price' => $orders_products['setup_price']);

 

        $subindex = 0;

        $attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "' and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");

        if (tep_db_num_rows($attributes_query)) {

          while ($attributes = tep_db_fetch_array($attributes_query)) {

            $this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],

                                                                    'value' => $attributes['products_options_values'],

                                                                    'prefix' => $attributes['price_prefix'],

                                                                    'price' => $attributes['options_values_price']);

 

            $subindex++;

          }

        }

 

        $this->info['tax_groups']["{$this->products[$index]['tax']}"] = '1';

 

        $index++;

      }

    }

 

    function cart() {

      global $customer_id, $sendto, $billto, $cart, $languages_id, $currency, $currencies, $shipping, $payment;

 

      $this->content_type = $cart->get_content_type();

 

      $customer_address_query = tep_db_query("select c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2, co.countries_iso_code_3, co.address_format_id, ab.entry_state from " . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id) where c.customers_id = '" . (int)$customer_id . "' and ab.customers_id = '" . (int)$customer_id . "' and c.customers_default_address_id = ab.address_book_id");

      $customer_address = tep_db_fetch_array($customer_address_query);

 

      $shipping_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$sendto . "'");

      $shipping_address = tep_db_fetch_array($shipping_address_query);

     

      $billing_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$billto . "'");

      $billing_address = tep_db_fetch_array($billing_address_query);

 

      $tax_address_query = tep_db_query("select ab.entry_country_id, ab.entry_zone_id from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)($this->content_type == 'virtual' ? $billto : $sendto) . "'");

      $tax_address = tep_db_fetch_array($tax_address_query);

 

      $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,

                          'currency' => $currency,

                          'currency_value' => $currencies->currencies[$currency]['value'],

                          'payment_method' => $payment,

                          'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''),

                          'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''),

                          'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''),

                          'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''),

                          'shipping_method' => $shipping['title'],

                          'shipping_cost' => $shipping['cost'],

                          'subtotal' => 0,

                          'tax' => 0,

                          'tax_groups' => array(),

                          'comments' => (isset($GLOBALS['comments']) ? $GLOBALS['comments'] : ''));

 

      if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) {

        $this->info['payment_method'] = $GLOBALS[$payment]->title;

 

        if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) {

          $this->info['order_status'] = $GLOBALS[$payment]->order_status;

        }

      }

 

      $this->customer = array('firstname' => $customer_address['customers_firstname'],

                              'lastname' => $customer_address['customers_lastname'],

                              'company' => $customer_address['entry_company'],

                              'street_address' => $customer_address['entry_street_address'],

                              'suburb' => $customer_address['entry_suburb'],

                              'city' => $customer_address['entry_city'],

                              'postcode' => $customer_address['entry_postcode'],

                              'state' => ((tep_not_null($customer_address['entry_state'])) ? $customer_address['entry_state'] : $customer_address['zone_name']),

                              'zone_id' => $customer_address['entry_zone_id'],

                              'country' => array('id' => $customer_address['countries_id'], 'title' => $customer_address['countries_name'], 'iso_code_2' => $customer_address['countries_iso_code_2'], 'iso_code_3' => $customer_address['countries_iso_code_3']),

                              'format_id' => $customer_address['address_format_id'],

                              'telephone' => $customer_address['customers_telephone'],

                              'email_address' => $customer_address['customers_email_address']);

 

      $this->delivery = array('firstname' => $shipping_address['entry_firstname'],

                              'lastname' => $shipping_address['entry_lastname'],

                              'company' => $shipping_address['entry_company'],

                              'street_address' => $shipping_address['entry_street_address'],

                              'suburb' => $shipping_address['entry_suburb'],

                              'city' => $shipping_address['entry_city'],

                              'postcode' => $shipping_address['entry_postcode'],

                              'state' => ((tep_not_null($shipping_address['entry_state'])) ? $shipping_address['entry_state'] : $shipping_address['zone_name']),

                              'zone_id' => $shipping_address['entry_zone_id'],

                              'country' => array('id' => $shipping_address['countries_id'], 'title' => $shipping_address['countries_name'], 'iso_code_2' => $shipping_address['countries_iso_code_2'], 'iso_code_3' => $shipping_address['countries_iso_code_3']),

                              'country_id' => $shipping_address['entry_country_id'],

                              'format_id' => $shipping_address['address_format_id']);

 

      $this->billing = array('firstname' => $billing_address['entry_firstname'],

                            'lastname' => $billing_address['entry_lastname'],

                            'company' => $billing_address['entry_company'],

                            'street_address' => $billing_address['entry_street_address'],

                            'suburb' => $billing_address['entry_suburb'],

                            'city' => $billing_address['entry_city'],

                            'postcode' => $billing_address['entry_postcode'],

                            'state' => ((tep_not_null($billing_address['entry_state'])) ? $billing_address['entry_state'] : $billing_address['zone_name']),

                            'zone_id' => $billing_address['entry_zone_id'],

                            'country' => array('id' => $billing_address['countries_id'], 'title' => $billing_address['countries_name'], 'iso_code_2' => $billing_address['countries_iso_code_2'], 'iso_code_3' => $billing_address['countries_iso_code_3']),

                            'country_id' => $billing_address['entry_country_id'],

                            'format_id' => $billing_address['address_format_id']);

 

      $index = 0;

      $products = $cart->get_products();

      for ($i=0, $n=sizeof($products); $i<$n; $i++) {

        $this->products[$index] = array('qty' => $products[$i]['quantity'],

                                        'name' => $products[$i]['name'],

                                        'model' => $products[$i]['model'],

                                        'tax' => tep_get_tax_rate($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),

                                        'tax_description' => tep_get_tax_description($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),

                                        'price' => $products[$i]['price'],

                                        'final_price' => $products[$i]['price'] + $cart->attributes_price($products[$i]['id']),

                                        'setup_price' => $cart->attributes_setup_price($products[$i]['id']),

                                        'weight' => $products[$i]['weight'],

                                        'id' => $products[$i]['id']);

 

        if ($products[$i]['attributes']) {

          $subindex = 0;

          reset($products[$i]['attributes']);

          while (list($option, $value) = each($products[$i]['attributes'])) {

            $attributes_query = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . (int)$products[$i]['id'] . "' and pa.options_id = '" . (int)$option . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . (int)$value . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . (int)$languages_id . "' and poval.language_id = '" . (int)$languages_id . "'");

            $attributes = tep_db_fetch_array($attributes_query);

 

            $this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options_name'],

                                                                    'value' => $attributes['products_options_values_name'],

                                                                    'option_id' => $option,

                                                                    'value_id' => $value,

                                                                    'prefix' => $attributes['price_prefix'],

                                                                    'price' => $attributes['options_values_price']);

 

            $subindex++;

          }

        }

 

        $shown_price = (tep_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty']) + $this->products[$index]['setup_price'];

        $this->info['subtotal'] += $shown_price;

 

        $products_tax = $this->products[$index]['tax'];

        $products_tax_description = $this->products[$index]['tax_description'];

        if (DISPLAY_PRICE_WITH_TAX == 'true') {

          $this->info['tax'] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

          if (isset($this->info['tax_groups']["$products_tax_description"])) {

            $this->info['tax_groups']["$products_tax_description"] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

          } else {

            $this->info['tax_groups']["$products_tax_description"] = $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

          }

        } else {

          $this->info['tax'] += ($products_tax / 100) * $shown_price;

          if (isset($this->info['tax_groups']["$products_tax_description"])) {

            $this->info['tax_groups']["$products_tax_description"] += ($products_tax / 100) * $shown_price;

          } else {

            $this->info['tax_groups']["$products_tax_description"] = ($products_tax / 100) * $shown_price;

          }

        }

 

        $index++;

      }

 

      if (DISPLAY_PRICE_WITH_TAX == 'true') {

        $this->info['total'] = $this->info['subtotal'] + $this->info['shipping_cost'];

      } else {

        $this->info['total'] = $this->info['subtotal'] + $this->info['tax'] + $this->info['shipping_cost'];

      }

    }

  }

?>

Share this post


Link to post
Share on other sites
This is what your order.php *should* look like.  It appears the file you posted has been corrupted and is missing quite a bit of code.  Use a tool like Beyond Compare to compare your order.php to the one posted here.  Use the file below as your new order.php, add back in your paypal IPN contribution, and you should be good to go.

 

As I said, I'm not really well versed when it comes to php, but could it be the PayPal mods are in conflict?

 

Quoting from the PayPal IPN instructions,

Find:

    $orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");

 

Replace with: (adds 'products_id')

//begin PayPal_Shopping_Cart_IPN

    $orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price, products_id from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");

//end PayPal_Shopping_Cart_IPN

 

somewhere around line 104 of the file you sent I find what appears to want to be replaced above, but it appears you've modified the line already with "setup_price"?

 

Am I being overly technical?

 

I really appreciate all the help, Ed...

 

Lou

Share this post


Link to post
Share on other sites

Ed,

 

Belay that last request, if you would, please... I think I have it figured out...

 

BTW, Lemme tell ya from the perspective of one who doesn't have a clue what he's doing in all this, that your original instructions were about the most straightforward, easy to follow, and concise that I've yet seen.

 

Right up to the point they met with my corrupt file, of course!

 

Thanks again for all your efforts! I really appreciate the help!

 

Lou

Share this post


Link to post
Share on other sites
This is what your order.php *should* look like.  It appears the file you posted has been corrupted and is missing quite a bit of code.  Use a tool like Beyond Compare to compare your order.php to the one posted here.  Use the file below as your new order.php, add back in your paypal IPN contribution, and you should be good to go.

Hey Ed,

 

I tried your file with my PayPal mods and it kept producing an error message. So I tried your file "out of the box" thinking the worst that could happen was PayPal would fail, and I could deal with that later. Still got the error.

 

So I went back to my install copy of osc, and this is the virgin, entire admin/includes/classes/order.php that follows. My only guess is that its a different build...

 

FYI, my friend...

Lou

 

<?php
/*
 $Id: order.php,v 1.7 2003/06/20 16:23:08 hpdl Exp $

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright (c) 2003 osCommerce

 Released under the GNU General Public License
*/

 class order {
   var $info, $totals, $products, $customer, $delivery;

   function order($order_id) {
     $this->info = array();
     $this->totals = array();
     $this->products = array();
     $this->customer = array();
     $this->delivery = array();

     $this->query($order_id);
   }

   function query($order_id) {
     $order_query = tep_db_query("select customers_name, customers_company, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
     $order = tep_db_fetch_array($order_query);

     $totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");
     while ($totals = tep_db_fetch_array($totals_query)) {
       $this->totals[] = array('title' => $totals['title'],
                               'text' => $totals['text']);
     }

     $this->info = array('currency' => $order['currency'],
                         'currency_value' => $order['currency_value'],
                         'payment_method' => $order['payment_method'],
                         'cc_type' => $order['cc_type'],
                         'cc_owner' => $order['cc_owner'],
                         'cc_number' => $order['cc_number'],
                         'cc_expires' => $order['cc_expires'],
                         'date_purchased' => $order['date_purchased'],
                         'orders_status' => $order['orders_status'],
                         'last_modified' => $order['last_modified']);

     $this->customer = array('name' => $order['customers_name'],
                             'company' => $order['customers_company'],
                             'street_address' => $order['customers_street_address'],
                             'suburb' => $order['customers_suburb'],
                             'city' => $order['customers_city'],
                             'postcode' => $order['customers_postcode'],
                             'state' => $order['customers_state'],
                             'country' => $order['customers_country'],
                             'format_id' => $order['customers_address_format_id'],
                             'telephone' => $order['customers_telephone'],
                             'email_address' => $order['customers_email_address']);

     $this->delivery = array('name' => $order['delivery_name'],
                             'company' => $order['delivery_company'],
                             'street_address' => $order['delivery_street_address'],
                             'suburb' => $order['delivery_suburb'],
                             'city' => $order['delivery_city'],
                             'postcode' => $order['delivery_postcode'],
                             'state' => $order['delivery_state'],
                             'country' => $order['delivery_country'],
                             'format_id' => $order['delivery_address_format_id']);

     $this->billing = array('name' => $order['billing_name'],
                            'company' => $order['billing_company'],
                            'street_address' => $order['billing_street_address'],
                            'suburb' => $order['billing_suburb'],
                            'city' => $order['billing_city'],
                            'postcode' => $order['billing_postcode'],
                            'state' => $order['billing_state'],
                            'country' => $order['billing_country'],
                            'format_id' => $order['billing_address_format_id']);

     $index = 0;
     $orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");
     while ($orders_products = tep_db_fetch_array($orders_products_query)) {
       $this->products[$index] = array('qty' => $orders_products['products_quantity'],
                                       'name' => $orders_products['products_name'],
                                       'model' => $orders_products['products_model'],
                                       'tax' => $orders_products['products_tax'],
                                       'price' => $orders_products['products_price'],
                                       'final_price' => $orders_products['final_price']);

       $subindex = 0;
       $attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "' and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");
       if (tep_db_num_rows($attributes_query)) {
         while ($attributes = tep_db_fetch_array($attributes_query)) {
           $this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],
                                                                    'value' => $attributes['products_options_values'],
                                                                    'prefix' => $attributes['price_prefix'],
                                                                    'price' => $attributes['options_values_price']);

           $subindex++;
         }
       }
       $index++;
     }
   }
 }
?>

Share this post


Link to post
Share on other sites

I too am trying to implement this contribution and am having the same problem as the last post. I just noticed that the file header version on my ORDER.PHP is 1.7 (same as above) but Ed's sample code is version 1.33. Maybe this is the problem...

 

Can anyone help resolve this? Thank you!

Edited by kgmmusic

Share this post


Link to post
Share on other sites

Ed,

 

This sounds like a great contribution and we are very much in need of this option, however if you can take a moment to clarify some of the questions regarding the version and possible changes to your contribution, we all would be thankful. :thumbsup:

Share this post


Link to post
Share on other sites

Sorry about the lack of replies in the last couple months. For some reason, I'm not getting notifications when people post to the form. I probably have something misconfigured somewhere. Anyway, I will sort through this and try to come up with a concise answer to all the questions. The build dates are only 10 days apart...

Share this post


Link to post
Share on other sites

In my hasty reply back in september I mixed up catalog/admin/includes/classes/order.php and catalog/includes/classes/order.php. That would explain the *different* build dates and vastly different file contents. I will post both of my files here for you to compare:

 

catalog/admin/includes/classes/order.php

 

 

<?php

/*

$Id: order.php,v 1.7 2003/06/20 16:23:08 hpdl Exp $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2003 osCommerce

 

Released under the GNU General Public License

*/

 

class order {

var $info, $totals, $products, $customer, $delivery;

 

function order($order_id) {

$this->info = array();

$this->totals = array();

$this->products = array();

$this->customer = array();

$this->delivery = array();

 

$this->query($order_id);

}

 

function query($order_id) {

$order_query = tep_db_query("select customers_name, customers_company, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

$order = tep_db_fetch_array($order_query);

 

$totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");

while ($totals = tep_db_fetch_array($totals_query)) {

$this->totals[] = array('title' => $totals['title'],

'text' => $totals['text']);

}

 

$this->info = array('currency' => $order['currency'],

'currency_value' => $order['currency_value'],

'payment_method' => $order['payment_method'],

'cc_type' => $order['cc_type'],

'cc_owner' => $order['cc_owner'],

'cc_number' => $order['cc_number'],

'cc_expires' => $order['cc_expires'],

'date_purchased' => $order['date_purchased'],

'orders_status' => $order['orders_status'],

'last_modified' => $order['last_modified']);

 

$this->customer = array('name' => $order['customers_name'],

'company' => $order['customers_company'],

'street_address' => $order['customers_street_address'],

'suburb' => $order['customers_suburb'],

'city' => $order['customers_city'],

'postcode' => $order['customers_postcode'],

'state' => $order['customers_state'],

'country' => $order['customers_country'],

'format_id' => $order['customers_address_format_id'],

'telephone' => $order['customers_telephone'],

'email_address' => $order['customers_email_address']);

 

$this->delivery = array('name' => $order['delivery_name'],

'company' => $order['delivery_company'],

'street_address' => $order['delivery_street_address'],

'suburb' => $order['delivery_suburb'],

'city' => $order['delivery_city'],

'postcode' => $order['delivery_postcode'],

'state' => $order['delivery_state'],

'country' => $order['delivery_country'],

'format_id' => $order['delivery_address_format_id']);

 

$this->billing = array('name' => $order['billing_name'],

'company' => $order['billing_company'],

'street_address' => $order['billing_street_address'],

'suburb' => $order['billing_suburb'],

'city' => $order['billing_city'],

'postcode' => $order['billing_postcode'],

'state' => $order['billing_state'],

'country' => $order['billing_country'],

'format_id' => $order['billing_address_format_id']);

 

$index = 0;

$orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price, setup_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");

while ($orders_products = tep_db_fetch_array($orders_products_query)) {

$this->products[$index] = array('qty' => $orders_products['products_quantity'],

'name' => $orders_products['products_name'],

'model' => $orders_products['products_model'],

'tax' => $orders_products['products_tax'],

'price' => $orders_products['products_price'],

'final_price' => $orders_products['final_price'],

'setup_price' => $orders_products['setup_price']);

 

$subindex = 0;

$attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "' and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");

if (tep_db_num_rows($attributes_query)) {

while ($attributes = tep_db_fetch_array($attributes_query)) {

$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],

'value' => $attributes['products_options_values'],

'prefix' => $attributes['price_prefix'],

'price' => $attributes['options_values_price']);

 

$subindex++;

}

}

$index++;

}

}

}

?>

 

 

catalog/includes/classes/order.php

 

 

<?php

/*

$Id: order.php,v 1.33 2003/06/09 22:25:35 hpdl Exp $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2003 osCommerce

 

Released under the GNU General Public License

*/

 

class order {

var $info, $totals, $products, $customer, $delivery, $content_type;

 

function order($order_id = '') {

$this->info = array();

$this->totals = array();

$this->products = array();

$this->customer = array();

$this->delivery = array();

 

if (tep_not_null($order_id)) {

$this->query($order_id);

} else {

$this->cart();

}

}

 

function query($order_id) {

global $languages_id;

 

$order_id = tep_db_prepare_input($order_id);

 

$order_query = tep_db_query("select customers_id, customers_name, customers_company, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

$order = tep_db_fetch_array($order_query);

 

$totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");

while ($totals = tep_db_fetch_array($totals_query)) {

$this->totals[] = array('title' => $totals['title'],

'text' => $totals['text']);

}

 

$order_total_query = tep_db_query("select text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' and class = 'ot_total'");

$order_total = tep_db_fetch_array($order_total_query);

 

$shipping_method_query = tep_db_query("select title from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' and class = 'ot_shipping'");

$shipping_method = tep_db_fetch_array($shipping_method_query);

 

$order_status_query = tep_db_query("select orders_status_name from " . TABLE_ORDERS_STATUS . " where orders_status_id = '" . $order['orders_status'] . "' and language_id = '" . (int)$languages_id . "'");

$order_status = tep_db_fetch_array($order_status_query);

 

$this->info = array('currency' => $order['currency'],

'currency_value' => $order['currency_value'],

'payment_method' => $order['payment_method'],

'cc_type' => $order['cc_type'],

'cc_owner' => $order['cc_owner'],

'cc_number' => $order['cc_number'],

'cc_expires' => $order['cc_expires'],

'date_purchased' => $order['date_purchased'],

'orders_status' => $order_status['orders_status_name'],

'last_modified' => $order['last_modified'],

'total' => strip_tags($order_total['text']),

'shipping_method' => ((substr($shipping_method['title'], -1) == ':') ? substr(strip_tags($shipping_method['title']), 0, -1) : strip_tags($shipping_method['title'])));

 

$this->customer = array('id' => $order['customers_id'],

'name' => $order['customers_name'],

'company' => $order['customers_company'],

'street_address' => $order['customers_street_address'],

'suburb' => $order['customers_suburb'],

'city' => $order['customers_city'],

'postcode' => $order['customers_postcode'],

'state' => $order['customers_state'],

'country' => $order['customers_country'],

'format_id' => $order['customers_address_format_id'],

'telephone' => $order['customers_telephone'],

'email_address' => $order['customers_email_address']);

 

$this->delivery = array('name' => $order['delivery_name'],

'company' => $order['delivery_company'],

'street_address' => $order['delivery_street_address'],

'suburb' => $order['delivery_suburb'],

'city' => $order['delivery_city'],

'postcode' => $order['delivery_postcode'],

'state' => $order['delivery_state'],

'country' => $order['delivery_country'],

'format_id' => $order['delivery_address_format_id']);

 

if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {

$this->delivery = false;

}

 

$this->billing = array('name' => $order['billing_name'],

'company' => $order['billing_company'],

'street_address' => $order['billing_street_address'],

'suburb' => $order['billing_suburb'],

'city' => $order['billing_city'],

'postcode' => $order['billing_postcode'],

'state' => $order['billing_state'],

'country' => $order['billing_country'],

'format_id' => $order['billing_address_format_id']);

 

$index = 0;

$orders_products_query = tep_db_query("select orders_products_id, products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price, setup_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");

while ($orders_products = tep_db_fetch_array($orders_products_query)) {

$this->products[$index] = array('qty' => $orders_products['products_quantity'],

'id' => $orders_products['products_id'],

'name' => $orders_products['products_name'],

'model' => $orders_products['products_model'],

'tax' => $orders_products['products_tax'],

'price' => $orders_products['products_price'],

'final_price' => $orders_products['final_price'],

'setup_price' => $orders_products['setup_price']);

 

$subindex = 0;

$attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "' and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");

if (tep_db_num_rows($attributes_query)) {

while ($attributes = tep_db_fetch_array($attributes_query)) {

$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],

'value' => $attributes['products_options_values'],

'prefix' => $attributes['price_prefix'],

'price' => $attributes['options_values_price']);

 

$subindex++;

}

}

 

$this->info['tax_groups']["{$this->products[$index]['tax']}"] = '1';

 

$index++;

}

}

 

function cart() {

global $customer_id, $sendto, $billto, $cart, $languages_id, $currency, $currencies, $shipping, $payment;

 

$this->content_type = $cart->get_content_type();

 

$customer_address_query = tep_db_query("select c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2, co.countries_iso_code_3, co.address_format_id, ab.entry_state from " . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id) where c.customers_id = '" . (int)$customer_id . "' and ab.customers_id = '" . (int)$customer_id . "' and c.customers_default_address_id = ab.address_book_id");

$customer_address = tep_db_fetch_array($customer_address_query);

 

$shipping_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$sendto . "'");

$shipping_address = tep_db_fetch_array($shipping_address_query);

 

$billing_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$billto . "'");

$billing_address = tep_db_fetch_array($billing_address_query);

 

$tax_address_query = tep_db_query("select ab.entry_country_id, ab.entry_zone_id from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)($this->content_type == 'virtual' ? $billto : $sendto) . "'");

$tax_address = tep_db_fetch_array($tax_address_query);

 

$this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,

'currency' => $currency,

'currency_value' => $currencies->currencies[$currency]['value'],

'payment_method' => $payment,

'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''),

'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''),

'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''),

'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''),

'shipping_method' => $shipping['title'],

'shipping_cost' => $shipping['cost'],

'subtotal' => 0,

'tax' => 0,

'tax_groups' => array(),

'comments' => (isset($GLOBALS['comments']) ? $GLOBALS['comments'] : ''));

 

if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) {

$this->info['payment_method'] = $GLOBALS[$payment]->title;

 

if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) {

$this->info['order_status'] = $GLOBALS[$payment]->order_status;

}

}

 

$this->customer = array('firstname' => $customer_address['customers_firstname'],

'lastname' => $customer_address['customers_lastname'],

'company' => $customer_address['entry_company'],

'street_address' => $customer_address['entry_street_address'],

'suburb' => $customer_address['entry_suburb'],

'city' => $customer_address['entry_city'],

'postcode' => $customer_address['entry_postcode'],

'state' => ((tep_not_null($customer_address['entry_state'])) ? $customer_address['entry_state'] : $customer_address['zone_name']),

'zone_id' => $customer_address['entry_zone_id'],

'country' => array('id' => $customer_address['countries_id'], 'title' => $customer_address['countries_name'], 'iso_code_2' => $customer_address['countries_iso_code_2'], 'iso_code_3' => $customer_address['countries_iso_code_3']),

'format_id' => $customer_address['address_format_id'],

'telephone' => $customer_address['customers_telephone'],

'email_address' => $customer_address['customers_email_address']);

 

$this->delivery = array('firstname' => $shipping_address['entry_firstname'],

'lastname' => $shipping_address['entry_lastname'],

'company' => $shipping_address['entry_company'],

'street_address' => $shipping_address['entry_street_address'],

'suburb' => $shipping_address['entry_suburb'],

'city' => $shipping_address['entry_city'],

'postcode' => $shipping_address['entry_postcode'],

'state' => ((tep_not_null($shipping_address['entry_state'])) ? $shipping_address['entry_state'] : $shipping_address['zone_name']),

'zone_id' => $shipping_address['entry_zone_id'],

'country' => array('id' => $shipping_address['countries_id'], 'title' => $shipping_address['countries_name'], 'iso_code_2' => $shipping_address['countries_iso_code_2'], 'iso_code_3' => $shipping_address['countries_iso_code_3']),

'country_id' => $shipping_address['entry_country_id'],

'format_id' => $shipping_address['address_format_id']);

 

$this->billing = array('firstname' => $billing_address['entry_firstname'],

'lastname' => $billing_address['entry_lastname'],

'company' => $billing_address['entry_company'],

'street_address' => $billing_address['entry_street_address'],

'suburb' => $billing_address['entry_suburb'],

'city' => $billing_address['entry_city'],

'postcode' => $billing_address['entry_postcode'],

'state' => ((tep_not_null($billing_address['entry_state'])) ? $billing_address['entry_state'] : $billing_address['zone_name']),

'zone_id' => $billing_address['entry_zone_id'],

'country' => array('id' => $billing_address['countries_id'], 'title' => $billing_address['countries_name'], 'iso_code_2' => $billing_address['countries_iso_code_2'], 'iso_code_3' => $billing_address['countries_iso_code_3']),

'country_id' => $billing_address['entry_country_id'],

'format_id' => $billing_address['address_format_id']);

 

$index = 0;

$products = $cart->get_products();

for ($i=0, $n=sizeof($products); $i<$n; $i++) {

$this->products[$index] = array('qty' => $products[$i]['quantity'],

'name' => $products[$i]['name'],

'model' => $products[$i]['model'],

'tax' => tep_get_tax_rate($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),

'tax_description' => tep_get_tax_description($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $tax_address['entry_zone_id']),

'price' => $products[$i]['price'],

'final_price' => $products[$i]['price'] + $cart->attributes_price($products[$i]['id']),

'setup_price' => $cart->attributes_setup_price($products[$i]['id']),

'weight' => $products[$i]['weight'],

'id' => $products[$i]['id']);

 

if ($products[$i]['attributes']) {

$subindex = 0;

reset($products[$i]['attributes']);

while (list($option, $value) = each($products[$i]['attributes'])) {

$attributes_query = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . (int)$products[$i]['id'] . "' and pa.options_id = '" . (int)$option . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . (int)$value . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . (int)$languages_id . "' and poval.language_id = '" . (int)$languages_id . "'");

$attributes = tep_db_fetch_array($attributes_query);

 

$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options_name'],

'value' => $attributes['products_options_values_name'],

'option_id' => $option,

'value_id' => $value,

'prefix' => $attributes['price_prefix'],

'price' => $attributes['options_values_price']);

 

$subindex++;

}

}

 

$shown_price = (tep_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty']) + $this->products[$index]['setup_price'];

$this->info['subtotal'] += $shown_price;

 

$products_tax = $this->products[$index]['tax'];

$products_tax_description = $this->products[$index]['tax_description'];

if (DISPLAY_PRICE_WITH_TAX == 'true') {

$this->info['tax'] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

if (isset($this->info['tax_groups']["$products_tax_description"])) {

$this->info['tax_groups']["$products_tax_description"] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

} else {

$this->info['tax_groups']["$products_tax_description"] = $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

}

} else {

$this->info['tax'] += ($products_tax / 100) * $shown_price;

if (isset($this->info['tax_groups']["$products_tax_description"])) {

$this->info['tax_groups']["$products_tax_description"] += ($products_tax / 100) * $shown_price;

} else {

$this->info['tax_groups']["$products_tax_description"] = ($products_tax / 100) * $shown_price;

}

}

 

$index++;

}

 

if (DISPLAY_PRICE_WITH_TAX == 'true') {

$this->info['total'] = $this->info['subtotal'] + $this->info['shipping_cost'];

} else {

$this->info['total'] = $this->info['subtotal'] + $this->info['tax'] + $this->info['shipping_cost'];

}

}

}

?>

Share this post


Link to post
Share on other sites

I should be receiving notifications now on this topic. I just figured out why I wasn't getting emails--I wasn't subscribed... Gee, I feel sheepish.

Share this post


Link to post
Share on other sites

I too even with the code posted above cannot find the area to modify the code for step 5.

Doing a search on this page doesn't even reveal it in your code.

When you say in your haste you posted the wrong information in the readme file. Are both of the above files the correct infromation?

There is a lot of code here to change to only have to change it all back when somethingdoesn't work.

 

Thanks for your help and support.

Share this post


Link to post
Share on other sites

After checking again, it appears I made a mistake in the instructions. Step 5 should read:

 

STEP 5: admin/includes/classes/shopping_cart.php

 

instead of STEP 5: admin/includes/classes/order.php. When I wrote step 5 I forgot to changed the filename from step 4. I caught it because it didn't make sense having two steps for the same file.

 

I have uploaded the small change to the contributions page. Sorry for all the headaches.

Share this post


Link to post
Share on other sites

Is Product Setup Fee reliant on Discount Coupons? because I'm having trouble finding ot_coupon.php and ot_gv.php for Step 12+13.

Share this post


Link to post
Share on other sites

It isn't relient on discount coupons. Those lines are just there so the coupon and gift voucher files can be appropriately modified if they exist. Just ignore those lines in the instructions if you don't have the coupons mod installed.

Share this post


Link to post
Share on other sites

Edtiger,

 

I was wondering, could this contribution also be used for a setup fee per Product group?

so not only charging the setup fee fr one product only, but for a group of products from the same manufacturer or vendor?


Building great webshops for customers with opensource backoffice application for a robotic accounting solution including POS
Migrating osC 2.x webshops to Phoenix
osCommerce dedicated hosting/colocation + turnkey solutions + building addons per request

Share this post


Link to post
Share on other sites

The product setup fee is attached to the product via attributes and is not attached to customers. Therefore, anytime a customer adds X product to shopping cart on orders or re-orders, the setup fee for product X will be charged (if any).

 

I am sure you could create a setup fee for product groups, but I'm not sure where you would begin. My contribution is just a simple mod to the way product attributes are handled. I am by no means an expert coder. However, we have had very good success with rentacoder or like programming providers in the past. Maybe this is the way to go for you. For around $100 US dollars you can get quite a bit of custom coding done.

Share this post


Link to post
Share on other sites

Hi all,

 

i added this contrib "Product Setup fee" but i have some little problems.

 

i used to display my prices with tax included.

this is ok in product_info.php

 

 

but, now when i change to my shopping_cart.php the setup price is shown

WITHOUT tax included.

 

 

 

i would be very very happy if you would help me please!!

 

contrib_fehler.jpg

 

 

 

thanks and greetings

 

Anja

Edited by Anja2506

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×