Welcome to Merchant Order Form
version 1.4
Ver. 1.5 available soon for free too.
What do you want to order today?
- Smart looking
invoices to print, mail, or fax
- Logging and/or
emailing orders to Merchant
- Logging to
a RDB format for import to PC database
- Customer
email confirmation
- Online Checking
information input
- Flexible
configurations for discounts or handling charges
- Adaptable
shipping methods, rates, configurations
- Automatic
foreign shipping rate change
- Multi State
tax configurations with adjustable computations
- Accepts input
for Cards, Checks, custom OrderForms
- Built in
support for custom shipping configurations
- Built in
support for customizing additional field input
- Built in
switch to require "cyber permission" approval
Merchant
OrderFormv1.4 are program
scripts written in Perl 5 code for use on Unix type or
NT systems using CGI (Common Gateway Interface). The program
scripts are installed and run on the server where your
Web Site is.
You should be
able to install the OrderForm page and the program's script
files if:
- You know
how to edit a Web Page file (an HTML file) and transfer
it to your server
- You know
how to FTP (file transfer Protocol) a regular text file
to your server
The documentation
can help someone with little to no experience installing
CGI scripts; however, if you don't know the difference between
an HTML file and a CGI file, then you're probably in for
a rough ride. Begin with the Quick Start section and follow the instructions
carefully.
Merchant
OrderFormv1.4 is loaded
with settings and options, from simple to complex, that
can be adjusted and/or configured to process your OrderForm
input in many ways.
You can read
an overview of each configuration section's abilities
and limitations under the heading further on in this document:
Each of the configuration sections begins with
an overview of what that group of settings can do. If you
need to know if you can adjust things the way you need them,
then find your way to the "What can these settings do"
section for that group of configurations, and consult the
summary there.
You can also
find answers for other questions under the heading:
| Table of Contents for this Documentation |
Merchant OrderFormv1.4 |
- Appendix 1 – Name - Value pairs used
in the OrderForm input Page
- Appendix 2 – Acronyms for
using with State tax matching
- Appendix 3 – Names used for
Country Matching
- Appendix 4 - Structure of the related
RDB files
Notice:This documentation is packaged with registered copies of
Merchant OrderFormv1.4,
and should not be distributed in anyway. Resale or
Redistribution of this documentation or the Merchant
OrderFormv1.4 programs and scripts is strictly
prohibited without the author's permission. Please visit
the Merchant
OrderForm Web Site to obtain registered copies of
the program or obtain information about registering it for
your web site. Standard disclaimer applies.
Merchant
Order Formv1.4 is a smart
Online OrderForm and invoice system for small product
collections. It interacts smartly with the user, and presents
friendly feedback. It does not process credit card
or online check transactions in real-time. It provides
four ways to process orders from your Online Customers:
- Send the
order via email to the Merchant
- Log the invoice
and orders into a Master Logging file
- Log the invoice
and orders into a delimited file for RDM import
- Send the
Customer an email verification of their orders
It is convenient for small collections of products,
since you only need to add new items to the HTML OrderForm
input page. Once Merchant OrderForm is up and running on
your Web site, then you only need to change your HTML OrderForm
to update, add, or delete your line of products. It's as
simple as editing your HTML OrderForm page.
You can layout
your HTML OrderForm page using checkboxes, dropdown boxes,
listboxes, radio buttons, or hidden input, and Merchant
OrderForm will sort out your Customer's orders and present
smart looking invoices.
Merchant
Order Form v1.4 will
handle as many New Products as your server has memory;
however, this would not seem practical since the customer
doesn't want to go through hundreds of checkboxes to order
items. So, it's probably more applicable to smaller collections
of products, whereas, a database / shopping cart system
seems more user friendly for large product collections.
A database / shopping cart system also allows the shopper
to "add" products from any page on the Web Site, and collect
in a "cart." Merchant OrderForm produces invoices from
one OrderForm at a time.
You need to
do two things to get the scripts up and running in test
mode:
- FTP the scripts
to your server's Cgi-Bin exactly as they are
- Set file
permissions on each of the files so they will execute
The program files are already configured to
run without any of the features enabled in the configuration
file, for basic installation and testing. Once you have
all 3 scripts running, then you can begin to play with the
configurations and features in the configuration file, but
I recommend getting all scripts running in basic mode first
before you start to configure it for your site needs.
- First, FTP
(File Transfer Protocol) the 9 files below
straight to your Unix, Linux server's CGI-BIN. They
should transfer and run exactly as is, without even
opening them up. Eventually you will need to open the
configuration file, but you don't need to do that now.
For now, just send them over as they are when you unpacked
them.
Important: Make sure to FTP the files
in ASCII mode only, do not use the FTP Binary Mode, else
the scripts won't work on your server's end.
- Next, you
need to set correct file Permissions on the files
you just sent to your server's CGI-BIN.
Note: Many FTP programs have a way to
set Unix type permissions from their menus. If you don't
have a way to set "permissions" from your FTP, then get
one that can, it's easier than doing it by Telnet (if you
even have Telnet access on your server). You can find some
Freeware FTP Clients (programs) at the NoNags
Web Site.
Here are the
files you need to FTP and the corresponding permissions
they need to work. Transfer all 9 files, and set the 4
"cgi" files with complete "execute" permissions, then
set the 2 "dat" files and 3 "rdb" files with complete
"execute" and "write" permissions.
| Filename |
Owner Permissions |
Group Permissions |
Other Permissions |
| orderconfig.cgi |
Read,
Write, Execute |
Read,
Execute |
Read,
Execute |
| orderfinal14.cgi |
Read,
Write, Execute |
Read,
Execute |
Read,
Execute |
| orderform14.cgi |
Read,
Write, Execute |
Read,
Execute |
Read,
Execute |
| ordercount14.cgi |
Read,
Write, Execute |
Read,
Execute |
Read,
Execute |
| orderlog.dat |
Read,
Write, Execute |
Read,
Write, Execute |
Read,
Write, Execute |
| ordernumber.dat |
Read,
Write, Execute |
Read,
Write, Execute |
Read,
Write, Execute |
| ordermain.rdb |
Read,
Write, Execute |
Read,
Write, Execute |
Read,
Write, Execute |
| ordercustom.rdb |
Read,
Write, Execute |
Read,
Write, Execute |
Read,
Write, Execute |
| orderorders.rdb |
Read,
Write, Execute |
Read,
Write, Execute |
Read, Write, Execute |
- Note: If you are using a Telnet connection to set permissions
in Unix then you can use:
- directory/> chmod
755 filename.cgi for Read, Execute permissions
- directory/> chmod
777 filename.cgi for Read, Write, Execute permissions
Now you should have the basic scripts and the configuration
file set to run from your Web Browser.
Perform a test and
see if you can run each of the scripts independently from
your Web Browser. You don't need to submit anything from
the HTML orderform to run them. Simply plug in the HTTP
addresses where you placed the scripts on your server
into your Web Browser's address or location bar. Here's
an example from my site.
All three of the
main script files should run this way. If they don't and
you're sure you followed the two important rules above (1)
FTP ASCII Mode only, and (2) Setting Permissions,
then you are getting a server error for some reason. If
you are getting server errors, you should consult the section
of this documentation - A checklist for installing CGI on Unix type servers.
Of course, you'll
get error messages when you run the first script <orderform14.cgi>
saying you haven't completed the data entry fields, but
the script is running, it's doing exactly what it's supposed
to do without the information submitted by your OrderForm
Page.
You'll also
get incomplete information when you run the other two
scripts this way <ordercount14.cgi> and <orderfinal14.cgi>
because they aren't processing any relevant information,
but the scripts should still run.
The <orderfinal14.cgi>
file will not test this way if "cyber permission" is enabled.
It is disabled in the download package. Unless you turned
it on in the configuration file, then it should be disabled.
Also, all other switches are initially turned off in the
configuration file, disabling things like file locking,
file logging, and mailing, which could prevent this final
file from executing independently.
When you have
tested all three main script files and they are running
on your server, then you are ready to begin your journey
of configuring Merchant OrderForm for your site needs.
You can place your HTML input OrderForm file <orderform14.html>
anywhere you want, and point the FORM POST tag to the
first processing file <orderform14.cgi>
Here are some
examples:
- <FORM
method=POST action="../cgi-bin/orderform14.cgi">
- <FORM
method=POST action="http://www.yourdomain.com/cgi-bin/orderform14.cgi">
- <FORM
method=POST action="https://www.yourdomain.com/cgi-bin/orderform14.cgi">
This type of HTML
tag is embedded inside the HTML code of your HTML OrderForm
input Page. It identifies an address and file name of where
the contents of the FORM will be sent when someone clicks
the "Submit" button on the OrderForm. You browser then sends
the entire contents of any FORM input to the file you identified.
In the above examples, all your FORM content is sent to
the Merchant OrderForm first processing file, which takes
over from there.
There is a main
example HTML OrderForm included in the package <orderform14.html>. It includes all the input
fields that you might want to use for your OrderForm.
There are also some samples of different ways you might
want to make your OrderForm input page.
They are meant to serve as examples, and you
can create your own HTML OrderForm if you want. You can
also modify the example OrderForms any way you want for
your site needs. If you create your own OrderForm then just
make sure you use the same name / value pairs that I have
used. A detailed listing of these name / value pairs can
be found in Appendix 1 at the end of this documentation.
The scripts process information by these names only. Therefore,
your OrderForm input Page will have to use these same "input
names."
- If you want
to process only Online checking account information, then:
Omit the credit card section on the OrderForm input
page. You can place the "I'll pay by check" checkbox
as a hidden variable. Now your form appears to process
only checks.
- You can also
remove the "checking account" section altogether and
the form appears to process only credit card transactions.
- Remove the
"additional customer information" section if you don't
need this, but make sure to keep the phone number, fax
number, and email fields if you need them, the "phone
field" has a validation rule, you'll have to remove
this if you don't use the phone field.
- You can remove
everything but shipping destination, and place the "pay
by check" as a hidden variable, and the form appears
to allow processing for money
order only.
- You can set
up an OrderForm that builds a product, like a custom
made computer, by creating sections with drop down menus.
The customer selects each component by choosing it from
the list.
- You can set
up an OrderForm where a set of radio buttons, checkboxes,
or drop down boxes list options for color, size, etc
for a product.
It's okay to omit fields that you don't need.
Just leave them out of your OrderForm input Page. The scripts
don't care about what is not there to process. However,
the first processing script attempts to validate that necessary
input is present. Necessary input is considered:
- At least
one ordered item, whether user chosen or hidden input
- At least
one choice of payment type, whether user chosen or hidden
input
- The essential
shipping destination information
- The "select"
input for Country and State is best as drop down menus
- And a phone
number in case some Merchant contact is needed
If you need additional input other than the
fields I have named in the main OrderForm input Page, then
you can configure the scripts to process input names of
your own. See the documentation on Working with settings
in the configuration file - Installing Custom Fields. You can place an unlimited
number of name / value pairs in your HTML input tags, as
long as you tell the configuration file what their names
are. Make sure you don't use any of the same name / value
pairs that I've already assigned. Consult the listing
in Appendix 1.
My examples
of the HTML OrderForm input Pages also include links to
picture windows to put images of your products in. You
can take this out, and everything will work fine. The
files named <show1.html> through <show9.html> are the picture windows. If you use this
set up, you'll need to add the images into the HTML windows.
The <scripts.jpg>
file is just a logo. When you configure the three processing
files, you can use a similar image for your site logo,
or you can omit the image and just use a name.
Merchant
Order Form v1.4 scripts will process the
product items in your HTML OrderForm input Page as long
as you keep to the format I've set up.
Here are the
two rules:
- The name
must be exactly "order"
- The value
must contain four elements separated by 4 minus
signs as delimiters
Here's the exact
HTML syntax to add new checkboxes to your HTML OrderForm
input Page.
<input
type="checkbox"
name="order"
value="Item Name----Description
of the Item----11.65----1">
This tag will create a new checkbox that, when
checked by the user, will send the Item Name, Item Description,
Price, and ShipCode to the CGI processing files. The processing
files will identify only the "order" NAME for processing
product data, and the VALUE data will be extracted correctly
only if the delimiters are used correctly.
You can use
any input type you like as long as the name / value pair
follows the pattern outlined. You can use radio buttons,
drop down boxes, list boxes, check boxes. Just make sure
you always name a product "order" and give the
value the 4 elements defined. All of your product names
will be "order." This is how the scripts tell it's a product
to be sorted out separately from the other information.
Usually, HTML Form input names would not be duplicated;
however, you must duplicate them here.
You can also
format the appearance of your checkboxes, dropdown boxes,
listboxes, radio buttons anyway you want. The way they
appear on the page, the type of labeling you use has nothing
to do with the underlying input name / value tags. You
can use images, links, or anything else to list and describe
your products as long as the underlying input name / value
attributes are correct.
If you get errors
from the invoice processing you better check this portion
very carefully and make sure that the NAME and
VALUE delimiters are correct. The delimiter "----"
4 minus signs together with no spaces between text must
be correct, and you must include all 4 pieces of information
in correct sequence for the VALUE.
- NAME="order"
- VALUE="Item
Name----Item Description----Price----ShipCode"
The Price must be in 2 decimal format
"100.00" and it must be a raw number with no dollar signs
or other formatting like commas, etc. If the price is fifty
cents then you would show that as "0.50", or $1,275.35 would
be shown as "1275.35".
The ShipCode
must be free of any formatting also, and can contain only
a numerical value. For now, you can just put ones for
your ShipCode. Merchant OrderForm
v1.4 has some serious flexibility when computing shipping
charges, and in order to fully appreciate what you can
do with your ShipCodes you may have to read about shipping
computations in the next section called - Working
with settings in the configuration file.
You don't need
to understand the configuration file in detail at this
point, but you will need some forethought to how you want
to assign ShipCode values to each product. So, I will
cover some information on how to think about using the
ShipCodes.
There are two ways to think about using the
global shipping schema:
Calculate
shipping charges as percentage of price
The first way is to simply calculate shipping
charges based on the cost of products. If you use this
method then you don't need shipcodes, because you already
have product prices listed. Just assign a "1" to every
shipcode for this schema. The "1" won't be used under
this schema, but you still need the value there as a placeholder.
Shipping will be computed using the actual price of products.
Calculate
shipping charges by weight per item, or dollar amount
per item
The second way
to use global settings is to set up your shipcodes as
either a:
- Weight
per item or a
- Shipping
amount per item
Which are interchangeable.
Then use the "Global Settings" (discussed in the next section)
and compute shipping charges based on the overall weight
or overall amount of the entire invoice.
Either this
item would be 35 cents to ship, or it would weigh 0.35
pounds.
- NAME="order"
VALUE="Name----Description----12.95----0.35"
Note: If using the "Global Setting" schema use the weight
or cost values for your entire list of products. Don't try
to use weight for one and amount to ship for another. This
is really a different schema, not the "Global" method.
When using the
"Global Settings" for shipping computations, then the
entire invoice's orders are totaled with the [weight X
quantity] for each product. You will instruct the configuration
file to deal with the total weight or shipping amount
from the invoice in different ways. Here are some of the
ways the "Global" computations would work:
- Using a rate
per pound
- Using a rate
for every 2.5 pounds
- Using a one
time rate regardless of the totals
- Using a rate
for each 5 pounds up to a maximum of $ 25.00 then charges
are free
Don't even think
about using these settings unless you are ready to think
about multiple arrays in perl 5. This schema uses 12 individual
settings for each shipcode assigned, and can get complicated.
Better to start with the suggestions above, which should
cover most shipping needs.
If you want
to use this level of computations then, you would use
a system of numbering for your ShipCodes starting at 1,
and proceeding in sequence to how ever many different
individual computations you need.
It might help
to think of this schema in the same weights and amounts
way, except that we won't be assigning weights and amounts
in the HTML OrderForm input Page tags. Instead, we will
be assigning a group number to each product, and in the
configuration file we will assign the particular characteristics
(amounts / weights) for that group.
In this schema,
you create a more complex system of shipping rules, where
individual sets of shipping rules will be applied to each
ShipCode. This system must use sequential integers starting
from one. If you plan to use this method, don't assign
decimal numbers to the ShipCodes, else the script won't
recognize the ShipCode. When these settings are enabled
in the configuration file, the script looks only for ShipCodes
1, 2, 3, 4, etc.
Example:
Let's say we have four different ShipCodes from 1 to 4
exactly. You can give any number of products a ShipCode
of 1, thereby assigning it to the individual computation
rules for group 1. Likewise for group 2, 3, and 4.
Note: You don't have to use all the groups you set up,
but that would be rather silly, not to mention pointless.
If you set up a 4 number system, and only use ShipCodes
for 1, 3, and 4, in your line of products, well then,
obviously, you only need to use a 3 number system. The
script will work fine looking for any products with a
ShipCode of "2" and seeing none, will go on to checking
the other ShipCodes. In computing, the scripts will look
for all the 1's, then all the 2's, etc., keeping a cumulative
total for each ShipCode.
This built in
feature is enabled in the configuration file, and bypasses
all other shipping computations. It's a way for someone
to write their own code for processing shipping charges.
If you're going to do this, then assign ShipCodes as you
would in the "Individual Item Settings" above, in sequential
integers starting at 1. Then when you write your code
in the actual processing file, you write your own rules
for computing each ShipCode group. There are more notes
about this further on in the documentation at the section
- Other Switch Functions.
Each of the
configuration sections begins with an overview of what
that group of settings can do. If you need to know if
you can adjust things the way you need them, then find
your way to the "What can these settings do" section
for that group of configurations, and consult the summary.
Here are
the major configuration sections that govern the behavior
of the program:
Once your scripts
are running in test mode, and you have set up your OrderForm
input Page, then you are ready to configure the features
and settings you want to use. Merchant OrderForm gets its instructions on what
to do from the configuration file, so you'll be editing
this file.
Important: Use an ASCII editor only, do not use a rich
text, or fancy word processor to edit the files unless
it lets you work in ASCII mode only. It's also best to
use an ASCII editor that will store the file in Unix format,
if you are working from a Windows machine. Two of the
processing files are too large for the regular Windows
Notepad. Therefore, you may have to find a good ASCII
text editor. Check out the NoNags Web Site.
Okay, I wish
I knew of some encouragement here. The configuration file
is almost five pages long printed. If you're not used
to CGI installations or perl looking code, then I know
it looks like a mess. The good news -- you don't have
to read about the features you don't want to use. But,
if you want to turn on a feature, or adjust a setting,
then the best way to do that is to use this portion of
the documentation as a reference. If you're pretty savvy
about perl looking stuff, then jump right into the file
and start setting stuff by using the comments embedded
in the configuration file.
The file you'll
be opening is called <orderconfig.cgi> and
here's some points to know about cruising around this
file:
- Settings
are grouped together under CPITALIZED HEADINGS
- In perl,
all comments start with the # character. So,
when you see a line like this:
# this
is a comment about something
You don't need
to modify anything past the # character.
You're looking
at notes and instructions.
- When modifying
a setting, be very careful to leave all the punctuation
intact. Perl is not like HTML, and it is not forgiving
if you leave one little single quote off, or one little
semicolon. The perl interpreter won't compile the code
if a syntax error exists.
- Most settings
are simply changing a number from zero to one or visa
versa
- Other settings
are text based and must remain within quotation marks
- Some of the
more complicated settings require that you define what
is called an ARRAY in Perl language, and write within
parentheses, assigning single or associated keys-values
settings. Follow the explanations for that section carefully,
and be very careful to place all the necessary single
quotes, commas, semicolons, parentheses, etc. exactly
as the instructions indicate.
What can
these settings do?
- Turn off
all tax computations
- Turn on tax
computations for all invoices
- Turn on tax
computations for designated shipping destination only,
using one or multiple destinations with individual tax
rates for each
- Assign individual
tax rates to match one or more destinations, and assign
a default tax rate for all other destinations
- Set the tax
to compute before or after shipping and handling charges
- Designate
one or more destinations to reverse the before / after
rule
- MOF only
looks for state matching in the shipping destination
address
Configuration details
$use_tax
- This turns
on (1) or turns off (0) using the tax computations.
- It must be
enabled for any computations to occur (1)
- No tax is
computed or printed if turned off (0)
$all_tax
- This enables
(1) computing and printing tax for ALL invoices.
- Disabling
(0) this causes MOF to look only for "state matching"
for tax rates.
- If turned
on (1) MOF first looks to see if there are designated
tax rates for any defined states in the array below
called <%taxrates>. If a match is found, then
MOF computes tax from that designated tax rate. If no
match is found, or if no states are defined for matching,
then MOF uses the default tax rate assigned in <$all_tax>.
- If turned
off (0) then MOF applies a tax only if the shipping
destination state is defined or designated in the array
below called <%taxrates>. If MOF does not find
a state match, then no tax is computed.
$all_rate = 0.03;
- The default
rate explained above if <all_tax> is enabled (1)
- Use the format
0.0625 with no quotation marks, it is a numeric value
%taxrates = ('STATE',rate);
- This contains
the acronyms of states that you want to tax and rates
for each
- You can define
only one('CO',0.03) which applies 3% tax to Colorado destinations
- Or as many
STATEs,rates as you need ('CO',0.03,'TX',0.0625,'OK',0.0825)
- Which applies
a 3% tax if Colorado is the shipping destination
- or a 6.25%
tax if Texas is the Shipping destination
- or an 8.25%
tax if Oklahoma is the destination
- If you want
to use the <all_tax> default rate for all invoices
then set this to null.
- %taxrates
= ();
- This
is NOT a zero it is two closed parentheses
Note: you
must use only the acronyms in the table provided in the
documentation, Appendix 2 – Acronyms for using with
State tax matching when setting up this array. MOF can only
look for values that were submitted by the drop down box
for state shipping destination. You can add to or edit the
drop down list in your HTML OrderForm input Page for shipping
destination if you want, but you must keep the same definitions
here as you have in the input page drop down list.
$tax_before
- If turned
on (1) tax is computed and printed before the S&H
charges
- If turned
off (0) tax is computed and printed after the S&H
charges
- The default
place to compute and print tax is AFTER the S&H
- Most states
require that S&H is taxed unless exact Shipping
charges are computed
- A few states
do not require S&H to be taxed
- Before this
rule is applied MOF looks for any exceptions listed
in the next setting
@exceptions
= ('STATE');
- Defines a
state or states to be exceptions to the before / after
rule
- Use only
the acronyms listed in the Shipping destination drop
down list
- Make sure
and follow the exact format using single quotes around
STATE
- Separate
multiple states with a comma ('DE','MT','NH','NJ')
Note: MOF will first look for shipping destination states
here before it applies the tax_before rule. A state listing
here will reverse the rule however it is set. If tax_before
is turned off (0) and an exception state is matched, then
tax will be computed and printed before the S&H charges,
or visa versa.
- Set the exceptions
to null if you don't want MOF looking for anything here.
- @exceptions
= ();
- This
is NOT a zero it is two closed parentheses
What can
these settings do?
- Turn off
any discount computations
- Compute a
discount for each N number of items - volume discount
- Compute a
discount for each X number of dollars - percentage of
dollars spent
- Compute a
discount as a one-time rate by number of products or
dollars spent
- Limit the
discount to a minimum / maximum amount
Think about the discount in these two ways:
- As a percentage
of the total dollars spent
- Or as a set
rate per N number of items purchased
These settings apply simple discount rules and rates globally, they cannot
produce an arbitrary discount schema that is uneven. The
settings can apply a set rate to a set number of products,
or a set percentage or dollar amount to a set number of
dollars, or a one-time discount for a set number of products
or set dollar amount, and/or within one-time minimum or
maximum limits.
Here is an example
of an uneven discount schema, which cannot be produced
by MOF settings, but can be produced by custom code:
Discount
$ 2.00 first 3 products, and $ 1.00 every product thereafter
until 10 products are purchased, then discount every
additional purchase $ 1.50.
- The discount
is subtracted from the gross amount, off the top.
- All the remaining
computations are based on that sub total, the net
amount.
- The handling
and shipping computations are based on the amount after
discount.
- The tax is
computed on the Net Amount if before S&H
- However S&H
is always based on the sub total after discount, the
net amount.
- And tax is
computed on the [Net Amount + Handling + Shipping] if
after
Configuration details
$use_discount
- Simply turns
on (1) or turns off (0) any discount computations
- No discount
is computed or displayed if turned off (0)
- If turned
on (1) and <repeat_discount> turned off (0) then
a one-time discount is applied
$rate_discount
- This is the
dollar amount (n) to be applied to the computation rules
below
- There is
a direct relationship between this rate and these two
settings
- Number
of Products <num_discount> or
- Amount
of Purchases <amt_discount>
$repeat_discount
- When enabled
(1) this tells MOF to apply the rate assigned to <rate_discount>
at each interval set by either
- Number
of Products <num_discount> or
- Amount
of Purchases <amt_discount>
- If turned
off (0), then the rate assigned to <rate_discount>
is applied only one time when the interval is reached
defined by either
- Number
of Products <num_discount> or
- Amount
of Purchases <amt_discount>
$num_discount
- Defines the
increment (n) of total products that MOF will apply
the rate in <rate_discount>
to:
- DISCOUNT
= rate_discountX (Total products
ordered / num_discount)
- if result
> max_discount then discount = max_discount
- if result
< min_discount then discount = min_discount
$amt_discount
- Defines the
increment (n) of total dollar
amount that MOF will apply the rate in <rate_discount>
to:
- DISCOUNT
= rate_discountX(Total dollar amount of invoice /amt_discount)
- if result
> max_discount then discount = max_discount
- if result
< min_discount then discount = min_discount
Note: You can only enable (1) either
Number or Amount to be computed. If you fail to enable either
of them, or if you mistakenly enable both of them, then
no computations occur.
$min_discount
- Defing a
dollar amount (n) minimum to override computations
- If (n) is
defined, then all discount computations result in at
least (n) amount
- Disable this
setting (0) if you do not want a minimum
$max_discount
- Defing a
dollar amount (n) maximum to override computations
- If (n) is
defined, then all discount computations will no exceed
(n) amount
- Disable this
setting (0) if you do not want a maximum
Compute an
exact five percent discount on every dollar spent
$use_discount = 1 turn on the discount computations
$repeat_discount
= 1 repeat the computation rule at each increment
below
$num_discount = 0 do not use the number
of products increment
$amt_discount = 0.01 instead set the amount increment for each
penny
$rate_discount = 0.0005 set the rate to 0.0005 for each penny of
total amount
Compute a
one-time discount of $ 10 on all orders over $ 150
$use_discount = 1 turn on the discount computations
$repeat_discount
= 0 turn off repeating the computation rule ( use
one time )
$num_discount = 0 do not set a number
increment to repeat
$amt_discount = 150 instead set an amount increment to the $ 150
$rate_discount
= 10 set the rate of $ 10 to discount
- As you can
see this is a "non-repeating" discount, set to adjust
$ 10 after the first $ 150 spent.
Compute a five dollar discount for each $ 100 spent
$use_discount
= 1 turn on the discount computations
$repeat_discount = 1 repeat the computation rule at each $ 100
dollars
$num_discount = 0 do not use the number of products increment
$amt_discount = 100 instead set the amount increment for every
$ 100
$rate_discount
= 5 set the rate to $ 5 for each $ 100 of total invoice
amount
- This results
in a five dollar discount for every $ 100 spent. It
is not an exact percent on the penny like the first
example. The discount is only applied at each $ 100
amount spent. So, a purchase of $ 199 would show only
the discount applied to the first $ 100, not the remaining
$ 99. The total amount would have to reach $ 200 to
get the second five dollar discount.
Note: If
you use the minimum / maximum settings,
then these setting will test the final output from the computations,
and adjust the final amount accordingly.
If we add a
$min_discount and $max_discount to the last
example then we can create a situation where at least
a $ 5 discount is applied regardless of how much is spent,
and the discount does not go over $ 20.
Compute across
the board a $ 5 discount but not to exceed $ 20 with the
last example
$min_discount
= 5 set the minimum to compute to $ 5
$max_discount = 20 set the maximum to compute to $ 20
Compute a
$ 10 volumediscount for each 10 products purchased
$use_discount = 1 turn on the discount computations
$repeat_discount
= 1 repeat the computation rule for each 10 products
purchased
$num_discount = 10 compute the rate
each time 10 items are purchased
$amt_discount = 0 and do not use the
amount interval
$rate_discount = 10 set the rate to $ 10 for each 10 of total products
purchased
- Again, because
of the relationship between increment and rate, the
$ 10 is only credited when a full 10 items have been
purchased. Once would not receive any discount for 9
products, and one would only receive $ 10 for 19 products.
Change the increment to 1 and the rate to 2.75 and a
$ 2.75 discount would be applied for every product purchased.
What can
these settings do?
The exact same
things as the settings for discount explained in the preceding
section.
- Turn on /
off switch for computing handling charges
- Computing
a one-time handling charge
- Computing
a Percentage handling charge
- Computing
a Bulk or Volume handling charge
- Limiting
to a minimum or maximum handling charge
Configuration details
The handling
computations work exactly the same way as the discount,
except they are, of course, added to the sub total after
discount. The exact same schema is used. You can assess
volume handling charges, a one time charge, or a percentage
handling charge.
Compute a
five cent handling charge for each dollar spent
$use_handling = 1 turn on the handling computations
$repeat_handling = 1 repeat the computation rule at each defined
increment
$num_handling = 0 do not use the number of products increment
$amt_handling = 1 instead set the amount increment for each
dollar (1)
$rate_handling = 0.05 set the rate to 0.05 for each $ 1 of total
amount
The shipping
computation schemas follow rules that are very similar
to the rules we have already been studying for Discount
computations and Handling computations.
Here's a quick
list of what the shipping configurations do:
- Automatically
detect an out of Merchant Country "foreign" rate
- Allow the
Customer to select between "standard" or "express" rates
- Settings
to define what are "standard" and "express" shipping
options
- Settings
to use a default "standard" or "express" shipping rate
- Configurations
to compute shipping charge by weight, volume, amount,
minimum, maximum, foreign, domestic, standard, express
The shipping computation rules work on a dollar
amount, or a number quantity. The dollar amount rules use
the Total Amount of products after a discount, the
If no discount is being used, then the rules
use the Total Amount of products. Both shipping and handling
charges are always using one of the two totals:
- Total
Amount with no discount or
- Sub
Total After discount
- Shipping
and handling charges are always computed independent
of any tax assessed.
- Shipping
and handling charges are always computed independently
of each other
- The number
quantity is based on the ShipCodes and not on the quantity
of products.
There are two sections to understanding Shipping
Charges:
- Determining
which set of rates the computation rules will use
This is
covered in the section - Shipping
Configurations - Methods Settings
- Setting
the computation rules
This is
covered in the section - Shipping
Configurations - Global Settings
And the section
- Shipping Configurations
- Individual Item Code Settings
The Methods Settings and Computation
Settings in the Global and Individual schemas
interact together. Both Global and Individual schemas have
settings for each of the four methods that can be use.
What can
these settings do?
- Automatically
detect a foreign or domestic shipping destination
- Allow the
customer to select a standard or express shipping method
- Assign your
own custom message to define "standard" or "express"
- Assign a
default method (standard or express) and disallow customer
selection
Configuration details
Four sets of
rates can be used:Standard, Express,
Foreign Standard, Foreign Express. So, you
are able to use four different sets of rate variables
which will be applied to the computation rules. The particular
set of rate variables being applied to your computation
rules, depends on how you configure the following options:
- Auto-Detect
where a foreign rate is needed
- Chose between
a standard or express rate
If you want to
use a Foreign Rate, then you must enable the Auto-Detect Foreign Country feature. If this feature
is disabled then you will not be able to apply out of country
shipping rates, as all rates will be handled as either Standard,
or Express only, with no use of "foreign shipping charges."
Enable this
feature by:
$use_ship
- 1
$use_country = 1
$match_country = "Merchant Country"
Note: the "match_country" value must come from
the drop down list on the OrderForm. You must use one
of the exact Country names in the Select Country Names
section found in this documentation - Appendix 3. Whenever a shipping destination
uses a Country other than the Merchant Country defined
in "match_country" then a foreign rate is applied.
Two other sets
of rate variables can be applied to the computation rules--Standard
or Express shipping
rates. You can allow the Customer to choose between these
two methods by enabling the "use_rates" switch.
This will place two radio buttons on the "Select Quantities
- Verify Information" page allowing the Customer to
select an Express rate if desired. When you enable this
feature, the default rate is "standard" unless the Customer
changes it to Express. You can also place your own text
defining what is meant by "standard" and what is meant
by "Express".
The settings
to use this feature are:
$use_rates = 1 allow the customer to choose between express / standard
rates
$msg_standard = "However you define what standard is"
$msg_express = "However you define what express is"
If you don't
want the Customer to choose between "standard" or "express"
rates, then you can disable the "use_rates" feature,
but you must then set a default rate to be used in the
computation rules.
Disable Customer
choices, and enable a default "standard" rate like this:
$use_rates = 0 do not let the customer
choose between express or standard
$use_standard = 1 instead set the default
rate as standard
$use_express = 0 and don't default as express
Disable Customer
choices, and set a default "express" rate like this:
$use_rates = 0 do not let the customer
choose between express or standard
$use_standard = 0 don't use standard
as the default rate
$use_express = 1 but use express as the default rate instead
Note: you may not have both the "use_standard"
and "use_express" switches enabled. If you do this
then nothing will be triggered for defining what the default
rate is. If you have the Customer choices enabled, then
it doesn't matter what you have placed in the default
settings, it will be overridden by the "use_rates"
Customer choices.
Note: when you get to the next section "Setting the
computation rules," then you will see that there are
settings for all four Methods --
standard, express, foreign standard, express foreign.
Make sure that you have placed values in all of the sets
of rate variables that you will be using in your particular
Method configuration.
For example,
if you don't use the Customer choices feature, and you
don't use the Out of Country feature, and want to apply
a $ 0.35 per pound standard
rate set to all invoices, and you don't want a minimum
or maximum limit, then you only need to have values for
the "standard" set of
rate variables:
Only standard
set of rate variables:
$use_ship = 1 turn on shipping charges
$use_country = 0 doesn't matter if foreign
or domestic
$use_rates = 0 customer doesn't have choice for standard or express
$use_standard = 1 the standard settings are the default
$repeat_shipping = 1 for every increment in $num_shippping repeat
computation
$num_shipping = 1 apply the rate 0.35 to each 1 pound of weight
$min_standard = 0 don't use a minimum amount
$max_standard
= 0 don't use a maximum amount
$rate_standard = 0.35 apply 35 cents
per pound
For another
example, if you will be using all four possible options
-- standard, express, foreign standard, express foreign,
and you want a minimum shipping charge for any of these
options, then you will need to give all sets values. If
you leave these setting out, then the computations will
attempt to act on a zero, which will zero out your shipping
charges.
The rule
is -- make sure and place values for any of the four
shipping rate methods that your particular configuration
will be using.
What can
these settings do?
For any one
of the four methods the Global settings can:
- Compute shipping
as actual percentage of dollar amount spent
- Compute shipping
using shipcodes as weight per product by a rate
- Compute shipping
using shipcodes as shipping price per product
These settings cannot produce an uneven shipping
schema. They use set rules to produce global rates. You
have four types of methods and rates that are applied globally.
This is an example
of an uneven shipping schema:
From 1 to
3 products ordered charge $ 3.50 and then charge $ 1.00
for each item after that, up to a total of 15 products,
then the shipping charge is free.
While the actual code to compute this example
is fairly simple, and can be custom written in perl code
embedded in the special shipping section, the global rules
cannot produce an uneven computation like this.
Configuration
details
The Global shipping
computation rules work with the same strategy as the discount
or handling computations. The computations can be adjusted
to work with weight or dollar amount, and they can be
set for a one-time charge, or a repeating computation.
As already mentioned,
the simplest way to think about ShipCodes using the "Global
Settings" is to think of computing a rate per weight or
cost per item.
When using the
ship code computation rules you are computing thusly:
- shipping
charge = rate X [ ( shipcode X quantity ) / increment
]
- The number
quantity is based on the ShipCodes X Quantity of products,
and not on the quantity of products alone.
- When you
use the $num_shipping increment you are using
the actual ShipCode settings you made in your HTML OrderForm
input Page.
If you are using the dollar amount then you
are computing this way:
- shipping
charge = rate X ( sub total after discount / increment
)
- But, when
you use the $amt_shipping you are not using the
ShipCodes, you are using an option to compute shipping
charges based on total invoice dollar amount.
Understanding the computation rules:
There are four
sets of rates -- standard, express, standard foreign,
express foreign
The computation rules will be applied to the
set of rates for the selected Method
You define the
"computation rule" with the following three variables.
Then, depending on the Method selected, the "computation
rule" is applied to the appropriate set of rates.
$repeat_shipping
- When enabled
(1) this tells MOF to apply the shipping rate resulting
from one of the four shipping methods at each interval
set by either
- Total
quantity of shipcode values <num_shipping>
or
- Amount
of Purchases <amt_shipping>
- If turned
off (0), then MOF will apply only a one-time rate resulting
from one of the four shipping methods at the interval
set by either
- Total
quantity of shipcode values <num_shipping>
or
- Amount
of Purchases <amt_shipping>
$num_shipping
- Defines the
increment (n) of total shipcode
values that MOF will
apply the designated shipping
rate to:
- SHIPPING
= rateX [ ( shipcode X
quantity ) / increment
]
- if result
> method maximum then shipping = method's maximum
- if result
< method minimum then shipping = method's minimum
$amt_shipping
- Defines the
increment (n) of Total Dollar
Amount that MOF will apply the designated
shipping rate to:
- SHIPPING
= rateX ( Total Dollar Amount/increment
)
- if result
> method maximum then shipping = method's maximum
- if result
< method minimum then shipping = method's minimum
If you enable the "repeat_shipping" switch, then the computation rule repeats
for every N number of increments, or every N dollar amounts.
You set which increment to use, either a number increment
"num_shipping" or a dollar increment "amt_shipping" by assigning the increment value to which
one you want to use, and leaving the other one set to zero.
Calculate
a "standard" shipping charge of $ 0.35 per pound with
a minimum $ 3.95 shipping charge:
$repeat_shipping = 1 repeat the computation rule for every increment
$num_shipping = 1 set the number increment to 1 ( pound )
$amt_shipping
= 0 do not use the amount increment
$min_standard = 3.95 make sure there
is a minimum $ 3.95 standard shipping charge
$max_standard = 0 there is no limit
to assessing 35 cents per pound
$rate_standard = 0.35 set rate to 35 cents per each 1 ( pound )
The num_shipping increment is 1 ( whatever ), so a 0.35 rate
is applied to every 1 (whatever) units, and if minimum
rate is set, then the minimum will be assessed, until
the rate is over that value -- then anything over $ 3.95
is computed at 35 cents per 1 (whatever). The ShipCodes
in your HTM OrderForm input Page are relative and can
be anything; however, you need to have some plan for your
ShipCodes so that computations are meaningful.
Now, make sure
and set all the other rate values if you are using all
four methods. For example, if you have enabled $use_country
and $use_rates then it is possible that any one
of the four sets of rates may be selected. So, you need
to make sure you have all four sets of rates defined.
Note: the above example assumes that you used a "weight"
schema for assigning ShipCodes in your HTML OrderForm
input Page.
Note: you only get to configure one computation rule.
For example, you can't calculate an "express" shipping
charge of $10.50 for anything from 1 to 10 pounds, and
then assess a $1.25 per pound rate for anything over 10
pounds. This rule really uses two different increment
settings.
You can also
just use a configuration based on the Total dollar Amount
of products purchased, for example:
Set up rates
that would include insurance based on dollar value.
$repeat_shipping = 1 assess $ 1.35 to
every $ 10 spent
$num_shipping = 0 do not use the ShipCodes schema
$amt_shipping
= 10 instead compute $ 1.35 for each $ 10 spent
$min_express = 12.95 make sure there
is a minimum $ 12.95 express shipping charge
$max_express = 0 there is no limit for
maximum
$rate_express = 1.35 set rate to $ 1.35 for every $ 10 spent
Note: you can't use one set of computation rules for
"standard" and another set of rules for "express."
You can only create one set of computation rules which
will be applied to whichever set of rates is chosen by
the method configurations.
What can
these settings do?
- Group products
together by shipcode and
- Apply a set
of different rates to each group
The way to think
about the individual item system of shipping definitions
is to think of a shipping cost per item, rather than a cost
per pound as in the "global" ( weight ) examples. All products
with a ShipCode of 1 may cost $ 0.35 cents to ship "standard"
Method, yet cost $ 0.75 cents to ship "foreign standard"
Method. Then, all products with a ShipCode of 2 may cost
$ 1.35 to ship "standard" Method. So, you can set each Method's
rates for each different ShipCode used, then assign your
products to groups of ShipCodes, or give all products their
own unique ShipCode.
- When $use_items
has a positive integer value you have enabled this feature,
and No Global rates will apply. If $use_items
is disabled, then whatever you have set in the Global
settings will be used.
- Set the value
of $use_items to the number of ShipCodes you
want in your system of individual definitions.
- Now, you
will define the settings for each individual ShipCode
by giving values to a 12 item array for each
ShipCode in your system. In the configuratoin file packaged
with Merchant OrderForm there are 4 sets of example
definitions:
- @items1
= (3.95,5,0.25,4.95,6,0.55,4.95,6,0.65,5.95,0,1.05);
- @items2
= (4.95,6,0.35,5.95,7,0.65,5.95,7,0.75,6.95,0,1.15);
- @items3
= (5.95,7,0.45,6.95,8,0.75,6.95,8,0.85,7.95,0,1.25);
- @items4
= (6.95,8,0.55,7.95,9,0.85,7.95,9,0.95,8.95,0,1.35);
- Lastly, any
minimum / maximum settings you have for the four sets
of Global Settings, will be applied after all individual
computations are made, as an overall minimum
- maximum. So, make sure these are set to zero if you
don’t want this last test computation to occur.
With each array
@items1 you are basically creating individual definitions
as you did in the section above on "Global Settings."
The "Global Settings" has 12 values defined:
|
$min_standard
$max_standard
$rate_standard
|
These
set the values to be used in computations whenever
the "standard" rate Method has been chosen |
|
$min_express
$max_express
$rate_express
|
These
set the values to be used in computations whenever
the "express" rate Method has been chosen |
|
$min_Fstandard
$max_Fstandard
$rate_Fstandard
|
These
set the values to be used in computations whenever
the "Foreign Standard" Method has been chosen |
|
$min_Fexpress
$max_Fexpress
$rate_Fexpress
|
These
set the valued to be used in computations whenever
the "Foreign Express" Method has been chosen |
The 12 elements
in the item arrays correspond to these same settings.
Remember to be very careful in making these arrays, and
keep commas exactly between each of the 12 values as in
the examples included in the packaged configuration file.
Here's what the elements correspond to:
|
Standard
Method
|
Express
Method
|
Standard
Foreign
|
Express
Foreign
|
|
min
|
max
|
rate
|
min
|
max
|
rate
|
min
|
max
|
rate
|
min
|
max
|
rate
|
|
0
|
0
|
0.35
|
0
|
0
|
0.45
|
0
|
0
|
0.55
|
0
|
0
|
0.65
|
The above example
has set No minimum or maximum rules, but has set the following
rates to be computed for this ShipCode (let's say it's
ShipCode 1):
If the "standard"
Method was selected a $ 0.35
rate would be applied to the total quantity of products
that had a ShipCode = 1. When the script
finds a product ordered with the ShipCode = 1,
then it goes to the array @items1 and extracts
the settings for whichever Method is active.
Important: you must at least enter a zero for each element,
and you must separate each element with a comma.
When you set
@items2 with a completely different set of definitions,
then you can create extremely individual rates. The "standard"
rates for all products with a ShipCode = 2 could
be very different than the rates for ShipCode = 1.
If you wanted
to give all orders with the ShipCode = 1 a minimum
of $ 12.50 for the Express Foreign method no matter how
many number 1 items were ordered, and anything after $
12.50 would adjust an additional $ 0.50 per each number 1 item ordered, then:
$use_ship
= 1
$use_items
= N where "N" is the number of unique item arrays
you will be using
@items1 = (0,0,0,0,0,0,0,0,0,12.5,0,0.5)
If you wanted
to make sure that a minimum of $ 12.50
shipping charge was applied to any set of orders
where someone chooses the Express Foreign method
of shipping, then just add the global setting:
$min_Fexpress
= 12.5
The $use_items
schema only uses a number counting and not an amount.
An amount is not needed because this coding schema is
a distinguishing characteristic in and of itself -- all
ShipCodes of 1 are of a particular type item, with a particular
shipping requirement for a given Method. The script totals
the quantity of products with the ShipCode = 1, computing
the rate for the active Method, looks for any minimum
or maximum rules to apply, and keeps a summary of the
computed shipping charges for that ShipCode's quantity
of products. Then the script does the same for the next
ShipCode in the system, ShipCode = 2, and so on.
Also, a repeating
or one-time setting is not needed because a minimum /
maximum setting for each @items definitions is
able to set a one-time charge for that ShipCode. These
values will limit that ShipCodes summary total to a high
/ low value. For example:
For the quantity
of products with ShipCode =1
A one-time
$ 4.50 charge for "Foreign Express" Method of
shipping is set this way:
@items1 = (0,0,0,0,0,0,0,0,0,4.5,4.5,0)
As you can see,
the one-time shipping charge of $ 4.50 is applied as the
summary of ShipCode 1's total.
Important: the $ 4.50
is applied to the summary computations for ShipCode
=1 only. If someone orders only one item with a ShipCode
= 1, then $ 4.50 will be the total shipping charge. However,
if products with other ShipCodes are ordered on the same
invoice, then, while all ShipCode = 1 products will total
to $ 4.50 only, the actual final shipping amount on the
invoice will be a compilation of ALL the summary
totals for each ShipCode set of rules in your system where
someone has ordered a quantity of products for any given
ShipCode.
Also, if you
use the Minimum - Maximum settings in the global
functions for Standard - Express - Standard Foreign -
Express Foreign, then you can create an "overall"
Minimum - Maximum shipping charge for the method used.
This means that after all individual computations are
compiled and summarized for each ShipCode, then a final
total can be tested against a global "Minimum" or "Maximum"
for the shipping total. To make use of this feature just
give the global settings your limit values for any of
the shipping methods you want to apply this to. For example:
You can set
an overall Minimum shipping charge of $
18.95 for any out of the country express
orders, by setting:
$min_Fexpress = 18.95 in the "Global Settings."
If you don't
want any overall Minimum - Maximum to apply for a particular
method, just leave it set to zero. If these global settings
are all set to zero while using the individual item ship
code system, then there will be no "global" adjustments
to the overall shipping charges. The only Minimum - Maximum
adjustments that will be applied are those you set in
the item arrays
Note: you cannot use a ShipCode in your HTML definitions
that has not been defined in your system of shipping codes
in the configuration file, and when defining your system
you must use only sequential numbers starting from one.
Example:
if you need to have 4 different ShipCodes, then you can
only use the numbers 1, 2, 3, and 4 when putting a ShipCode
value in your HTML OrderForm input page. You can't use
a system of 4 ShipCodes and put a 5 as a ShipCode value
in your HTML OrderForm definitions, because the script
won't look for a "5" when computing each item's ShipCode.
The script will only look for the values 1, 2, 3, and
4 in a system of 4 ShipCodes. Likewise, you can't define
a system of 4 ShipCodes in the configurations, and try
to use values in your HTML definitions starting with 5,
6, 7, and 8. I guess I really didn't need to say all this
paragraph above, but you never know what some energetic
soul might hope to do.
What can
these settings do?
- These settings
allow you to install an unlimited number of custom fields
on your OrderForm input Page that can be processed by
MOF and included in Logs, Mail, and the Select Quantities
verify information page.
Configuration details
$use_fields
- This tells
the scripts that you will be using custom fields
on your HTML OrderForm input Page. And tells MOF to
look for your field names as assigned, and pass them
throughout the program to include in mail or logs.
$title_fields = "Other Information About Hobbies and Interests"
- This is where
you define what the group of fields will be called whenever
their contents is displayed on the Information Verification
Page, or in the main log file, or in the Merchant or
Customer email.
For example you may create several new fields about hobbies and interests.
Whenever any data is entered into those fields, then it
will be displayed in the Merchant email like this:
Other
Information About Hobbies and Interests
- Type of
Hobby: I like computing
- Area of
Interest: I like watching good movies
Okay, now we need to do the array thing again.
There are three
arrays that define:
- What "name"
you are using in the HTML OrderForm input Page
for each new field
- What title
you would like to print out next to the contents for
each new field
- Whether to
include or exclude each new field in the Customer email
notification
@custom_names = ( 'hobby','interest' )
- In the example
above, this tells the scripts that two new field names
exist in the OrderForm. These are the names you give
to each field in your FORM input tags. The sample OrderForm
called <ordersample14.html>
shows an example of this, and the names correspond to
the six new fields defined in the example <orderconfig.cgi>
in this package.
Continuing with
our example above, you would create the following input
tags in your HTML OrderForm input Page:
- <input
type="text" name="hobby"
size=30>
- <input
type="text" name="interest"
size=30>
The scripts now
know what to look for when parsing and printing information
in your new fields. And you can add as many names as you
need to as long as you keep with the exact format for listing
elements in the array-- using single quotes to enclose each
name, with a comma inserted between each name, enclosed
in parenthesis.
@custom_titles
= ( 'Type of Hobby','Area of Interest' )
- The elements
in this array correspond to the @custom_names array.
Put the title that will be listed and printed for each
corresponding name. Make sure the order is exactly the
same. This example will result in printing the titles
like we have been working on:
- Type
of Hobby: I like computing
- Area
of Interest: I like watching good movies
@customer_fields
= ( 1,1 )
- This array
corresponds element for element with the @custom_names
array above. It acts as switches to turn on (1) or turn
off (0) the data display for a corresponding "name"
contents. It switches whether that corresponding "names"
data is displayed in the Customer Email notice. This
feature only effects the Customer Email notice. There
are no switches to turn on or off whether your new fields
display in the log files or the Merchant Email -- all
custom fields will be displayed in those areas.
The above example allows for both the <name="hobby">
and the <name="interest"> contents to be displayed
in the Customer Email. If you wanted to allow only the <name="hobby"> contents to be shown in the Customer Email
notice, and not the <name="interest">
then:
- @customer_fields
= ( 1,0
)
Important: The three arrays correspond identically to
each other, so all three must have the exact same number
of elements.
What can
these settings do?
- Override
all shipping configurations except your own custom code
- Turn on or
off validation rules for Online Checking input fields
- Show and
process Checking input fields completed without validation
- Turn on or
off the routines to force checkbox for final "cyber
approval"
- The customer
will have to check the correct box to complete transaction
- If customer
aborts the "cyber approval" form you can redirect them
anywhere
- Turn on or
off the file locking switches
- Turn on or
off the LOG files
- Turn on or
off the LOG DataBase files
- Turn on or
off sensitive information displaying in the Mail
Configuration details
$special_ship
- Enabling
this (1) triggers an override of all shipping computations
- Diverting
MOF to look for custom shipping code
- In the file
<ordercount14.cgi> around LINE 460 is space to
write your own code
- There are
notes there on variables you can use and resulting variables
required
- If you enable
this without writing some code then shipping will be
zero everytime
- Whatever
code you use must produce two unformatted numeric variables
$check_validate
- This simply
turns on (1) the scripts input validation rules to check
and see if all the fields for "checking" information
are filled out. Turn it off (0) if you don't want to
validate these input fields. Also, make sure and turn
it off, if your OrderForm input page does not include
these fields, because the script will attempt to validate
the input.
$show_check
- Turning this
on (1) allows any completed input from the Checking
information section on your OrderForm to be passed and
processed and printed in logs, or mailings even if it
has not been validated. This is for those who aren't
using Online Checking, and don't care if all the fields
are completed or not, but would like whatever is completed
to print and pass through. If you use check_validate
this setting is redundant.
$cyber_check
- Turn on (1)
or turn off (0) displaying the "cyber permission" routines
- If enabled
(1) then the customer is forced to check a box for final
approval for the Merchant to draft their Online Checking
or Credit Card accounts. If the customer fails to provide
the correct response, then they are redirected to a
URL that is set in the next setting.
Note: if this is turned on (1), and
you attempt to execute the final processing file <orderfinal14.cgi>
as a direct call rather than submitting from the previous
process, then the final script will hang. This sort of thing
should only be done for testing purposes anyway. But it
won't test unless you disable (0) the <cyber_check>
setting. This is because the final script is attempting
to verify whether "cyber permission" was sent or not, and
of course it wasn't--nothing was sent and MOF wants to check
for permission.
$redirect_url
= "../index.html";
- If "cyber
permission" fails on the second try, then the browser
is redirected to a location that you define in this
setting. It can be a relative URL or a full URL somewhere
off in the Cyber Universe.
$redirect_name = "Your Redirect Page Name";
- This is the
name that will appear on the final "cyber permission"
page saying that they will be redirected to this page
here. Then name of the page.
$lock
- This enables
(1) or disables (0) the file locking for all the files
that the script will be writing to. It's VERY
IMPORTANT that you turn this on if you
plan to keep the log files. Unless you get some furious
activity all happening at the same time on your server
(which I hope will happen to all who use Merchant OrderForm),
then the files are mostly okay. However, without file
locking turned on, all it takes is for two hits on the
same log file at exactly the same time and all your
data could be wiped out ! Of course, exactly the
same time in computer terms means exactly the same nano-second,
which can happen.
I ran versions 1.1 on my server for 6 months without file locking and
there were never two hits on the write files at exactly
the same time, but you don't want to take a chance. Turn
it on especially if you're using Unix, Linux type machines,
since it's tested to work on those type servers.
$log_file
- Turn on file
logging (1) or turn off (0) file logging
- This enables
(1) the script to write all invoices into a master logging
file. The log file can be named anything, as long as
you configure the name in the File Locations section of this configuration file.
The file called <orderlog.dat> in the package
is the master logging file. Also, you'll want to read
the section An important note about Security to make
sure this file is not accessible from the entire whole
world. Once you turn this on, you don't want Web surfers
reading your orders that have been logged.
$rdb_file
- Turn on (1)
or turn off (0) logging to the ASCII delimited DB files
- This turns
on another logging feature where the final processing
script writes to three ASCII flatfile database format
files. Again, you can name these files anything you
want as long as you change the names in the File
Locations section of this configuration file. In
the package these three files are called:
- ordermain.rdb
- orderorders.rdb
- ordercustom.rdb
As with the other log file, you'll want to
read the section An
important note about Security to make sure these
files are not accessible from the entire whole world. Once
you turn this on, you don't want Web surfers reading your
orders logged.
The three RDB
files provide a way to import all invoice information
into any PC Database program that will import from ASCII
flatfile delimited text files, like Access 97. The three
files also provide your invoices sorted to separate files
so that when you import the information you can build
a relational design. You can see how the three files are
printed and related in Appendix
4 - Structure of the related RDB files.
$mail_info
- This enables
(1) or disables (0) whether you include sensitive information
(credit card numbers and checking account information)
in the email that is sent to the Merchant.
No sensitive information is ever sent to the Customer.
Of course, the Merchant mail will have to be turned
on for this to work.
What can
these settings do?
- Define your
Web Site name to be listed throughout the MOF processing
screens
- Define the
link to your Main Web Site as a link back from the processing
screens
These settings just set up your logo, or site
name to appear on the invoices, and configure the site page
or location that will be linked to the site name or logo.
So, when the site name or logo is clicked, you will return
to the identified home page or site.
Configuration
details
$site_name
= "Your Site Name Here"
- This is the
Web site name that appear at the top left of all the
screens, and throughout the ordering process. It also
appears at the bottom of each page as a credit line.
You can just use a text name as in the example above,
or you can put in HTML tags for font, color attributes,
or even an image logo.
The example configuration file included in
the package shows how an image is used in place of the site
name. This way the logo displays at those places wherever
the $site_name variable appears in the scripts.
Here's an
example of using a logo
$site_name = "<img src=\"../images/scripts.jpg\"
border=0 width=91 height=26 alt=\"Your
Site Name\">";
Important: If you use double quotes to enclose this HTML
tag, then you'll have to use the perl escape character
"\" preceding quotation marks or other sensitive characters
like @$, etc. Study the example above to see that where
a double quote appears in HTML tags, it is preceded by
the left backslash. This tells the perl interpreter that
the next character is a literal character, since double
quotes is a special character in perl. You can simply
enclose the whole thing in single quotation marks, which
tells perl that it's all literal characters.
Here's an
example of using font attributes to highlight a plain
text site name
$site_name = '<font color=navy><strong>My
Site Name</strong><font color=black>';
$plain_name
= "Your site name in plain text";
- This is simply
plain text to be used at different places where HTML
is not allowed, like in the log file, and in the email
notices. Make sure it's plain text only.
$base_url =
"../";
- This is the
root directory for your Web site. You can use a relative
location as in the example above, or you can use the
entire HTTP url. Just make sure the address ends with
a backslash. Another example is "http://www.yourdomain.com/"
$main_filename
= "index.html";
- This will
be appended to the $base_url to identify the
complete address of the page you want someone to return
to when they click your logo or site name.
What can
these settings do?
- This creates
the Merchant address, city, state, zip, phone, fax.
The on / off attributes allow you to assign beginning
and ending HTML attributes surrounding the Merchant
information on the invoice. It's pretty straight forward.
Configuration
details
$on_attributes
= "<strong>";
$off_attributes = "</strong>";
- Assign the
beginning HTML tags to how you want your Merchant information
displayed, and then assign the "off" HTML tags for enclosing
your information. You can simply leave these blank and
your Merchant information will be displayed as formatted
in the script. Leave them blank this way, and don't
even leave a blank space in them.
- $on_attributes
= "";
- $off_attributes
= "";
The following variables identify Merchant address, phone, etc.
Make sure and enclose
your information in double or single quotes:
$site_address
= "111 Merchant Ave.";
$site_city
= "Austin";
$site_state = "Texas";
$site_zip = "77777";
$site_phone
= "444.444.4444";
$site_fax = "555.555.4444";
What can
these settings do?
- Tell the
scripts where all the files are it needs to work with
- Defines the
delimiter if using RDB file logging
Configuration details
This section
of configurations identify the file names and locations
of all the files used by the scripts. The first processing
file is not listed here, because it is started by your
HTML OrderForm input Page, when you do the FORM POST Action.
All other files that the scripts will need to work with
are identified by name and/or location here.
Remember: These files can be used by the processing scripts
only if permissions are set correctly. Even though the
file is listed in your CGI-BIN, if it doesn't have complete
write permissions, then the script won't be able to write
it. The script has built in error messages to tell you
if a needed file can't be opened by the script.
orderconfig.cgi
- This file
is identified in the opening lines of each of the three
processing files. There is a line that has the comment:
- #
Make sure you have the correct name for the CONFIG
file here.
- require
'orderconfig.cgi';
If you change the name of the configuration
file, then you will need to change its name within each
of the three processing files, as in the example above.
One of the most common reasons one might need to change
this name is to comply with a server set up that designates
the PL extension to run perl scripts. This file is required
and must have complete read, execute permissions.
orderform14.cgi
ordercount14.cgi
orderfinal14.cgi
- These are
the second and third processing files, respectively.
They process the orders from computations to final invoice
and printing of the logs and email notices. Both of
these files are required, and must have complete read,
execute permissions to run.
ordernumber.dat
- This file
is where the final processing script retrieves the next
increment for the invoice number to be used. The example
starts the numbering at 1000, but you can put in any
number you want. Put in 235145657, and folks will think
you're selling at the rate of Amazon.Com, or Microsoft
J This is a required file, and must have complete read,
write, and execute permissions to run.
orderlog.dat
- This is the
main log file. You don't need to have it in your CGI-BIN
if you don't enable the $log_file switch to use
it; however, if you enable the $log_file switch
then the final processing script will go looking for
it. It will need to have complete read, write, and execute
permissions to work.
Warning: This file contains sensitive information,
and you want to make sure it cannot be accessed by just
anyone with a Web browser. Read the section An
Important note about Security to understand how to work
with this issue.
ordermain.rdb
orderorders.rdb
ordercustom.rdb
- These three
files are the PC Database import files. They are only
required if you enable the $rdb_file switch to
use this feature. If you enable the $rdb_file
switch the final processing script will go looking for
all three of the files to write stuff to.
Warning: These files contain sensitive information,
and you want to make sure they cannot be accessed by just
anyone with a Web browser. Read the section An
Important note about Security to understand how to work
with this issue.
The simplest
way to make everything work is to just dump all these
files in your CGI-BIN, then you only have to use the filename.cgi,
and you don't have to mess with using absolute addressing
to identify location. This is what we did in the Quick Start section. The script looks for the
files in the local directory first, unless directed to
look elsewhere.
If you need
to mess with absolute addressing, then this would be the
entire pathway as if you were identifying a place on your
hard drive, except you are identifying an actual location
on your server's hard drive. It is not the HTTP
address used in Browsing the Web. The HTTP address is
a virtual address, and is not an actual pathway on your
server's hard drive. It is a virtual pathway, known by
the server's HTTP software, but the scripts can't write
or read files via the Web HTTP address or location. The
scripts must have the actual hard drive location of files
it will be writing to or reading from.
An absolute
pathway would look something like this on my local computer:
$logfile_path = "c:/HTTPd/Documents/orderform/orderlog.dat";
This example
places the main log file in a completely different directory
than the CGI-BIN, and gives the absolute (actual) "pathway/filename.dat"
so the script knows exactly where on the hard drive to
write something. The script can't write through a virtual
pathway like a Web address. It can only write to a hard
drive.
An absolute
pathway might look something like this on a server's hard
drive.
$logfile_path = "/usr/u/n/name/public-web/orderform/orderlog.dat";
This example
writes to the main log file located in a sub directory
on my public-web directories, providing the file has the
correct permissions. It allows you to write the file in
a location other than the CGI-BIN where the scripts reside.
Again, this cannot be an HTTP address like you use in
your Web browser, since a Web page is only a virtual location
designated by the servers HTTP software.
Now, just make
sure that you identify the filename (and locations if
need) for all the following processes. You can change
the filenames if you want, but then make sure you identify
the correct file name in the file location settings below:
- $cgi_count
= "ordercount14.cgi";
- $cgi_final
= "orderfinal14.cgi";
- $number_path
= "ordernumber.dat";
- $logfile_path
= "orderlog.dat";
- $rdb_main
= "ordermain.rdb";
- $rdb_orders
= "orderorders.rdb";
- $rdb_custom
= "ordercustom.rdb";
The above listing of file settings show that all the necessary files are
located in the same directory as the original script and
configuration file, usually the CGI-BIN.
There is one
lone setting in this section which is used to define a
delimiter for the RDB file logging. If you use the RDB
logging, then you'll need to define a delimiter. This
is a good one to use.
$delimit
= "~";
- In this example,
the tilde character is used as a delimiter for all the
data storage in the three RDB files. You can use any
character you want, but you don't want to use a common
character that will confuse how you import the files.
The delimiter character
acts as a separator between fields in the ASCII flatfile
database log files. When a program reads these files, it
starts a new field every time it encounters the delimiter.
If there is no data in a particular field, then a null is
placed in the place of the data. In the ASCII flatfile delimited
database, each line is a record, and each field is separated
by the delimiter.
Here's an
example of how the delimiter works in the RDB files.
1004~1004-512-444-7777~8/12/98~11:30:02~Master Card~Customer
The above example
has logged one record and six fields. There is more information
on the exact structure of the ASCII flat file delimited
database files in Appendix 4 - Structure of the related RDB
files.
What can
these settings do?
- Turn on or
off sending order invoices by email to the Merchant
- Turn on or
off sending order confirmations by email to the Customer
- Identify
your server's mail program location
- Identify
the email account to send Merchant invoices
- Identify
a URL for the Merchant to include in Customer mail notices
Configuration details
This is the
one set up part that people have the most trouble with.
That's because server mail program locations and set ups
vary more than other things. The trick to getting the
mail working on Merchant OrderForm is to get the correct
mail program location identified, and of course to have
the correct send to address.
Once your mail
program location is identified, then you can send mail:
- To the Merchant
- To the Customer
Getting the location
of the server's mail program set
$mailprog
= '/usr/sbin/sendmail';
- This setting
is the location of your server's mail program. "Sendmail"
is a common Unix type mail program, and the above is
a typical location. You may need to ask your server
admin what kind of mail server you have and where it
is located. Perhaps, go to some scripts that you have
working on your site, like maybe the ever popular formail.cgi
to see how it defines the location of your server's
mail program, and then use that exact definition for
$mailprog here.
Any installation
of Merchant OrderForm will have to be linked to a mail program
that simulates "Sendmail." Here's an example where Qmail
is being used as the server's mail program.
$mailprog
= '/var/qmail/bin/qmail-inject';
- If you are
using "Qmail" then this might be a typical location
for a server's "Qmail" program.
As far as setting
up the email on an NT platform, people have to obtain a
windows version of sendmail or blat in order
to accomplish the same thing sendmail offers unix users.
I have heard suggestions about running an NT mailer called
Imail from Ipswitch, which has a client program that simulates
sendmail. Just put the path in for the client program and
point it to the .exe file. I think Imail may be a
little pricy.
The program
Sendmail for Windows has also
been recommended for NT applications, and is more affordable.
A possible configuration is to install it on the NT Web
Server Drive under D:|mail and then add it to the
NT Environment. Then identify the address for Merchant
OrderForm as:
$mailprog
= "/mail/sendmail";
Where you
send the mail to:
$myemail
= 'yourname@domain.com';
- You also
need to tell the mail program where to mail the Merchant
invoices. Simply put in your email address here.
Warning: See the notes in the
section called An important
note about security about where you are sending mail
to when you send Merchant invoices via email.
Most problems
with the mail portion are as mentioned above, the sendmail
or sendmail simulated program is not identified correctly.
Once this part is working, just turn on the switches to
send the mail.
$merchantmail
- By turning
this switch on (1) you are sending a copy of each invoice
to the Merchant at the email address defined in $myemail.
Remember,
you can include or exclude sensitive information like credit
card numbers and checking account information by setting
the switch $mail_info in the Other Switch Section of the configuration file.
It is best to send mail only within the same server so that
it does not go out over the internet. If you must send the
Merchant order out over the internet, then disable the $mail_info
switch, so that sensitive information is not mailed over
the internet, or find a way to send the sensitive information
via some kind of PGP encryption protocol, (Pretty
Good Privacy) encryption software.
Warning: See the notes in the section called An important note about security about where you
are sending mail to when you send Merchant invoices via
email.
$customermail
- By turning
this on (1) you are sending the Customer an email receipt,
provided that they enter a valid email address on the
OrderForm. If this switch is turned on and no email
address is entered, then no Customer email notification
will be attempted by the script; however, if a bogus
email address is entered, then the final processing
script will send a notice through the mail program identified.
In turn, the server's mail program will notify you or
the server admin that it was an undeliverable mail message.
Not A Warning: This setting enables or disables mailing a
Customer Order Verification. It does not need any encryption,
since it does not contain the credit card numbers, only
an invoice verification, and thank you note.
One last
mail setting:
$site_location
= "http://www.yourdomain.com/";
- This setting
is simply the location of the Merchant's Web Site. It
is used only in the Customer email receipt as a signature
line, and way to reference the Merchant's Web Site in
the Customer email notification.
Here are some
important recommendations about security with your Merchant
OrderForm set up.
Use SSL on
a virtual domain when available
I recommend
that you use a secure web server SSL (the https:
protocol) for transport of the FORM data to your web site,
and that you keep the log file of invoices secure while
on your server .. Make sure the log file doesn't live
in a Public Web access area. A virtual domain would be
secure, but not a simple user Public Web area. The Log
file would be unsecured with a simple user Public Web
area, and you wouldn't want to store credit card numbers
like this. Make sure it's on a secure virtual domain web
site.
SSL is
a function of your server's software, so you'll need to
contact your server admin on how to send your CGI scripts
through their HTTPS protocol and their site certificate.
Once you have the HTTPS address to use, then you will
call up FIRST your HTML
OrderForm input Page through this secure HTTPS
protocol.
The link
to your OrderForm input Page from wherever will be through
the HTTPS protocol.
<a href="https://yoursecuredomain.com/orderfor.html">Place
your order here</a>
Now, any information
between the browser and the script processes is encrypted
via the HTTPS protocol, until you exit the last CGI process,
or make a browser call to a non HTTPS location. When you
exit the last CGI processing file, then you will be leaving
the secure area.
If you don't
have a virtual domain with strict permissions, and you
put the DAT file and the RDB files that log the invoices
on a Public-Web set up, then at least give the DAT file
and RDB files some very confusing name like <BFGIZ23432datafile.dat>
and prevent a Web browser from reading a listing of your
cgi-bin directory. Place an <index.html> file that
reads "NO Access to this area" or something like that
in your CGI-BIN, then whenever a browser tries to get
a listing of the CGI-BIN directory, it defaults to the
index.html file which has a message "No Access to this
area."
A virtual domain
is set up with stricter permissions, and usually forbids
access from Public Web inquiries trying to access a file
on the CGI-BIN via the Web.
If you enable
the email options to have the Merchant receive a copy
of the invoice via email, then use some form of encryption,
like PGP. If you are mailing to an account on the same
server as your OrderForm then it will be processed locally
and should not go out over the internet. If mail account
and OrderForm processing files are on the same server,
the mail would be processed internally by the server,
and not open to the Internet mail exchange. Make sure
it's on the same server, or use encryption.
PGP encryption
is a utility program that is installed to process your
mail. I don't know much about setting these up. But PGP
would be set up as a program that you sendmail to, instead
of the regular sendmail program. If you want to email
me some more information of using PGP with Merchant OrderForm,
then I'll put you on the permanent list of registered
users with a lifetime membership.
It is considered
professional to state on the opening order FORM whether
your process is secure or not ..
Here are some
brief things you can check to make sure you have installed
the scripts correctly on your Unix based server.
- Check
the location of the perl interpreter. The opening
line in all perl scripts must contain
the server's location of the Perl interpreter. Make
sure this line correctly points to your perl interpreter.
Here's a typical location of the perl interpreter.
If you think
this line is not correct, then ask your admin where perl
is. Then you'll need to change this first line in all
the four CGI files in the package. If you have Telnet
access you can go to the unix prompt and type in..
>whereis
perl
This will tell
you the location of the perl interpreter.
Here are some other locations:
- #!/usr/bin/perl
- #!/usr/local/bin/perl5
- Make sure
that your are pointing the top line to "perl 5." Some
servers have perl 4 as a default installation, and the
Merchant Order Form needs perl 5 to run.
If you have
Telnet Access or using NT, you can type from the prompt
or unix shell
>perl
-v
Which will give
you the version of perl that you are running.
- Make sure
and FTP the ASCII files and script files in "ASCII
transfer protocol." Do Not transfer
the files binary. You can transfer the image files binary,
but not the other files.
- Make sure
you have made the three processing files and one configuration
file to have complete executable permissions, which
is a CHMOD <filename>
755 on Unix servers.
- Make sure
that both DAT files and all three RDB files have full
write permissions, which is a CHMOD <filename> 777 on Unix type servers.
- Make sure
your CGI-BIN has executable permissions as well.
- Make sure
you have the correct file name extension for your server.
Many servers identify CGI calls with the <filename.cgi>
extension, but some servers use the <filename.pl>
extension to signify CGI executable files. If your server
used the PL extension, then you'll have to rename the
four CGI files to <filename.pl> and you'll
also have to go into each of the three processing files
and change the line
"require
filename.cgi" to "require filename.pl"
- If your server
uses the <finename.PL> extension for cgi calls,
then make sure you have changed the two settings in
the configuration file that identify the name of the
last two processing files.
- $cgi_count
= "ordercount.pl"
- $cgi_final
= "orderfinal.pl"
- Use only
an ASCII text editor to modify the files, and
store them in Unix format if you can. Don't edit the
files with an editor that places unknown or hidden formatting
into the file. All files should be strictly ASCII format.
- Since you
are placing the scripts and archives within the same
directory you don't have to worry about relative or
absolute pathways. There are no pathway adjustments,
except identifying the location of image files.
I have included
some of the common questions and installation problems
that people are having with Merchant OrderForm.
Here is a
list of the FAQ stuff:
Try not to embrace
the RONCO method for your shipping schema--if you buy
this I'll throw in this, and this, and yes, even this.
This is an uneven configuration and the existing rules
have no way of knowing how everyone around the World might
dream up that very special shipping deal guaranteed to
promote entrepreneurial fame.
It's probably
best that you get the basic idea of how MOF uses shipping
rules first, and then see if you can fit your needs into
that schema, rather than the other way around.
Think about
the shipping computations in one of three ways:
- Compute shipping
based on weight per item
- Compute shipping
based on a set amount for each item
- Compute shipping
based on total dollar amount
MOF uses precise global rules, or precise group rules, which can vary
by four different methods, with some ability to limit minimum
and/or maximum shipping charges. It is set up to create
unlimited ways to apply global rules to an entire invoice,
or ways to apply group rules to groups of products. MOF
uses rules rather than complicated shipping tables.
Basically, you
can't do anything that is arbitrary or uneven with the
existing configuration rules. You can however, do anything
imagined by either writing your own perl code in the custom
shipping section, or having someone (like myself) write
the code for your custom shipping needs, even to the point
of using a complicated table of shipping charges.
This is an example
of an uneven shipping schema:
Shipping is
$ 3.50 for 1 to 3 items, and then $ 1.00 per each additional
item, up to 15 total items, where the shipping is free,
unless it's express, then shipping continues at $ 1.00
per additional item up to a total of 25 items, when if
becomes free.
This can be written
in about 8 or 10 short perl code lines, but can't be accomplished
from the MOF settings.
I'm looking
at the actual 1999 UPS shipping tables, and hope to be
working on a few "plug-ins" that will give MOF the ability
to consult free standing shipping tables in different
ways. One could use the actual UPS tables, or build their
own tables. I just need the time to get to this.
Yes, but it
can't consolidate them into one invoice.
The MOF scripts
will try to process anything you throw at them from anywhere
in the World from an HTML FORM submission. However, MOF
set up any cookies or reference that a particular OrderForm
was submitted from the same person who wants a consolidated
invoice.
You can have
hundreds of OrderForms which submit to only one location
of the scripts for processing, and MOF will throw invoices
back to the correct person, as fast as your computer will
run, but MOF processes only one OrderForm at a time.
Note: If you
use one location of MOF to process OrderForms from several
different sites, or several different locations within
the same site, then all LOGGING will be stored in the
same log file, because MOF uses the same set of configurations.
- You can create
multiple installations of MOF, each with their own separate
configuration file, and thereby, create separate LOG
and MAIL functions for different OrderForms.
- Or you can
set up a custom hidden field identifying where a particular
OrderForm originated. The reference will get stored
in your LOG files and/or MAILed to identify its originating
location.
- Also, with
some pretty simple programming, you could even create
code in MOF to recognize an OrderForm's hidden field
identifier from different locations and use respective
LOG files or MAIL configurations.
I'm researching
a few of these services, which seem to have interface
techniques that are easy to install. However, the Merchant
OrderForm v1.4 package you have doesn't have any built
in settings or configurations to just turn this on or
off.
Please contact
me RGA@IO.COM with the name of the authorization service
that you want to use, and I'll look into it. In many cases,
it's a simple matter of submitting the final invoice amounts
and other limited information via hidden variables, or
the Environment QUERY_STRING variables. MOF simply submits
some of its output to the appropriate service, and the
service takes over from there.
Some perl knowledgeable
folks have linked Merchant OrderForm's output to an authorization
service. If you are doing this, then I would be interested
in collaborating with you on this, and can offer you a
FREE lifetime membership for the Merchant OrderForm scripts
in exchange for documenting your work. Or if you are working
on doing it yourself, then I would be interested in assisting
so that we could get it working smoothly.
Who cares ?
Well, Big Bill
probably cares, and I don't mean Mr. Clinton.
I know, Big
Bill doesn't even know about Merchant OrderForm, but he
knows about MS Front Page 9x, and might care if you use
his company's software.
Big Bill's help
system for MS FrontPage 9x probably doesn't explain that
CGI scripts can be installed from HUNDREDS of programs
all the way from FTP programs to HTML editors. Now, just
exactly how you might do that with MS FrontPage 9x, or
even if it will do that, I must confess, I don't have
a clue, mainly because MS FrontPage 9x is one of the FEW
pieces of Microsoft software that hasn't found its way
onto my computer, or into my pocketbook. I've never used
it.
The important
questions are do you know how to -OR- can MS FrontPage
9x:
- Edit an HTML
file and transfer it to your server ?
- Edit a plain
ASCII text file ?
- FTP the text
files to your server and set permissions ?
It doesn't matter what software you use to do these three things, as long
as they get done. I use a freeware ASCII text editor to
write and edit HTML, as well as the perl code in the scripts.
Then I use a freeware FTP program (File Transfer Protocol)
to transfer all the files from my computer to the server
where my Web Site is located.
My guess is
that MS FrontPage 9x will do all of those three things,
you'll just have to learn how to work it. Your Web pages
or any CGI scripts don't actually integrate with MS FrontPage
or any other Web publishing software. Web publishing software
is just an agent to make and transfer HTML files to your
sever, or to FTP other files to your server like JPG,
GIF, or even CGI files.
Web Sites and
CGI programs actually LIVE on your ISP server. Once you
have constructed and transferred the files, then your
Web Publishing software has nothing to do with how the
HTML or CGI files work on the internet.
These questions
are more relevant than the MS FrontPage 9x compatibility
one:
- Is Merchant
OrderForm compatible with Perl 4, NO.
- Is Merchant
OrderForm compatible with Perl 5, YES
- Is Merchant
OrderForm compatible with NT, YES
- Is Merchant
OrderForm compatible with Unix, Linux, YES.
- Does my ISP
even allow the use of CGI on my Web Site ?
- Do I need
Telnet or Unix shell access to install the scripts,
NO.
This has been an educational moment sponsored
by the Merchant OrderForm staff J
When the three
processing files and one configuration file are installed
correctly, you will be able to initiate a direct call
from your Web browser to the http address where each script
is located. You can initiate each script stand alone,
by calling it up with your browser as in the example at
my site.
A direct browser
call to the first processing file:
http://www.io.com/~rga/cgi-bin/orderform14.cgi
Although, a
direct call to the first file like this gives you the
incomplete input message, you know the file is running,
else you would not get this message. The message is a
result of the script processing without any input.
You can make
a direct call to the other two processing files in the
same way to isolate which script is not running.
If you get an
"Error 500 Internal Server Error" then the script
is not installed correctly, or it could be contaminated.
Contamination could occur if not transferred correctly,
not stored in Unix format for Unix type servers, etc.
If you have
access to the perl interpretor then run a perl -c ( for
code check ) on the files.
>
perl -c filename.cgi
This runs a check
on the code and will tell you if there are code problems,
things like containers left out, syntax problems, perhaps
from editing. The package you downloaded is fine on my
server. It's been downloaded by hundreds of folks. You
may need to download it again if you get some code errors.
If you are not
accessing perl 5 on your server, you will get an error
checking the code on these scripts. Perl 4 will give you
an error with the <sprintf> function.
>
perl -v
This will give
you the version your are running.
If you get "Error
500 Internal Server Errors" keep reviewing the "CGI
Installation Notes" until you get it right. You missed
some subtle installation necessity.
Of course "File
Not Found" errors mean you don't have all the files
linked correctly. But, running each script stand alone,
for testing, will eliminate "File Not Found" errors.
If one of the
scripts returns a "Document Contains No Data" error
then the script is running, meaning it has all the correct
permissions, pathways, and is being processed by the perl
interpreter, yet the perl interpreter has found a syntax
error in the script. This invariably happens as someone
goes to modify the script in some way, and misses the
very strict syntax rules for balancing containers, quotation
marks, not using the escape character for perl's designated
characters, etc. Again, if you run a perl code check it
will tell you where the error in the syntax is.
>perl
-c filename.cgi
This is an internal
message embedded in the last processing script. The final
script sends it if it can't find the DAT files or the
RDB files.
- Make sure
the name is set correctly in configurations
- Make sure
you have full write permission on both DAT files, and
all three RDB files
- Make sure
you are using an "absolute" pathway correctly, if used
or needed.
- Don't ever
use a URL address like HTTP or HTTPS for these file
locations
The easiest way to make the scripts work is
to follow the Quick Start
instructions
Name - Value pairs used in the OrderForm input
Page
This is a list
of the names that are already being used in the script
processing or in the HTML OrderForm input Page NAME -
VALUE pairs. Do not uses these same names if you
make new fields in your OrderForm input Page or it will
cause some conflict in the scripts processing information.
- approvetype
- approvename
- approvebank
- noapprove
- redirect
- unit_tax
- sales_tax
- reversetax
- show_before
- show_after
- sub_after
- show_check
- sendcheck
- includetax
- includecountry
- shiptype
- discount
- show_discount
- sub_discount
- handling
- show_handling
- shipping
- show_shipping
- method
- grand_total
- checkname
- checkbank
- checknumber
- checkroute
- checkaccount
- cardtype
- cardnumber
- cardyear
- cardmonth
- cardholder
- realname
- address
- city
- zip
- state
- country
- custname
- custaddress
- custcity
- custzip
- custstate
- custcountry
- mailname
- phone
- fax
- comments
Acronyms for using with State tax matching
These are the
NAME - VALUE pairs that are listed in the drop down box
for identifying the shipping destination state. If you
are going to enable the Tax these states option,
then you need to use the two letter acronyms below to
identify which state(s) will be matched for tax to be
included, and which states will be matched for before
- after exceptions. You can build your own drop down box
if you want, but the rule is:
- Whatever
is in the State Matching arrays must also be in your
drop down box
In the Tax Variables and Configurations section of the configuration
file you will build these two arrays from the acronyms in
your drop down box as defined below.
- Exmaple arrays
for Tax Variables:
- %taxrates
= ('AL',0.045,'AZ',0.0333,'CO',0.03,'TX',0.0625);
- @exceptions
= ('CA','CO','CT');
- <select
name="state">
- <option
value=NA>Not Applicable
- <option
value=AL>Alabama
- <option
value=AK>Alaska
- <option
value=AZ>Arizona
- <option
value=AR>Arkansas
- <option
value=CA>California
- <option
value=CO>Colorado
- <option
value=CT>Connecticut
- <option
value=DE>Delaware
- <option
value=DC>District of Columbia
- <option
value=FL>Florida
- <option
value=GA>Georgia
- <option
value=HI>Hawaii
- <option
value=ID>Idaho
- <option
value=IL>Illinois
- <option
value=IN>Indiana
- <option
value=IA>Iowa
- <option
value=KS>Kansas
- <option
value=KY>Kentucky
- <option
value=LA>Louisiana
- <option
value=ME>Maine
- <option
value=MD>Maryland
- <option
value=MA>Massachusetts
- <option
value=MI>Michigan
- <option
value=MN>Minnesota
- <option
value=MS>Mississippi
- <option
value=MO>Missouri
- <option
value=MT>Montana
- <option
value=NE>Nebraska
- <option
value=NV>Nevada
- <option
value=NH>New Hampshire
- <option
value=NJ>New Jersey
- <option
value=NM>New Mexico
- <option
value=NY>New York
- <option
value=NC>North Carolina
- <option
value=ND>North Dakota
- <option
value=OH>Ohio
- <option
value=OK>Oklahoma
- <option
value=OR>Oregon
- <option
value=PA>Pennsylvania
- <option
value=RI>Rhode Island
- <option
value=SC>South Carolina
- <option
value=SD>South Dakota
- <option
value=TN>Tennessee
- <option
value=TX>Texas
- <option
value=UT>Utah
- <option
value=VT>Vermont
- <option
value=VA>Virginia
- <option
value=WA>Washington
- <option
value=WV>West Virginia
- <option
value=WI>Wisconsin
- <option
value=WY>Wyoming
- <option
value=AB>Alberta
- <option
value=BC>British Columbia
- <option
value=MB>Manitoba
- <option
value=NB>New Brunswick
- <option
value=NF>Newfoundland
- <option
value=NT>NWT
- <option
value=NS>Nova Scotia
- <option
value=ON>Ontario
- <option
value=PE>P.E.I.
- <option
value=PQ>Quebec
- <option
value=SK>Saskatchewan
- <option
value=YT>Yukon
Names used for Country Drop Down Box
These are the
country values used in the drop down box for shipping
country. If you enable the $use_country feature, to automatically change
the shipping rate for foreign shipping destinations, then
you need to use the exact country as defined in the drop
down box for the $match_country setting to identify what the
domestic country is.
- <option>Albania
- <option>Algeria
- <option>American
Samoa
- <option>Andorra
- <option>Angola
- <option>Anguilla
- <option>Antigua
& Barbuda
- <option>Argentina
- <option>Aruba
- <option>Australia
- <option>Austria
- <option>Azores
- <option>Bahamas
- <option>Bahrain
- <option>Bangladesh
- <option>Barbados
- <option>Belarus
- <option>Belgium
- <option>Belize
- <option>Benin
- <option>Bermuda
- <option>Bolivia
- <option>Bonaire
- <option>Botswana
- <option>Brazil
- <option>British
Virgin Islands
- <option>Brunei
- <option>Bulgaria
- <option>Burkina
Faso
- <option>Burundi
- <option>Cambodia
- <option>Cameroon
- <option>Canary
Islands
- <option>Canada
- <option>Cape
Verde
- <option>Cayman
Islands
- <option>Central
African Republic
- <option>Chad
- <option>Channel
Islands
- <option>Chile
- <option>Colombia
- <option>Congo
- <option>Cook
Islands
- <option>Costa
Rica
- <option>Croatia
- <option>Cuba
- <option>Curacao
- <option>Cyprus
- <option>Czech
Republic
- <option>Denmark
- <option>Djibouti
- <option>Dominica
- <option>Dominican
Republic
- <option>Ecuador
- <option>Egypt
- <option>El
Salvador
- <option>England
- <option>Equatorial
Guinea
- <option>Eritrea
- <option>Estonia
- <option>Ethiopia
- <option>Faeroe
Islands
- <option>Federated
States of Micronesia
- <option>Fiji
- <option>Finland
- <option>France
- <option>French
Guiana
- <option>French
Polynesia
- <option>Gabon
- <option>Gambia
- <option>Georgia
- <option>Germany
- <option>Ghana
- <option>Gibraltar
- <option>Greece
- <option>Greenland
- <option>Grenada
- <option>Guadeloupe
- <option>Guam
- <option>Guatemala
- <option>Guinea
- <option>Guinea-Bissau
- <option>Guyana
- <option>Haiti
- <option>Holland
- <option>Honduras
- <option>Hong
Kong
- <option>Hungary
- <option>Iceland
- <option>India
- <option>Indonesia
- <option>Israel
- <option>Italy
- <option>Ivory
Coast
- <option>Jamaica
- <option>Japan
- <option>Jordan
- <option>Kazakhstan
- <option>Kenya
- <option>Kiribati
- <option>Kosrae
- <option>Kuwait
- <option>Kyrgyzstan
- <option>Laos
- <option>Latvia
- <option>Lebanon
- <option>Lesotho
- <option>Liberia
- <option>Liechtenstein
- <option>Lithuania
- <option>Luxembourg
- <option>Macau
- <option>Macedonia
- <option>Madagascar
- <option>Madeira
- <option>Malawi
- <option>Malaysia
- <option>Maldives
- <option>Mali
- <option>Malta
- <option>Marshall
Islands
- <option>Martinique
- <option>Mauritania
- <option>Mauritius
- <option>Mexico
- <option>Moldova
- <option>Monaco
- <option>Montserrat
- <option>Morocco
- <option>Mozambique
- <option>Myanmar
- <option>Namibia
- <option>Nepal
- <option>Netherlands
- <option>Netherlands
Antilles
- <option>New
Caledonia
- <option>New
Zealand
- <option>Nicaragua
- <option>Niger
- <option>Nigeria
- <option>Norfolk
Island
- <option>Northern
Ireland
- <option>Northern
Mariana Islands
- <option>Norway
- <option>Oman
- <option>Pakistan
- <option>Palau
- <option>Panama
- <option>Papua
New Guinea
- <option>Paraguay
- <option>Peoples
Republic of China
- <option>Peru
- <option>Philippines
- <option>Poland
- <option>Ponape
- <option>Portugal
- <option>Qatar
- <option>Republic
of Ireland
- <option>Republic
of Yemen
- <option>Reunion
- <option>Romania
- <option>Rota
- <option>Russia
- <option>Rwanda
- <option>Saba
- <option>Saipan
- <option>Saudi
Arabia
- <option>Scotland
- <option>Senegal
- <option>Seychelles
- <option>Sierra
Leone
- <option>Singapore
- <option>Slovakia
- <option>Slovenia
- <option>Solomon
Islands
- <option>South
Africa
- <option>South
Korea
- <option>Spain
- <option>Sri
Lanka
- <option>St.
Barthelemy
- <option>St.
Christopher
- <option>St.
Croix
- <option>St.
Eustatius
- <option>St.
John
- <option>St.
Kitts & Nevis
- <option>St.
Lucia
- <option>St.
Maarten
- <option>St.
Martin
- <option>St.
Thomas
- <option>St.
Vincent and the Grenadines
- <option>Sudan
- <option>Suriname
- <option>Swaziland
- <option>Sweden
- <option>Switzerland
- <option>Syria
- <option>Tahiti
- <option>Taiwan
- <option>Tajikistan
- <option>Tanzania
- <option>Thailand
- <option>Tinian
- <option>Togo
- <option>Tonga
- <option>Tortola
- <option>Trinidad
&Tobago
- <option>Truk
- <option>Tunisia
- <option>Turkey
- <option>Turks
& Caicos Islands
- <option>Tuvalu
- <option>Uganda
- <option>Ukraine
- <option>Union
Island
- <option>United
Arab Emirates
- <option>United
Kingdom
- <option>Uruguay
- <option
selected>USA
- <option>US
Virgin Islands
- <option>Uzbekistan
- <option>Vanuatu
- <option>Venezuela
- <option>Vietnam
- <option>Virgin
Gorda
- <option>Wake
Island
- <option>Wales
- <option>Wallis
& Futuna Islands
- <option>Western
Samoa
- <option>Yap
- <option>Zaire
- <option>Zambia
- <option>Zimbabwe
Structure of the related RDB files
This is the
order of the fields that get printed to the main RDB file
ordermain.rdb. If there is no data entered for
a particular field, then a null is stored to that place,
with the delimiter intact. There are 37 Fields printed
in the ordermain.rdb file in the following order.
If you import this file to a PC Database, then you'll
want to set up this sort of structure to import directly
into. All formatting is stripped from the dollar numbers,
so the computations are stored in this file as non-formatted
2 decimal numbers
- Invoice
Number (related field)
- Unique
ID Number (related field)
- Date ( MM/DD/YY
)
- Time ( HH/MM/SS
)
- Payment Type
(check, card type)
- Account Name
- Bank Name
- Check Number
- Bank Routing
Number
- Account Number
- Card Name
- Card Number
- Expiration
Date ( MM/YY )
- Number of
Products for this Invoice
- Total Amount
of Products
- Discount
- Sub Total
( After Discount )
- Sales Tax
- Handling
Charge
- Shipping
Charge
- Total Invoice
Amount (sub total + sales tax + handling + shipping
)
- Shipping
Method ( standard, express, foreign standard, foreign
express )
- Ship to Name
- Ship to Address
- Ship to City
- Ship to State
- Ship to Zip
- Ship to Country
- Customer
Name
- Customer
Address
- Customer
City
- Customer
State
- Customer
Zip
- Customer
Country
- Email Address
- Fax Number
- Phone Number
This is the order
of the fields that get printed to the RDB file orderorders.rdb.
If there is no data entered for a particular field,
then a null is stored to that place, with the delimiter
intact. There are 7 Fields printed in the orderorders.rdb
file in the following order. If you import this file to
a PC Database, then you'll want to set up this sort of structure
to import directly into. All formatting is stripped from
the dollar numbers, so the computations are stored in this
file as non-formatted 2 decimal numbers
This file is
set up to provide "relational database" design, so it
will print as many records (lines) as products ordered.
You can then relate either one of the first two fields
to the main RDB file ordermain.rdb.
- Invoice
Number (related field)
- Unique
ID Number (related field)
- Quantity
of this Product ordered
- Item Name
- Item Description
- Item Price
- Item ShipCode
This is the order
of the fields that get printed to the RDB file ordercustom.rdb.
This file is only printed if $use_fields is turned
on.
This file is
set up to provide "relational database" design. The ordercustom.rdb
file prints only one record per invoice related to the
main invoice file ordermain.rdb. It is related
by either one of the first two fields. It will print at
least the first two fields:
- Invoice
Number (related field)
- Unique
ID Number (related field)
And then it will print as many fields as you
have set up in your custom fields configuration. It will
print null fields if you have fields set up but no data
is entered into a particular field. The delimiters will
print to hold the null spaces.
Okay, as mentioned
at the opening of this file, and at the top of each of
the scripts - By opening and configuring these scripts
for your server and application you thereby assume any
and all responsibility for the use and outcomes of this
program. There are absolutely no warrantees or guarantees
that come with these scripts. When you download the scripts
you assume all responsibility for anything resulting from
their use.