Zen Cart Logo
Forums / Built-in Shipping and Payment Modules / COD only above certain order amount?

COD only above certain order amount?

Locked

Views: 8,746

Results 21 to 40 of 52
This thread is locked. New replies are disabled.
17 Jun 2007, 7:48 AM
#21
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

COD only above certain order amount?

I get this when I try to check out with the new code...

PHP Parse error: parse error in C:\Program Files\Ensim\Sitedata\onlineshop\Inetpub\wwwroot\includes\modules\payment\cod.php on line 150

17 Jun 2007, 8:04 AM
#22
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

I did on a clean file and it worked on the basic >50 condition.

But can I also incorporate the other 2 conditions? vandelivery and storepickup?

17 Jun 2007, 11:18 AM
#23
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

Hi Linda, your code has problem as well, with a clean cod.php file and your additional codes, its ok on the customer side checkout. It is also ok in admin when I click modules-payment. But when I open the admin-customers-orders, and click to open each order, orders with COD as payment will not open, and there is a line:

PHP Fatal error: Call to a member function on a non-object in C:\Program Files\Ensim\Sitedata\onlineshop\Inetpub\wwwroot\includes\modules\payment\cod.php on line 74

line 74 refers to this line:

if ($_SESSION['cart']->show_total() < 50) {

I have taken out all other codes regarding the other conditions. so its down to the baisc total>50 codes only.

Any idea?

17 Jun 2007, 2:39 PM
#24
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

Where exactly are you when you see this error?

I am trying to reproduce it ... :unsure:

17 Jun 2007, 3:15 PM
#25
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

hi,
ok, clean unmodified file, then put in your code in cod.php, no other conditions yet. So orders above 50, COD will show, below, COD will not show. I log in as a regular registered customer and tried all the combination of shipping and payment. Works fine.

Now I log into admin.
Modules -> Payment. No error. Your code solved the problem over econcepts original code. Great.

Now the error:
Do a check out transaction with a dummy customer. You can try 2 transaction to compare. One use COD, another use say bank transfer. Both have to be above $50 so that COD is shown?

Log back into admin.
Customers -> Orders
So your new 2 transaction is listed. say 1001 and 1002.
We usually click on the transaction to open it up to see the details, and also to update status etc.
But if the transaction is a COD transaction, it wont show the details, it will show:

PHP Fatal error: Call to a member function on a non-object in C:\Program Files\Ensim\Sitedata\onlineshop\Inetpub\wwwroot\in cludes\modules\payment\cod.php on line 74

and nothing else. I dont believe I did any other customization of any sort.

17 Jun 2007, 3:50 PM
#26
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

Odd ... mine is working fine ...

What version Zen Cart are you running?

17 Jun 2007, 4:02 PM
#27
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

Make sure that you added that global $cart; at the start of the function as indicated in my changes ... or you will get errors ...

But I just tried this on another installation and still no errors ...

18 Jun 2007, 3:38 AM
#28
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

I am on 1.36...
that is very strange.....
I dont think posting the whole cod.php file here will help. Looking at the situation, ie the error on that line occurs when I open a COD transaction in customers-> orders, would it be easier if I troubleshoot what is called when I open an order?

When I mean open an order, I mean click on the particular transaction, it will then be highlighted, the arrow on it, then click again to open the details... all the COD transaction does not work...

18 Jun 2007, 3:42 AM
#29
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

Do you have any kind of add-ons or something in the Admin?

18 Jun 2007, 3:55 AM
#30
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

I am at wits end. I post my cod file, maybe I am really missing a bracket here or a word there. Red ones are the one I added according to your post. Blue ones are what I will want to add when the red works....

 
<?php
//
// +----------------------------------------------------------------------+
// |zen-cart Open Source E-commerce                                       |
// +----------------------------------------------------------------------+
// | Copyright (c) 2003 The zen-cart developers                           |
// |                                                                      |
// | http://www.zen-cart.com/index.php                                    |
// |                                                                      |
// | Portions Copyright (c) 2003 osCommerce                               |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the GPL license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available through the world-wide-web at the following url:           |
// | http://www.zen-cart.com/license/2_0.txt.                             |
// | If you did not receive a copy of the zen-cart license and are unable |
// | to obtain it through the world-wide-web, please send a note to       |
// | [email protected] so we can mail you a copy immediately.          |
// +----------------------------------------------------------------------+
// $Id: cod.php 1105 2005-04-04 22:05:35Z birdbrain $
//
  class cod {
    var $code, $title, $description, $enabled;
// class constructor
    function cod() {
      global $order;
      $this->code = 'cod';
      $this->title = MODULE_PAYMENT_COD_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_COD_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_COD_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_COD_STATUS == 'True') ? true : false);
      if ((int)MODULE_PAYMENT_COD_ORDER_STATUS_ID > 0) {
        $this->order_status = MODULE_PAYMENT_COD_ORDER_STATUS_ID;
      }
      if (is_object($order)) $this->update_status();
    }
// class methods
    function update_status() {
      global $order, $db;
      global $cart;
      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_COD_ZONE > 0) ) {
        $check_flag = false;
        $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_COD_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
        while (!$check->EOF) {
          if ($check->fields['zone_id'] < 1) {
            $check_flag = true;
            break;
          } elseif ($check->fields['zone_id'] == $order->delivery['zone_id']) {
            $check_flag = true;
            break;
          }
          $check->MoveNext();
        }
        if ($check_flag == false) {
          $this->enabled = false;
        }
      }
// disable the module if the order only contains virtual products
      if ($this->enabled == true) {
        if ($order->content_type != 'physical') {
          $this->enabled = false;
        }
      }
// disable if total is < 50 
      if ($_SESSION['cart']->show_total() < 50) { 
        $this->enabled = false; 
      } 
// turn off COD for post
//if (substr_count($_SESSION['shipping']['id'], 'table') == true) {
//$this->enabled = false;
//}
// turn on COD for storepickup
//if (substr_count($_SESSION['shipping']['id'], 'storepickup') == true) {
//$this->enabled = true;
//}
// turn on COD for delivery
//if (substr_count($_SESSION['shipping']['id'], 'flat') == true) {
//$this->enabled = true;
//}

    }
    function javascript_validation() {
      return false;
    }
    function selection() {
      return array('id' => $this->code,
                   'module' => $this->title);
    }
    function pre_confirmation_check() {
      return false;
    }
    function confirmation() {
      return false;
    }
    function process_button() {
      return false;
    }
    function before_process() {
      return false;
    }
    function after_process() {
      return false;
    }
    function get_error() {
      return false;
    }
    function check() {
      global $db;
      if (!isset($this->_check)) {
        $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_COD_STATUS'");
        $this->_check = $check_query->RecordCount();
      }
      return $this->_check;
    }
    function install() {
      global $db;
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Cash On Delivery Module', 'MODULE_PAYMENT_COD_STATUS', 'True', 'Do you want to accept Cash On Delivery payments?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_COD_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_COD_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_COD_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())");
   }
    function remove() {
      global $db;
      $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }
    function keys() {
      return array('MODULE_PAYMENT_COD_STATUS', 'MODULE_PAYMENT_COD_ZONE', 'MODULE_PAYMENT_COD_ORDER_STATUS_ID', 'MODULE_PAYMENT_COD_SORT_ORDER');
    }
  }
?>
 
18 Jun 2007, 3:56 AM
#31
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

sorry, the red and blue highlights does not seem to come out when I put the codes in php brackets.....

18 Jun 2007, 4:01 AM
#32
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

NOTE: All of those == true should be an == 1 or == 2 as you are looking for a count ...

Next ... rename cod.php to cod.php_HIDE on your server ...

Now load the original file ... can you use COD?

18 Jun 2007, 4:35 AM
#33
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

ok, wait, let me get in a totally clean file again.

18 Jun 2007, 5:02 AM
#34
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

Hi Linda,
I did a clean downloaded cod.php, only put in your codes. Test, ok all seems to work like you said.

I guess I messed up along the way.

This has solved part of my requirement.
But the other conditions that I need, how to I incorporate it?

I think you get my idea of the requirement. postal delivery cannot COD for all value, and van delivery/self collect must allow COD for all value..

If I change the ==true to ==1, will it work?

// turn off COD for post
//if (substr_count($_SESSION['shipping']['id'], 'table') == true) {
//$this->enabled = false;
//}
// turn on COD for storepickup
//if (substr_count($_SESSION['shipping']['id'], 'storepickup') == true) {
//$this->enabled = true;
//}
// turn on COD for delivery
//if (substr_count($_SESSION['shipping']['id'], 'flat') == true) {
//$this->enabled = true;
//}
18 Jun 2007, 5:28 AM
#35
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

table == 2

usps == 1

ups == 1

This is count how many times that appears in the id ...

table_table is 2

ups_Express is 1

18 Jun 2007, 6:58 AM
#36
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

Hi Linda,

THe <50 worked

Then I added the codes

 
// turn off COD for post 
if (substr_count($_SESSION['shipping']['id'], 'table') == 2) { 
$this->enabled = false; 
} 
// turn on COD for storepickup 
if (substr_count($_SESSION['shipping']['id'], 'storepickup') == 1) { 
$this->enabled = true; 
} 
// turn on COD for delivery 
if (substr_count($_SESSION['shipping']['id'], 'flat') == 1) { 
$this->enabled = true; 
}

table works, as COD is not shown when table is choosen and order above $50.

But the other 2 does not work.
I 'derived' the '$this->enabled = true' from the table code. But it does not seem to work. Does it not work this way?

For storepickup and flat, COD option should always be on no matter what amount or what type of delivery.....

19 Jun 2007, 3:54 AM
#37
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: COD only above certain order amount?

I believe flat and storepickup are both 2 also ...

19 Jun 2007, 5:07 AM
#38
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

Not working....

if I put

 
// disable the module if the order only contains virtual products
      if ($this->enabled == true) {
        if ($order->content_type != 'physical') {
          $this->enabled = false;
        }
      }
// disable if total is < 50 
      if ($_SESSION['cart']->show_total() < 50) { 
        $this->enabled = false; 
      } 
    }
// turn off COD for post 
if (substr_count($_SESSION['shipping']['id'], 'table') == 2) { 
$this->enabled = false; 
} 
// turn on COD for storepickup 
if (substr_count($_SESSION['shipping']['id'], 'storepickup') == 2) { 
$this->enabled = true; 
} 
// turn on COD for delivery 
if (substr_count($_SESSION['shipping']['id'], 'flat') == 2) { 
$this->enabled = true; 
}
    }

I get

error on line 88, which is the line if ($_SESSION['cart']->show_total() < 50) {

If I put

 
// turn off COD for post 
if (substr_count($_SESSION['shipping']['id'], 'table') == 2) { 
$this->enabled = false; 
} 
// turn on COD for storepickup 
if (substr_count($_SESSION['shipping']['id'], 'storepickup') == 2) { 
$this->enabled = true; 
} 
// turn on COD for delivery 
if (substr_count($_SESSION['shipping']['id'], 'flat') == 2) { 
$this->enabled = true; 
}
// disable the module if the order only contains virtual products
      if ($this->enabled == true) {
        if ($order->content_type != 'physical') {
          $this->enabled = false;
        }
      }
// disable if total is < 50 
      if ($_SESSION['cart']->show_total() < 50) { 
        $this->enabled = false; 
      }

I get

PHP Parse error: parse error, expecting T_OLD_FUNCTION' or T_FUNCTION' or T_VAR' or '}'' in C:\Program Files\Ensim\Sitedata\onlineshop\Inetpub\wwwroot\includes\modules\payment\cod.php on line 79

So I dont think its just stacking up the conditions... they seem to affect one another...

19 Jun 2007, 5:41 AM
#39
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

The customer side/shop front works fine/great. But the admin side does not work. I cant open all the COD transactions in customer-> orders...

the final code I am using now is:

 
<?php
//
// +----------------------------------------------------------------------+
// |zen-cart Open Source E-commerce                                       |
// +----------------------------------------------------------------------+
// | Copyright (c) 2003 The zen-cart developers                           |
// |                                                                      |
// | http://www.zen-cart.com/index.php                                    |
// |                                                                      |
// | Portions Copyright (c) 2003 osCommerce                               |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the GPL license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available through the world-wide-web at the following url:           |
// | http://www.zen-cart.com/license/2_0.txt.                             |
// | If you did not receive a copy of the zen-cart license and are unable |
// | to obtain it through the world-wide-web, please send a note to       |
// | [email protected] so we can mail you a copy immediately.          |
// +----------------------------------------------------------------------+
// $Id: cod.php 1105 2005-04-04 22:05:35Z birdbrain $
//
  class cod {
    var $code, $title, $description, $enabled;
// class constructor
    function cod() {
      global $order;
      $this->code = 'cod';
      $this->title = MODULE_PAYMENT_COD_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_COD_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_COD_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_COD_STATUS == 'True') ? true : false);
      if ((int)MODULE_PAYMENT_COD_ORDER_STATUS_ID > 0) {
        $this->order_status = MODULE_PAYMENT_COD_ORDER_STATUS_ID;
      }
      if (is_object($order)) $this->update_status();
    }
// class methods
    function update_status() {
      global $order, $db;
 global $cart;
      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_COD_ZONE > 0) ) {
        $check_flag = false;
        $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_COD_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
        while (!$check->EOF) {
          if ($check->fields['zone_id'] < 1) {
            $check_flag = true;
            break;
          } elseif ($check->fields['zone_id'] == $order->delivery['zone_id']) {
            $check_flag = true;
            break;
          }
          $check->MoveNext();
        }
        if ($check_flag == false) {
          $this->enabled = false;
        }
      }
// disable the module if the order only contains virtual products
      if ($this->enabled == true) {
        if ($order->content_type != 'physical') {
          $this->enabled = false;
        }
      }
// disable if total is < 50 
      if ($_SESSION['cart']->show_total() < 50) { 
        $this->enabled = false; 
      }
// turn off COD for post 
if (substr_count($_SESSION['shipping']['id'], 'table') == 2) { 
$this->enabled = false; 
} 
// turn on COD for storepickup 
if (substr_count($_SESSION['shipping']['id'], 'storepickup') == 2) { 
$this->enabled = true; 
} 
// turn on COD for delivery 
if (substr_count($_SESSION['shipping']['id'], 'flat') == 2) { 
$this->enabled = true; 
}
    }
    function javascript_validation() {
      return false;
    }
    function selection() {
      return array('id' => $this->code,
                   'module' => $this->title);
    }
    function pre_confirmation_check() {
      return false;
    }
    function confirmation() {
      return false;
    }
    function process_button() {
      return false;
    }
    function before_process() {
      return false;
    }
    function after_process() {
      return false;
    }
    function get_error() {
      return false;
    }
    function check() {
      global $db;
      if (!isset($this->_check)) {
        $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_COD_STATUS'");
        $this->_check = $check_query->RecordCount();
      }
      return $this->_check;
    }
    function install() {
      global $db;
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Cash On Delivery Module', 'MODULE_PAYMENT_COD_STATUS', 'True', 'Do you want to accept Cash On Delivery payments?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_COD_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_COD_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_COD_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())");
   }
    function remove() {
      global $db;
      $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }
    function keys() {
      return array('MODULE_PAYMENT_COD_STATUS', 'MODULE_PAYMENT_COD_ZONE', 'MODULE_PAYMENT_COD_ORDER_STATUS_ID', 'MODULE_PAYMENT_COD_SORT_ORDER');
    }
  }
?>
22 Jun 2007, 5:25 AM
#40
ronwong avatar

ronwong

Zen Follower

Join Date:
Jan 2006
Posts:
223
Plugin Contributions:
0

Re: COD only above certain order amount?

any kind soul can help on this?