diff --git a/client-barcode/doc/codes/code93-to-go-all.eps b/client-barcode/doc/codes/code93-to-go-all.eps
new file mode 100644
index 0000000..5741033
--- /dev/null
+++ b/client-barcode/doc/codes/code93-to-go-all.eps
@@ -0,0 +1,409 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: Terry Burton
+%%BoundingBox: 50 40 168 122
+%%EndComments
+%%EndProlog
+
+currentglobal
+true setglobal
+/Generic /Category findresource
+dup length 1 add dict copy
+dup /InstanceType /packedarraytype put
+/uk.co.terryburton.bwipp exch /Category defineresource pop
+setglobal
+
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+begin
+/renlinear {
+
+ 20 dict begin % Confine variables to local scope
+
+ /args exch def % We are given some arguments
+
+ % Default options
+ /sbs [] def
+ /bhs [] def
+ /bbs [] def
+ /txt [] def
+ /barcolor (unset) def
+ /includetext false def
+ /textcolor (unset) def
+ /textxalign (unset) def
+ /textyalign (unset) def
+ /textfont (Courier) def
+ /textsize 10 def
+ /textxoffset 0 def
+ /textyoffset 0 def
+ /textgaps 0 def
+ /alttext () def
+ /bordercolor (unset) def
+ /backgroundcolor (unset) def
+ /inkspread 0.15 def
+ /width 0 def
+ /barratio 1 def
+ /spaceratio 1 def
+ /showborder false def
+ /borderleft 10 def
+ /borderright 10 def
+ /bordertop 1 def
+ /borderbottom 1 def
+ /borderwidth 0.5 def
+ /guardwhitespace false def
+ /guardleftpos 0 def
+ /guardleftypos 0 def
+ /guardrightpos 0 def
+ /guardrightypos 0 def
+ /guardwidth 6 def
+ /guardheight 7 def
+
+ % Apply the renderer options and the user options
+ args {def} forall
+ opt {def} forall
+
+ /barcolor barcolor cvlit def
+ /textcolor textcolor cvlit def
+ /textxalign textxalign cvlit def
+ /textyalign textyalign cvlit def
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textxoffset textxoffset cvr def
+ /textyoffset textyoffset cvr def
+ /textgaps textgaps cvr def
+ /alttext alttext cvlit def
+ /bordercolor bordercolor cvlit def
+ /backgroundcolor backgroundcolor cvlit def
+ /inkspread inkspread cvr def
+ /width width cvr def
+ /barratio barratio cvr def
+ /spaceratio spaceratio cvr def
+ /borderleft borderleft cvr def
+ /borderright borderright cvr def
+ /bordertop bordertop cvr def
+ /borderbottom borderbottom cvr def
+ /borderwidth borderwidth cvr def
+ /guardleftpos guardleftpos cvr def
+ /guardleftypos guardleftypos cvr def
+ /guardrightpos guardrightpos cvr def
+ /guardrightypos guardrightypos cvr def
+ /guardwidth guardwidth cvr def
+ /guardheight guardheight cvr def
+
+ % Create bar elements and put them into the bars array
+ /bars sbs length 1 add 2 idiv array def
+ /x 0.00 def /maxh 0 def
+ 0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
+ /i exch def
+ i 2 mod 0 eq { % i is even
+ /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
+ sbs i get 0 ne {
+ /h bhs i 2 idiv get 72 mul def % Height from bhs
+ /c d 2 div x add def % Centre of the bar = x + d/2
+ /y bbs i 2 idiv get 72 mul def % Baseline from bbs
+ /w d inkspread sub def % bar width = digit - inkspread
+ bars i 2 idiv [h c y w] put % Add the bar entry
+ h y add maxh gt {/maxh h y add def} if
+ } {
+ bars i 2 idiv -1 put % Dummy entry
+ } ifelse
+ } {
+ /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
+ } ifelse
+ /x x d add def % x+=d
+ } for
+
+ gsave
+
+ currentpoint translate
+
+ % Force symbol to given width
+ width 0 ne {
+ width 72 mul x div 1 scale
+ } if
+
+ % Set RGB or CMYK color depending on length of given hex string
+ /setanycolor {
+ /anycolor exch def
+ anycolor length 6 eq {
+ (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
+ } if
+ anycolor length 8 eq {
+ (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
+ } if
+ } bind def
+
+ % Display the border and background
+ newpath
+ borderleft neg borderbottom neg moveto
+ x borderleft add borderright add 0 rlineto
+ 0 maxh borderbottom add bordertop add rlineto
+ x borderleft add borderright add neg 0 rlineto
+ 0 maxh borderbottom add bordertop add neg rlineto
+ closepath
+ backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
+ showborder {
+ gsave
+ bordercolor (unset) ne { bordercolor setanycolor } if
+ borderwidth setlinewidth stroke
+ grestore
+ } if
+
+ % Display the bars for elements in the bars array
+ gsave
+ 0 setlinecap
+ barcolor (unset) ne { barcolor setanycolor } if
+ bars {
+ dup -1 ne {
+ aload pop newpath setlinewidth moveto 0 exch rlineto stroke
+ } {
+ pop
+ } ifelse
+ } forall
+ grestore
+
+ % Display the text for elements in the text array
+ textcolor (unset) ne { textcolor setanycolor } if
+ includetext {
+ textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
+ /s 0 def /f () def
+ txt {
+ {} forall
+ 2 copy s ne exch f ne or {
+ 2 copy /s exch def /f exch def
+ exch findfont exch scalefont setfont
+ } {
+ pop pop
+ } ifelse
+ moveto show
+ } forall
+ } {
+ textfont findfont textsize scalefont setfont
+ alttext () eq {
+ /txt [ txt { 0 get {} forall } forall ] def
+ /tstr txt length string def
+ 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
+ } {
+ /tstr alttext def
+ } ifelse
+
+ % Find true ascent of font
+ tstr length 0 eq {
+ 0
+ } {
+ gsave
+ newpath 0 0 moveto (0) false charpath pathbbox
+ 4 1 roll pop pop pop
+ grestore
+ currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
+ currentfont /StrokeWidth known and {
+ currentfont /StrokeWidth get 2 div 0 exch
+ currentfont /FontMatrix get dtransform
+ dup mul exch dup mul add sqrt
+ add
+ } if
+ } ifelse
+ /textascent exch def
+ /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
+
+ /textxpos textxoffset x textwidth sub 2 div add def
+ textxalign (left) eq { /textxpos textxoffset def } if
+ textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
+ textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
+ textxalign (offright) eq { /textxpos x textxoffset add def } if
+ textxalign (justify) eq textwidth x lt and {
+ /textxpos 0 def
+ /textgaps x textwidth sub tstr length 1 sub div def
+ } if
+ /textypos textyoffset textascent add 1 add neg def
+ textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
+ textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
+ textxpos textypos moveto textgaps 0 tstr ashow
+ } ifelse
+ } if
+
+ % Display the guard elements
+ guardwhitespace {
+ 0.75 setlinewidth
+ guardleftpos 0 ne {
+ newpath
+ guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
+ guardwidth neg guardheight -2 div rlineto
+ guardwidth guardheight -2 div rlineto
+ stroke
+ } if
+ guardrightpos 0 ne {
+ newpath
+ guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
+ guardwidth guardheight -2 div rlineto
+ guardwidth neg guardheight -2 div rlineto
+ stroke
+ } if
+ } if
+
+ grestore
+
+ end
+
+} bind def
+/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+% --DESC: Code 93
+% --EXAM: THIS IS CODE 93
+% --EXOP: includetext includecheck
+% --RNDR: renlinear
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /renlinear dup /uk.co.terryburton.bwipp findresource put
+begin
+/code93 {
+
+ 20 dict begin % Confine variables to local scope
+
+ /options exch def % We are given an option string
+ /barcode exch def % We are given a barcode string
+
+ /dontdraw false def
+ /includecheck false def % Enable/disable checkdigit
+ /includetext false def % Enable/disable text
+ /textfont /Courier def
+ /textsize 10 def
+ /textyoffset -7 def
+ /height 1 def
+ /parsefnc false def
+
+ % Parse the input options
+ options type /stringtype eq {
+ 1 dict begin
+ options {
+ token false eq {exit} if dup length string cvs (=) search
+ true eq {cvlit exch pop exch def} {cvlit true def} ifelse
+ } loop
+ currentdict end /options exch def
+ } if
+ options {def} forall
+
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textyoffset textyoffset cvr def
+ /height height cvr def
+
+ /encs
+ [ (131112) (111213) (111312) (111411) (121113)
+ (121212) (121311) (111114) (131211) (141111)
+ (211113) (211212) (211311) (221112) (221211)
+ (231111) (112113) (112212) (112311) (122112)
+ (132111) (111123) (111222) (111321) (121122)
+ (131121) (212112) (212211) (211122) (211221)
+ (221121) (222111) (112122) (112221) (122121)
+ (123111) (121131) (311112) (311211) (321111)
+ (112131) (113121) (211131) (121221) (312111)
+ (311121) (122211) (111141) (1111411)
+ ] def
+
+ % Create a string of the available characters
+ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
+
+ /barlen barcode length def
+
+ % Special function characters
+ /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
+ /fncvals <<
+ (SFT$) sft1
+ (SFT%) sft2
+ (SFT/) sft3
+ (SFT+) sft4
+ >> def
+
+ % Convert input into bytes accounting for shift characters
+ /msg barlen array def
+ /i 0 def /j 0 def {
+ i barlen eq {exit} if
+ /char barcode i get def
+ parsefnc char 94 eq and i barlen 4 sub lt and {
+ barcode i 1 add get 94 ne {
+ /char fncvals barcode i 1 add 4 getinterval get def
+ /i i 4 add def
+ } {
+ /i i 1 add def
+ } ifelse
+ } if
+ msg j char put
+ /i i 1 add def
+ /j j 1 add def
+ } loop
+ /msg msg 0 j getinterval def
+ /msglen msg length def
+
+ includecheck {
+ /sbs msglen 6 mul 25 add string def
+ } {
+ /sbs msglen 6 mul 13 add string def
+ } ifelse
+ /txt msglen array def
+
+ % Put the start character
+ sbs 0 encs 47 get putinterval
+
+ /checksum1 0 def /checksum2 0 def
+ 0 1 msglen 1 sub {
+ /i exch def
+ % Lookup the encoding for the each barcode character
+ msg i get dup 0 lt {
+ 42 exch sub /indx exch def
+ /char ( ) def
+ } {
+ 1 string dup 0 4 -1 roll put /char exch def
+ barchars char search
+ pop % Discard true leaving pre
+ length /indx exch def % indx is the length of pre
+ pop pop % Discard seek and post
+ } ifelse
+ /enc encs indx get def % Get the indxth encoding
+ sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
+ txt i [char i 9 mul 9 add textyoffset textfont textsize] put
+ /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
+ /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
+ } for
+
+ includecheck {
+ % Put the first checksum character
+ /checksum1 checksum1 47 mod def
+ /checksum2 checksum2 checksum1 add 47 mod def
+ sbs msglen 6 mul 6 add encs checksum1 get putinterval
+ sbs msglen 6 mul 12 add encs checksum2 get putinterval
+ % Put the end character
+ sbs msglen 6 mul 18 add encs 48 get putinterval
+ } {
+ % Put the end character
+ sbs msglen 6 mul 6 add encs 48 get putinterval
+ } ifelse
+
+ % Return the arguments
+ <<
+ /ren //renlinear
+ /sbs [sbs {48 sub} forall]
+ /bhs [sbs length 1 add 2 idiv {height} repeat]
+ /bbs [sbs length 1 add 2 idiv {0} repeat]
+ includetext {
+ /txt txt
+ } if
+ /opt options
+ >>
+
+ dontdraw not //renlinear if
+
+ end
+
+} bind def
+/code93 dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+gsave
+50 50 translate
+0 0 moveto <544f20474f20414c4c> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
+grestore
+
+showpage
diff --git a/client-barcode/doc/codes/code93-to-go-none.eps b/client-barcode/doc/codes/code93-to-go-none.eps
new file mode 100644
index 0000000..473b138
--- /dev/null
+++ b/client-barcode/doc/codes/code93-to-go-none.eps
@@ -0,0 +1,409 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: Terry Burton
+%%BoundingBox: 50 40 177 122
+%%EndComments
+%%EndProlog
+
+currentglobal
+true setglobal
+/Generic /Category findresource
+dup length 1 add dict copy
+dup /InstanceType /packedarraytype put
+/uk.co.terryburton.bwipp exch /Category defineresource pop
+setglobal
+
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+begin
+/renlinear {
+
+ 20 dict begin % Confine variables to local scope
+
+ /args exch def % We are given some arguments
+
+ % Default options
+ /sbs [] def
+ /bhs [] def
+ /bbs [] def
+ /txt [] def
+ /barcolor (unset) def
+ /includetext false def
+ /textcolor (unset) def
+ /textxalign (unset) def
+ /textyalign (unset) def
+ /textfont (Courier) def
+ /textsize 10 def
+ /textxoffset 0 def
+ /textyoffset 0 def
+ /textgaps 0 def
+ /alttext () def
+ /bordercolor (unset) def
+ /backgroundcolor (unset) def
+ /inkspread 0.15 def
+ /width 0 def
+ /barratio 1 def
+ /spaceratio 1 def
+ /showborder false def
+ /borderleft 10 def
+ /borderright 10 def
+ /bordertop 1 def
+ /borderbottom 1 def
+ /borderwidth 0.5 def
+ /guardwhitespace false def
+ /guardleftpos 0 def
+ /guardleftypos 0 def
+ /guardrightpos 0 def
+ /guardrightypos 0 def
+ /guardwidth 6 def
+ /guardheight 7 def
+
+ % Apply the renderer options and the user options
+ args {def} forall
+ opt {def} forall
+
+ /barcolor barcolor cvlit def
+ /textcolor textcolor cvlit def
+ /textxalign textxalign cvlit def
+ /textyalign textyalign cvlit def
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textxoffset textxoffset cvr def
+ /textyoffset textyoffset cvr def
+ /textgaps textgaps cvr def
+ /alttext alttext cvlit def
+ /bordercolor bordercolor cvlit def
+ /backgroundcolor backgroundcolor cvlit def
+ /inkspread inkspread cvr def
+ /width width cvr def
+ /barratio barratio cvr def
+ /spaceratio spaceratio cvr def
+ /borderleft borderleft cvr def
+ /borderright borderright cvr def
+ /bordertop bordertop cvr def
+ /borderbottom borderbottom cvr def
+ /borderwidth borderwidth cvr def
+ /guardleftpos guardleftpos cvr def
+ /guardleftypos guardleftypos cvr def
+ /guardrightpos guardrightpos cvr def
+ /guardrightypos guardrightypos cvr def
+ /guardwidth guardwidth cvr def
+ /guardheight guardheight cvr def
+
+ % Create bar elements and put them into the bars array
+ /bars sbs length 1 add 2 idiv array def
+ /x 0.00 def /maxh 0 def
+ 0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
+ /i exch def
+ i 2 mod 0 eq { % i is even
+ /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
+ sbs i get 0 ne {
+ /h bhs i 2 idiv get 72 mul def % Height from bhs
+ /c d 2 div x add def % Centre of the bar = x + d/2
+ /y bbs i 2 idiv get 72 mul def % Baseline from bbs
+ /w d inkspread sub def % bar width = digit - inkspread
+ bars i 2 idiv [h c y w] put % Add the bar entry
+ h y add maxh gt {/maxh h y add def} if
+ } {
+ bars i 2 idiv -1 put % Dummy entry
+ } ifelse
+ } {
+ /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
+ } ifelse
+ /x x d add def % x+=d
+ } for
+
+ gsave
+
+ currentpoint translate
+
+ % Force symbol to given width
+ width 0 ne {
+ width 72 mul x div 1 scale
+ } if
+
+ % Set RGB or CMYK color depending on length of given hex string
+ /setanycolor {
+ /anycolor exch def
+ anycolor length 6 eq {
+ (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
+ } if
+ anycolor length 8 eq {
+ (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
+ } if
+ } bind def
+
+ % Display the border and background
+ newpath
+ borderleft neg borderbottom neg moveto
+ x borderleft add borderright add 0 rlineto
+ 0 maxh borderbottom add bordertop add rlineto
+ x borderleft add borderright add neg 0 rlineto
+ 0 maxh borderbottom add bordertop add neg rlineto
+ closepath
+ backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
+ showborder {
+ gsave
+ bordercolor (unset) ne { bordercolor setanycolor } if
+ borderwidth setlinewidth stroke
+ grestore
+ } if
+
+ % Display the bars for elements in the bars array
+ gsave
+ 0 setlinecap
+ barcolor (unset) ne { barcolor setanycolor } if
+ bars {
+ dup -1 ne {
+ aload pop newpath setlinewidth moveto 0 exch rlineto stroke
+ } {
+ pop
+ } ifelse
+ } forall
+ grestore
+
+ % Display the text for elements in the text array
+ textcolor (unset) ne { textcolor setanycolor } if
+ includetext {
+ textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
+ /s 0 def /f () def
+ txt {
+ {} forall
+ 2 copy s ne exch f ne or {
+ 2 copy /s exch def /f exch def
+ exch findfont exch scalefont setfont
+ } {
+ pop pop
+ } ifelse
+ moveto show
+ } forall
+ } {
+ textfont findfont textsize scalefont setfont
+ alttext () eq {
+ /txt [ txt { 0 get {} forall } forall ] def
+ /tstr txt length string def
+ 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
+ } {
+ /tstr alttext def
+ } ifelse
+
+ % Find true ascent of font
+ tstr length 0 eq {
+ 0
+ } {
+ gsave
+ newpath 0 0 moveto (0) false charpath pathbbox
+ 4 1 roll pop pop pop
+ grestore
+ currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
+ currentfont /StrokeWidth known and {
+ currentfont /StrokeWidth get 2 div 0 exch
+ currentfont /FontMatrix get dtransform
+ dup mul exch dup mul add sqrt
+ add
+ } if
+ } ifelse
+ /textascent exch def
+ /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
+
+ /textxpos textxoffset x textwidth sub 2 div add def
+ textxalign (left) eq { /textxpos textxoffset def } if
+ textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
+ textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
+ textxalign (offright) eq { /textxpos x textxoffset add def } if
+ textxalign (justify) eq textwidth x lt and {
+ /textxpos 0 def
+ /textgaps x textwidth sub tstr length 1 sub div def
+ } if
+ /textypos textyoffset textascent add 1 add neg def
+ textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
+ textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
+ textxpos textypos moveto textgaps 0 tstr ashow
+ } ifelse
+ } if
+
+ % Display the guard elements
+ guardwhitespace {
+ 0.75 setlinewidth
+ guardleftpos 0 ne {
+ newpath
+ guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
+ guardwidth neg guardheight -2 div rlineto
+ guardwidth guardheight -2 div rlineto
+ stroke
+ } if
+ guardrightpos 0 ne {
+ newpath
+ guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
+ guardwidth guardheight -2 div rlineto
+ guardwidth neg guardheight -2 div rlineto
+ stroke
+ } if
+ } if
+
+ grestore
+
+ end
+
+} bind def
+/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+% --DESC: Code 93
+% --EXAM: THIS IS CODE 93
+% --EXOP: includetext includecheck
+% --RNDR: renlinear
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /renlinear dup /uk.co.terryburton.bwipp findresource put
+begin
+/code93 {
+
+ 20 dict begin % Confine variables to local scope
+
+ /options exch def % We are given an option string
+ /barcode exch def % We are given a barcode string
+
+ /dontdraw false def
+ /includecheck false def % Enable/disable checkdigit
+ /includetext false def % Enable/disable text
+ /textfont /Courier def
+ /textsize 10 def
+ /textyoffset -7 def
+ /height 1 def
+ /parsefnc false def
+
+ % Parse the input options
+ options type /stringtype eq {
+ 1 dict begin
+ options {
+ token false eq {exit} if dup length string cvs (=) search
+ true eq {cvlit exch pop exch def} {cvlit true def} ifelse
+ } loop
+ currentdict end /options exch def
+ } if
+ options {def} forall
+
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textyoffset textyoffset cvr def
+ /height height cvr def
+
+ /encs
+ [ (131112) (111213) (111312) (111411) (121113)
+ (121212) (121311) (111114) (131211) (141111)
+ (211113) (211212) (211311) (221112) (221211)
+ (231111) (112113) (112212) (112311) (122112)
+ (132111) (111123) (111222) (111321) (121122)
+ (131121) (212112) (212211) (211122) (211221)
+ (221121) (222111) (112122) (112221) (122121)
+ (123111) (121131) (311112) (311211) (321111)
+ (112131) (113121) (211131) (121221) (312111)
+ (311121) (122211) (111141) (1111411)
+ ] def
+
+ % Create a string of the available characters
+ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
+
+ /barlen barcode length def
+
+ % Special function characters
+ /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
+ /fncvals <<
+ (SFT$) sft1
+ (SFT%) sft2
+ (SFT/) sft3
+ (SFT+) sft4
+ >> def
+
+ % Convert input into bytes accounting for shift characters
+ /msg barlen array def
+ /i 0 def /j 0 def {
+ i barlen eq {exit} if
+ /char barcode i get def
+ parsefnc char 94 eq and i barlen 4 sub lt and {
+ barcode i 1 add get 94 ne {
+ /char fncvals barcode i 1 add 4 getinterval get def
+ /i i 4 add def
+ } {
+ /i i 1 add def
+ } ifelse
+ } if
+ msg j char put
+ /i i 1 add def
+ /j j 1 add def
+ } loop
+ /msg msg 0 j getinterval def
+ /msglen msg length def
+
+ includecheck {
+ /sbs msglen 6 mul 25 add string def
+ } {
+ /sbs msglen 6 mul 13 add string def
+ } ifelse
+ /txt msglen array def
+
+ % Put the start character
+ sbs 0 encs 47 get putinterval
+
+ /checksum1 0 def /checksum2 0 def
+ 0 1 msglen 1 sub {
+ /i exch def
+ % Lookup the encoding for the each barcode character
+ msg i get dup 0 lt {
+ 42 exch sub /indx exch def
+ /char ( ) def
+ } {
+ 1 string dup 0 4 -1 roll put /char exch def
+ barchars char search
+ pop % Discard true leaving pre
+ length /indx exch def % indx is the length of pre
+ pop pop % Discard seek and post
+ } ifelse
+ /enc encs indx get def % Get the indxth encoding
+ sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
+ txt i [char i 9 mul 9 add textyoffset textfont textsize] put
+ /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
+ /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
+ } for
+
+ includecheck {
+ % Put the first checksum character
+ /checksum1 checksum1 47 mod def
+ /checksum2 checksum2 checksum1 add 47 mod def
+ sbs msglen 6 mul 6 add encs checksum1 get putinterval
+ sbs msglen 6 mul 12 add encs checksum2 get putinterval
+ % Put the end character
+ sbs msglen 6 mul 18 add encs 48 get putinterval
+ } {
+ % Put the end character
+ sbs msglen 6 mul 6 add encs 48 get putinterval
+ } ifelse
+
+ % Return the arguments
+ <<
+ /ren //renlinear
+ /sbs [sbs {48 sub} forall]
+ /bhs [sbs length 1 add 2 idiv {height} repeat]
+ /bbs [sbs length 1 add 2 idiv {0} repeat]
+ includetext {
+ /txt txt
+ } if
+ /opt options
+ >>
+
+ dontdraw not //renlinear if
+
+ end
+
+} bind def
+/code93 dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+gsave
+50 50 translate
+0 0 moveto <544f20474f204e4f4e45> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
+grestore
+
+showpage
diff --git a/client-barcode/doc/codes/code93-to-go-only.eps b/client-barcode/doc/codes/code93-to-go-only.eps
new file mode 100644
index 0000000..fba752c
--- /dev/null
+++ b/client-barcode/doc/codes/code93-to-go-only.eps
@@ -0,0 +1,409 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: Terry Burton
+%%BoundingBox: 50 40 177 122
+%%EndComments
+%%EndProlog
+
+currentglobal
+true setglobal
+/Generic /Category findresource
+dup length 1 add dict copy
+dup /InstanceType /packedarraytype put
+/uk.co.terryburton.bwipp exch /Category defineresource pop
+setglobal
+
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+begin
+/renlinear {
+
+ 20 dict begin % Confine variables to local scope
+
+ /args exch def % We are given some arguments
+
+ % Default options
+ /sbs [] def
+ /bhs [] def
+ /bbs [] def
+ /txt [] def
+ /barcolor (unset) def
+ /includetext false def
+ /textcolor (unset) def
+ /textxalign (unset) def
+ /textyalign (unset) def
+ /textfont (Courier) def
+ /textsize 10 def
+ /textxoffset 0 def
+ /textyoffset 0 def
+ /textgaps 0 def
+ /alttext () def
+ /bordercolor (unset) def
+ /backgroundcolor (unset) def
+ /inkspread 0.15 def
+ /width 0 def
+ /barratio 1 def
+ /spaceratio 1 def
+ /showborder false def
+ /borderleft 10 def
+ /borderright 10 def
+ /bordertop 1 def
+ /borderbottom 1 def
+ /borderwidth 0.5 def
+ /guardwhitespace false def
+ /guardleftpos 0 def
+ /guardleftypos 0 def
+ /guardrightpos 0 def
+ /guardrightypos 0 def
+ /guardwidth 6 def
+ /guardheight 7 def
+
+ % Apply the renderer options and the user options
+ args {def} forall
+ opt {def} forall
+
+ /barcolor barcolor cvlit def
+ /textcolor textcolor cvlit def
+ /textxalign textxalign cvlit def
+ /textyalign textyalign cvlit def
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textxoffset textxoffset cvr def
+ /textyoffset textyoffset cvr def
+ /textgaps textgaps cvr def
+ /alttext alttext cvlit def
+ /bordercolor bordercolor cvlit def
+ /backgroundcolor backgroundcolor cvlit def
+ /inkspread inkspread cvr def
+ /width width cvr def
+ /barratio barratio cvr def
+ /spaceratio spaceratio cvr def
+ /borderleft borderleft cvr def
+ /borderright borderright cvr def
+ /bordertop bordertop cvr def
+ /borderbottom borderbottom cvr def
+ /borderwidth borderwidth cvr def
+ /guardleftpos guardleftpos cvr def
+ /guardleftypos guardleftypos cvr def
+ /guardrightpos guardrightpos cvr def
+ /guardrightypos guardrightypos cvr def
+ /guardwidth guardwidth cvr def
+ /guardheight guardheight cvr def
+
+ % Create bar elements and put them into the bars array
+ /bars sbs length 1 add 2 idiv array def
+ /x 0.00 def /maxh 0 def
+ 0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
+ /i exch def
+ i 2 mod 0 eq { % i is even
+ /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
+ sbs i get 0 ne {
+ /h bhs i 2 idiv get 72 mul def % Height from bhs
+ /c d 2 div x add def % Centre of the bar = x + d/2
+ /y bbs i 2 idiv get 72 mul def % Baseline from bbs
+ /w d inkspread sub def % bar width = digit - inkspread
+ bars i 2 idiv [h c y w] put % Add the bar entry
+ h y add maxh gt {/maxh h y add def} if
+ } {
+ bars i 2 idiv -1 put % Dummy entry
+ } ifelse
+ } {
+ /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
+ } ifelse
+ /x x d add def % x+=d
+ } for
+
+ gsave
+
+ currentpoint translate
+
+ % Force symbol to given width
+ width 0 ne {
+ width 72 mul x div 1 scale
+ } if
+
+ % Set RGB or CMYK color depending on length of given hex string
+ /setanycolor {
+ /anycolor exch def
+ anycolor length 6 eq {
+ (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
+ } if
+ anycolor length 8 eq {
+ (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
+ } if
+ } bind def
+
+ % Display the border and background
+ newpath
+ borderleft neg borderbottom neg moveto
+ x borderleft add borderright add 0 rlineto
+ 0 maxh borderbottom add bordertop add rlineto
+ x borderleft add borderright add neg 0 rlineto
+ 0 maxh borderbottom add bordertop add neg rlineto
+ closepath
+ backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
+ showborder {
+ gsave
+ bordercolor (unset) ne { bordercolor setanycolor } if
+ borderwidth setlinewidth stroke
+ grestore
+ } if
+
+ % Display the bars for elements in the bars array
+ gsave
+ 0 setlinecap
+ barcolor (unset) ne { barcolor setanycolor } if
+ bars {
+ dup -1 ne {
+ aload pop newpath setlinewidth moveto 0 exch rlineto stroke
+ } {
+ pop
+ } ifelse
+ } forall
+ grestore
+
+ % Display the text for elements in the text array
+ textcolor (unset) ne { textcolor setanycolor } if
+ includetext {
+ textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
+ /s 0 def /f () def
+ txt {
+ {} forall
+ 2 copy s ne exch f ne or {
+ 2 copy /s exch def /f exch def
+ exch findfont exch scalefont setfont
+ } {
+ pop pop
+ } ifelse
+ moveto show
+ } forall
+ } {
+ textfont findfont textsize scalefont setfont
+ alttext () eq {
+ /txt [ txt { 0 get {} forall } forall ] def
+ /tstr txt length string def
+ 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
+ } {
+ /tstr alttext def
+ } ifelse
+
+ % Find true ascent of font
+ tstr length 0 eq {
+ 0
+ } {
+ gsave
+ newpath 0 0 moveto (0) false charpath pathbbox
+ 4 1 roll pop pop pop
+ grestore
+ currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
+ currentfont /StrokeWidth known and {
+ currentfont /StrokeWidth get 2 div 0 exch
+ currentfont /FontMatrix get dtransform
+ dup mul exch dup mul add sqrt
+ add
+ } if
+ } ifelse
+ /textascent exch def
+ /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
+
+ /textxpos textxoffset x textwidth sub 2 div add def
+ textxalign (left) eq { /textxpos textxoffset def } if
+ textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
+ textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
+ textxalign (offright) eq { /textxpos x textxoffset add def } if
+ textxalign (justify) eq textwidth x lt and {
+ /textxpos 0 def
+ /textgaps x textwidth sub tstr length 1 sub div def
+ } if
+ /textypos textyoffset textascent add 1 add neg def
+ textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
+ textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
+ textxpos textypos moveto textgaps 0 tstr ashow
+ } ifelse
+ } if
+
+ % Display the guard elements
+ guardwhitespace {
+ 0.75 setlinewidth
+ guardleftpos 0 ne {
+ newpath
+ guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
+ guardwidth neg guardheight -2 div rlineto
+ guardwidth guardheight -2 div rlineto
+ stroke
+ } if
+ guardrightpos 0 ne {
+ newpath
+ guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
+ guardwidth guardheight -2 div rlineto
+ guardwidth neg guardheight -2 div rlineto
+ stroke
+ } if
+ } if
+
+ grestore
+
+ end
+
+} bind def
+/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+% --DESC: Code 93
+% --EXAM: THIS IS CODE 93
+% --EXOP: includetext includecheck
+% --RNDR: renlinear
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /renlinear dup /uk.co.terryburton.bwipp findresource put
+begin
+/code93 {
+
+ 20 dict begin % Confine variables to local scope
+
+ /options exch def % We are given an option string
+ /barcode exch def % We are given a barcode string
+
+ /dontdraw false def
+ /includecheck false def % Enable/disable checkdigit
+ /includetext false def % Enable/disable text
+ /textfont /Courier def
+ /textsize 10 def
+ /textyoffset -7 def
+ /height 1 def
+ /parsefnc false def
+
+ % Parse the input options
+ options type /stringtype eq {
+ 1 dict begin
+ options {
+ token false eq {exit} if dup length string cvs (=) search
+ true eq {cvlit exch pop exch def} {cvlit true def} ifelse
+ } loop
+ currentdict end /options exch def
+ } if
+ options {def} forall
+
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textyoffset textyoffset cvr def
+ /height height cvr def
+
+ /encs
+ [ (131112) (111213) (111312) (111411) (121113)
+ (121212) (121311) (111114) (131211) (141111)
+ (211113) (211212) (211311) (221112) (221211)
+ (231111) (112113) (112212) (112311) (122112)
+ (132111) (111123) (111222) (111321) (121122)
+ (131121) (212112) (212211) (211122) (211221)
+ (221121) (222111) (112122) (112221) (122121)
+ (123111) (121131) (311112) (311211) (321111)
+ (112131) (113121) (211131) (121221) (312111)
+ (311121) (122211) (111141) (1111411)
+ ] def
+
+ % Create a string of the available characters
+ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
+
+ /barlen barcode length def
+
+ % Special function characters
+ /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
+ /fncvals <<
+ (SFT$) sft1
+ (SFT%) sft2
+ (SFT/) sft3
+ (SFT+) sft4
+ >> def
+
+ % Convert input into bytes accounting for shift characters
+ /msg barlen array def
+ /i 0 def /j 0 def {
+ i barlen eq {exit} if
+ /char barcode i get def
+ parsefnc char 94 eq and i barlen 4 sub lt and {
+ barcode i 1 add get 94 ne {
+ /char fncvals barcode i 1 add 4 getinterval get def
+ /i i 4 add def
+ } {
+ /i i 1 add def
+ } ifelse
+ } if
+ msg j char put
+ /i i 1 add def
+ /j j 1 add def
+ } loop
+ /msg msg 0 j getinterval def
+ /msglen msg length def
+
+ includecheck {
+ /sbs msglen 6 mul 25 add string def
+ } {
+ /sbs msglen 6 mul 13 add string def
+ } ifelse
+ /txt msglen array def
+
+ % Put the start character
+ sbs 0 encs 47 get putinterval
+
+ /checksum1 0 def /checksum2 0 def
+ 0 1 msglen 1 sub {
+ /i exch def
+ % Lookup the encoding for the each barcode character
+ msg i get dup 0 lt {
+ 42 exch sub /indx exch def
+ /char ( ) def
+ } {
+ 1 string dup 0 4 -1 roll put /char exch def
+ barchars char search
+ pop % Discard true leaving pre
+ length /indx exch def % indx is the length of pre
+ pop pop % Discard seek and post
+ } ifelse
+ /enc encs indx get def % Get the indxth encoding
+ sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
+ txt i [char i 9 mul 9 add textyoffset textfont textsize] put
+ /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
+ /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
+ } for
+
+ includecheck {
+ % Put the first checksum character
+ /checksum1 checksum1 47 mod def
+ /checksum2 checksum2 checksum1 add 47 mod def
+ sbs msglen 6 mul 6 add encs checksum1 get putinterval
+ sbs msglen 6 mul 12 add encs checksum2 get putinterval
+ % Put the end character
+ sbs msglen 6 mul 18 add encs 48 get putinterval
+ } {
+ % Put the end character
+ sbs msglen 6 mul 6 add encs 48 get putinterval
+ } ifelse
+
+ % Return the arguments
+ <<
+ /ren //renlinear
+ /sbs [sbs {48 sub} forall]
+ /bhs [sbs length 1 add 2 idiv {height} repeat]
+ /bbs [sbs length 1 add 2 idiv {0} repeat]
+ includetext {
+ /txt txt
+ } if
+ /opt options
+ >>
+
+ dontdraw not //renlinear if
+
+ end
+
+} bind def
+/code93 dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+gsave
+50 50 translate
+0 0 moveto <544f20474f204f4e4c59> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
+grestore
+
+showpage
diff --git a/client-barcode/doc/codes/code93-to-go-prev.eps b/client-barcode/doc/codes/code93-to-go-prev.eps
new file mode 100644
index 0000000..90028b4
--- /dev/null
+++ b/client-barcode/doc/codes/code93-to-go-prev.eps
@@ -0,0 +1,409 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: Terry Burton
+%%BoundingBox: 50 40 177 122
+%%EndComments
+%%EndProlog
+
+currentglobal
+true setglobal
+/Generic /Category findresource
+dup length 1 add dict copy
+dup /InstanceType /packedarraytype put
+/uk.co.terryburton.bwipp exch /Category defineresource pop
+setglobal
+
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+begin
+/renlinear {
+
+ 20 dict begin % Confine variables to local scope
+
+ /args exch def % We are given some arguments
+
+ % Default options
+ /sbs [] def
+ /bhs [] def
+ /bbs [] def
+ /txt [] def
+ /barcolor (unset) def
+ /includetext false def
+ /textcolor (unset) def
+ /textxalign (unset) def
+ /textyalign (unset) def
+ /textfont (Courier) def
+ /textsize 10 def
+ /textxoffset 0 def
+ /textyoffset 0 def
+ /textgaps 0 def
+ /alttext () def
+ /bordercolor (unset) def
+ /backgroundcolor (unset) def
+ /inkspread 0.15 def
+ /width 0 def
+ /barratio 1 def
+ /spaceratio 1 def
+ /showborder false def
+ /borderleft 10 def
+ /borderright 10 def
+ /bordertop 1 def
+ /borderbottom 1 def
+ /borderwidth 0.5 def
+ /guardwhitespace false def
+ /guardleftpos 0 def
+ /guardleftypos 0 def
+ /guardrightpos 0 def
+ /guardrightypos 0 def
+ /guardwidth 6 def
+ /guardheight 7 def
+
+ % Apply the renderer options and the user options
+ args {def} forall
+ opt {def} forall
+
+ /barcolor barcolor cvlit def
+ /textcolor textcolor cvlit def
+ /textxalign textxalign cvlit def
+ /textyalign textyalign cvlit def
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textxoffset textxoffset cvr def
+ /textyoffset textyoffset cvr def
+ /textgaps textgaps cvr def
+ /alttext alttext cvlit def
+ /bordercolor bordercolor cvlit def
+ /backgroundcolor backgroundcolor cvlit def
+ /inkspread inkspread cvr def
+ /width width cvr def
+ /barratio barratio cvr def
+ /spaceratio spaceratio cvr def
+ /borderleft borderleft cvr def
+ /borderright borderright cvr def
+ /bordertop bordertop cvr def
+ /borderbottom borderbottom cvr def
+ /borderwidth borderwidth cvr def
+ /guardleftpos guardleftpos cvr def
+ /guardleftypos guardleftypos cvr def
+ /guardrightpos guardrightpos cvr def
+ /guardrightypos guardrightypos cvr def
+ /guardwidth guardwidth cvr def
+ /guardheight guardheight cvr def
+
+ % Create bar elements and put them into the bars array
+ /bars sbs length 1 add 2 idiv array def
+ /x 0.00 def /maxh 0 def
+ 0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
+ /i exch def
+ i 2 mod 0 eq { % i is even
+ /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
+ sbs i get 0 ne {
+ /h bhs i 2 idiv get 72 mul def % Height from bhs
+ /c d 2 div x add def % Centre of the bar = x + d/2
+ /y bbs i 2 idiv get 72 mul def % Baseline from bbs
+ /w d inkspread sub def % bar width = digit - inkspread
+ bars i 2 idiv [h c y w] put % Add the bar entry
+ h y add maxh gt {/maxh h y add def} if
+ } {
+ bars i 2 idiv -1 put % Dummy entry
+ } ifelse
+ } {
+ /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
+ } ifelse
+ /x x d add def % x+=d
+ } for
+
+ gsave
+
+ currentpoint translate
+
+ % Force symbol to given width
+ width 0 ne {
+ width 72 mul x div 1 scale
+ } if
+
+ % Set RGB or CMYK color depending on length of given hex string
+ /setanycolor {
+ /anycolor exch def
+ anycolor length 6 eq {
+ (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
+ } if
+ anycolor length 8 eq {
+ (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
+ } if
+ } bind def
+
+ % Display the border and background
+ newpath
+ borderleft neg borderbottom neg moveto
+ x borderleft add borderright add 0 rlineto
+ 0 maxh borderbottom add bordertop add rlineto
+ x borderleft add borderright add neg 0 rlineto
+ 0 maxh borderbottom add bordertop add neg rlineto
+ closepath
+ backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
+ showborder {
+ gsave
+ bordercolor (unset) ne { bordercolor setanycolor } if
+ borderwidth setlinewidth stroke
+ grestore
+ } if
+
+ % Display the bars for elements in the bars array
+ gsave
+ 0 setlinecap
+ barcolor (unset) ne { barcolor setanycolor } if
+ bars {
+ dup -1 ne {
+ aload pop newpath setlinewidth moveto 0 exch rlineto stroke
+ } {
+ pop
+ } ifelse
+ } forall
+ grestore
+
+ % Display the text for elements in the text array
+ textcolor (unset) ne { textcolor setanycolor } if
+ includetext {
+ textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
+ /s 0 def /f () def
+ txt {
+ {} forall
+ 2 copy s ne exch f ne or {
+ 2 copy /s exch def /f exch def
+ exch findfont exch scalefont setfont
+ } {
+ pop pop
+ } ifelse
+ moveto show
+ } forall
+ } {
+ textfont findfont textsize scalefont setfont
+ alttext () eq {
+ /txt [ txt { 0 get {} forall } forall ] def
+ /tstr txt length string def
+ 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
+ } {
+ /tstr alttext def
+ } ifelse
+
+ % Find true ascent of font
+ tstr length 0 eq {
+ 0
+ } {
+ gsave
+ newpath 0 0 moveto (0) false charpath pathbbox
+ 4 1 roll pop pop pop
+ grestore
+ currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
+ currentfont /StrokeWidth known and {
+ currentfont /StrokeWidth get 2 div 0 exch
+ currentfont /FontMatrix get dtransform
+ dup mul exch dup mul add sqrt
+ add
+ } if
+ } ifelse
+ /textascent exch def
+ /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
+
+ /textxpos textxoffset x textwidth sub 2 div add def
+ textxalign (left) eq { /textxpos textxoffset def } if
+ textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
+ textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
+ textxalign (offright) eq { /textxpos x textxoffset add def } if
+ textxalign (justify) eq textwidth x lt and {
+ /textxpos 0 def
+ /textgaps x textwidth sub tstr length 1 sub div def
+ } if
+ /textypos textyoffset textascent add 1 add neg def
+ textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
+ textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
+ textxpos textypos moveto textgaps 0 tstr ashow
+ } ifelse
+ } if
+
+ % Display the guard elements
+ guardwhitespace {
+ 0.75 setlinewidth
+ guardleftpos 0 ne {
+ newpath
+ guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
+ guardwidth neg guardheight -2 div rlineto
+ guardwidth guardheight -2 div rlineto
+ stroke
+ } if
+ guardrightpos 0 ne {
+ newpath
+ guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
+ guardwidth guardheight -2 div rlineto
+ guardwidth neg guardheight -2 div rlineto
+ stroke
+ } if
+ } if
+
+ grestore
+
+ end
+
+} bind def
+/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+% --DESC: Code 93
+% --EXAM: THIS IS CODE 93
+% --EXOP: includetext includecheck
+% --RNDR: renlinear
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /renlinear dup /uk.co.terryburton.bwipp findresource put
+begin
+/code93 {
+
+ 20 dict begin % Confine variables to local scope
+
+ /options exch def % We are given an option string
+ /barcode exch def % We are given a barcode string
+
+ /dontdraw false def
+ /includecheck false def % Enable/disable checkdigit
+ /includetext false def % Enable/disable text
+ /textfont /Courier def
+ /textsize 10 def
+ /textyoffset -7 def
+ /height 1 def
+ /parsefnc false def
+
+ % Parse the input options
+ options type /stringtype eq {
+ 1 dict begin
+ options {
+ token false eq {exit} if dup length string cvs (=) search
+ true eq {cvlit exch pop exch def} {cvlit true def} ifelse
+ } loop
+ currentdict end /options exch def
+ } if
+ options {def} forall
+
+ /textfont textfont cvlit def
+ /textsize textsize cvr def
+ /textyoffset textyoffset cvr def
+ /height height cvr def
+
+ /encs
+ [ (131112) (111213) (111312) (111411) (121113)
+ (121212) (121311) (111114) (131211) (141111)
+ (211113) (211212) (211311) (221112) (221211)
+ (231111) (112113) (112212) (112311) (122112)
+ (132111) (111123) (111222) (111321) (121122)
+ (131121) (212112) (212211) (211122) (211221)
+ (221121) (222111) (112122) (112221) (122121)
+ (123111) (121131) (311112) (311211) (321111)
+ (112131) (113121) (211131) (121221) (312111)
+ (311121) (122211) (111141) (1111411)
+ ] def
+
+ % Create a string of the available characters
+ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
+
+ /barlen barcode length def
+
+ % Special function characters
+ /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
+ /fncvals <<
+ (SFT$) sft1
+ (SFT%) sft2
+ (SFT/) sft3
+ (SFT+) sft4
+ >> def
+
+ % Convert input into bytes accounting for shift characters
+ /msg barlen array def
+ /i 0 def /j 0 def {
+ i barlen eq {exit} if
+ /char barcode i get def
+ parsefnc char 94 eq and i barlen 4 sub lt and {
+ barcode i 1 add get 94 ne {
+ /char fncvals barcode i 1 add 4 getinterval get def
+ /i i 4 add def
+ } {
+ /i i 1 add def
+ } ifelse
+ } if
+ msg j char put
+ /i i 1 add def
+ /j j 1 add def
+ } loop
+ /msg msg 0 j getinterval def
+ /msglen msg length def
+
+ includecheck {
+ /sbs msglen 6 mul 25 add string def
+ } {
+ /sbs msglen 6 mul 13 add string def
+ } ifelse
+ /txt msglen array def
+
+ % Put the start character
+ sbs 0 encs 47 get putinterval
+
+ /checksum1 0 def /checksum2 0 def
+ 0 1 msglen 1 sub {
+ /i exch def
+ % Lookup the encoding for the each barcode character
+ msg i get dup 0 lt {
+ 42 exch sub /indx exch def
+ /char ( ) def
+ } {
+ 1 string dup 0 4 -1 roll put /char exch def
+ barchars char search
+ pop % Discard true leaving pre
+ length /indx exch def % indx is the length of pre
+ pop pop % Discard seek and post
+ } ifelse
+ /enc encs indx get def % Get the indxth encoding
+ sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
+ txt i [char i 9 mul 9 add textyoffset textfont textsize] put
+ /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
+ /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
+ } for
+
+ includecheck {
+ % Put the first checksum character
+ /checksum1 checksum1 47 mod def
+ /checksum2 checksum2 checksum1 add 47 mod def
+ sbs msglen 6 mul 6 add encs checksum1 get putinterval
+ sbs msglen 6 mul 12 add encs checksum2 get putinterval
+ % Put the end character
+ sbs msglen 6 mul 18 add encs 48 get putinterval
+ } {
+ % Put the end character
+ sbs msglen 6 mul 6 add encs 48 get putinterval
+ } ifelse
+
+ % Return the arguments
+ <<
+ /ren //renlinear
+ /sbs [sbs {48 sub} forall]
+ /bhs [sbs length 1 add 2 idiv {height} repeat]
+ /bbs [sbs length 1 add 2 idiv {0} repeat]
+ includetext {
+ /txt txt
+ } if
+ /opt options
+ >>
+
+ dontdraw not //renlinear if
+
+ end
+
+} bind def
+/code93 dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+
+gsave
+50 50 translate
+0 0 moveto <544f20474f2050524556> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
+grestore
+
+showpage
diff --git a/client-barcode/doc/freitagskasse.svg b/client-barcode/doc/freitagskasse.svg
index 66e3302..12e412b 100644
--- a/client-barcode/doc/freitagskasse.svg
+++ b/client-barcode/doc/freitagskasse.svg
@@ -16,7 +16,7 @@
inkscape:version="0.48.2 r9819"
sodipodi:docname="freitagskasse.svg">
HOWTO Freitagskasse v2
+ id="title3609">HOWTO Freitagskasse v3
+ inkscape:window-maximized="1"
+ borderlayer="true" />
@@ -72,7 +73,7 @@
image/svg+xml
- HOWTO Freitagskasse v2
+ HOWTO Freitagskasse v3
Sebastian Pipping <sebastian@pipping.org>
@@ -103,6 +104,11 @@
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-308.2677)">
+
@@ -123,7 +129,7 @@
xml:space="preserve"
id="flowRoot6039"
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- transform="translate(40.001329,318.21825)">HOWTO Freitagskasse
+ transform="translate(-12.91979,-2.0000225)">
@@ -161,7 +167,7 @@
xml:space="preserve"
id="flowRoot6047"
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- transform="translate(-171.79164,178.34453)">(3) Code COMMIT scannen
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- DEPOSIT 0.01
-
-
-
-
- 1 Cent
-
+ id="g6275">
+ transform="matrix(1.25,0,0,-1.25,556.40087,541.52356)">
@@ -754,7 +476,7 @@
5 Cent
+ id="g6215"
+ transform="translate(0,2.8183594e-5)">
+ transform="matrix(1.25,0,0,-1.25,556.40087,702.75931)">
@@ -1037,7 +759,7 @@
10 Cent
+ id="g6155"
+ transform="translate(0,1.6474609e-5)">
+ transform="matrix(1.25,0,0,-1.25,556.40087,863.99507)">
+ id="path4061" />
+ id="path4063" />
+ id="path4065" />
+ id="path4067" />
+ id="path4069" />
+ id="path4071" />
+ id="path4073" />
+ id="path4075" />
+ id="path4077" />
+ id="path4079" />
+ id="path4081" />
+ id="path4083" />
+ id="path4085" />
+ id="path4087" />
+ id="path4089" />
+ id="path4091" />
+ id="path4093" />
+ id="path4095" />
+ id="path4097" />
+ id="path4099" />
+ id="path4101" />
+ id="path4103" />
+ id="path4105" />
+ id="path4107" />
+ id="path4109" />
+ id="path4111" />
+ id="path4113" />
+ id="path4115" />
+ id="path4117" />
+ id="path4119" />
+ id="path4121" />
+ id="path4123" />
+ id="path4125" />
+ id="path4127" />
+ id="path4129" />
+ id="path4131" />
+ id="path4133" />
+ id="path4135" />
+ id="path4137" />
+ d="m 1175,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4139" />
+ id="path4141" />
+ id="path4143" />
+ id="path4145" />
+ id="path4147" />
+ d="m 1335,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4149" />
+ id="path4151" />
+ id="path4153" />
+ id="path4155" />
+ id="path4157" />
+ id="text4161">
DEPOSIT 0.50
+ id="tspan4163">DEPOSIT 1.00
50 Cent
+ id="rect3535-9" />1 Euro
+ id="g6092">
+ transform="matrix(1.25,0,0,-1.25,545.15088,1025.2309)">
+ id="path4401" />
+ id="path4403" />
+ id="path4405" />
+ id="path4407" />
+ id="path4409" />
+ id="path4411" />
+ id="path4413" />
+ id="path4415" />
+ id="path4417" />
+ id="path4419" />
+ id="path4421" />
+ id="path4423" />
+ id="path4425" />
+ id="path4427" />
+ id="path4429" />
+ id="path4431" />
+ id="path4433" />
+ id="path4435" />
+ id="path4437" />
+ id="path4439" />
+ id="path4441" />
+ id="path4443" />
+ id="path4445" />
+ id="path4447" />
+ id="path4449" />
+ id="path4451" />
+ id="path4453" />
+ id="path4455" />
+ id="path4457" />
+ id="path4459" />
+ d="m 905,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4461" />
+ id="path4463" />
+ id="path4465" />
+ d="m 1005,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4467" />
+ id="path4469" />
+ id="path4471" />
+ id="path4473" />
+ id="path4475" />
+ id="path4477" />
+ id="path4479" />
+ id="path4481" />
+ id="path4483" />
+ id="path4485" />
+ id="path4487" />
+ id="path4489" />
+
+ id="path4493" />
+ id="path4495" />
+
+
+ id="path4501" />
+ id="path4503" />
+ id="text4507">
DEPOSIT 1.00
+ id="tspan4509">DEPOSIT 10.00
1 Euro
+ id="rect3535-9-1" />10 Euro
+ id="g8994"
+ transform="translate(-4,0)">
+ transform="matrix(1.25,0,0,-1.25,59.552105,1022.7308)">
+ id="path3265" />
+ id="path3267" />
+ id="path3269" />
+ id="path3271" />
+ id="path3273" />
+ id="path3275" />
+ d="m 185,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3277" />
+ id="path3279" />
+ d="m 240,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3281" />
+ id="path3283" />
+ id="path3285" />
+ id="path3287" />
+ id="path3289" />
+ id="path3291" />
+ id="path3293" />
+ d="m 455,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3295" />
-
-
-
+ id="path3297" />
+ id="path3299" />
+ id="path3301" />
+ id="path3303" />
-
-
-
-
-
+ id="path3305" />
+ id="path3307" />
-
-
-
-
-
-
-
+ id="path3309" />
+ id="path3311" />
+ id="path3313" />
-
-
+ id="path3315" />
-
+ id="path3317" />
+ id="path3319" />
+ id="path3321" />
+ id="path3323" />
+ id="path3325" />
+ transform="matrix(1,0,0,-1,9,1)"
+ id="text3329">
DEPOSIT 5.00
+ id="tspan3331">COMMIT
5 Euro
+ id="rect3535-9-1-4" />COMMIT
+ id="g8958"
+ transform="translate(-4,0)">
+ transform="matrix(1.25,0,0,-1.25,319.6015,1022.7308)">
+ id="path3167" />
+ id="path3169" />
+ id="path3171" />
-
+ id="path3173" />
+ id="path3175" />
-
+ id="path3177" />
+ id="path3179" />
+ id="path3181" />
+ d="m 250,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3183" />
+ id="path3185" />
+ id="path3187" />
-
+ id="path3189" />
+ d="m 365,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3191" />
+ id="path3193" />
+ id="path3195" />
-
+ id="path3197" />
+ id="path3199" />
+ d="m 505,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3201" />
+ id="path3203" />
+ d="m 575,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3205" />
+ d="m 595,80 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3207" />
+ id="path3209" />
+ id="path3211" />
+
+ id="path3215" />
+
+
+ UNDO
+
+
+
+
+ UNDO
+
+
+
+
+
+
+
+ 1 1 2 3 4 2 3
+ ... für nichts
+
+ id="path4067-7" />
+ id="path4069-4" />
+
+
+ id="path4075-2" />
+
+ id="path4079-0" />
+ id="path4081-3" />
+
+ id="path4085-0" />
+ id="path4087-0" />
+ id="path4089-3" />
+ id="path4091-4" />
+ d="m 390,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4093-9" />
+ id="path4095-2" />
+ id="path4097-7" />
+ id="path4099-4" />
+
+
+ id="path4105-2" />
+ id="path4107-4" />
+ id="path4109-4" />
+ id="path4111-3" />
+ id="path4113-8" />
+ id="path4115-6" />
+ id="path4117-0" />
+
+ id="path4121-9" />
+ id="path4123-2" />
+ d="m 880,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4125-2" />
-
-
- DEPOSIT 10.00
-
-
-
-
- 10 Euro
-
-
-
+ d="m 910,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4127-3" />
+ id="path4129-1" />
+ id="path4131-8" />
+ d="m 995,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4133-3" />
+ d="m 1015,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4135-4" />
+ d="m 1060,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4137-2" />
+ id="path4139-2" />
+ id="path4141-4" />
+ id="path4143-5" />
+ id="path4145-1" />
+ id="path4147-7" />
+ d="m 1230,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:38.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4149-5" />
+ d="m 1265,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4151-7" />
+
+
+ TO GO NONE
+
+
+
+
+
+
+ ... allein
+
+ id="path4219" />
+ id="path4221" />
+ d="m 60,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:38.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4223" />
+ id="path4225" />
+ id="path4227" />
+ id="path4229" />
+ id="path4231-9" />
+
+ id="path4235-1" />
+
+ id="path4239-8" />
+ d="m 345,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4241-9" />
+ id="path4243-6" />
+ id="path4245-7" />
+ d="m 415,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4247-7" />
+ id="path4249-3" />
+ id="path4251-7" />
+ d="m 510,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4253-1" />
+ d="m 555,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4255-2" />
+ id="path4257-2" />
+ id="path4259-1" />
+ id="path4261-5" />
+ id="path4263-0" />
+ d="m 690,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4265-9" />
+ id="path4267-0" />
+ id="path4269-4" />
+ d="m 790,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4271-0" />
+ id="path4273-1" />
+ id="path4275-3" />
+ d="m 860,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4277-7" />
+ id="path4279-4" />
+ d="m 940,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4281-1" />
+ id="path4283-1" />
+ id="path4285-3" />
+ id="path4287-0" />
+ d="m 1055,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4289-3" />
+ id="path4291-2" />
+ id="path4293-1" />
+
+ id="path4297-5" />
+ id="path4299-6" />
+ id="path4301-5" />
+ id="path4303-4" />
+ id="text4307">
DEPOSIT 50.00
+ id="tspan4309">TO GO ONLY
+
+
50 Euro
-
- ... für davor
+ transform="matrix(1.25,0,0,-1.25,860.81975,1025.2309)">
+ id="path4371" />
+ id="path4373" />
+ id="path4375" />
+ id="path4377" />
+ id="path4379" />
+ d="m 160,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path4381" />
+ id="path4383" />
+ id="path4385" />
+ id="path4387" />
+
+ id="path4391" />
+ id="path4393" />
+
+ id="path4397" />
+ id="path4399" />
+ id="path4401-0" />
+
+ id="path4405-1" />
+
+ id="path4409-6" />
+
+
+
+ id="path4417-3" />
+
+
+ id="path4423-6" />
+ id="path4425-0" />
+ id="path4427-2" />
+
+ id="path4431-8" />
+
+ id="path4435-5" />
+ id="path4437-0" />
+ id="path4439-6" />
+ id="path4441-0" />
+
+ id="path4445-3" />
+ id="path4447-7" />
+ id="path4449-8" />
+ id="path4451-2" />
+ id="path4453-1" />
+ id="path4455-0" />
+ transform="matrix(1,0,0,-1,9,3)"
+ id="text4459">
COMMIT
+ id="tspan4461">TO GO PREV
- COMMIT
+
+
+ id="g5879">
+ transform="matrix(1.25,0,0,-1.25,872.06975,541.52356)">
+
+
+
+
+ id="path3932" />
+
+ id="path3936" />
+ d="m 215,100 0,720"
+ style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ id="path3938" />
+ id="path3940" />
+
+ id="path3944" />
+
+
+ id="path3950" />
+ id="path3952" />
+ id="path3954" />
+
+ id="path3958" />
+
+
+
+ id="path3966" />
+ id="path3968" />
+ id="path3970" />
+ id="path3972" />
+ id="path3974" />
+ id="path3976" />
+ id="path3978" />
+ id="path3980" />
+
+ id="path3984" />
+ id="path3986" />
+ id="path3988" />
+ id="path3990" />
+ id="path3992" />
+
+ id="path3996" />
+
+ id="path4000" />
+ id="path4002" />
+ transform="matrix(1,0,0,-1,9,3)"
+ id="text4006">
UNDO
+ id="tspan4008">TO GO ALL
UNDO
-
-
-
-
-
-
-
+ height="47.142883"
+ width="279.99997"
+ id="rect3535-6-0" />... für alles
1 1 2 3 4 2 3
+ id="flowRoot6039-5"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ transform="translate(787.40737,319.07285)">Pfand
diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py
index 15f033f..7d61d4b 100644
--- a/client-barcode/freitagskasse.py
+++ b/client-barcode/freitagskasse.py
@@ -6,7 +6,7 @@
from __future__ import print_function
import freitagslib.network as net
-from freitagslib.commands import BuyCommand, DepositCommand, ToGoCommand
+from freitagslib.commands import BuyCommand, DepositCommand
import colorama
from colorama import Fore, Style
@@ -19,7 +19,7 @@ import time
import urllib2
-COLOR_WARN = Fore.YELLOW
+COLOR_HINT = Fore.YELLOW + Style.BRIGHT
COLOR_ERROR = Fore.RED
COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT
COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT
@@ -40,8 +40,13 @@ def print_display(s):
#display_fifo = open('/tmp/display', 'w')
fd = os.open( "/tmp/display", os.O_WRONLY)
display_fifo = os.fdopen(fd,"w")
+ except OSError:
+ display_fifo = None
+ pass
+ return
except IOError:
display_fifo = None
+ pass
return
display_fifo.write(s)
display_fifo.flush()
@@ -90,11 +95,16 @@ def warn_balance():
print_display('\e\x0cKontostand im Minus,bitte Geld aufladen.')
-def error_page(message):
+def error_page(error_message, hint_message=None):
clear()
- print(COLOR_ERROR + message + COLOR_RESET)
+ print(COLOR_ERROR + error_message + COLOR_RESET)
print()
- delay('Weiter', 3)
+ delay_seconds = 3
+ if hint_message is not None:
+ print(COLOR_HINT + hint_message + COLOR_RESET)
+ print()
+ delay_seconds += 3
+ delay('Weiter', delay_seconds)
class Status:
@@ -115,22 +125,14 @@ class Status:
def color(amount):
return COLOR_WITHDRAW if amount < 0 else COLOR_DEPOSIT
- def color_command(command):
- diff = command.difference()
- if diff >= 0:
- return COLOR_DEPOSIT
- return COLOR_TO_GO if isinstance(command, ToGoCommand) else COLOR_WITHDRAW
-
def show_total(balance, plus=' '):
print('%3s %-40s %s%c %6.2f Euro%s' \
% ('', '', color(balance), sign(balance, plus),
abs(balance), COLOR_RESET))
- def show_item(position, command):
- diff = command.difference()
- label = command.label()
+ def show_item(position, diff, label, color):
print('%2d) %-40s %s%c %6.2f Euro%s' \
- % (position, label, color_command(command), sign(diff),
+ % (position, label, color, sign(diff),
abs(diff), COLOR_RESET))
def show_bar():
@@ -145,8 +147,18 @@ class Status:
print('Geplante Änderungen:')
show_total(initial_balance)
- for i, (command, balance_backup) in enumerate(self.transfers):
- show_item(i + 1, command)
+ i = 1
+ for command, dummy in self.transfers:
+ if isinstance(command, BuyCommand):
+ if (command.includes_commodity()):
+ show_item(i, -command.commodity_value(), command.commodity_label(), COLOR_WITHDRAW)
+ i += 1
+ if (command.includes_deposit()):
+ show_item(i, -command.deposit_value(), command.deposit_label(), COLOR_TO_GO)
+ i += 1
+ else:
+ show_item(i, command.difference(), command.label(), COLOR_DEPOSIT)
+ i += 1
show_bar()
if len(self.transfers) > 1:
show_total(self.balance - initial_balance, plus='+')
@@ -236,109 +248,78 @@ class Status:
if scope == TO_GO_ALL:
"""
- Adds a ToGoCommands for each BuyCommands with deposit > 0 lacking a pair
+ Makes all BuyCommands with deposit > 0 include deposit
+ ...and updates future balance accordingly.
"""
- after = list()
dummy, initial_balance = self.transfers[0]
balance_before = initial_balance
- def body(prev, command, balance_before):
- if isinstance(prev, BuyCommand) \
- and prev.deposit() > 0 \
- and (not isinstance(command, ToGoCommand) \
- or (isinstance(command, ToGoCommand) \
- and prev.item() != command.item())):
- to_go = ToGoCommand(prev.item())
- prev.set_to_go(True)
- after.append((to_go, balance_before))
- balance_before += to_go.difference()
- if command is not None:
- after.append((command, balance_before))
- balance_before += command.difference()
- return balance_before
-
- prev = None
- for command, dummy in list(self.transfers):
- balance_before = body(prev, command, balance_before)
- prev = command
- balance_before = body(prev, None, balance_before)
+ for command, dummy in self.transfers:
+ if isinstance(command, BuyCommand) \
+ and not command.includes_deposit() \
+ and command.deposit_value() > 0:
+ command.include_deposit(True)
+ balance_before += command.difference()
self.balance = balance_before
- self.transfers = after
elif scope == TO_GO_NONE:
"""
- Deletes all ToGoCommands
+ Makes all BuyCommands that include commodity
+ not include deposit any more
+ ...and updates future balance accordingly.
"""
- after = list()
first_command, initial_balance = self.transfers[0]
balance_before = initial_balance
- for command, dummy in list(self.transfers):
+ for command, dummy in self.transfers:
if isinstance(command, BuyCommand) \
- and command.is_to_go():
- command.set_to_go(False)
- elif isinstance(command, ToGoCommand):
- continue
- after.append((command, balance_before))
+ and command.includes_commodity():
+ command.include_deposit(False)
balance_before += command.difference()
self.balance = balance_before
- self.transfers = after
elif scope == TO_GO_PREV:
"""
- Adds a ToGoCommand after previous BuyCommand
+ Makes the last BuyCommand include deposit
+ ...and updates future balance accordingly.
"""
prev, balance_backup = self.transfers[-1]
if not isinstance(prev, BuyCommand):
error_page(_PRODUCT_FIRST)
return
- to_go = ToGoCommand(prev.item())
- prev.set_to_go(True)
- self.transfers.append((to_go, self.balance))
- self.balance += to_go.difference()
+ if prev.includes_deposit():
+ error_page('FEHLER: Pfand für Produkt "%s" bereits aktiviert' % prev.item_name())
+ return
+ if prev.deposit_value() <= 0:
+ error_page('FEHLER: Produkt "%s" hat kein Pfand' % prev.item_name())
+ return
+ before = prev.difference()
+ prev.include_deposit(True)
+ after = prev.difference()
+ self.balance += (after - before)
elif scope == TO_GO_ONLY:
"""
- Replace all BuyCommands with deposit > 0 by
- a ToGoCommand. Resolve ToGoCommand duplicates.
+ Makes all BuyCommand that include commodity
+ be deposit only
+ ...and updates future balance accordingly.
"""
- after = list()
- first_command, initial_balance = self.transfers[0]
+ dummy, initial_balance = self.transfers[0]
balance_before = initial_balance
- for command, dummy in list(self.transfers):
- if isinstance(command, ToGoCommand) \
- and prev_item is not None \
- and command.item() == prev_item:
- """
- Skip this very duplicate
- """
- prev_item = None
- continue
- elif isinstance(command, BuyCommand) \
- and command.deposit() > 0:
- """
- Replace by ToGoCommand
- """
- item = command.item()
- command = ToGoCommand(item)
- prev_item = item
- else:
- prev_item = None
- after.append((command, balance_before))
+ for command, dummy in self.transfers:
+ if isinstance(command, BuyCommand) \
+ and command.deposit_value() > 0 \
+ and command.includes_commodity():
+ command.include_commodity(False)
+ command.include_deposit(True)
balance_before += command.difference()
self.balance = balance_before
- self.transfers = after
def undo(self):
assert(self.logged_in())
if self.transfers:
- (last_command, balance_backup) = self.transfers[-1]
- if isinstance(last_command, ToGoCommand) \
- and self.transfers:
- second_last_command = self.transfers[-2]
- if isinstance(second_last_command, BuyCommand):
- second_last_command.set_to_go(False)
+ dummy, balance_backup = self.transfers[-1]
self.transfers.pop()
self.balance = balance_backup
else:
@@ -378,7 +359,10 @@ def handle(line, status):
except urllib2.HTTPError as e:
if e.code == 404: # URL not found == user unknown
print_display('\e\x0cFEHLER: Nutzer ist unbekannt: "%7s"' % line[:7])
- error_page('FEHLER: Benutzer "%s" nicht bekannt' % line)
+ error_page('FEHLER: Benutzer "%s" nicht bekannt' % line,
+ hint_message='Ist in der WebApp unter "Einstellungen" ' \
+ 'für Ihren Account Plugin "BarcodePlugin" ' \
+ 'als erlaubt markiert?')
else:
print_display('\e\x0cFEHLER: Server Error%20s' % str(e)[:20])
error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))
diff --git a/client-barcode/freitagslib/commands.py b/client-barcode/freitagslib/commands.py
index 48f0934..333ead8 100644
--- a/client-barcode/freitagslib/commands.py
+++ b/client-barcode/freitagslib/commands.py
@@ -5,18 +5,16 @@
# Licensed under GPL v3 or later
import freitagslib.network as net
-from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY
+from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT
-class Command(object):
- def difference(self):
- return self._difference
-
-
-class DepositCommand(Command):
+class DepositCommand(object):
def __init__(self, amount):
self._difference = amount
+ def difference(self):
+ self._difference
+
def run(self, user_name):
net.deposit(self._difference, net.DEPOSIT_CASH, user_name)
@@ -24,43 +22,61 @@ class DepositCommand(Command):
return '%.2f Euro einzahlen' % self._difference
-class _ItemBasedCommand(Command):
+class BuyCommand(object):
def __init__(self, item):
self._item = item
+ self._commodity = True
+ self._deposit = False
+
+ def _what_to_buy(self):
+ if self._deposit and self._commodity:
+ return ITEM_AND_DEPOSIT
+ elif self._deposit:
+ return DEPOSIT_ONLY
+ elif self._commodity:
+ return ITEM_ONLY
+ else:
+ raise ValueError("BuyCommand in illegal state")
- def item(self):
- return self._item
-
-
-class BuyCommand(_ItemBasedCommand):
- def __init__(self, item):
- super(BuyCommand, self).__init__(item)
- self._difference = -item.price
- self._to_go = False ## TODO session state, instead?
+ def difference(self):
+ if self._deposit and self._commodity:
+ return -(self._item.price + self._item.deposit)
+ elif self._deposit:
+ return -(self._item.deposit)
+ elif self._commodity:
+ return -(self._item.price)
+ else:
+ raise ValueError("BuyCommand in illegal state")
def run(self, user_name):
- net.buy_item(self._item.id, what_about_it=ITEM_ONLY, user_name=user_name)
+ net.buy_item(self._item.id, what_about_it=self._what_to_buy(), user_name=user_name)
- def label(self):
+ def item_name(self):
return self._item.name
- def is_to_go(self):
- return self._to_go
+ def commodity_label(self):
+ if self._deposit:
+ return self._item.name
+ else:
+ return "%s (exkl. Pfand)" % self._item.name
- def set_to_go(self, to_go):
- self._to_go = to_go
+ def deposit_label(self):
+ return '%s Pfand' % self._item.name
- def deposit(self):
- return self._item.deposit
+ def includes_commodity(self):
+ return self._commodity
+ def includes_deposit(self):
+ return self._deposit
-class ToGoCommand(_ItemBasedCommand):
- def __init__(self, item):
- super(ToGoCommand, self).__init__(item)
- self._difference = -item.deposit
+ def include_commodity(self, commodity):
+ self._commodity = commodity
- def run(self, user_name):
- net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name)
+ def include_deposit(self, deposit):
+ self._deposit = deposit
- def label(self):
- return '%s Pfand' % self._item.name
+ def commodity_value(self):
+ return self._item.price
+
+ def deposit_value(self):
+ return self._item.deposit
diff --git a/k4ever/buyable/templates/buyables/history.html b/k4ever/buyable/templates/buyables/history.html
index 7194808..d777fd6 100644
--- a/k4ever/buyable/templates/buyables/history.html
+++ b/k4ever/buyable/templates/buyables/history.html
@@ -26,34 +26,41 @@
-
+
Buchung |
- Einkauf |
+ Einkauf |
Buchung |
- Einkauf |
+ Einkauf |
{% for order in history.object_list %}
-
+ |
{{ order.dateTime|date:"Y-m-d H:i" }}
|
-
-
- {% for item in order.purchase_set.all %}
- -
- {{ item.buyable.name }}{% if item.isDeposit %} Pfand{% endif %}
- zu {{ item.price|floatformat:2 }} €
-
- {% endfor %}
-
+ |
+
+
+ {% for item in order.purchase_set.all %}
+
+ {% if not item.isDeposit %}
+
+ {% else %}
+ {{ item.buyable.name }} Pfand
+ {% endif %}
+
+ zu {{ item.price|floatformat:2 }} €
+ |
+ {% endfor %}
+
+
|
{% endfor %}
diff --git a/k4ever/main/templates/main/startpage.html b/k4ever/main/templates/main/startpage.html
index e327d96..38c0e11 100644
--- a/k4ever/main/templates/main/startpage.html
+++ b/k4ever/main/templates/main/startpage.html
@@ -1,36 +1,238 @@
{% extends "base.html" %}
{% block "content" %}
- {% if allMost %}
- Am beliebtesten ist:
- {% for buyable in allMost %}
- {{ buyable.buyable__name }} ( {{ buyable.num_buys }} mal)
- {% endfor %}
-
+
+ {% if allMostDrinks or allMostSnacks %}
+
+
+
+
+ |
+
+ Die beliebtesten Artikel
+ |
+
+ Deine Lieblingsartikel
+ |
+
+ Zuletzt hattest du:
+ |
+
+
+
+ Getränke
+ |
+
+ {% if allMostDrinks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+ {% if usersMostDrinks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+ {% if usersLastDrinks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+
+
+ Snacks
+ |
+
+ {% if allMostSnacks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+ {% if usersMostSnacks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+ {% if usersLastSnacks %}
+
+ {% else %}
+ Noch keine gekauft.
+ {% endif %}
+ |
+
+
{% else %}
{{ error }}
- Noch niemand hat was gekauft?
+ Es hat scheinbar noch niemand etwas gekauft.
Sei der Erste!
{% endif %}
-
- {% if usersMost %}
- Am oeftesten hattest du:
- {% for buyable in usersMost %}
-
{{ buyable.buyable__name }} ( {{ buyable.num_buys }} mal)
- {% endfor %}
-
+
+
+ {% comment %}
+
+ {% if usersMostSnacks or usersMostDrinks %}
+
Deine Lieblingsartikel
+
+
+
+ Getränke
+ |
+
+ Snacks
+ |
+
+
+
+
{% else %}
{{ error }}
- Nix gekauft?
+ Wie es aussieht, hast du noch nichts gekauft.
Das kannst du ändern!
{% endif %}
-
- {% if usersLast %}
- Als letztes hattest du:
- {% for buyable in usersLast %}
-
{{ buyable.buyable__name }}
- {% endfor %}
-
+
+
+ {% if usersLastSnacks or usersLastDrinks %}
+
Du hattest als letztes:
+
+
+
+ Getränke
+ |
+
+ Snacks
+ |
+
+
+
+
{% else %}
{{ error }}
- Noch nix gekauft?
{% endif %}
+
+ {% endcomment %}
{% endblock %}
diff --git a/k4ever/main/views.py b/k4ever/main/views.py
index e539c7e..d7167af 100644
--- a/k4ever/main/views.py
+++ b/k4ever/main/views.py
@@ -1,3 +1,4 @@
+# -*- coding: utf8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
@@ -5,18 +6,46 @@ from django.db.models import Count
from django.http import HttpResponseRedirect
from main.models import Plugin, PluginPermission
-
-from buyable.models import Purchase, Buyable
+from buyable.models import Purchase, Buyable, BuyableType
@login_required
def startpage(request):
''' Diese Funktion wird wahrscheinlich viel Last erzeugen, da
sie ueber mehrere Tabellen joined,filtered und wieder reduced.
'''
- allMost = Purchase.objects.filter(isDeposit=False).values('buyable__name', 'buyable__id').annotate(num_buys=Count('buyable')).order_by('-num_buys')
- usersMost = Purchase.objects.filter(isDeposit=False).values('buyable__name','buyable__id').filter(order__user=request.user.id).annotate(num_buys=Count('buyable')).order_by('-num_buys')
- usersLast = Purchase.objects.filter(isDeposit=False).values('buyable__name','buyable__id').filter(order__user=request.user.id).order_by('-order__dateTime')
- return render_to_response("main/startpage.html", {'allMost' : allMost,'usersMost': usersMost, 'usersLast' : usersLast[:12]}, RequestContext(request))
+ drinks = BuyableType.objects.get(name="Getränk").buyable_set.all()
+ snacks = BuyableType.objects.get(name="Snack").buyable_set.all()
+
+ allMost = Purchase.objects.filter(isDeposit=False).values('buyable__name', 'buyable__id','buyable__image','buyable__price','buyable__deposit')
+
+ allMostDrinks = allMost.filter(buyable__in=drinks).annotate(num_buys=Count('buyable')).order_by('-num_buys')
+ allMostSnacks = allMost.filter(buyable__in=snacks).annotate(num_buys=Count('buyable')).order_by('-num_buys')
+
+ usersMostDrinks = allMost.filter(buyable__in=drinks).filter(order__user=request.user.id).annotate(num_buys=Count('buyable')).order_by('-num_buys')
+ usersMostSnacks = allMost.filter(buyable__in=snacks).filter(order__user=request.user.id).annotate(num_buys=Count('buyable')).order_by('-num_buys')
+
+# usersLastDrinks = allMost.filter(buyable__in=drinks).filter(order__user=request.user.id).annotate(num_buys=Count('buyable')).order_by('-order__dateTime')
+# usersLastSnacks = allMost.filter(buyable__in=snacks).filter(order__user=request.user.id).annotate(num_buys=Count('buyable')).order_by('-order__dateTime')
+
+ usersLastDrinks = allMost.filter(buyable__in=drinks).filter(order__user=request.user.id).order_by('-order__dateTime')
+ usersLastSnacks = allMost.filter(buyable__in=snacks).filter(order__user=request.user.id).order_by('-order__dateTime')
+
+ #if someone knows a better way to do this, just replace this code
+ #purpose: filter usersLast so that it only contains unique items
+ usersLastDrinks_unique = []
+ for x in usersLastDrinks:
+ if not x in usersLastDrinks_unique:
+ usersLastDrinks_unique.append(x)
+ #usersLastDrinks = map(lambda x:{ "buyable__name" : x }, usersLastDrinks_unique)
+ usersLastDrinks = usersLastDrinks_unique
+
+ usersLastSnacks_unique = []
+ for x in usersLastSnacks:
+ if not x in usersLastSnacks_unique:
+ usersLastSnacks_unique.append(x)
+ usersLastSnacks = usersLastSnacks_unique
+
+ return render_to_response("main/startpage.html", {'allMostDrinks' : allMostDrinks[:5], 'allMostSnacks' : allMostSnacks[:5], 'usersMostDrinks': usersMostDrinks[:5], 'usersMostSnacks': usersMostSnacks[:5], 'usersLastDrinks' : usersLastDrinks[:10], 'usersLastSnacks' : usersLastSnacks[:10]}, RequestContext(request))
def register(request):
""" The "no registration available" page... """
diff --git a/k4ever/transaction/templates/transaction/overview.html b/k4ever/transaction/templates/transaction/overview.html
index 8102c2c..4ff0c7b 100644
--- a/k4ever/transaction/templates/transaction/overview.html
+++ b/k4ever/transaction/templates/transaction/overview.html
@@ -26,20 +26,55 @@
Vergangene Transaktionen:
- {% for transaction in history %}
- {% if forloop.first and transacted %}
-
- {% endif %}
- [ {{ transaction.dateTime }} ] {{ transaction.amount|floatformat:2 }} € durch {{ transaction.transactionType }}
- {% if not transaction.transactionType.needsCheck or transaction.checked %}
- eingegangen
- {% else %}
- aber noch nicht bestätigt
- {% endif %}
- {% if forloop.first and transacted %}
-
- {% endif %}
-
- {% endfor %}
+
+ {% comment %}
+
+
+ Datum
+ |
+
+ Uhrzeit
+ |
+
+ Betrag
+ |
+
+ Typ
+ |
+
+ Status
+ |
+
+ {% endcomment %}
+
+ {% for transaction in history %}
+
+
+ {% if forloop.first and transacted %}
+
+ {% endif %}
+ [ {{ transaction.dateTime|date:"j. M Y" }},
+ |
+
+ {{ transaction.dateTime|date:"H:i" }} Uhr ]
+ |
+ {{ transaction.amount|floatformat:2 }}€
+ |
+
+ durch {{ transaction.transactionType }}
+ |
+
+ {% if not transaction.transactionType.needsCheck or transaction.checked %}
+ eingegangen
+ {% else %}
+ aber noch nicht bestätigt
+ {% endif %}
+ |
+ {% if forloop.first and transacted %}
+
+ {% endif %}
+
+ {% endfor %}
+
{% endblock %}