Line 0
Link Here
|
|
|
1 |
#!/usr/bin/perl |
2 |
|
3 |
#example script to print a basketgroup |
4 |
#written 07/11/08 by john.soros@biblibre.com and paul.poulain@biblibre.com |
5 |
|
6 |
# Copyright 2008-2009 BibLibre SARL |
7 |
# |
8 |
# This file is part of Koha. |
9 |
# |
10 |
# Koha is free software; you can redistribute it and/or modify it under the |
11 |
# terms of the GNU General Public License as published by the Free Software |
12 |
# Foundation; either version 2 of the License, or (at your option) any later |
13 |
# version. |
14 |
# |
15 |
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY |
16 |
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR |
17 |
# A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
18 |
# |
19 |
# You should have received a copy of the GNU General Public License along |
20 |
# with Koha; if not, write to the Free Software Foundation, Inc., |
21 |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
22 |
|
23 |
#you can use any PDF::API2 module, all you need to do is return the stringifyed pdf object from the printpdf sub. |
24 |
package pdfformat::layout2pagesde; |
25 |
use vars qw($VERSION @ISA @EXPORT); |
26 |
use Number::Format qw(format_price); |
27 |
use MIME::Base64; |
28 |
use strict; |
29 |
use warnings; |
30 |
use utf8; |
31 |
|
32 |
use C4::Branch qw(GetBranchDetail); |
33 |
|
34 |
BEGIN { |
35 |
use Exporter (); |
36 |
our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); |
37 |
# set the version for version checking |
38 |
$VERSION = 1.00; |
39 |
@ISA = qw(Exporter); |
40 |
@EXPORT = qw(printpdf); |
41 |
} |
42 |
|
43 |
|
44 |
#be careful, all the sizes (height, width, etc...) are in mm, not PostScript points (the default measurment of PDF::API2). |
45 |
#The constants exported tranform that into PostScript points (/mm for milimeter, /in for inch, pt is postscript point, and as so is there only to show what is happening. |
46 |
use constant mm => 25.4 / 72; |
47 |
use constant in => 1 / 72; |
48 |
use constant pt => 1; |
49 |
|
50 |
use PDF::API2; |
51 |
#A4 paper specs |
52 |
my ($height, $width) = (297, 210); |
53 |
use PDF::Table; |
54 |
|
55 |
sub printorders { |
56 |
my ($pdf, $basketgroup, $baskets, $orders) = @_; |
57 |
|
58 |
my $cur_format = C4::Context->preference("CurrencyFormat"); |
59 |
my $num; |
60 |
|
61 |
if ( $cur_format eq 'FR' ) { |
62 |
$num = new Number::Format( |
63 |
'decimal_fill' => '2', |
64 |
'decimal_point' => ',', |
65 |
'int_curr_symbol' => '', |
66 |
'mon_thousands_sep' => ' ', |
67 |
'thousands_sep' => ' ', |
68 |
'mon_decimal_point' => ',' |
69 |
); |
70 |
} else { # US by default.. |
71 |
$num = new Number::Format( |
72 |
'int_curr_symbol' => '', |
73 |
'mon_thousands_sep' => ',', |
74 |
'mon_decimal_point' => '.' |
75 |
); |
76 |
} |
77 |
|
78 |
$pdf->mediabox($height/mm, $width/mm); |
79 |
my $page = $pdf->page(); |
80 |
|
81 |
my $pdftable = new PDF::Table(); |
82 |
|
83 |
my $abaskets; |
84 |
my $arrbasket; |
85 |
my @keys = ('Bestellung', 'Titel', 'Anz.', 'Preis inkl. MWSt.', 'Rabatt', 'MWSt.', 'Gesamt, exkl. MWSt.', 'Gesamt inkl. MWSt.'); |
86 |
for my $bkey (@keys) { |
87 |
push(@$arrbasket, $bkey); |
88 |
} |
89 |
push(@$abaskets, $arrbasket); |
90 |
|
91 |
for my $basket (@$baskets){ |
92 |
for my $line (@{$orders->{$basket->{basketno}}}) { |
93 |
$arrbasket = undef; |
94 |
push( @$arrbasket, |
95 |
$basket->{basketno}, |
96 |
$line->{title} . " / " . $line->{author} . ( $line->{isbn} ? " ISBN: " . $line->{isbn} : '' ) . ( $line->{en} ? " EN: " . $line->{en} : '' ) . ", " . $line->{itemtype} . ( $line->{publishercode} ? 'Verlag:'. $line->{publishercode} : ""), |
97 |
$line->{quantity}, |
98 |
$num->format_price($line->{rrpgsti}), |
99 |
$num->format_price($line->{discount}).'%', |
100 |
$num->format_price($line->{gstrate} * 100).'%', |
101 |
$num->format_price($line->{totalgste}), |
102 |
$num->format_price($line->{totalgsti}), |
103 |
); |
104 |
push(@$abaskets, $arrbasket); |
105 |
} |
106 |
} |
107 |
|
108 |
$pdftable->table($pdf, $page, $abaskets, |
109 |
x => 10/mm, |
110 |
w => ($width - 20)/mm, |
111 |
start_y => 285/mm, |
112 |
next_y => 285/mm, |
113 |
start_h => 260/mm, |
114 |
next_h => 260/mm, |
115 |
padding => 5, |
116 |
padding_right => 5, |
117 |
background_color_odd => "lightgray", |
118 |
font => $pdf->corefont("Times", -encoding => "utf8"), |
119 |
font_size => 3/mm, |
120 |
header_props => { |
121 |
font => $pdf->corefont("Times", -encoding => "utf8"), |
122 |
font_size => 10, |
123 |
bg_color => 'gray', |
124 |
repeat => 1, |
125 |
}, |
126 |
column_props => [ |
127 |
{ justify => 'left' }, |
128 |
{ min_w => 90/mm }, |
129 |
{ justify => 'right' }, |
130 |
{ justify => 'right' }, |
131 |
{ justify => 'right' }, |
132 |
{ justify => 'right' }, |
133 |
{ justify => 'right' }, |
134 |
{ justify => 'right' }, |
135 |
], |
136 |
); |
137 |
|
138 |
$pdf->mediabox($width/mm, $height/mm); |
139 |
} |
140 |
|
141 |
sub printhead { |
142 |
my ($pdf, $basketgroup, $bookseller) = @_; |
143 |
|
144 |
# get library name |
145 |
my $libraryname = C4::Context->preference("LibraryName"); |
146 |
# get branch details |
147 |
my $billingdetails = GetBranchDetail( $basketgroup->{billingplace} ); |
148 |
my $deliverydetails = GetBranchDetail( $basketgroup->{deliveryplace} ); |
149 |
my $freedeliveryplace = $basketgroup->{freedeliveryplace}; |
150 |
# get the subject |
151 |
my $subject; |
152 |
|
153 |
# open 1st page (with the header) |
154 |
my $page = $pdf->openpage(1); |
155 |
|
156 |
# create a text |
157 |
my $text = $page->text; |
158 |
|
159 |
# print the libraryname in the header |
160 |
$text->font( $pdf->corefont("Times", -encoding => "utf8"), 6/mm ); |
161 |
$text->translate(30/mm, ($height-28.5)/mm); |
162 |
$text->text($libraryname); |
163 |
|
164 |
# print order info, on the default PDF |
165 |
$text->font( $pdf->corefont("Times", -encoding => "utf8"), 8/mm ); |
166 |
$text->translate(100/mm, ($height-5-48)/mm); |
167 |
$text->text($basketgroup->{'id'}); |
168 |
|
169 |
# print the date |
170 |
my $today = C4::Dates->today(); |
171 |
$text->translate(130/mm, ($height-5-48)/mm); |
172 |
$text->text($today); |
173 |
|
174 |
$text->font( $pdf->corefont("Times", -encoding => "utf8"), 4/mm ); |
175 |
|
176 |
# print billing infos |
177 |
$text->translate(100/mm, ($height-86)/mm); |
178 |
$text->text($libraryname); |
179 |
$text->translate(100/mm, ($height-97)/mm); |
180 |
$text->text($billingdetails->{branchname}); |
181 |
$text->translate(100/mm, ($height-108.5)/mm); |
182 |
$text->text($billingdetails->{branchphone}); |
183 |
$text->translate(100/mm, ($height-115.5)/mm); |
184 |
$text->text($billingdetails->{branchfax}); |
185 |
$text->translate(100/mm, ($height-122.5)/mm); |
186 |
$text->text($billingdetails->{branchaddress1}); |
187 |
$text->translate(100/mm, ($height-127.5)/mm); |
188 |
$text->text($billingdetails->{branchaddress2}); |
189 |
$text->translate(100/mm, ($height-132.5)/mm); |
190 |
$text->text($billingdetails->{branchaddress3}); |
191 |
$text->translate(100/mm, ($height-137.5)/mm); |
192 |
$text->text(join(' ', $billingdetails->{branchzip}, $billingdetails->{branchcity}, $billingdetails->{branchcountry})); |
193 |
$text->translate(100/mm, ($height-147.5)/mm); |
194 |
$text->text($billingdetails->{branchemail}); |
195 |
|
196 |
# print subject |
197 |
$text->translate(100/mm, ($height-145.5)/mm); |
198 |
$text->text($subject); |
199 |
|
200 |
# print bookseller infos |
201 |
$text->translate(100/mm, ($height-180)/mm); |
202 |
$text->text($bookseller->{name}); |
203 |
$text->translate(100/mm, ($height-185)/mm); |
204 |
$text->text($bookseller->{postal}); |
205 |
$text->translate(100/mm, ($height-190)/mm); |
206 |
$text->text($bookseller->{address1}); |
207 |
$text->translate(100/mm, ($height-195)/mm); |
208 |
$text->text($bookseller->{address2}); |
209 |
$text->translate(100/mm, ($height-200)/mm); |
210 |
$text->text($bookseller->{address3}); |
211 |
|
212 |
# print delivery infos |
213 |
$text->font( $pdf->corefont("Times-Bold", -encoding => "utf8"), 4/mm ); |
214 |
$text->translate(50/mm, ($height-237)/mm); |
215 |
if ($freedeliveryplace) { |
216 |
my $start = 242; |
217 |
my @fdp = split('\n', $freedeliveryplace); |
218 |
foreach (@fdp) { |
219 |
$text->text($_); |
220 |
$text->translate( 50 / mm, ( $height - $start ) / mm ); |
221 |
$start += 5; |
222 |
} |
223 |
} else { |
224 |
$text->text( $deliverydetails->{branchaddress1} ); |
225 |
$text->translate( 50 / mm, ( $height - 242 ) / mm ); |
226 |
$text->text( $deliverydetails->{branchaddress2} ); |
227 |
$text->translate( 50 / mm, ( $height - 247 ) / mm ); |
228 |
$text->text( $deliverydetails->{branchaddress3} ); |
229 |
$text->translate( 50 / mm, ( $height - 252 ) / mm ); |
230 |
$text->text( join( ' ', $deliverydetails->{branchzip}, $deliverydetails->{branchcity}, $deliverydetails->{branchcountry} ) ); |
231 |
} |
232 |
$text->translate(50/mm, ($height-262)/mm); |
233 |
$text->text($basketgroup->{deliverycomment}); |
234 |
} |
235 |
|
236 |
sub printfooters { |
237 |
my $pdf = shift; |
238 |
for ( 1..$pdf->pages ) { |
239 |
my $page = $pdf->openpage($_); |
240 |
my $text = $page->text; |
241 |
$text->font( $pdf->corefont("Times", -encoding => "utf8"), 3/mm ); |
242 |
$text->translate(10/mm, 10/mm); |
243 |
$text->text("Seite $_ / ".$pdf->pages); |
244 |
} |
245 |
} |
246 |
|
247 |
sub printpdf { |
248 |
my ($basketgroup, $bookseller, $baskets, $orders, $GST) = @_; |
249 |
# open the default PDF that will be used for base (1st page already filled) |
250 |
my $pdf_template = C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout2pagesde.pdf'; |
251 |
my $pdf = PDF::API2->open($pdf_template); |
252 |
$pdf->pageLabel( 0, { |
253 |
-style => 'roman', |
254 |
} ); # start with roman numbering |
255 |
# fill the 1st page (basketgroup information) |
256 |
printhead($pdf, $basketgroup, $bookseller); |
257 |
# fill other pages (orders) |
258 |
printorders($pdf, $basketgroup, $baskets, $orders); |
259 |
# print something on each page (usually the footer, but you could also put a header |
260 |
printfooters($pdf); |
261 |
return $pdf->stringify; |
262 |
} |
263 |
|
264 |
1; |