X-Cart: shopping cart software

X-Cart forums (https://forum.x-cart.com/index.php)
-   Dev Questions (https://forum.x-cart.com/forumdisplay.php?f=20)
-   -   PO Numbers on Invoices, Searchable in Orders. (https://forum.x-cart.com/showthread.php?t=31653)

Berto 06-04-2007 08:55 PM

PO Numbers on Invoices, Searchable in Orders.
 
I've been asked to include this modification for people who want to have order-based Purchase Order Numbers, pulling that info from the encrypted field and making it searchable in the admin Orders section. This mod also includes PO Numbers on invoices.

Caveat: In this mod, the new PO Number field is not encrypted. If that's important, then you must modify further to include encryption.

This has been tested on X-Cart 4.1.7. You may wish to modify further for other versions of X-Cart.


Don't forget -- Step One is to create a new field in the database. Steps Two through Ten follow in the next post.


Step 1: Create a new database field with phpMyAdmin or another method in the xcart_orders table directly after "extra," called po_number. (Varchar(50), not null).

see next post for more... :D

Berto 06-04-2007 08:58 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Step 2: Add this to the bottom of xcart_root_folder/include/func/func.db.php: --(See reply #6 for a fix.)

Code:

function getPONum($o_details) {
        if (strpos($o_details, "PO Number") > -1) {
                $po_number_arr = explode(' ',$o_details);
                        for ($int=0; $int<count($po_number_arr); $int++) {
                                if ((strpos($po_number_arr[$int], "PO") > -1)&&(strpos($po_number_arr[$int + 1], "Number") > -1)) {
                                        $po_num = $po_number_arr[$int + 2];
                                        break;
                                }
                        }
                return $po_num;
        } else {
                return "";
        }
}



Step 3: The above will not work if there are spaces in the PO Number, so modify xcart_root_folder/skin1/customer/main/payment_po.tpl:
Add this script after the "required fields" script (just before the table tag):
Code:

{literal}
<script type="text/javascript">
<!--
function ckFld() {
 var fld = document.checkout_form.PO_Number;
 if (fld.value.indexOf(' ') > -1) {
        alert('There can be no spaces in this field.');
        fld.value = fld.value.replace(' ','');
        fld.focus();
 }
}
-->
</script>
{/literal}

and change this line:
Code:

<input type="text" size="32" id="PO_Number" name="PO_Number" />
to this:
Code:

<input type="text" size="32" id="PO_Number" name="PO_Number" onChange="ckFld();" />


Step 4: Find the array in xcart_root_folder/include/func/func_order.php that begins:
Code:

$insert_data = array (
and insert "po_number" at the end of it (around line 579) by replacing this:
Code:

        'extra' => addslashes(serialize($_extra)));
with the following, so that the last two lines in the array read:
Code:

        'extra' => addslashes(serialize($_extra)),
        'po_number' => addslashes(getPONum($order_details)));



Step 5: Modify xcart_root_folder/include/orders.php:

Find the array:
Code:

$advanced_options = array("orderid1", "orderid2", "total_max", "payment_method", "shipping_method", "status", "provider", "features", "product_substring", "productcode", "productid", "price_max", "customer", "address_type", "phone", "email");
and replace it with this to add "po_number" so that it reads:
Code:

$advanced_options = array("orderid1", "orderid2", "total_max", "payment_method", "po_number", "shipping_method", "status", "provider", "features", "product_substring", "productcode", "productid", "price_max", "customer", "address_type", "phone", "email");

In the same file, find:
Code:

        if (!empty($sort) && in_array($sort, array("orderid","status","customer","date","provider", "total"))) {
and change it to include "po_number" as well, to read:
Code:

        if (!empty($sort) && in_array($sort, array("orderid","status","customer","date","po_number","provider", "total"))) {

Then, find this "if" clause (around line 182):
Code:

        # Search by payment method
        if (!empty($data["payment_method"]))
                $search_condition .= " AND $sql_tbl[orders].payment_method LIKE '".$data["payment_method"]."%'";

keep it there and add another search clause below it, (before "# Search by shipping method"):
Code:

        # Search by po number
        if (!empty($data["po_number"]))
                $search_condition .= " AND $sql_tbl[orders].po_number LIKE '%".$data["po_number"]."%'";


The last mod on this file is to find this case (around line 420):
Code:

        case "date":
                $sort_string = "$sql_tbl[orders].date $direction";
                break;

keep it there and add this case below it:
Code:

        case "po_number":  // added for po number
                $sort_string = "($sql_tbl[orders].po_number + 0) $direction";
                break;



Step 6: In the file xcart_root_folder/admin/order.php, find this line (around line 190):
Code:

                $query_data['details'] = func_crypt_order_details($details);
and add this line directly under it:
Code:

                $query_data['po_number'] = getPOnum($details);


Step 7: Edit the file xcart_root_folder/skin1/mail/html/order_invoice.tpl:

Find this line:
Code:

<b>{$lng.lbl_payment_method}:</b><br />{$order.payment_method}<br /><b>{$lng.lbl_delivery}:</b><br />{$order.shipping|trademark|default:$lng.txt_not_available}
and change it to:
Code:

<b>{$lng.lbl_payment_method}:</b><br />{$order.payment_method}<br /><b>{$lng.lbl_po_number}:</b> {$order.po_number}<br /><b>{$lng.lbl_delivery}:</b><br />{$order.shipping|trademark|default:$lng.txt_not_available}


Step 8: Edit the file xcart_root_folder/skin1/main/order_info.tpl:

After the table row:
Code:

<tr>
        <td valign="top">{$lng.lbl_payment_method}</td>
        <td valign="top">{$order.payment_method}</td>
</tr>

add this new table row:
Code:

<tr>
        <td valign="top">{$lng.lbl_po_number}</td>
        <td valign="top">{$order.po_number}</td>
</tr>



Step 9: Edit the file xcart_root_folder/skin1/main/order_list.tpl:

Find the section:
Code:

<tr class="TableHead">
        <td width="5">&nbsp;</td>
        <td width="5%" nowrap="nowrap">{if $search_prefilled.sort_field eq "orderid"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=orderid">#</a></td>
        <td nowrap="nowrap">{if $search_prefilled.sort_field eq "status"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=status">{$lng.lbl_status}</a></td>
        <td width="30%" nowrap="nowrap">{if $search_prefilled.sort_field eq "customer"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=customer">{$lng.lbl_customer}</a></td>
{if $usertype eq "A" and $single_mode eq ""}
{assign var="colspan" value=7}
        <td width="20%" nowrap="nowrap">{if $search_prefilled.sort_field eq "provider"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=provider">{$lng.lbl_provider}</a></td>
{/if}
        <td width="20%" nowrap="nowrap">{if $search_prefilled.sort_field eq "date"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=date">{$lng.lbl_date}</a></td>
        <td width="20%" align="right" nowrap="nowrap">{if $search_prefilled.sort_field eq "total"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=total">{$lng.lbl_total}</a></td>
</tr>

and replace it with this:
Code:

<tr class="TableHead">
        <td width="5">&nbsp;</td>
        <td width="5%" nowrap="nowrap">{if $search_prefilled.sort_field eq "orderid"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=orderid">#</a></td>
        <td nowrap="nowrap">{if $search_prefilled.sort_field eq "status"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=status">{$lng.lbl_status}</a></td>
        <td width="35%" nowrap="nowrap">{if $search_prefilled.sort_field eq "customer"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=customer">{$lng.lbl_customer}</a></td>
{if $usertype eq "A" and $single_mode eq ""}
{assign var="colspan" value=7}
        <td width="20%" nowrap="nowrap">{if $search_prefilled.sort_field eq "provider"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=provider">{$lng.lbl_provider}</a></td>
{/if}
        <td width="20%" nowrap="nowrap">{if $search_prefilled.sort_field eq "date"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=date">{$lng.lbl_date}</a></td>
        <td width="15%" nowrap="nowrap">{if $search_prefilled.sort_field eq "po_number"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=po_number">{$lng.lbl_po_number}</a></td>
        <td width="10%" align="right" nowrap="nowrap">{if $search_prefilled.sort_field eq "total"}{include file="buttons/sort_pointer.tpl" dir=$search_prefilled.sort_direction}&nbsp;{/if}<a href="orders.php?mode=search&amp;sort=total">{$lng.lbl_total}</a></td>
</tr>


Find this line:
Code:

        <td nowrap="nowrap"><a href="order.php?orderid={$orders[oid].orderid}">{$orders[oid].date|date_format:$config.Appearance.datetime_format}</a></td>
and add this line directly under it:
Code:

        <td nowrap="nowrap"><a href="order.php?orderid={$orders[oid].orderid}">{$orders[oid].po_number}</a></td>


Step 10: Edit the file xcart_root_folder/skin1/main/orders.tpl:

Find the line:
Code:

var searchform_def = [
and at the end of that entire array insert:
Code:

['posted_data[po_number]', '']
after the 'posted_data[status]' line.

Now find the table row:
Code:

<tr>
        <td class="FormButton" nowrap="nowrap">{$lng.lbl_payment_method}:</td>
        <td width="10">&nbsp;</td>
        <td>
        <select name="posted_data[payment_method]" style="width:70%">
                <option value=""></option>
{section name=pm loop=$payment_methods}
                <option value="{$payment_methods[pm].payment_method}"{if $search_prefilled.payment_method eq $payment_methods[pm].payment_method} selected="selected"{/if}>{$payment_methods[pm].payment_method}</option>
{/section}
        </select>
        </td>
</tr>

and add this row after it:
Code:

<tr>
        <td class="FormButton" nowrap="nowrap">{$lng.lbl_po_number}:</td>
        <td width="10">&nbsp;</td>
        <td>
        <input type="text" name="posted_data[po_number]" size="30" value="{$search_prefilled.po_number}" style="width:70%" />
        </td>
</tr>



That's it. :D

chamberinternet 06-08-2007 05:34 AM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Hello ...
This is great :) It's working fine ... apart from just one thing ..

I'm not sure if it's the function getPONum() but as well as attaching the PO Number is also grabbing the first word of the next line (In this case it's Company Name)

So when i look at the database the po_number field is showing "5361 Company"
(5361 is the actual po number i entered)

Any ideas ?

Thanks A Lot ...

Regards

Shafiq :sK

Berto 06-08-2007 03:28 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Oh, yes...

We removed the Company name and Name of purchaser from our po orders, so, no wonder this didn't come up! My function finds spaces, but not line returns. So here's a possible fix:

Try this function instead in your file x-cart_root/include/func/func.db.php:
Code:

function getPONum($o_details) {
        if (strpos($o_details, "PO Number") > -1) {
                $po_number_arr = explode(' ',$o_details);
                        for ($int=0; $int<count($po_number_arr); $int++) {
                                if ((strpos($po_number_arr[$int], "PO") > -1)&&(strpos($po_number_arr[$int + 1], "Number") > -1)) {
                                        $po_arr = explode('\n', $po_number_arr[$int + 2]);
                                        $po_num = $po_arr[0];
                                        break;
                                }
                        }
                return $po_num;
        } else {
                return "";
        }
}


Let me know if that one works! :D

chamberinternet 06-09-2007 11:38 AM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Hello ... Just tried this ... But no joy :(

Any other ideas ?

Thanks & Regards

Shafiq :sK

Berto 06-09-2007 02:04 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Ugh. :roll:

We've got to find how your system registers line breaks.

So, try this function at the bottom of x-cart_root/include/func/func.db.php instead:
Code:

function getPONum($o_details) {
        if (strpos($o_details, "PO Number") > -1) {
                $o_string = preg_replace("/\r\n|\n|\r/", " ", $o_details);
                $po_number_arr = explode(' ',$o_string);
                for ($int=0; $int<count($po_number_arr); $int++) {
                        if ((strpos($po_number_arr[$int], "PO") > -1)&&(strpos($po_number_arr[$int + 1], "Number") > -1)) {
                                $po_num = $po_number_arr[$int + 2];
                                break;
                        }
                }
                        return $po_num;
        } else {
                return "";
        }
}


Does that do it? I hope so! :D

chamberinternet 06-09-2007 02:11 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Excellent :D !!

That did the trick ... Thanks very much !!!

Regards

Shafiq :sK

Berto 06-11-2007 12:58 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Quote:

Originally Posted by chamberinternet
Excellent :D !!

That did the trick ... Thanks very much !!!

Regards

Shafiq :sK


Hooray! :D

Now it's a pretty nifty mod for 4.1.x.

Cheers,

GreatLakesVacuum 03-02-2009 11:46 AM

Re: PO Numbers on Invoices, Searchable in Orders.
 
I tried this on 4.2 ... yikes ... all kinds of stuff is broken now ... I think i backed up all the files but one :( So now to try to undo it all...

GreatLakesVacuum 03-02-2009 12:18 PM

Re: PO Numbers on Invoices, Searchable in Orders.
 
Quote:

Originally Posted by GreatLakesVacuum
I tried this on 4.2 ... yikes ... all kinds of stuff is broken now ... I think i backed up all the files but one :( So now to try to undo it all...


Nevermind, I screwed up a step, it works fine!


All times are GMT -8. The time now is 09:35 PM.

Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.