Jump to content

CatDadRick

Members
  • Content count

    253
  • Joined

  • Last visited

Posts posted by CatDadRick


  1. I also found my wierd issue with getting quotes, I had not populated all the fields in one of my test Vendors, Max box weight, Tare weight, zones and Percentage-based Tare Weight, this was breaking the shipping data calculations, and it ended up using 0 as the quantity to be shipped. I will look into this to see if we need some defaults or what. So I'll get back to this today hopefully and see what I can do.
    Craig,

     

    I had to change the structure of some of the fields in the vendors table. The max_box_weight and tare_weight fields needed to alllow for larger weights so I changed mine to "dec 15,4". Meant to post this last week when I found it.

     

    Thanks,

    Rick Knight


  2. I've got all the changes made in my fedex1.php file and it's working fine for me. You can test at my site if you like, just don't actually submit the order. If you want, I can e-mail you my "fedex1.php" file for you to just upload and try if you want. So you don't have to make all the individual changes. smile.gif
    I just diff'd your fedex1.php against mine and found a couple of differences that may have been my problem. I say "may" because I just went to your store, created an account, put something in my cart and went to checkout. Everything seemed to work fine except when I got to Delivery Information, your Fedex module only gave one rate, Home Delivery (5 Days). That's the same thing I was getting on my site, which, by the way, now seems to be working and giving multiple rates. You can take a look at my store, I don't think we're supposed to post our store URLs here so I'll PM the address to you along with a product that uses Fedex shipping. If you have a chance, let me know how things work for you.

     

    Thanks again,

    Rick Knight


  3. Kymation,

     

    I've just applied all of your changes to the Fedex1 module and now I get only a single rate back from Fedex. Before I applied the changes, I was getting a choice of several rates. The rate I do get back is or method "Home delivery (2 Days)" and it's the same cost as that method prior to your changes.

     

    Thanks,

    Rick Knight


  4. Shipping taxes were being applied properly everytime before installing MVS, now the shipping taxes are applied if I use a method from the shipping module (outside of MVS), but taxes refuse to be applied when using shipping methods set within MVS.

    I hadn't checked this, and since I sell from a store located in a state that says shipping is taxable, I should have. Yes, taxes are not being applied to the MVS modules. Otherwise, this contribution works great. I've done some rate comparisons, and they match perfectly!

     

    Now, where are taxes added? Checkout_shipping? I'll take a look around and see what I can find, but this is probably one for Craig and Jim.

     

    Thanks,

    Rick Knight


  5. Craig,

     

    I've added code to catalog/admin/vendors.php.

    This just shows the selected vendros information so that I don't have to go into edit mode.

    Just below this line (535)

     	 echo " Vendor name: ". $vInfo->vendors_name ."<br>";

    Add this

     	 
    // 	 $contents[] = array('text' => tep_info_image . $vInfo->vendors_image . '<br>');
    	 $contents[] = array('text' => '<br>' . TEXT_VENDORS_ID . ': <br><b>' . $vInfo->vendors_id . '</b>');
    	 $contents[] = array('text' => '<br>' . TEXT_VENDORS_NAME . '<br><b>' . $vInfo->vendors_name . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDORS_CONTACT . ': <br><b>' . $vInfo->vendors_contact . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDORS_PHONE1 . '<br><b>' . $vInfo->vendors_phone1 . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDORS_EMAIL . '<br><b>' . $vInfo->vendors_email . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDORS_SEND_EMAIL . '<br><b>' . $vInfo->vendors_send_email . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDOR_STREET . '<br><b>' . $vInfo->vendor_street . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDOR_CITY . '<br><b>' . $vInfo->vendor_city . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDOR_STATE . '<br><b>' . $vInfo->vendor_state . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_VENDORS_ZIPCODE . '<br><b>' . $vInfo->vendors_zipcode . '</b>');
    	 $contents[] = array('text' => '<br>' . TEXT_VENDOR_COUNTRY . '<br><b>' . tep_get_country_name($vInfo->vendor_country) . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_ACCOUNT_NUMBER . '<br><b>' . $vInfo->account_number . '</b>');
    	 $contents[] = array('text' =>  '<br>' . 'Vendors URL: '. '<br><b>' . $vInfo->vendors_url . '</b>');
    	 $contents[] = array('text' =>  '<br>' . TEXT_ZONES. '<br><b>' . $vInfo->zones . '</b>');
         

     

    Also, for anyone using the RMA Returns contribution, to make it work with MVS,

    In catalog/includes/vendor_order_info.php on line 68 find

          echo '          </tr>';

    and add below

    // RMA 2.4 added
    
    // Don't show Return link if order is still pending or processing
    // You can change this or comment it out as best fits your store configuration
    if (($orders_status == '1') OR ($orders_status == '2') ) {
    echo '<tr><td class="smallText" valign="center" colspan="9">' . $return_link = '' . '</td></tr>';
    } else {
    if ($order->products[$i]['return'] == '1') {
    $rma_query_one = tep_db_query("SELECT returns_id FROM " . TABLE_RETURNS_PRODUCTS_DATA . " where products_id = '" . $order->products[$i]['id'] . "' and order_id = '" . $HTTP_GET_VARS['order_id'] . "'");
    $rma_query = tep_db_fetch_array($rma_query_one);
    $rma_number_query = tep_db_query("SELECT rma_value FROM " . TABLE_RETURNS . " where returns_id = '" . $rma_query['returns_id'] . "'");
    $rma_result = tep_db_fetch_array($rma_number_query);
    
    echo '<tr><td class="smallText" valign="center" colspan="9">' . $return_link = '<font color=cc0000><b>' . TEXT_RMA . ' # <a href="' . tep_href_link('returns_track.php', 'action=returns_show&rma=' . $rma_result['rma_value'], 'SSL') . '">' . $rma_result['rma_value'] . '</a></td></tr>';
    } else {
    echo '<tr><td class="smallText" valign="center" colspan="9">' . $return_link = '<a href="' . tep_href_link(FILENAME_RETURN, 'order_id=' . $HTTP_GET_VARS['order_id'] . '&products_id=' . ($order->products[$i]['id']), 'SSL') . '"><font color=cc0000><b>' . TEXT_RETURN_PRODUCT .'</a></b></font></td></tr>';
    }
    }
    // EOADD RMA 2.4

    This code is found in catalog/account_history_info.php and can be copied from there but some additional modifications are needed, mainly the http stuff and the "if" statement at the top of the code.

     

    Thanks again,

    Rick Knight


  6. OK. After several attempt to break something, anything, with this mod and not being able to, I decided to install it to my live store. I just finnished up with the install and some prelim testing, and everything is working and working very well. I too modified my Easypopulate and Margin report contribs to work with this, but that was relaltivly simple. It looks like some work is needed to make this work with the RMA contrib, so I'll see what I can there (any input very welcome).

     

    So far, so good. Thanks guys.

     

    Craig, I would like to see your Easypopulate and Margin report contribs.

     

    Thanks again,

    Rick Knight


  7. Well, it's been pretty quite here lately. I guess no one is finding any bugs to report. I haven't found any. Today I modified my Easypopulate and Margin Report mods to work with this. So far so good. I amy try it on my live server this weekend, especially if no one is finding any problems.

     

    Craig and Jim, EXCELLENT JOB.

     

    Thanks,

    Rick Knight


  8. Rick: I think I see what you are trying to do. Craig wrote this part, so I'm not as familiar with it as I should be. Bear with me here....

     

    Most of the code for new orders has been moved out to vendor_order_info.php. If you look in there, the variable for quantity is

    $order->products[$l]['orders_products'][$i]['qty']

    and the variable for product name is

    $order->products[$l]['orders_products'][$i]['name']

    In the above variables, $l is the vendor id and $i is the product id. I'm assuming that you have a loop already to step through the products. You'll need another loop outside that one to step through the vendors, using something like 

      for ($l=0, $m=sizeof($order->products); $l<$m; $l++) {

    If I didn't understand what you are trying to do, please let me know and I'll try again.

     

    Regards

    Jim

     

    Thanks Jim, that's exactly what I was after.

     

    Rick Knight


  9. Rick: The code for that is in admin/orders.php, around line 291:

        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
         echo '          <tr class="dataTableRow">' . "\n" .
              '            <td class="dataTableContent" valign="top" align="right">' . $order->products[$i]['qty'] . ' x</td>' . "\n" .
              '            <td class="dataTableContent" valign="top">' . $order->products[$i]['name'];

    It should be displaying the quantity followed by an "x", e.g. 3 x. If this is not working, check that the value of $order->products[$i]['qty'] is being set. If you're getting the rest of the line, look for a typo in the above code.

     

    Regards

    Jim

     

    Jim,

    The order information shows up correctly in the invoice listing view. What I'm trying to do is get the quantity and model to show up in the orders view. There's a status box to the left of the orders list that shows information about the selected order without actually opening the order. It works fine on old orders, but on new orders, the quantity and model are not listed, just the "x" between the two. I can't see where the information should come from for new orders. Here's that section of code from catalog/admin/orders.php. Way down near the bottom of the this code, near

    for ($i=0; $i<sizeof($order->products); $i++) {

    Is where I'm lost. I've created an IF/ELSE statement (not in listing) to detect old or new order, but I don't see what variables to use for new orders? Again, this is minor, but if you can give me a quick pointer...

      $heading = array();
     $contents = array();
    
     switch ($action) {
       case 'delete':
         $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_ORDER . '</b>');
    
         $contents = array('form' => tep_draw_form('orders', FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=deleteconfirm'));
         $contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br><br><b>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</b>');
         $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('restock') . ' ' . TEXT_INFO_RESTOCK_PRODUCT_QUANTITY);
         $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
         break;
       default:
         if (isset($oInfo) && is_object($oInfo)) {
           $heading[] = array('text' => '<b>[' . $oInfo->orders_id . ']  ' . tep_datetime_short($oInfo->date_purchased) . '</b>');
    
           $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
           $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ORDERS_INVOICE, 'oID=' . $oInfo->orders_id) . '" TARGET="_blank">' . tep_image_button('button_invoice.gif', IMAGE_ORDERS_INVOICE) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS_PACKINGSLIP, 'oID=' . $oInfo->orders_id) . '" TARGET="_blank">' . tep_image_button('button_packingslip.gif', IMAGE_ORDERS_PACKINGSLIP) . '</a>');
           $contents[] = array('text' => '<br>' . TEXT_DATE_ORDER_CREATED . ' ' . tep_date_short($oInfo->date_purchased));
           if (tep_not_null($oInfo->last_modified)) $contents[] = array('text' => TEXT_DATE_ORDER_LAST_MODIFIED . ' ' . tep_date_short($oInfo->last_modified));
           $contents[] = array('text' => '<br>' . TEXT_INFO_PAYMENT_METHOD . ' '  . $oInfo->payment_method);
    // RMA added
           $contents[] = array('align' => 'center', 'text' => '<BR><a href="' . tep_href_link('restore_order.php', 'oID=' . $oInfo->orders_id) . '"><font color=red>Restore Order</font></a>');
    // EORMA
     
    // WebMakers.com Added: Show Shipping Method
           $contents[] = array('text' => TEXT_INFO_SHIPPING_METHOD . ' ' . tep_get_orders_shipping_method($oID));
    
    // BOF: WebMakers.com Added: Thanks to elari added to display product list for selected order
    // indicate if comments exist
       $orders_history_query = tep_db_query("select orders_status_id, date_added, customer_notified, comments from " . TABLE_ORDERS_STATUS_HISTORY . " where orders_id = '" . $oInfo->orders_id . "' and comments !='" . "'" );
       if (tep_db_num_rows($orders_history_query)) {
           $contents[] = array('align' => 'left', 'text' => '<br>*COMMENTS');
       }
    
    $contents[] = array('text' => '<br>' . tep_image(DIR_WS_IMAGES . 'pixel_black.gif','','100%','3'));
    $order = new order($oInfo->orders_id);
    $contents[] = array('text' => 'Products Ordered: ' . sizeof($order->products) );
    for ($i=0; $i<sizeof($order->products); $i++) {
     $contents[] = array('text' => $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name']);
    
     if (sizeof($order->products[$i]['attributes']) > 0) {
       for ($j=0; $j<sizeof($order->products[$i]['attributes']); $j++) {
         $contents[] = array('text' => ' <i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></nobr>' );
       }
     }
    }

    Thanks,

    Rick Knight


  10. *COMMENTS

    ---------------------------

    Products Ordered: 2

    x

    x

    Oops,

     

    That's one of my mods. I know where the code is, so I'll see if I can move it. At this point, I can't find anything in the mod that doesn't seem to work!

     

    I need to edit some of the mods I have installed, like RMA system and Margin Report to work with MVS, but I don't think that'll be much of a problem.

     

    I'll keep trying to find a bug, but...

     

    Thanks,

    Rick Knight


  11. Jim,

    Problem solved.

    No error messages on the page or in my logs. Also, the footer does load, so I think I must have just missed something in the "new order old order" section. I'm gonna diff it again and see if I can find anything.

            if (tep_not_null($order->orders_shipping_id)) {
        	 require ('vendor_order_info.php');
        	 } else {    

    The closing brace for this bit of code was the problem. When I merged the new code into my catalog/admin/orders.php I has one brace short. I added one where it looked appropriate, but after pouring over this till I started to go blind, I found the correct spot. Now it works.

     

    One other(small) problem. In catalog/admin/orders.php, in the main Orders view, there's a small box to the right of the page with information about the currently selected order. This box has, among other things, a section near the bottom labeled "*COMMENTS" but the comments do not show up and below that is a section labeled "Products Ordered:". This section shows the total number of items orderd, quantity for each line item and the model name of the items. With an old order, this information shows up, but with a new order, I get the total quantity and then an "x" for each line item. Like this...

    *COMMENTS

    ---------------------------

    Products Ordered: 2

    x

    x

    Do you get the same results on your system? Again, not a big deal and I'm going to look for it myself, but if you have any suggestion?

     

    Thanks,

    Rick Knight


  12. Rick: The Orders page on my test site works fine. I suspect that you missed something in admin/orders.php or one of the associated files. Do you get any error messages on the page or in your logs?

    Jim,

     

    No error messages on the page or in my logs. Also, the footer does load, so I think I must have just missed something in the "new order old order" section. I'm gonna diff it again and see if I can find anything.

     

    Rick Knight


  13. Craig, Jim,

     

    I think I found a problem in catalog/admin/orders. When I open a new order (after adding this latest version) I don't get the bottom half of the order. The order totals, comments box, order status and the couple of buttons that are normally at the bottom of the order view are missing. I do get the table showing the items purchased, but nothing below that except the page footer so I have no way to update the status of the order. If I look at an old order (before this version), all the information, comment box and buttons are avaliable. Did I miss some of the code here?

     

    Other than that, I have been trying to break this, but without much success. Great job :thumbsup: .

     

    I will keep trying.

     

    Thanks,

    Rick Knight


  14. Jim, Thanks for taking a look at this...

     

    Line 199: You need the underscore at the end of the text part of the constant names, like this:

    'MODULE_SHIPPING_FREESHIPPER_STATUS_' . $vendors_id

    to avoid breaking the Remove function.

    I don't know how I missed this. I guess I've looked at this just a bit too much...

     

    Anyway, your suggestions worked. I have a full set of shipping modules now. This morning I add MVS to another test installation that's a bit closer to my actual store setup. Works great.

     

    Thanks,

    Rick Knight


  15. Jim, Craig & Tanaka,

     

    I've been working on getting the FREESHIPPER shipping module to work on this, but I'm not having much luck. I think I've made all the changes in Jim's modules.txt, but this simple mod just isn't working. I'm posting here in hopes that someone can take a quick look at it and tell me what I've missed.

     

    Also, Craig I know you guys are busy trying to get another release out the door, but have you had a chance to look at the Fedex1 module I sent?

     

    Here's the FREESHIPPER module...

    <?php
    /*
     WebMakers.com Added: Free Payments and Shipping
     Written by Linda McGrath osCOMMERCE@WebMakers.com
     http://www.thewebmakerscorner.com
    
     osCommerce, Open Source E-Commerce Solutions
     http://www.oscommerce.com
    
     Copyright (c) 2002 osCommerce
    
     Released under the GNU General Public License
    */
    
     class freeshipper {
       var $code, $title, $description, $icon, $enabled;
    
    // BOF: WebMakers.com Added: Free Payments and Shipping
    // class constructor
       function freeshipper() {
         global $order, $cart;
    // MVS Added   
         $this->vendors_id = ($products['vendors_id'] <= 0) ? 1 : $products['vendors_id']; 
    // EOADD   
         $this->code = 'freeshipper';
         $this->title = MODULE_SHIPPING_FREESHIPPER_TEXT_TITLE;
         $this->description = MODULE_SHIPPING_FREESHIPPER_TEXT_DESCRIPTION;
         $this->icon = DIR_WS_ICONS . 'shipping_free_shipper.jpg';
    // MVS Add/Changed
    /*      
      $this->sort_order = MODULE_SHIPPING_FREESHIPPER_SORT_ORDER;
         $this->tax_class = MODULE_SHIPPING_FREESHIPPER_TAX_CLASS;
         $this->enabled = ((MODULE_SHIPPING_FREESHIPPER_STATUS == 'True') ? true : false);
    
    // Only show if weight is 0
    //      if ( (!strstr($PHP_SELF,'modules.php')) || $cart->show_weight()==0) {
           $this->enabled = MODULE_SHIPPING_FREESHIPPER_STATUS;
           if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_FREESHIPPER_ZONE > 0) ) {
             $check_flag = false;
             $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_SHIPPING_FREESHIPPER_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
             while ($check = tep_db_fetch_array($check_query)) {
               if ($check['zone_id'] < 1) {
                 $check_flag = true;
                 break;
               } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
                 $check_flag = true;
                 break;
               }
             }
    
             if ($check_flag == false) {
               $this->enabled = false;
             }
           }
    */
    // EOADD  
    //      }
    // EOF: WebMakers.com Added: Free Payments and Shipping
       }
    
    // MVS Added	
       function sort_order($vendors_id='0') {
         if (defined (constant ('MODULE_SHIPPING_FREESHIPPER_SORT_ORDER_' . $vendors_id))) {
           $this->sort_order = constant('MODULE_SHIPPING_FREESHIPPER_SORT_ORDER_' . $vendors_id);
         } else {
           $this->sort_order = '0';
         }
         return $this->sort_order;
       }
    
       function tax_class($vendors_id='1') {
         $this->tax_class = constant('MODULE_SHIPPING_FREESHIPPER_TAX_CLASS_' . $vendors_id);
         return $this->tax_class;
       }
    
       function enabled($vendors_id='1') {
         $this->enabled = false;
         $status = constant('MODULE_SHIPPING_FREESHIPPER_STATUS_' . $vendors_id);
    	 if (isset ($status) && $status != '') {
           $this->enabled = (($status == 'True') ? true : false);
         }
         return $this->enabled;
       }
     
       function zones($vendors_id='1') {
         if ( ($this->enabled == true) && ((int)constant('MODULE_SHIPPING_FREESHIPPER_ZONE_' . $vendors_id) > 0) ) {
           $check_flag = false;
           $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . (int)constant('MODULE_SHIPPING_FREESHIPPER_ZONE_' . $vendors_id) . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
           while ($check = tep_db_fetch_array($check_query)) {
             if ($check['zone_id'] < 1) {
               $check_flag = true;
               break;
             } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
               $check_flag = true;
               break;
             } //if
           }//while
    
           if ($check_flag == false) {
             $this->enabled = false;
           }//if
         }//if
         return $this->enabled;
       }//function
    // EOADD	
    // class methods
    // MVS Added/Changed
    //    function quote($method = '') {
       function quote($method = '', $module = '', $vendors_id = '1') {
    // EOADD
         global $order;
    // MVS Added
    /*      
      $vendors_data_query = tep_db_query("select handling_charge, 
                                                    handling_per_box 
                                             from " . TABLE_VENDORS . " 
                                             where vendors_id = '" . (int)$vendors_id . "'"
                                           );
         $vendors_data = tep_db_fetch_array($vendors_data_query);
    */
         $vendors_data_query = tep_db_query("select v.vendor_country,
                                              v.vendors_zipcode
                                              from " . TABLE_VENDORS . " v,
                                                   " . TABLE_COUNTRIES . " c
                                              where v.vendors_id = '" . (int)$vendors_id . "'
                                              and v.vendor_country = c.countries_id"
                                            );
         $vendors_data = tep_db_fetch_array($vendors_data_query);
         $handling_charge = $vendors_data['handling_charge'];
         $handling_per_box = $vendors_data['handling_per_box'];
         if ($handling_charge > $handling_per_box*$shipping_num_boxes) {
           $handling = $handling_charge;
         } else {
           $handling = $handling_per_box*$shipping_num_boxes;
         }
    // EOADD
         $this->quotes = array('id' => $this->code,
                               'module' => MODULE_SHIPPING_FREESHIPPER_TEXT_TITLE,
                               'methods' => array(array('id' => $this->code,
                                                        'title' => '<FONT COLOR=FF0000><B>' . MODULE_SHIPPING_FREESHIPPER_TEXT_WAY . '</B></FONT>',
    // MVS Added/Changed
    //                                                     'cost' => SHIPPING_HANDLING + MODULE_SHIPPING_FREESHIPPER_COST)));
                                                        'cost' => $shipping + $handling)));
    // EOADD
    
         if ($this->tax_class > 0) {
           $this->quotes['tax'] = tep_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
         }
         if (tep_not_null($this->icon)) $this->quotes['icon'] = tep_image($this->icon, $this->title);
    
         return $this->quotes;
       }
    
       function check(/*MVS*/$vendors_id='1') {
         if (!isset($this->_check)) {
    // MVS Added/Changed        
    //  $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_FREESHIPPER_STATUS'");
           $check_query = tep_db_query("select configuration_value from " . TABLE_VENDOR_CONFIGURATION . " where vendors_id = '". $vendors_id ."' and configuration_key = 'MODULE_SHIPPING_FREESHIPPER_STATUS_" . $vendors_id . "'");
    // EOADD
           $this->_check = tep_db_num_rows($check_query);
         }
         return $this->_check;
       }
    
    // MVS Added/Changed
    /*    
    function install() {
         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enable Free Shipping', 'MODULE_SHIPPING_FREESHIPPER_STATUS', '1', 'Do you want to offer Free shipping?', '6', '5', now())");
         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Free Shipping Cost', 'MODULE_SHIPPING_FREESHIPPER_COST', '0.00', 'What is the Shipping cost? The Handling fee will also be added.', '6', '6', now())");
         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Tax Class', 'MODULE_SHIPPING_FREESHIPPER_TAX_CLASS', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'tep_get_tax_class_title', 'tep_cfg_pull_down_tax_classes(', now())");
         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Shipping Zone', 'MODULE_SHIPPING_FREESHIPPER_ZONE', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SHIPPING_FREESHIPPER_SORT_ORDER', '0', 'Sort order of display.', '6', '0', now())");
       }
    */	
       function install($vendors_id='1') {
         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Enable Free Shipping', 'MODULE_SHIPPING_FREESHIPPER_STATUS_" . $vendors_id . "', '1', 'Do you want to offer Free shipping?', '6', '5', now(), '" . $vendors_id . "')");
         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Free Shipping Cost', 'MODULE_SHIPPING_FREESHIPPER_COST_" . $vendors_id . "', '0.00', 'What is the Shipping cost? The Handling fee will also be added.', '6', '6', now(), '" . $vendors_id . "')");
         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added, vendors_id) values ('Tax Class', 'MODULE_SHIPPING_FREESHIPPER_TAX_CLASS_" . $vendors_id . "', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'tep_get_tax_class_title', 'tep_cfg_pull_down_tax_classes(', now(), '" . $vendors_id . "')");
         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added, vendors_id) values ('Shipping Zone', 'MODULE_SHIPPING_FREESHIPPER_ZONE_" . $vendors_id . "', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now(), '" . $vendors_id . "')");
         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Sort Order', 'MODULE_SHIPPING_FREESHIPPER_SORT_ORDER_" . $vendors_id . "', '0', 'Sort order of display.', '6', '0', now(), '" . $vendors_id . "')");
       }
    // EOADD
    
       function remove(/*MVS*/$vendors_id='1') {
    //      $keys = '';
    //      $keys_array = $this->keys();
    //      for ($i=0; $i<sizeof($keys_array); $i++) {
    //        $keys .= "'" . $keys_array[$i] . "',";
    //      }
    //      $keys = substr($keys, 0, -1);
    
    // MVS Added/Changed
    //      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in (" . $keys . ")");
         tep_db_query("delete from " . TABLE_VENDOR_CONFIGURATION . " where vendors_id = '". $vendors_id ."' and configuration_key in ('" . implode("', '", $this->keys($vendors_id)) . "')");
    // EOADD    
    }
    
       function keys(/*MVS*/$vendors_id='1') {
         return array('MODULE_SHIPPING_FREESHIPPER_STATUS' . $vendors_id, 'MODULE_SHIPPING_FREESHIPPER_COST' . $vendors_id, 'MODULE_SHIPPING_FREESHIPPER_TAX_CLASS' . $vendors_id, 'MODULE_SHIPPING_FREESHIPPER_ZONE' . $vendors_id, 'MODULE_SHIPPING_FREESHIPPER_SORT_ORDER' . $vendors_id);
       }
     }
    ?>

    Thanks guys,

    Rick Knight


  16. I don't think that I ever posted that code here. I did send it to Craig to review. So, check your files, and if these changes don't already exist, please make them as follows.

     

    In admin/includes/functions/html_output.php, add the following near the bottom:

    ////
    // Creates a pull-down list of countries
     function tep_get_country_list($name, $selected = '', $parameters = '') {
       $countries = tep_get_countries();
    
       return tep_draw_pull_down_menu($name, $countries, $selected, $parameters);
     }

    Then in admin/vendors.php, find this code (line332):

      echo tep_draw_input_field('vendor_country', $vInfo->vendor_country, 'maxlength="64"');

    and replace it with this:

      echo tep_get_country_list('vendor_country', $vInfo->vendor_country);

    Now you will need to go to the Vendors page in your Admin and select the country from the dropdown for each vendor. Then you can change this code in your usps.php from

          $vendors_data_query = tep_db_query("select vendor_country,
                                                    vendors_zipcode
                                             from " . TABLE_VENDORS . "
                                             where vendors_id = '" . (int)$vendors_id . "'"
                                           );

    to

          $vendors_data_query = tep_db_query("select c.countries_iso_code_2 as vendor_country,
                                                    v.vendors_zipcode
                                             from " . TABLE_VENDORS . " v,
                                                  " . TABLE_COUNTRIES . c"
                                             where v.vendors_id = '" . (int)$vendors_id . "'
                                               and c.countries_id = v.vendor_country"
                                           );

    Now your USPS query should work. Oh, and replace SHIPPING_ORIGIN_ZIP with $vendors_data['vendors_zipcode'].

     

    This is all untested, since my USPS password still doesn't work on their production server. Looks like I need to give them a call.

     

    Regards

    Jim

     

    Jim,

     

    I haven't made these changes yet, but I will today. In the mean time, I changed SHIPPING_ORIGIN_ZIP in my sups.php as you suggested and then took a look at my configuration table and found that the country codes required for USPS are numeric and the US is 223. I put 223 into the vendor_country field in the vendors table and it worked. I'm getting quotes from USPS. Do your mods do the same thing, that is, convert the ISO code to the numeric code?

     

    Thanks,

    Rick Knight


  17. Yes, that's a typical USPS error code. The country is either not getting passed, or it's getting passed in the wrong format. I need to fix the SQL to give the country in the right format. Do you know what format USPS wants? I can't find it in the docs.

     

    There's another constant as well: SHIPPING_ORIGIN_ZIP  around line 346.

     

    Regards

    Jim

    You know, I kept looking at SHIPPING_ORIGIN_ZIP and thinking it should be changed somehow.

     

    I think the USPS country format is standard 2 character code, like US, GB etc. If you look at the bottom of my USPS module you'll see a country code list and it's all standard 2 character, but it doesn't list the US. If I have time tonight I'll look at SHIPPING_ORIGIN_ZIP some more.

     

    Thanks,

    Rick Knight


  18. Jim,

     

    That's getting closer. After making those changes, I no longer get any error messages from the USPS module. In a test transaction I get the following error in the Shipping Methods > Products box under United States Postal Service...

      -2147219080 - Missing value for Country.
    This looks like a USPS error code, so my ID and Password are being passed off to USPS and something is getting back. I think.

     

    Thanks again,

    Rick Knight


  19. Kymation,

     

    I'm still trying to make the USPS modules work, both my modified USPS module and the one you've packaged with MVS and I've found a couple of things.

     

    First, according to your modules.txt, when converting a shipping module for use with MVS, one of the first modifications to make is to change this

    // class constructor
     function usps() {
       global $order;

    to

    // class constructor
     function usps() {
       global $order, $vendors_id;

    It looks like this was missed in your usps.php, however, adding it made no difference.

     

    Second, in my usps.php, things appear to be working with the same results as your usps.php, but I'm getting an error in my httpd logs that looks like halfway through processing the usps.php file, the $vendors_id variable is lost! I'm getting the following error in my log for all the lines below

      function getQuote() {
        global $order;

    Here's the error message

    [error] PHP Warning: constant(): Couldn't find constant MODULE_SHIPPING_USPS_OPTIONS_ in /usr/local/httpd/catalog/includes/modules/vendors_shipping/usps.php on line 324
    Note the constant ends with the underscore, not a number. This is repeated 5 times, once on each of these lines 324, 328, 340 and 396, twice on line 328. All of the lines above 324 that have the contant in them are apparently handled OK. I am able to install and uninstall the module and it works just as yours does including not giving a quote. I'm going to attach my usps.php here. Maybe you can take a quick look and see why the $vendors_id variable seems to get dropped.

     

    <?php

    /*

     $Id: usps.php,v 1.47 2003/04/08 23:23:42 dgw_ Exp $

     ++++ modified as USPS Methods 2.5 08/02/03 by Brad Waite and Fritz Clapp ++++

     

     osCommerce, Open Source E-Commerce Solutions

     http://www.oscommerce.com

     

     Copyright (c) 2003 osCommerce

     

     Released under the GNU General Public License

    */

     

     class usps {

       var $code, $title, $description, $icon, $enabled, $countries;

     

    // class constructor

       function usps() {

         global $order, /* MVS */$vendors_id;

    // Added MVS  

      $this->vendors_id = ($products['vendors_id'] <= 0) ? 1 : $products['vendors_id'];

    // End ADD

     

         $this->code = 'usps';

         $this->title = MODULE_SHIPPING_USPS_TEXT_TITLE;

         $this->description = MODULE_SHIPPING_USPS_TEXT_DESCRIPTION;

         $this->icon = DIR_WS_ICONS . 'shipping_usps.gif';

     

    // Removed MVS

    /*

         $this->sort_order = MODULE_SHIPPING_USPS_SORT_ORDER;

         $this->tax_class = MODULE_SHIPPING_USPS_TAX_CLASS;

         $this->enabled = ((MODULE_SHIPPING_USPS_STATUS == 'True') ? true : false);

     

         if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_USPS_ZONE > 0) ) {

           $check_flag = false;

           $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_SHIPPING_USPS_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");

           while ($check = tep_db_fetch_array($check_query)) {

             if ($check['zone_id'] < 1) {

               $check_flag = true;

               break;

             } elseif ($check['zone_id'] == $order->delivery['zone_id']) {

               $check_flag = true;

               break;

             }

           }

     

           if ($check_flag == false) {

             $this->enabled = false;

           }

         }

    End of Remove

    */

         $this->types = array('Express' => 'Express Mail',

                              'First Class' => 'First-Class Mail',

                              'Priority' => 'Priority Mail',

                              'Parcel' => 'Parcel Post');

     

         $this->intl_types = array('GXG Document' => 'Global Express Guaranteed Document Service',

                                   'GXG Non-Document' => 'Global Express Guaranteed Non-Document Service',

                                   'Express' => 'Global Express Mail (EMS)',

                                   'Priority Lg' => 'Global Priority Mail - Flat-rate Envelope (large)',

                                   'Priority Sm' => 'Global Priority Mail - Flat-rate Envelope (small)',

                                   'Priority Var' => 'Global Priority Mail - Variable Weight Envelope (single)',

                                   'Airmail Letter' => 'Airmail Letter Post',

                                   'Airmail Parcel' => 'Airmail Parcel Post',

                                   'Surface Letter' => 'Economy (Surface) Letter Post',

                                   'Surface Post' => 'Economy (Surface) Parcel Post');

     

         $this->countries = $this->country_list();

       }

     

    // MVS ADD

       function sort_order($vendors_id='0') {

         if (defined (constant ('MODULE_SHIPPING_USPS_SORT_ORDER_' . $vendors_id))) {

           $this->sort_order = constant('MODULE_SHIPPING_USPS_SORT_ORDER_' . $vendors_id);

         } else {

           $this->sort_order = '0';

         }

         return $this->sort_order;

       }

     

       function tax_class($vendors_id='1') {

         $this->tax_class = constant('MODULE_SHIPPING_USPS_TAX_CLASS_' . $vendors_id);

         return $this->tax_class;

       }

     

       function enabled($vendors_id='1') {

         $this->enabled = false;

         $status = constant('MODULE_SHIPPING_USPS_STATUS_' . $vendors_id);

      if (isset ($status) && $status != '') {

           $this->enabled = (($status == 'True') ? true : false);

         }

         return $this->enabled;

       }

     

       function zones($vendors_id='1') {

         if ( ($this->enabled == true) && ((int)constant('MODULE_SHIPPING_USPS_ZONE_' . $vendors_id) > 0) ) {

           $check_flag = false;

           $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . (int)constant('MODULE_SHIPPING_USPS_ZONE_' . $vendors_id) . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");

           while ($check = tep_db_fetch_array($check_query)) {

             if ($check['zone_id'] < 1) {

               $check_flag = true;

               break;

             } elseif ($check['zone_id'] == $order->delivery['zone_id']) {

               $check_flag = true;

               break;

             } //if

           }//while

     

           if ($check_flag == false) {

             $this->enabled = false;

           }//if

         }//if

         return $this->enabled;

       }//function

    // EOADD MVS

     

    // class methods

    // Changed MVS

    //    function quote($method = '') {

    function quote($method = '', $module = '', $vendors_id = '1') {

    // EOCHANGE

     

    // BOF: UPS USPS

         global $order, $shipping_weight, $shipping_num_boxes, $transittime;

     

         if ( tep_not_null($method) && (isset($this->types[$method]) || in_array($method, $this->intl_types)) ) {

           $this->_setService($method);

         }

     

         $this->_setMachinable('False');

         $this->_setContainer('None');

         $this->_setSize('REGULAR');

     

    // usps doesnt accept zero weight

         $shipping_weight = ($shipping_weight < 0.1 ? 0.1 : $shipping_weight);

         $shipping_pounds = floor ($shipping_weight);

         $shipping_ounces = round(16 * ($shipping_weight - floor($shipping_weight)));

         $this->_setWeight($shipping_pounds, $shipping_ounces);

    // BOF: UPS USPS

     

         if (in_array('Display weight', explode(', ', constant('MODULE_SHIPPING_USPS_OPTIONS_' . $vendors_id)))) {

           $shiptitle = ' (' . $shipping_num_boxes . ' x ' . $shipping_weight . 'lbs)';

         } else {

           $shiptitle = '';

         }

    // EOF: UPS USPS

     

         $uspsQuote = $this->_getQuote();

     

         if (is_array($uspsQuote)) {

           if (isset($uspsQuote['error'])) {

             $this->quotes = array('module' => $this->title,

                                   'error' => $uspsQuote['error']);

           } else {

     

    // Added MVS

         $vendors_data_query = tep_db_query("select handling_charge,

                                                    handling_per_box

                                             from " . TABLE_VENDORS . "

                                             where vendors_id = '" . (int)$vendors_id . "'"

                                           );

         $vendors_data = tep_db_fetch_array($vendors_data_query);

     

         $handling_charge = $vendors_data['handling_charge'];

         $handling_per_box = $vendors_data['handling_per_box'];

         if ($handling_charge > $handling_per_box*$shipping_num_boxes) {

           $handling = $handling_charge;

         } else {

           $handling = $handling_per_box*$shipping_num_boxes;

         }

    // EOADD MVS

     

    /* Original

             $this->quotes = array('id' => $this->code,

                                   'module' => $this->title . ' (' . $shipping_num_boxes . ' x ' . $shipping_weight . 'lbs)');

    */

    // BOF: UPS USPS

             $this->quotes = array('id' => $this->code,

                                   'module' => $this->title . $shiptitle);

    // EOF: UPS USPS

     

             $methods = array();

             $size = sizeof($uspsQuote);

             for ($i=0; $i<$size; $i++) {

               list($type, $cost) = each($uspsQuote[$i]);

     

    // BOF: UPS USPS

               $title = ((isset($this->types[$type])) ? $this->types[$type] : $type);

               if(in_array('Display transit time', explode(', ', constant('MODULE_SHIPPING_USPS_OPTIONS_' . $vendors_id))))    $title .= $transittime[$type];

     

    /* ORIGINAL

               $methods[] = array('id' => $type,

                                  'title' => ((isset($this->types[$type])) ? $this->types[$type] : $type),

                                  'cost' => ($cost + MODULE_SHIPPING_USPS_HANDLING) * $shipping_num_boxes);

    */

               $methods[] = array('id' => $type,

                                  'title' => $title,

                                  'cost' => ($cost + $handling) * $shipping_num_boxes);

             }

    // EOF: UPS USPS

     

             $this->quotes['methods'] = $methods;

     

             if ($this->tax_class > 0) {

               $this->quotes['tax'] = tep_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);

             }

           }

         } else {

           $this->quotes = array('module' => $this->title,

                                 'error' => MODULE_SHIPPING_USPS_TEXT_ERROR);

         }

     

         if (tep_not_null($this->icon)) $this->quotes['icon'] = tep_image($this->icon, $this->title);

     

         return $this->quotes;

       }

     

    // MVS Added/Changed    

    // function check() {

       function check($vendors_id = '1') {

    //EOMVS

     

         if (!isset($this->_check)) {

    // MVS Added/Changed

    //        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_USPS_STATUS'");

           $check_query = tep_db_query("select configuration_value from " . TABLE_VENDOR_CONFIGURATION . " where vendors_id = '". $vendors_id ."' and configuration_key = 'MODULE_SHIPPING_USPS_STATUS_" . $vendors_id . "'");

    // EOMVS    

       

     $this->_check = tep_db_num_rows($check_query);

         }

         return $this->_check;

       }

     

    // MVS Added/Changed

    /*

       function install() {

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable USPS Shipping', 'MODULE_SHIPPING_USPS_STATUS', 'True', 'Do you want to offer USPS shipping?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enter the USPS User ID', 'MODULE_SHIPPING_USPS_USERID', 'NONE', 'Enter the USPS USERID assigned to you.', '6', '0', now())");

    // BOF: UPS USPS

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enter the USPS Password', 'MODULE_SHIPPING_USPS_PASSWORD', 'NONE', 'See USERID, above.', '6', '0', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Which server to use', 'MODULE_SHIPPING_USPS_SERVER', 'production', 'An account at USPS is needed to use the Production server', '6', '0', 'tep_cfg_select_option(array(\'test\', \'production\'), ', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Handling Fee', 'MODULE_SHIPPING_USPS_HANDLING', '0', 'Handling fee for this shipping method.', '6', '0', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Tax Class', 'MODULE_SHIPPING_USPS_TAX_CLASS', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'tep_get_tax_class_title', 'tep_cfg_pull_down_tax_classes(', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Shipping Zone', 'MODULE_SHIPPING_USPS_ZONE', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SHIPPING_USPS_SORT_ORDER', '0', 'Sort order of display.', '6', '0', now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Domestic Shipping Methods', 'MODULE_SHIPPING_USPS_TYPES', 'Express, Priority, First Class, Parcel', 'Select the domestic services to be offered:', '6', '14', 'tep_cfg_select_multioption(array(\'Express\', \'Priority\', \'First Class\', \'Parcel\'), ',  now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Int\'l Shipping Methods', 'MODULE_SHIPPING_USPS_TYPES_INTL', 'GXG Document, GXG Non-Document, Express, Priority Lg, Priority Sm, Priority Var, Airmail Letter, Airmail Parcel, Surface Letter, Surface Post', 'Select the international services to be offered:', '6', '15', 'tep_cfg_select_multioption(array(\'GXG Document\', \'GXG Non-Document\', \'Express\', \'Priority Lg\', \'Priority Sm\', \'Priority Var\', \'Airmail Letter\', \'Airmail Parcel\', \'Surface Letter\', \'Surface Post\'), ',  now())");

         tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('USPS Options', 'MODULE_SHIPPING_USPS_OPTIONS', 'Display weight, Display transit time', 'Select from the following the USPS options.', '6', '16', 'tep_cfg_select_multioption(array(\'Display weight\', \'Display transit time\'), ',  now())");

    // EOF: UPS USPS

       }

    */

       function install($vendors_id = '1') {

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added, vendors_id) values ('Enable USPS Shipping', 'MODULE_SHIPPING_USPS_STATUS_" . $vendors_id . "', 'True', 'Do you want to offer USPS shipping?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Enter the USPS User ID', 'MODULE_SHIPPING_USPS_USERID_" . $vendors_id . "', 'NONE', 'Enter the USPS USERID assigned to you.', '6', '0', now(), '" . $vendors_id . "')");

    // BOF: UPS USPS

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Enter the USPS Password', 'MODULE_SHIPPING_USPS_PASSWORD_" . $vendors_id . "', 'NONE', 'See USERID, above.', '6', '0', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added, vendors_id) values ('Which server to use', 'MODULE_SHIPPING_USPS_SERVER_" . $vendors_id . "', 'production', 'An account at USPS is needed to use the Production server', '6', '0', 'tep_cfg_select_option(array(\'test\', \'production\'), ', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Handling Fee', 'MODULE_SHIPPING_USPS_HANDLING_" . $vendors_id . "', '0', 'Handling fee for this shipping method.', '6', '0', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added, vendors_id) values ('Tax Class', 'MODULE_SHIPPING_USPS_TAX_CLASS_" . $vendors_id . "', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'tep_get_tax_class_title', 'tep_cfg_pull_down_tax_classes(', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added, vendors_id) values ('Shipping Zone', 'MODULE_SHIPPING_USPS_ZONE_" . $vendors_id . "', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added, vendors_id) values ('Sort Order', 'MODULE_SHIPPING_USPS_SORT_ORDER_" . $vendors_id . "', '0', 'Sort order of display.', '6', '0', now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added, vendors_id) values ('Domestic Shipping Methods', 'MODULE_SHIPPING_USPS_TYPES_" . $vendors_id . "', 'Express, Priority, First Class, Parcel', 'Select the domestic services to be offered:', '6', '14', 'tep_cfg_select_multioption(array(\'Express\', \'Priority\', \'First Class\', \'Parcel\'), ',  now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added, vendors_id) values ('Int\'l Shipping Methods', 'MODULE_SHIPPING_USPS_TYPES_INTL_" . $vendors_id . "', 'GXG Document, GXG Non-Document, Express, Priority Lg, Priority Sm, Priority Var, Airmail Letter, Airmail Parcel, Surface Letter, Surface Post', 'Select the international services to be offered:', '6', '15', 'tep_cfg_select_multioption(array(\'GXG Document\', \'GXG Non-Document\', \'Express\', \'Priority Lg\', \'Priority Sm\', \'Priority Var\', \'Airmail Letter\', \'Airmail Parcel\', \'Surface Letter\', \'Surface Post\'), ',  now(), '" . $vendors_id . "')");

         tep_db_query("insert into " . TABLE_VENDOR_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added, vendors_id) values ('USPS Options', 'MODULE_SHIPPING_USPS_OPTIONS_" . $vendors_id . "', 'Display weight, Display transit time', 'Select from the following the USPS options.', '6', '16', 'tep_cfg_select_multioption(array(\'Display weight\', \'Display transit time\'), ',  now(), '" . $vendors_id . "')");

    // EOF: UPS USPS

       }

    // EOADD

     

    // MVS Added/Changed

    /*

       function remove() {

         tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");

       }

    */

       function remove($vendors_id) {

         tep_db_query("delete from " . TABLE_VENDOR_CONFIGURATION . " where vendors_id = '". $vendors_id ."' and configuration_key in ('" . implode("', '", $this->keys($vendors_id)) . "')");

       }

    // EOADD

     

    // MVS Added/Changed

    /*    

    function keys() {

    // BOF: UPS USPS

    // ORIGINAL      return array('MODULE_SHIPPING_USPS_STATUS', 'MODULE_SHIPPING_USPS_USERID', 'MODULE_SHIPPING_USPS_PASSWORD', 'MODULE_SHIPPING_USPS_SERVER', 'MODULE_SHIPPING_USPS_HANDLING', 'MODULE_SHIPPING_USPS_TAX_CLASS', 'MODULE_SHIPPING_USPS_ZONE', 'MODULE_SHIPPING_USPS_SORT_ORDER');

         return array('MODULE_SHIPPING_USPS_STATUS', 'MODULE_SHIPPING_USPS_USERID', 'MODULE_SHIPPING_USPS_PASSWORD', 'MODULE_SHIPPING_USPS_SERVER', 'MODULE_SHIPPING_USPS_HANDLING', 'MODULE_SHIPPING_USPS_TAX_CLASS', 'MODULE_SHIPPING_USPS_ZONE', 'MODULE_SHIPPING_USPS_SORT_ORDER', 'MODULE_SHIPPING_USPS_OPTIONS', 'MODULE_SHIPPING_USPS_TYPES', 'MODULE_SHIPPING_USPS_TYPES_INTL');

    // EOF: UPS USPS

       }

    */

    function keys($vendors_id) {

    // BOF: UPS USPS

    // ORIGINAL      return array('MODULE_SHIPPING_USPS_STATUS', 'MODULE_SHIPPING_USPS_USERID', 'MODULE_SHIPPING_USPS_PASSWORD', 'MODULE_SHIPPING_USPS_SERVER', 'MODULE_SHIPPING_USPS_HANDLING', 'MODULE_SHIPPING_USPS_TAX_CLASS', 'MODULE_SHIPPING_USPS_ZONE', 'MODULE_SHIPPING_USPS_SORT_ORDER');

         return array('MODULE_SHIPPING_USPS_STATUS_' . $vendors_id, 'MODULE_SHIPPING_USPS_USERID_' . $vendors_id, 'MODULE_SHIPPING_USPS_PASSWORD_' . $vendors_id, 'MODULE_SHIPPING_USPS_SERVER_' . $vendors_id, 'MODULE_SHIPPING_USPS_HANDLING_' . $vendors_id, 'MODULE_SHIPPING_USPS_TAX_CLASS_' . $vendors_id, 'MODULE_SHIPPING_USPS_ZONE_' . $vendors_id, 'MODULE_SHIPPING_USPS_SORT_ORDER_' . $vendors_id, 'MODULE_SHIPPING_USPS_OPTIONS_' . $vendors_id, 'MODULE_SHIPPING_USPS_TYPES_' . $vendors_id, 'MODULE_SHIPPING_USPS_TYPES_INTL_' . $vendors_id);

    // EOF: UPS USPS

       }

    // EOADD MVS

     

       function _setService($service) {

         $this->service = $service;

       }

     

       function _setWeight($pounds, $ounces=0) {

         $this->pounds = $pounds;

         $this->ounces = $ounces;

       }

     

       function _setContainer($container) {

         $this->container = $container;

       }

     

       function _setSize($size) {

         $this->size = $size;

       }

     

       function _setMachinable($machinable) {

         $this->machinable = $machinable;

       }

     

       function _getQuote() {

    // BOF: UPS USPS

         global $order, $vendors_id, $transittime;

     

         if(in_array('Display transit time', explode(', ', constant('MODULE_SHIPPING_USPS_OPTIONS_' . $vendors_id)))) $transit = TRUE;

    // EOF: UPS USPS

     

         if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {

           $request  = '<RateRequest USERID="' . constant('MODULE_SHIPPING_USPS_USERID_' . $vendors_id) . '" PASSWORD="' . constant('MODULE_SHIPPING_USPS_PASSWORD_' . $vendors_id) . '">';

           $services_count = 0;

     

           if (isset($this->service)) {

             $this->types = array($this->service => $this->types[$this->service]);

           }

     

           $dest_zip = str_replace(' ', '', $order->delivery['postcode']);

           if ($order->delivery['country']['iso_code_2'] == 'US') $dest_zip = substr($dest_zip, 0, 5);

     

           reset($this->types);

    // BOF: UPS USPS

           $allowed_types = explode(", ", constant('MODULE_SHIPPING_USPS_TYPES_' . $vendors_id));

           while (list($key, $value) = each($this->types)) {

    // BOF: UPS USPS

      if ( !in_array($key, $allowed_types) ) continue;

             $request .= '<Package ID="' . $services_count . '">' .

                         '<Service>' . $key . '</Service>' .

                         '<ZipOrigination>' . SHIPPING_ORIGIN_ZIP . '</ZipOrigination>' .

                         '<ZipDestination>' . $dest_zip . '</ZipDestination>' .

                         '<Pounds>' . $this->pounds . '</Pounds>' .

                         '<Ounces>' . $this->ounces . '</Ounces>' .

                         '<Container>' . $this->container . '</Container>' .

                         '<Size>' . $this->size . '</Size>' .

                         '<Machinable>' . $this->machinable . '</Machinable>' .

                         '</Package>';

     

    // BOF: UPS USPS

             if($transit){

               $transitreq  = 'USERID="' . constant('MODULE_SHIPPING_USPS_USERID_' . $vendors_id) .

                            '" PASSWORD="' . constant('MODULE_SHIPPING_USPS_PASSWORD_' . $vendors_id) . '">' .

                            '<OriginZip>' . STORE_ORIGIN_ZIP . '</OriginZip>' .

                            '<DestinationZip>' . $dest_zip . '</DestinationZip>';

     

               switch ($key) {

                 case 'Express':  $transreq[$key] = 'API=ExpressMail&XML=' .

                                  urlencode( '<ExpressMailRequest ' . $transitreq . '</ExpressMailRequest>');

                                  break;

                 case 'Priority': $transreq[$key] = 'API=PriorityMail&XML=' .

                                  urlencode( '<PriorityMailRequest ' . $transitreq . '</PriorityMailRequest>');

                                  break;

                 case 'Parcel':   $transreq[$key] = 'API=StandardB&XML=' .

                                  urlencode( '<StandardBRequest ' . $transitreq . '</StandardBRequest>');

                                  break;

                 default:         $transreq[$key] = '';

                                  break;

               }

             }

    // EOF: UPS USPS

     

             $services_count++;

           }

           $request .= '</RateRequest>';

     

           $request = 'API=Rate&XML=' . urlencode($request);

         } else {

           $request  = '<IntlRateRequest USERID="' . constant('MODULE_SHIPPING_USPS_USERID_' . $vendors_id) . '" PASSWORD="' . constant('MODULE_SHIPPING_USPS_PASSWORD_' . $vendors_id) . '">' .

                       '<Package ID="0">' .

                       '<Pounds>' . $this->pounds . '</Pounds>' .

                       '<Ounces>' . $this->ounces . '</Ounces>' .

                       '<MailType>Package</MailType>' .

                       '<Country>' . $this->countries[$order->delivery['country']['iso_code_2']] . '</Country>' .

                       '</Package>' .

                       '</IntlRateRequest>';

     

           $request = 'API=IntlRate&XML=' . urlencode($request);

         }

     

         switch (constant('MODULE_SHIPPING_USPS_SERVER_' . $vendors_id)) {

           case 'production': $usps_server = 'production.shippingapis.com';

                              $api_dll = 'shippingapi.dll';

                              break;

           case 'test':

           default:           $usps_server = 'testing.shippingapis.com';

                              $api_dll = 'ShippingAPITest.dll';

                              break;

         }

     

         $body = '';

     

         $http = new httpClient();

         if ($http->Connect($usps_server, 80)) {

           $http->addHeader('Host', $usps_server);

           $http->addHeader('User-Agent', 'osCommerce');

           $http->addHeader('Connection', 'Close');

     

           if ($http->Get('/' . $api_dll . '?' . $request)) $body = $http->getBody();

    // BOF: UPS USPS

    //  mail('you@yourdomain.com','USPS rate quote response',$body,'From: <you@yourdomain.com>');

           if ($transit && is_array($transreq) && ($order->delivery['country']['id'] == STORE_COUNTRY)) {

             while (list($key, $value) = each($transreq)) {

               if ($http->Get('/' . $api_dll . '?' . $value)) $transresp[$key] = $http->getBody();

             }

           }

    // EOF: UPS USPS

     

           $http->Disconnect();

         } else {

           return false;

         }

     

         $response = array();

         while (true) {

           if ($start = strpos($body, '<Package ID=')) {

             $body = substr($body, $start);

             $end = strpos($body, '</Package>');

             $response[] = substr($body, 0, $end+10);

             $body = substr($body, $end+9);

           } else {

             break;

           }

         }

     

         $rates = array();

         if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {

           if (sizeof($response) == '1') {

             if (ereg('<Error>', $response[0])) {

               $number = ereg('<Number>(.*)</Number>', $response[0], $regs);

               $number = $regs[1];

               $description = ereg('<Description>(.*)</Description>', $response[0], $regs);

               $description = $regs[1];

     

               return array('error' => $number . ' - ' . $description);

             }

           }

     

           $n = sizeof($response);

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

             if (strpos($response[$i], '<Postage>')) {

               $service = ereg('<Service>(.*)</Service>', $response[$i], $regs);

               $service = $regs[1];

               $postage = ereg('<Postage>(.*)</Postage>', $response[$i], $regs);

               $postage = $regs[1];

     

               $rates[] = array($service => $postage);

     

    // BOF: UPS USPS

               if ($transit) {

                 switch ($service) {

                   case 'Express':     $time = ereg('<MonFriCommitment>(.*)</MonFriCommitment>', $transresp[$service], $tregs);

                                       $time = $tregs[1];

                                       if ($time == '' || $time == 'No Data') {

                                         $time = '1 - 2 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       } else {

                                         $time = 'Tomorrow by ' . $time;

                                       }

                                       break;

                   case 'Priority':    $time = ereg('<Days>(.*)</Days>', $transresp[$service], $tregs);

                                       $time = $tregs[1];

                                       if ($time == '' || $time == 'No Data') {

                                         $time = '2 - 3 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       } elseif ($time == '1') {

                                         $time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAY;

                                       } else {

                                         $time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       }

                                       break;

                   case 'Parcel':      $time = ereg('<Days>(.*)</Days>', $transresp[$service], $tregs);

                                       $time = $tregs[1];

                                       if ($time == '' || $time == 'No Data') {

                                         $time = '4 - 7 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       } elseif ($time == '1') {

                                         $time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAY;

                                       } else {

                                         $time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       }

                                       break;

                   case 'First Class': $time = '2 - 5 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;

                                       break;

                   default:            $time = '';

                                       break;

                 }

                 if ($time != '') $transittime[$service] = ' (' . $time . ')';

               }

    // EOF: UPS USPS

             }

           }

         } else {

           if (ereg('<Error>', $response[0])) {

             $number = ereg('<Number>(.*)</Number>', $response[0], $regs);

             $number = $regs[1];

             $description = ereg('<Description>(.*)</Description>', $response[0], $regs);

             $description = $regs[1];

     

             return array('error' => $number . ' - ' . $description);

           } else {

             $body = $response[0];

             $services = array();

             while (true) {

               if ($start = strpos($body, '<Service ID=')) {

                 $body = substr($body, $start);

                 $end = strpos($body, '</Service>');

                 $services[] = substr($body, 0, $end+10);

                 $body = substr($body, $end+9);

               } else {

                 break;

               }

             }

     

    // BOF: UPS USPS

             $allowed_types = array();

             foreach( explode(", ", constant('MODULE_SHIPPING_USPS_TYPES_INTL_' . $vendors_id)) as $value ) $allowed_types[$value] = $this->intl_types[$value];

    // EOF: UPS USPS

     

             $size = sizeof($services);

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

               if (strpos($services[$i], '<Postage>')) {

                 $service = ereg('<SvcDescription>(.*)</SvcDescription>', $services[$i], $regs);

                 $service = $regs[1];

                 $postage = ereg('<Postage>(.*)</Postage>', $services[$i], $regs);

                 $postage = $regs[1];

    // BOF: UPS USPS

                 $time = ereg('<SvcCommitments>(.*)</SvcCommitments>', $services[$i], $tregs);

                 $time = $tregs[1];

                 $time = preg_replace('/Weeks$/', MODULE_SHIPPING_USPS_TEXT_WEEKS, $time);

                 $time = preg_replace('/Days$/', MODULE_SHIPPING_USPS_TEXT_DAYS, $time);

                 $time = preg_replace('/Day$/', MODULE_SHIPPING_USPS_TEXT_DAY, $time);

     

                 if( !in_array($service, $allowed_types) ) continue;

    // EOF: UPS USPS

                 if (isset($this->service) && ($service != $this->service) ) {

                   continue;

                 }

     

                 $rates[] = array($service => $postage);

    // BOF: UPS USPS

          if ($time != '') $transittime[$service] = ' (' . $time . ')';

    // EOF: UPS USPS

               }

             }

           }

         }

     

         return ((sizeof($rates) > 0) ? $rates : false);

       }

     

       function country_list() {

         $list = array('AF' => 'Afghanistan',

                       'AL' => 'Albania',

                       'DZ' => 'Algeria',

                       'AD' => 'Andorra',

                       'AO' => 'Angola',

                       'AI' => 'Anguilla',

                       'AG' => 'Antigua and Barbuda',

                       'AR' => 'Argentina',

                       'AM' => 'Armenia',

                       'AW' => 'Aruba',

                       'AU' => 'Australia',

       


  20. I've found the problem with the UPS quotes. In admin/vendor_modules.php, find the following (starting at line 20):

    Thanks Jim, this fixed the UPS quotes for me.

     

    Something I've noticed though, in Admin>Vendors>Vendor Manager>Manage the Sort Order doesn't show, probably a very minor issue. Also, with the USPS module the USPS Options just show "array". Same with USPS Domestic Shipping Methods, just shows "array". I can edit the module, but when I save the changes, it stills shows "array", not the actual Options and Rates. Could that have something to do with the quote not working? I noticed that when the UPS module didn't work it had the same symptom, but now that I've applied your fix, the rates show correctly.

     

    Thanks again,

    Rick Knight


  21. Also make certain that SELECT_VENDOR_SHIPPING is set to 'true' in your database.

    Thanks Guys, that was the problem, and I also somehow managed to not copy vendors_shipping.php. Ooops.

     

    Everything appears correct except that I cannot get a UPS or USPS rate. Table and Flat work fine but UPS gives nothing and USPS returns this message

    An error occured with the USPS shipping calculations.

    If you prefer to use USPS as your shipping method, please contact the store owner.

    I also used Jim's instructions for modifying shipping modules to modify my existing USPS module, but I get the same results. I've checked my configuration for UPS/USPS account information and rate selection, everything is correct. Any Idea why two modules work and two don't?

    I have written an instruction sheet on modifying modules. I need to make a couple of fixes and then I'll post it in the Contribution area. This may help you in modifying another module. I'd be interested in knowing how you do with that as well.

    Jim. This worked great. Easy to fillow even though there are a lot of changes that need to be made.

     

    Also, at the bottom of shopping_cart.php you have the following code...

    <?php
     require(DIR_WS_INCLUDES . 'show_variables.php');
     require(DIR_WS_INCLUDES . 'application_bottom.php');
    ?>

    I don't have a "show_variables.php" so I commented that line out. Is it needed for something?

     

    Thank again,

    Rick Knight

×