FFZG: custom basketgroup pdf template
authorDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 13 Jan 2016 09:30:17 +0000 (10:30 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 25 Mar 2019 14:43:15 +0000 (15:43 +0100)
acqui/basketgroup.pl
acqui/pdfformat/ffzg.pm [new file with mode: 0644]
ffzg/ffzg-narudzbenice/systempreferences.sql [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/acquisitions.pref
koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.odt [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.pdf [new file with mode: 0644]

index cc3f9fc..d29df74 100755 (executable)
@@ -126,7 +126,7 @@ sub printbasketgrouppdf{
     my ($basketgroupid) = @_;
 
     my $pdfformat = C4::Context->preference("OrderPdfFormat");
-    my @valid_pdfformats = qw(pdfformat::layout3pages pdfformat::layout2pages pdfformat::layout3pagesfr pdfformat::layout2pagesde);
+    my @valid_pdfformats = qw(pdfformat::layout3pages pdfformat::layout2pages pdfformat::layout3pagesfr pdfformat::layout2pagesde pdfformat::ffzg);
     if (grep {$_ eq $pdfformat} @valid_pdfformats) {
         $pdfformat = "Koha::$pdfformat";
         my $pdfformat_filepath = File::Spec->catfile(split /::/, $pdfformat) . '.pm';
diff --git a/acqui/pdfformat/ffzg.pm b/acqui/pdfformat/ffzg.pm
new file mode 100644 (file)
index 0000000..f72a5fd
--- /dev/null
@@ -0,0 +1,424 @@
+#!/usr/bin/perl
+
+#example script to print a basketgroup
+#written 07/11/08 by john.soros@biblibre.com and paul.poulain@biblibre.com
+
+# Copyright 2008-2009 BibLibre SARL
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+#you can use any PDF::API2 module, all you need to do is return the stringifyed pdf object from the printpdf sub.
+package pdfformat::ffzg;
+use vars qw($VERSION @ISA @EXPORT);
+use MIME::Base64;
+use List::MoreUtils qw/uniq/;
+use strict;
+use warnings;
+use utf8;
+
+use C4::Branch qw(GetBranchDetail GetBranchName);
+
+use Koha::Number::Price;
+use Koha::DateUtils;
+
+use Data::Dump qw(dump); # FIXME
+
+BEGIN {
+         use Exporter   ();
+         our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+       # set the version for version checking
+         $VERSION     = 1.00;
+       @ISA    = qw(Exporter);
+       @EXPORT = qw(printpdf);
+}
+
+
+#be careful, all the sizes (height, width, etc...) are in mm, not PostScript points (the default measurment of PDF::API2).
+#The constants exported transform 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.
+use constant mm => 25.4 / 72;
+use constant in => 1 / 72;
+use constant pt => 1;
+
+use PDF::API2;
+#A4 paper specs
+my ($height, $width) = (297, 210);
+use PDF::Table;
+
+sub _pdf_font {
+       my ($pdf, $font) = @_;
+       # $font = Times, Times-Bold
+
+       my $mapping = {
+               'Times'      => '/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed.ttf',
+               'Times-Bold' => '/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf',
+       };
+
+       if ( my $ttf = $mapping->{$font} ) {
+#              warn "XXX using $ttf font insted of $font";
+               return $pdf->ttfont( $ttf );
+
+       } else {
+               warn "ERROR: can't find ttf font $font, fallback to corefont";
+               return $pdf->corefont($font, -encoding => "utf8");
+       }
+
+}
+
+
+sub printhead {
+    my ($pdf, $basketgroup, $bookseller) = @_;
+
+    # get library name
+    my $libraryname = C4::Context->preference("LibraryName");
+    # get branch details
+    my $billingdetails  = GetBranchDetail( $basketgroup->{billingplace} );
+warn "XXX billingdetails = ",dump($billingdetails);
+    my $deliverydetails = GetBranchDetail( $basketgroup->{deliveryplace} );
+warn "XXX deliverydetails = ", dump($deliverydetails);
+    my $freedeliveryplace = $basketgroup->{freedeliveryplace};
+warn "XXX freedeliveryplace = ", dump($freedeliveryplace);
+
+    # open 1st page (with the header)
+    my $page = $pdf->openpage(1);
+
+    # create a text
+    my $text = $page->text;
+       $text->fillcolor('black');
+#      $text->fillcolor('red');
+
+
+    # print order info, on the default PDF
+    $text->font( _pdf_font( $pdf, "Times-Bold" ), 12/pt );
+#    $text->translate(100/mm,  ($height-24)/mm);
+       $text->translate(283/pt, 774/pt);
+       $text->text( $basketgroup->{'id'} . '-' . $basketgroup->{'ffzg_nr'} . '/' . $basketgroup->{'ffzg_year'} );
+
+    $text->font( _pdf_font( $pdf, "Times" ), 10/pt );
+
+    # print the date FIXME
+#    $text->translate(140/mm,  ($height-24)/mm);
+    $text->translate(420.75/pt,  773.93/pt);
+    $text->text($basketgroup->{ffzg_date});
+
+#warn "XXX bookseller ", dump( $bookseller );
+
+    # print bookseller infos
+       my $y_pt = 727;
+       foreach my $line ( $bookseller->{name}, split(/[\n\r]+/, $bookseller->{postal}) ) {
+           $text->translate(336/pt, $y_pt/pt);
+               $text->text($line);
+               $y_pt -= 12;
+       }
+
+       # Lokacija za isporuku -- Zbirka...
+    $text->translate(62/pt, 590/pt);
+    $text->text($basketgroup->{deliverycomment});
+
+    $text->translate(58/pt, 556/pt);
+    $text->text("Narudžbenicu ispisala: " . C4::Context->userenv->{"firstname"} . " " .  C4::Context->userenv->{"surname"} );
+#    $text->translate(58/pt, 556/pt - 10/pt);
+#      $text->text("basketgroup: " . $basketgroup->{'id'});
+
+}
+
+sub print_tables {
+    my ($pdf, $basketgroup, $baskets, $orders) = @_;
+
+    my $cur_format = C4::Context->preference("CurrencyFormat");
+
+       my $a_titles = [[
+               'Rbr.',
+               'košarica / narudžba',
+               'Naslov',
+               'Kol.',
+               'Cijena bez PDV-a',
+               'Cijena s PDV-om',
+               'Popust %',
+               'Popust iznos',
+               'Porez',
+               'Ukupno bez PDV-a',
+               'Ukupno s PDV-om'
+       ]];
+
+       my $rbr = 1;
+
+       my $order_total;
+       my $basket_totals;
+
+    for my $basket (@$baskets){
+
+#warn "XXX basket = ",dump( $basket );
+
+               my $basket_total;
+
+        my $titleinfo;
+        foreach my $order (@{$orders->{$basket->{basketno}}}) {
+#warn "XXX order = ",dump($order);
+
+                       $order->{discount_value} = $order->{rrpgste} - $order->{ecostgste};
+                       $basket_total->{$_} += $order->{$_} foreach (qw( totalgste totalgsti gstvalue quantity ));
+                       $basket_total->{$_} += $order->{$_} * $order->{quantity} foreach (qw( rrpgste rrpgsti ecostgste discount_value ));
+                       push @{$basket_total->{gstrate}}, $order->{gstrate};
+
+            $titleinfo = "";
+            if ( C4::Context->preference("marcflavour") eq 'UNIMARC' ) {
+                $titleinfo =  $order->{title} . " / " . $order->{author} .
+                    ( $order->{isbn} ? " ISBN: " . $order->{isbn} : '' ) .
+                    ( $order->{en} ? " EN: " . $order->{en} : '' ) .
+                    ( $order->{itemtype} ? ", " . $order->{itemtype} : '' ) .
+                    ( $order->{edition} ? ", " . $order->{edition} : '' ) .
+                    ( $order->{publishercode} ? ' published by '. $order->{publishercode} : '') .
+                    ( $order->{publicationyear} ? ', '. $order->{publicationyear} : '');
+            }
+            else { # MARC21, NORMARC
+                $titleinfo =  $order->{title} . " " . $order->{author} .
+                    ( $order->{isbn} ? " ISBN: " . $order->{isbn} : '' ) .
+                    ( $order->{en} ? " EN: " . $order->{en} : '' ) .
+                    ( $order->{itemtype} ? " " . $order->{itemtype} : '' ) .
+                    ( $order->{edition} ? ", " . $order->{edition} : '' ) .
+                    ( $order->{publishercode} ? ' published by '. $order->{publishercode} : '') .
+                    ( $order->{copyrightdate} ? ' '. $order->{copyrightdate} : '');
+            }
+
+            push @$a_titles, [
+                               $rbr++ . '.',
+                               $basket->{basketno} . ' / ' . $order->{ordernumber},
+                $titleinfo, #. ($order->{order_vendornote} ? "\n----------------\nNote for vendor : " . $order->{order_vendornote} : '' ),
+                $order->{quantity},
+                Koha::Number::Price->new( $order->{rrpgste} )->format,
+                Koha::Number::Price->new( $order->{rrpgsti} )->format,
+                Koha::Number::Price->new( $order->{discount} )->format . '%',
+                Koha::Number::Price->new( $order->{discount_value})->format,
+                Koha::Number::Price->new( $order->{gstrate} * 100 )->format . '%',
+                Koha::Number::Price->new( $order->{totalgste} )->format,
+                Koha::Number::Price->new( $order->{totalgsti} )->format,
+            ];
+        }
+
+               $basket_total->{$_} = $basket->{$_} foreach qw( basketname basketno );
+               $basket_total->{gstrate} = join(" ", map { Koha::Number::Price->new($_ * 100)->format . '%' } uniq @{ $basket_total->{gstrate} } );
+
+               push @$basket_totals, $basket_total;
+
+               $order_total->{$_} += $basket_total->{$_} foreach qw( rrpgste rrpgsti totalgste totalgsti gstvalue quantity ecostgste discount_value );
+               push @{$order_total->{gstrate}}, $basket_total->{gstrate};
+    }
+
+       $order_total->{gstrate} = join(" ", uniq @{ $order_total->{gstrate} } );
+
+warn "XXX basket_totals = ",dump( $basket_totals );
+warn "XXX order_total = ", dump( $order_total );
+
+       push @$a_titles, [
+               '',
+               '',
+               'Ukupno:',
+               $order_total->{quantity},
+               Koha::Number::Price->new( $order_total->{rrpgste} )->format,
+               Koha::Number::Price->new( $order_total->{rrpgsti} )->format,
+               '', # discount
+               Koha::Number::Price->new( $order_total->{discount_value})->format,
+               '', # gstrate
+               Koha::Number::Price->new( $order_total->{totalgste} )->format,
+               Koha::Number::Price->new( $order_total->{totalgsti} )->format,
+       ];
+
+       my $a_baskets = [[
+               'Br. košarice',
+       'Košarica',
+               'Cijena bez PDV-a',
+               'Cijena s PDV-om',
+               'Porez',
+               'Iznos poreza',
+               'Popust iznos',
+               'Ukupno bez PDV-a',
+               'Ukupno s PDV-om',
+       ]];
+       foreach my $basket_total ( @$basket_totals ) {
+               push @$a_baskets, [ map {
+                               m/^basket/
+                               ? $basket_total->{$_}
+                               : Koha::Number::Price->new($basket_total->{$_})->format . ( m/^gstrate$/ ? '%' : '' )
+                       } qw(
+                       basketno
+                       basketname
+                       rrpgste
+                       rrpgsti
+                       gstrate
+                       gstvalue
+                       discount_value
+                       totalgste
+                       totalgsti
+               ) ];
+       }
+       push @$a_baskets, [ '', 'Ukupno', map { Koha::Number::Price->new($order_total->{$_})->format } qw(
+               rrpgste
+               rrpgsti
+               gstrate
+               gstvalue
+               discount_value
+               totalgste
+               totalgsti
+       ) ];
+       $a_baskets->[-1]->[4] = ''; # remove gstreate from total
+
+    $pdf->mediabox($height/mm, $width/mm);
+       my $page = $pdf->openpage(1);
+       my $pdftable = new PDF::Table();
+
+       my ($end_page, $pages_spanned, $table_bot_y) =
+       $pdftable->table($pdf, $page, $a_titles,
+               x => 10/mm, # 57/pt
+               w => ($width - 20)/mm,
+               start_y => 470/pt,
+               next_y  => $height/mm - 25/mm,
+               start_h => $height/mm - 470/pt, # - 25/mm,
+               next_h  => $height/mm - ( 2 * 25/mm ),
+               padding => 3,
+               padding_top => 2,
+               background_color_odd  => "lightgray",
+               font       => _pdf_font( $pdf, "Times" ),
+               font_size => 8/pt,
+               header_props   =>    {
+                       font       => _pdf_font( $pdf, "Times" ),
+                       font_size  => 8/pt,
+                       font_color => 'white',
+                       bg_color   => 'gray',
+                       repeat     => 1,
+               },
+               column_props => [
+                       {}, # rbr
+                       {}, # basket/order
+                       { min_w => 55/mm },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+               ],
+       );
+
+       $table_bot_y -= 10/mm;
+
+       if ( $table_bot_y < 25/mm + ( 3 + @$a_baskets ) * 12/pt ) {
+               warn "XXX force baskets to next page\n";
+               $table_bot_y = $height/mm - 25/mm;
+               $end_page = $pdf->page();
+       }
+
+       my $text = $end_page->text;
+       $text->font( _pdf_font( $pdf, "Times" ), 10/pt );
+       $text->translate(20/mm, $table_bot_y );
+#      $text->fillcolor('red');
+       $text->text("Trošak po košaricama");
+
+       $table_bot_y -= 5/mm;
+       $page = $end_page;
+
+       $pdftable->table($pdf, $page, $a_baskets,
+               x => 10/mm, # 57/pt
+               w => ($width - 20)/mm,
+               start_y => $table_bot_y,
+               next_y  => 250/mm,
+               start_h => 250/mm,
+               next_h  => 250/mm,
+               padding => 3,
+               padding_top => 2,
+               background_color_odd  => "lightgray",
+               font       => _pdf_font( $pdf, "Times" ),
+               font_size => 8/pt,
+               header_props   =>    {
+                       font       => _pdf_font( $pdf, "Times" ),
+                       font_size  => 8/pt,
+                       font_color => 'white',
+                       bg_color   => 'gray',
+                       repeat     => 1,
+               },
+               column_props => [
+                       {},
+                       {},
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+                       { justify => 'right' },
+               ],
+       );
+
+}
+sub printfooters {
+       my ($pdf, $basketgroup) = @_;
+       for (my $i=1;$i <= $pdf->pages;$i++) {
+               my $page = $pdf->openpage($i);
+               my $text = $page->text;
+               $text->font( _pdf_font( $pdf, "Times" ), 3/mm );
+               $text->translate(10/mm,  10/mm);
+               $text->text("Page $i / ".$pdf->pages);
+#              $text->text("Page $i / ".$pdf->pages . "    basketgroup: " . $basketgroup->{id});
+               $text->translate($width/mm - 40/mm,  10/mm);
+               $text->text("basketgroup: " . $basketgroup->{id});
+       }
+}
+
+sub printpdf {
+    my ($basketgroup, $bookseller, $baskets, $orders, $GST) = @_;
+warn "XXX basketgroup = ",dump($basketgroup);
+
+       if ( ! $basketgroup->{ffzg_year} ) {
+               if ( $basketgroup->{ffzg_date} =~ m/^(\d\d\d\d)-(\d\d)-(\d\d)\s.*/ ) {
+                       my ( $yyyy, $mm, $dd ) = ( $1, $2, $3 );
+                       my $dbh = C4::Context->dbh;
+                       $dbh->begin_work;
+                       my $sth = $dbh->prepare(qq{ select max(ffzg_nr) from aqbasketgroups where ffzg_year = ? });
+                       $sth->execute( $yyyy );
+                       my ($nr) = $sth->fetchrow_array;
+                       $nr++;
+                       $sth = $dbh->prepare(qq{ update aqbasketgroups set ffzg_year = ?, ffzg_nr = ? where id = ? });
+                       $sth->execute( $yyyy, $nr, $basketgroup->{id} );
+
+                       $dbh->commit;
+                       warn "XXX ",$basketgroup->{id}, " basketgroup got $yyyy-$nr\n";
+
+                       $basketgroup->{ffzg_year} = $yyyy;
+                       $basketgroup->{ffzg_nr}   = $nr;
+               }
+       }
+
+       $basketgroup->{ffzg_date} =~ s/\s.+//; # strip time from datetime
+
+    # open the default PDF that will be used for base (1st page already filled)
+    my $pdf_template = C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/ffzg-narudzbenica.pdf';
+    my $pdf = PDF::API2->open($pdf_template);
+    $pdf->pageLabel( 0, {
+        -style => 'roman',
+    } ); # start with roman numbering
+    # fill the 1st page (basketgroup information)
+    printhead($pdf, $basketgroup, $bookseller);
+
+    print_tables($pdf, $basketgroup, $baskets, $orders);
+
+
+    # print something on each page (usually the footer, but you could also put a header
+    printfooters($pdf, $basketgroup);
+    return $pdf->stringify;
+}
+
+1;
diff --git a/ffzg/ffzg-narudzbenice/systempreferences.sql b/ffzg/ffzg-narudzbenice/systempreferences.sql
new file mode 100644 (file)
index 0000000..97e7ee7
--- /dev/null
@@ -0,0 +1,9 @@
+update systempreferences set value='pdfformat::ffzg' where variable = 'OrderPdfFormat' ;
+
+alter table aqbasketgroups add column ffzg_date datetime default now() ;
+
+alter table aqbasketgroups add column ffzg_year int ;
+alter table aqbasketgroups add column ffzg_nr int ;
+
+
+-- basketgroups za stare nadužbenice
index 8f9082a..19fadbc 100644 (file)
@@ -107,4 +107,5 @@ Acquisitions:
                   "pdfformat::layout3pages":   English 3-page
                   "pdfformat::layout3pagesfr": French 3-page
                   "pdfformat::layout2pagesde": German 2-page
+                  "pdfformat::ffzg": FFZG
             - layout when printing basket groups.
diff --git a/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.odt b/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.odt
new file mode 100644 (file)
index 0000000..029ecca
Binary files /dev/null and b/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.odt differ
diff --git a/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.pdf b/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.pdf
new file mode 100644 (file)
index 0000000..28d58b2
Binary files /dev/null and b/koha-tmpl/intranet-tmpl/prog/pdf/ffzg-narudzbenica.pdf differ