| 1 | #!/usr/bin/perl -w |
| 2 | |
| 3 | sub gettok { |
| 4 | if(/\G\"([^\"]*)\"\s+/gc) { |
| 5 | return $1; |
| 6 | } elsif(/\G(\S+)\s+/gc) { |
| 7 | return $1; |
| 8 | } else { |
| 9 | return undef; |
| 10 | } |
| 11 | } |
| 12 | |
| 13 | while(@ARGV) { |
| 14 | if(!open IF, $ARGV[0]) { |
| 15 | last; |
| 16 | } |
| 17 | shift @ARGV; |
| 18 | while(<IF>) { |
| 19 | if(/^prod\s+/g) { |
| 20 | $cp = {}; |
| 21 | $id = gettok; |
| 22 | $cp->{"s"} = gettok; |
| 23 | $cp->{"p"} = gettok; |
| 24 | $cp->{"w"} = gettok; |
| 25 | $prod{$id} = $cp; |
| 26 | } |
| 27 | if(/^prt\s+/g) { |
| 28 | $id = gettok; |
| 29 | $prts{$id} = {"name" => gettok, "items" => {}}; |
| 30 | } |
| 31 | if(/^item\s+/g) { |
| 32 | $prt = gettok; |
| 33 | if(!exists $prts{$prt}) { |
| 34 | die "invalid participant $prt in item line"; |
| 35 | } |
| 36 | $a = 1; |
| 37 | while($t = gettok) { |
| 38 | if($t =~ /^\d+(\.\d+)?$/) { |
| 39 | $a = $t; |
| 40 | next; |
| 41 | } |
| 42 | $i = $prts{$prt}->{"items"}; |
| 43 | if(exists $i->{$t}) { |
| 44 | $i->{$t} += $a; |
| 45 | } else { |
| 46 | $i->{$t} = $a; |
| 47 | } |
| 48 | $a = 1; |
| 49 | } |
| 50 | } |
| 51 | if(/^freight\s+(\d+)/) { |
| 52 | $fc = $1; |
| 53 | } |
| 54 | if(/^realprice\s+(\d+)/) { |
| 55 | $rp = $1; |
| 56 | } |
| 57 | } |
| 58 | close IF; |
| 59 | } |
| 60 | |
| 61 | $yt = $wt = 0; |
| 62 | for $p (sort keys %prts) { |
| 63 | $I = $prts{$p}->{"items"}; |
| 64 | $sp = $sw = 0; |
| 65 | for $i (keys %$I) { |
| 66 | $yt += $I->{$i} * $prod{$i}->{"p"}; |
| 67 | $wt += $I->{$i} * $prod{$i}->{"w"}; |
| 68 | $sp += $I->{$i} * $prod{$i}->{"p"}; |
| 69 | $sw += $I->{$i} * $prod{$i}->{"w"}; |
| 70 | } |
| 71 | $prts{$p}->{"sp"} = $sp; |
| 72 | $prts{$p}->{"sw"} = $sw; |
| 73 | } |
| 74 | $er = (($yt + $fc) / $rp); |
| 75 | |
| 76 | while($cmd = shift @ARGV) { |
| 77 | if($cmd eq "stat") { |
| 78 | print "Total: $yt ($rp SEK), $wt g\n"; |
| 79 | print "Freight: $fc\n"; |
| 80 | print ("Ratio: " . $er . "\n"); |
| 81 | } elsif($cmd eq "judgement") { |
| 82 | for $prt (keys %prts) { |
| 83 | print "$prts{$prt}->{name}:\n"; |
| 84 | $sp = $prts{$prt}->{"sp"}; |
| 85 | $sw = $prts{$prt}->{"sw"}; |
| 86 | printf "\tProducts ¥%i (%i SEK), %i g\n", $sp, ($sp / $er), $sw; |
| 87 | $ff = $sw / $wt; |
| 88 | $sfc = $fc * $ff; |
| 89 | printf "\tFreight ¥%i (%.1f%%, %i SEK)\n", $sfc, (100 * $ff), ($sfc / $er); |
| 90 | $st = $sfc + $sp; |
| 91 | printf "\tTotal: ¥%i (%i SEK)\n", $st, ($st / $er); |
| 92 | } |
| 93 | } elsif($cmd eq "rcpt-txt") { |
| 94 | $prt = shift @ARGV; |
| 95 | $I = $prts{$prt}->{"items"}; |
| 96 | for $i (keys %$I) { |
| 97 | printf "%.1f %s\t\t%i (%i SEK)\t%i g\n", $I->{$i}, $prod{$i}->{"s"}, $I->{$i} * $prod{$i}->{"p"}, $I->{$i} * $prod{$i}->{"p"} / $er, $I->{$i} * $prod{$i}->{"w"}; |
| 98 | } |
| 99 | } elsif($cmd eq "rcpt-tex") { |
| 100 | print <<EOF |
| 101 | \\documentclass[a4paper,11pt]{article} |
| 102 | \\usepackage[swedish]{babel} |
| 103 | \\usepackage[T1]{fontenc} |
| 104 | \\usepackage[utf8x]{inputenc} |
| 105 | \\usepackage{longtable} |
| 106 | \\title{Kvitto} |
| 107 | \\begin{document} |
| 108 | \\begin{longtable}{lllllll} |
| 109 | Artikel & Antal & \\\'{A}-pris & Pris & Pris (SEK) & Vikt \\\\ |
| 110 | \\hline |
| 111 | EOF |
| 112 | ; |
| 113 | $prt = shift @ARGV; |
| 114 | $I = $prts{$prt}->{"items"}; |
| 115 | $ni = 0; |
| 116 | for $i (keys %$I) { |
| 117 | printf "%s & ", $prod{$i}->{"s"}; |
| 118 | printf "%.1f & ", $I->{$i}; |
| 119 | printf "%i & ", $prod{$i}->{"p"}; |
| 120 | printf "%i & ", $prod{$i}->{"p"} * $I->{$i}; |
| 121 | printf "%.2f & ", $prod{$i}->{"p"} * $I->{$i} / $er; |
| 122 | printf "%i & ", $prod{$i}->{"w"} * $I->{$i}; |
| 123 | #printf "%.1f %s\t\t%i (%i SEK)\t%i g", $I->{$i}, $prod{$i}->{"s"}, $I->{$i} * $prod{$i}->{"p"}, $I->{$i} * $prod{$i}->{"p"} / $er, $I->{$i} * $prod{$i}->{"w"}; |
| 124 | print "\\\\\n"; |
| 125 | $ni += $I->{$i}; |
| 126 | } |
| 127 | print "\\hline\nDelsumma & "; |
| 128 | printf "%i & & ", $ni; |
| 129 | printf "%i & ", $prts{$prt}->{"sp"}; |
| 130 | printf "%.2f & ", $prts{$prt}->{"sp"} / $er; |
| 131 | printf "%i & ", $prts{$prt}->{"sw"}; |
| 132 | print "\\\\\n"; |
| 133 | $ff = $prts{$prt}->{"sw"} / $wt; |
| 134 | printf "Frakt & %.1f\\%% & ", 100 * $ff; |
| 135 | printf "%i & ", $fc; |
| 136 | printf "%i & ", $fc * $ff; |
| 137 | printf "%.2f", $fc * $ff / $er; |
| 138 | print "\\\\\n"; |
| 139 | print "\\hline\nTotalt & & & "; |
| 140 | printf "%i & ", $fc * $ff + $prts{$prt}->{"sp"}; |
| 141 | printf "\\textbf{%.2f} & ", ($fc * $ff + $prts{$prt}->{"sp"}) / $er; |
| 142 | print "\n"; |
| 143 | print "\\end{longtable}\n"; |
| 144 | print "\n"; |
| 145 | print "\\end{document}\n"; |
| 146 | } else { |
| 147 | print STDERR "usage: ordershare DESCFILE... COMMAND...\n"; |
| 148 | print STDERR "\tcommands:\n"; |
| 149 | print STDERR "\tstat General statistics\n"; |
| 150 | print STDERR "\tjudgement Overview for each participant\n"; |
| 151 | print STDERR "\trcpt-txt PARTICIPANT Receipt in text format\n"; |
| 152 | print STDERR "\trcpt-tex PARTICIPANT Receipt in LaTeX format\n"; |
| 153 | } |
| 154 | } |