Product Spotlight on UnForm
Zero Error Rate
at Hodges Badge
“Getting orders right” is usually a
pre-requisite of staying in business and providing the kind of service that
keeps customers coming back, and frequently is what separates industry
leaders from the rest of the pack.
In a supply business where customer artwork is
involved, and where customers’ show and event timetables are not flexible,
“getting orders right” becomes an even more crucial barometer to success.
Imagine a single company that produces fully
HALF of all award ribbons used in the USA. That’s Hodges Badge Company,
located in Portsmouth, Rhode Island.
Now imagine that same company manually
photocopying customer artwork, and manually taping or pasting it to the
front page of every order. As recently as 2003, that’s how it was done at
Hodges.
Enter UnForm.
Using UnForm and Image Alchemy, Hodges now
rasterizes customers’ image files “on the fly”, and incorporates them
directly into order documents during printing.
Since they implemented this system three years
ago, owner and CEO Rick Hodges knows of no errors where a customer has
received an order with the wrong logo, or where a logo’s orientation was
incorrect.
Every print job processed on Hodges’ Linux-based
order processing system is piped through UnForm. They have about 40 “rule
files” that they created in-house that handle everything from purchase
orders to sales orders to barcodes.
Rick considers that Hodges Badge is
“very automated” for what he describes as “a basic business like ours”, and
points to their extensive network integration of Linux and Windows, factory
terminals, and RF scanning as examples.
Now, with over 15,000 custom logos in their
library of active customer artwork housed on a Windows NT server in JPG
format, the process of controlling and managing the flow of this crucial
element of the manufacturing and fulfillment process has evolved with
technology, in a classic “market-share/profitability-growth-leveraged-by-technology” fashion.
Here is a description of the underlying
technical process at work during order generation where UnForm comes into
play. This is a summarization of what's coded in the UnForm rule file,
which is reproduced in its entirety at the bottom of this article.
- UnForm detects an order with a die number reference. The die
number is the reference to the image. If there is no die number
reference a different production order rule file will be
detected with a different set of commands.
- In the prejob { } routine get ( ) commands are used to get
certain order info into expression variables for later reference
by UnForm, and to lookup order header and customer data
directly from the data files, using BBx file open ( ) and read (
) commands. The die number is one of the pieces of order data
read from the order header file.
- In the prepage { } routine the existence of an order die
number causes the logostatus flag to be null (rather than 'F') ,
and causes code to resolve the network directory location of the
die image file to be processed.
- Three values are needed to resolve the location of the image
properly: a design number, a design letter, and a design
directory. Code in the prepage section handles pulling this info
out and building the full path and filename to the proper image
file.
- At the end of the prepage section the command is built to
invoke the Image Alchemy graphic file conversion with the
resolved path and file name, and a BBx scall ( ) command is used
to execute it, causing a 450x450 pcl-compatible image to be
created in the UnForm directory from the art department's TIF
file version.
- A precopy { } block sets up some SKIP logic so that multiple
page orders can be processed properly. The die image and a
barcode is only printed on page 1 of an order, so subsequent
order pages are formatted differently than page 1. Only page 1
of an order document is assigned to copy 1, and all subsequent
pages are assigned to copy 2.
- The actual form printing text and graphic enhancement
commands are then established within IF COPY 1 or IF COPY 2
clauses.
- A postjob { } section to expreslly erase the image file is
included at the end, so that an order with no die number
reference does not duplicate the image from the last order.
|
Below is an image of the production order
produced by UnForm. Hodges
has chosen to font and bold mainly order header and form label data, but for
the most part leave the main order data in the mono-spaced courier font.
While many companies choose to enhance all text with some combination of
complementary proportional fonts and attributes, our experience at SDSI
shows that many companies also intentionally choose to leave certain form
text in what some think of as a more "unenhanced" courier mono-spaced font,
as a way for that data to stand out more as variable data from the rest of
the text on the form.
The customer's artwork logo we have been discussing can be seen in the bottom
right section above the total charges.
SDSI enjoys counting Hodges Badge
Company as one of its end-users. Their proud family-owned heritage is an
inspirational story that it's nice to be a part of, in an
evolving-technology sort of a way. Visit the elaborate and colorful Hodges
web site at
www.hodgesbadge.com, and read more about founding great-grandfather
William Hodges and his two younger daughters Anna and Emaline, who together
in 1920, probably couldn’t envision the ways in which their order-taking,
assembly and stitching operations would evolve to command such a large share
of this interesting recreational market.
Thank you to Rick Hodges and Jenn
Bento for sharing this
unique implementation of UnForm with all of us. And best of luck to Rick and
family hanging all those ribbons on all those horses.
After all, someone’s gotta do it
…
The rule set instructions as provided by
Hodges are shown below.
TECH TIP RULE FILE:[Hodges Production Order
With Die on Page 1]
detect 0,0,"HODGES PRODUCTION ORDER WITH DIE"
# Detect anywhere on the page
# This is set at line 5104 in H.ORDER.PRINTING.1 when PASS=0 and
die$ <>""
# There are different rule files for orders with dies and orders
without dies.
dpi 600
cols 80
rows 66
pcopies 2
#constants - from logo printing
const textcol=18
const textattr=cgtimes,13
const lgtext=cgtimes,20,bold
const ltrhd=univers,8,bold
const designpath$="/artdept/"
#set the font for the page as 12 pitch courier (note pitch, not
point as it is a fixed font!)
#non-proportional
font 0,0,66,80,courier,10
# find the parts of the order number
prejob{
acknowledgement1$=cvs(get(29,7,3),3)
ordernum1$=cvs(get(69,7,2),3)
ordernum2$=cvs(get(72,7,6),3)
custnum1$=cvs(get(44,7,9),3)
promised1$=cvs(get(61,8,8),3)
event1$=cvs(get(61,10,8),3)
horderheaders=unt; open(horderheaders)"/u/hbc/data/H.ORDER.HEADERS"
read (horderheaders,key=get(69,7,2)+get(72,7,6),tim=30)\
*,*,*,*,*,*,*,shipby$,*,*,*,*,*,*,*,init$\
,order,*,*,*,*,*,*,*,*,die$,*,*,*,*,time,*,*,web$,repeat$,*,change$
hcustomers=unt; open(hcustomers)"/u/hbc/data/H.CUSTOMERS"
read (hcustomers,key=get(44,7,9),tim=30)\
a3$,b3$,org$,bill2$,bill3$,bill4$,billfone$,billfax$,bille$\
,shipname$,ship2$,ship3$,ship4$,shipzip$,shipfone$,shipfax$,shipe$,listinfo$,type$,first$\
,thisyear,lastyear,allyears,history1$,history2$,key$,coment$,ccard$,paycode3$,lastcode$,limit\
,state$,tax$,designs$,c3$,d3$,e3$,f3$
}
prepage {
if acknowledgement1$="ACK" then acknowledgement1$="ORDER
ACKNOWLEDGEMENT"\
else acknowledgement1$=""
if key$<>"" then keytext$="Acct Mgr: "+key$ else keytext$=""
if shipby$<>"" then shipby$="Ship By: "+shipby$(3,2)+"/"+shipby$(5)+"/"+shipby$(1,2)\
else shipby$="Ship By: / /"
#if die$<>"" then dietext$="Customer's Design: "+die$
if repeat$<>"" then repeattext$="SKETCHES: "+repeat$ else repeattext$=""
if change$<>"" then changetext$="REVISED " else changetext$=""
if web$<>"" then webtext$="WEB # "+web$ else webtext$=""
if die$<>"" then dietext2$="This order uses a logo. " else
logostatus$="F"
if die$<>"" then logotext2$="Printed below is logo # "+die$+"."
# test the design value to see what folder it is in
# since all designs have 5 digit uppercase numbers on tigger (linux),
and either 5 or 4 digit
# lowercase #'s on pooh (NT), we need to differentiate based on the
dash character in position
# 2 of the file name to tell if this is a stock or custom design
if logostatus$="F" goto done_logostatus_not_F:
# logostatus_not_F
if len(die$)=>6 then die$=die$(1,6); type$="custom"
if die$(2,1)="-" then type$="stock"
# if it is a stock design (based on the dash character) the
design letter
# is the first character. If it is a custom design, the design
letter is the
# first 2 letters.
if type$="stock" then designltr$=die$(1,1)
if type$<>"stock" then designltr$=die$(1,2)
# whether a stock or custom design, the design number is always
the last 3 digits
if num(designnum$)<999 then designnum$=die$(4,3) else designnum$=die$(3,4)
if type$="custom" goto do_type_custom
# do_type_stock
if designltr$(1,1)="A" then designdir$="\(a\)animals\ stock/"
if designltr$(1,1)="B" then designdir$="\(b\)athletic\ stock/"
if designltr$(1,1)="C" then designdir$="\(c\)corporate\ stock/"
if designltr$(1,1)="D" then designdir$=""
if designltr$(1,1)="G" then designdir$="\(g\)org\ stock/"
if designltr$(1,1)="H" then designdir$="\(h\)animals\ stock/"
if designltr$(1,1)="M" then designdir$="\(m\)misc\ stock/"
if designltr$(1,1)="O" then designdir$="\(o\)drug\ stock/"
if designltr$(1,1)="P" then designdir$="\(p\)plant\ stock/"
if designltr$(1,1)="X" then designdir$="\(x\)religion\ stock/"
goto done_logostatus_not_F
do_type_custom:
if designltr$(1,1)="A" and type$="custom" then designdir$="\(a\)animals\
custom/"
if designltr$(1,1)="B" and type$="custom" then designdir$="\(b\)athletic\
custom/"
if designltr$(1,1)="C" and type$="custom" then designdir$="\(c\)corporate\
custom/"
if designltr$(1,1)="D" and type$="custom" then designdir$="\(d\)hospitals\
custom/"
if designltr$(1,1)="E" and type$="custom" then designdir$="\(e\)education\
custom/"
if designltr$(1,1)="F" and type$="custom" then designdir$="\(f\)fair\
custom/"
if designltr$(1,1)="G" and type$="custom" then designdir$="\(g\)4\-h\
custom/"
# horse shows have 5 sub folders :(
if designltr$(1,2)>="HA" and designltr$(1,2)<="HE" then designdir$="\(h\)horse\
custom\/hahe/"
if designltr$(1,2)>="HF" and designltr$(1,2)<="HJ" then designdir$="\(h\)horse\
custom\/hfhj/"
if designltr$(1,2)>="HK" and designltr$(1,2)<="HO" then designdir$="\(h\)horse\
custom\/hkho/"
if designltr$(1,2)>="HP" and designltr$(1,2)<="HT" then designdir$="\(h\)horse\
custom\/hpht/"
if designltr$(1,2)>="HU" and designltr$(1,2)<="HZ" then designdir$="\(h\)horse\
custom\/huhz/"
if designltr$(1,1)="O" and type$="custom" then designdir$="\(o\)drug\
custom/"
if designltr$(1,1)="P" and type$="custom" then designdir$="\(p\)garden\
club\ custom/"
if designltr$(1,1)="R" and type$="custom" then designdir$="\(r\)rec\
park\ custom/"
if designltr$(1,1)="S" and type$="custom" then designdir$="\(s\)swim\
custom/"
if designltr$(1,1)="W" and type$="custom" then designdir$="\(w\)misc\
custom/"
if designltr$(1,1)="X" and type$="custom" then designdir$="\(x\)religion\
custom/"
#convert designnum$ from uppercase (tigger) to lowercase (pooh)
if type$="stock" then designltr$(1,1)=chr(asc(designltr$(1,1))+32)
if type$="custom" then designltr$(1,1)=chr(asc(designltr$(1,1))+32)
if type$="custom" then designltr$(2,1)=chr(asc(designltr$(2,1))+32)
done_logostatus_not_F:
j1$="/artdept/"
j$=j1$+designdir$+designltr$+designnum$+"*"+".tif"
filein$=j$
fileout$="/u/unform/logo.pcl"
#page 154 of imagealchemy manual convert the image filein$ to HP
PCL file called
#fileout$ with dimensions of 450 x 450 at 300 dpi, gamma in is 1.0,
gamma out is
#2.0 to compensate for dot gain, with type 3 ditering, a serpentine
raster and
#adding dithering noise. -Q is quitet mode = pg 267, the -+
preserves aspect ratio
a$="/u/hbc/alchemy/alchemy "+filein$+" "+fileout$\
+" -Q -P -o -+ -X450 -Y450 -D 300 300 -Gi 1.0 -Go 2.0 -ds3 10"
a=scall(a$)
btmlinetx$="Hodges Badge Company, Inc. 1170 East Main Road
Portsmouth, RI 02871"\
+" www.hodgesbadge.com Order w/Logo"+date(0,tim:"%M/%D/%Y %Hz:%mz")
# end of prepage routine
}
# if this is the first copy and the page isn't 1, skip it. If it
is the second
# copy and the page is 1 then skip it.
precopy {
if copy=1 and get(50,11,6)<>"PAGE 1" then skip=1
if copy=2 and get(50,11,6)="PAGE 1" then skip=1
if copy=2 and get(2,4,3)="ACK" then acknowledgement1$="ORDER
ACKNOWLEDGEMENT"
}
if copy = 1
# insert barcode for customer number, ship by date and order
number
# using code 39 - 3:1 - no check digit which is 440, see page 32
barcode 12,1,{custnum1$},440,100,3
text 33,1,{shipby$},courier,7,bold
barcode 59,1,{ordernum1$+ordernum2$},440,100,3
# if this is an acknowledgement, print ORDER ACKNOWLEDGEMENT down
the page
text 40,21,{acknowledgement1$},univers,35,bold,rotate 270,shade
20
# start printing stuff below the header
text 10,4.5,"HODGES BADGE COMPANY, INC.",univers,12,bold
text 10,5.5,"1170 East Main Road",univers,11
text 10,6.5,"P.O. Box 1290, Portsmouth, RI 02871",univers,11
text 10,7.5,"www.hodgesbadge.com",univers,11
text 1,9,"Telephone 800-556-2440 or 401-682-2000",univers,10
text 1,10,"Fax 800-292-7377 or 401-682-2329",univers,10
text 2,13,"SHIP TO:",cgtimes,11,bold
text 47,13,"BILL TO:",cgtimes,11,bold
text 47,6,"CUSTOMER #",univers,12,bold
text 47,4.5,"ORDER NO.",univers,13,bold
text 47,8,"Promised for Delivery",univers,10
text 47,9,"Stated Event Date", univers,10
text 47,10,{"File: "+get(74,9,13)},univers,10
text 47,11,"ListInfo:",univers,10
# draw a box around the shipto and billto addresses
box 0,12,80,9,10
text 58,6,{custnum1$},univers,12
text 58,4.5,{ordernum1$+ordernum2$},univers,13,bold
text 68,4.5,{changetext$},univers,13,bold
text 65,8,{promised1$},univers,12
text 61,11,{file1$}
text 53,11,{listinfo$},univers,10
text 65,9,{event1$},univers,12
text 70,12,{keycode1$}
text 2,18.75,{"Special Instructions "+get(24,19,20)},12,cgtimes,
bold
text 2,19.5,{"Order Entered On: "+get(16,20,8)},9,cgtimes
text 18,19.5,{init$},9,cgtimes
text 23.5,19.5,{webtext$},9,cgtimes
text 2,20.5,{keytext$},12,cgtimes,bold
text 18,20.5,{repeattext$},9,cgtimes
erase 2,19,45,1
erase 2,20,40,1
erase 1,1,80,13
erase 21,1,80,1
erase "Our order",0,0,20,1
text 47,18,{"Invoicing Terms: "+get(64,18,17)},11,cgtimes,bold
erase 47,18,53,1
text 47,19,{"Shipping Instructions: "+get(57,19,15)},11,cgtimes
erase 47,19,53,1
text 60,20,{get(24,20,21)},11,cgtimes,bold # special ship
instruct
text 1,60,{"Printing Time: "+str(time)},9,cgtimes
text 1,59,{dietext$},10,cgtimes,bold # cust design number
# bottom line of text, company name, addr, etc.
text 10,66,{btmlinetx$},univers,6
# insert HODGES logo
image 1,1.25,"\u\unform\hodgessmalllogo.pcl"
# actually print the customers logo on the page
# - this fails if there is no logo so nothing gets
# printed in this case
text 60,48,{dietext2$},10,cgtimes
text 60,49.5,{logotext2$},10,cgtimes
image 60,51,"/u/unform/logo.pcl"
# if driver pdf
# image .5,1.25,8,8,"\u\unform\hodgessmalllogo.pdf"
endif
if copy = 2
text 2,4,"HODGES BADGE COMPANY, INC.",univers,12,bold
text 2,5,"1170 East Main Road",univers,11
text 2,6,"P.O. Box 1290, Portsmouth, RI 02871",univers,11
text 2,7,"www.hodgesbadge.com",univers,11
text 2,8.5,"Telephone 800-556-2440 or 401-682-2000",univers,10
text 2,9.5,"Fax 800-292-7377 or 401-682-2329",univers,10
# draw a box around the static info at the top of the page
box 0,3,80,7,8
text 40,4,{"ORDER NO: "+ordernum1$+ordernum2$}
# print a message at the bottom of the page
text 12,65,{"Hodges Badge Company, Inc. 1170 East Main Road
Portsmouth, RI 02871"\
+" www.hodgesbadge.com "+date(0,tim:"%M/%D/%Y %Hz:%mz")},univers,6
erase 1,1,80,13
erase 21,1,80,1
erase "Our order",0,0,20,1
# if this is an acknowledgement, print ORDER ACKNOWLEDGEMENT down
the page
text 40,21,{acknowledgement1$},univers,35,bold,rotate 270,shade 20
endif
postpage{
# delete logo.pcl so it doesn't show up if there is a problem
w/file conversion
# on the next order
b$="rm -f /u/unform/logo.pcl"
b=scall(b$)
}
<eof>
|
Look for this product spotlight feature in
every issue of our quarterly News.Pages.
|