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 @@ - +
- + - + {% for order in history.object_list %} - - {% 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 %} +
BuchungEinkaufEinkauf
BuchungEinkaufEinkauf
+ {{ 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 %} + + {% endfor %} + +
+ {% if not item.isDeposit %} + + {% else %} + {{ item.buyable.name }} Pfand + {% endif %} +
+ zu {{ item.price|floatformat:2 }} € +
+ + + + + + + + + + + + + + + + + + +
+   + +

Die beliebtesten Artikel

+
+

Deine Lieblingsartikel

+
+

Zuletzt hattest du:

+
+

Getränke

+
+ {% if allMostDrinks %} + + {% for buyable in allMostDrinks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }}
({{ buyable.num_buys }} mal) +
+ Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} + +
+ {% else %} + Noch keine gekauft. + {% endif %} +
+ {% if usersMostDrinks %} + + {% for buyable in usersMostDrinks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }}
({{ buyable.num_buys }} mal) +
+ Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} + +
+ {% else %} + Noch keine gekauft. + {% endif %} +
+ {% if usersLastDrinks %} + + {% for buyable in usersLastDrinks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }} + + Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} + +
+ {% else %} + Noch keine gekauft. + {% endif %} +
+

Snacks

+
+ {% if allMostSnacks %} + + {% for buyable in allMostSnacks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }}
({{ buyable.num_buys }} mal) +
+ Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} +
+ {% else %} + Noch keine gekauft. + {% endif %} +
+ {% if usersMostSnacks %} + + {% for buyable in usersMostSnacks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }}
({{ buyable.num_buys }} mal) +
+ Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} +
+ {% else %} + Noch keine gekauft. + {% endif %} +
+ {% if usersLastSnacks %} + + {% for buyable in usersLastSnacks %} + + + + + + {% endfor %} +
+ + + {{ buyable.buyable__name }} + + Kaufen + {% if buyable.buyable__deposit > 0 %} + (Ohne Pfand) Kaufen (Mit Pfand) + {% else %} + + {% endif %} +
+ {% 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 %} + + + + + + + + {% endcomment %} + + {% for transaction in history %} + + + + + + {% if forloop.first and transacted %} + + {% endif %} + + {% endfor %} +
+ Datum + + Uhrzeit + + Betrag + + Typ + + Status +
+ {% 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 %} +
{% endblock %}