rel_3_0 moved to HEAD
[koha.git] / barcodes / barcodesGenerator.pl
index ef7b2f1..af0c4dc 100755 (executable)
@@ -27,276 +27,347 @@ use strict;
 use CGI;
 use C4::Context;
 use C4::Output;
-use HTML::Template;
+
+
+#FIXME : module deprecated ?
 use PDF::API2;
 use PDF::API2::Page;
-use PDF::API2::PDF::Utils;
+use PDF::API2::Util;
 use C4::Barcodes::PrinterConfig;
-use Time::localtime; 
-
+use Time::localtime;
 
 # This function returns the path to deal with the correct files, considering
 # templates set and language.
 sub getPath {
-       my $type = shift @_;
-       my $templatesSet = C4::Context->preference('template');
-       my $lang = C4::Context->preference('opaclanguages');
-       if ($type eq "intranet") {
-               return "$ENV{'DOCUMENT_ROOT'}/intranet-tmpl/$templatesSet/$lang";
-       } else {
-               return "$ENV{'DOCUMENT_ROOT'}/opac-tmpl/$templatesSet/$lang";
-       }
+    my $type         = shift @_;
+    my $templatesSet = C4::Context->preference('template');
+    my $lang         = C4::Context->preference('opaclanguages');
+    if ( $type eq "intranet" ) {
+        return "$ENV{'DOCUMENT_ROOT'}/intranet-tmpl/$templatesSet/$lang";
+    }
+    else {
+        return "$ENV{'DOCUMENT_ROOT'}/opac-tmpl/$templatesSet/$lang";
+    }
 }
 
 # Load a configuration file. Before use this function, check if that file exists.
 sub loadConfFromFile {
-  my $fileName = shift @_;
-       my %keyValues;
-       open FILE, "<$fileName";
-       while (<FILE>) {
-               chomp;
-               if (/\s*([\w_]*)\s*=\s*([\[\]\<\>\w_\s:@,\.-]*)\s*/) {
-                       $keyValues{$1} = $2;
-               }
-       }
-       close FILE;
-       return %keyValues;
+    my $fileName = shift @_;
+    my %keyValues;
+    open FILE, "<$fileName";
+    while (<FILE>) {
+        chomp;
+        if (/\s*([\w_]*)\s*=\s*([\[\]\<\>\w_\s:@,\.-]*)\s*/) {
+            $keyValues{$1} = $2;
+        }
+    }
+    close FILE;
+    return %keyValues;
 }
 
 # Save settings to a configuration file. It delete previous configuration settings.
 sub saveConfToFile {
-       my $fileName = shift @_;
-       my %keyValues = %{shift @_};
-       my $i;
-       open FILE, ">$fileName";                        
-       my $i;
-       foreach $i (keys(%keyValues)) {
-    print FILE $i." = ".$keyValues{$i}."\n";
-       }
-       close FILE;
+    my $fileName  = shift @_;
+    my %keyValues = %{ shift @_ };
+    my $i;
+    open FILE, ">$fileName";
+    foreach $i ( keys(%keyValues) ) {
+        print FILE $i . " = " . $keyValues{$i} . "\n";
+    }
+    close FILE;
 }
 
 # Load the config file.
-my $filenameConf = &getPath("intranet")."/includes/labelConfig/itemsLabelConfig.conf";
+my $filenameConf =
+  &getPath("intranet") . "/includes/labelConfig/itemsLabelConfig.conf";
 my %labelConfig = &loadConfFromFile($filenameConf);
 
 # Creates a CGI object and take its parameters
-my $cgi = new CGI;
-my $from = $cgi->param('from');
-my $to = $cgi->param('to');
-my $individualCodes = $cgi->param('individualCodes');
-my $rangeType = $cgi->param('rangeType');
-my $pageType = $cgi->param('pages');
-my $label = $cgi->param('label');
-my $numbersystem = $cgi->param('numbersystem');
+my $cgi              = new CGI;
+my $from             = $cgi->param('from');
+my $to               = $cgi->param('to');
+my $individualCodes  = $cgi->param('individualCodes');
+my $rangeType        = $cgi->param('rangeType');
+my $pageType         = $cgi->param('pages');
+my $label            = $cgi->param('label');
+my $numbersystem     = $cgi->param('numbersystem');
 my $text_under_label = $cgi->param('text_under_label');
 
 # Generate the checksum from an inventary code
 sub checksum {
 
-  sub calculateDigit {
-    my $code = shift @_;
-    my $sum = 0;
-         my $odd_parity = 1;
-    my $i;
-    for ($i = length($code) - 1; $i >= 0; $i--){
-          if ( $odd_parity ) {
-                 $sum = $sum + ( 3 * substr($code, $i, 1) );
-     } else {
-                       $sum = $sum + substr($code, $i, 1); }
-                 $odd_parity = !$odd_parity;
-          }
-    my $check_digit = 10 - ($sum%10);
-       if ($check_digit==10) {
-               $check_digit=0;
-       }
-         return $code.$check_digit;
-  }
-
-  my $currentCode = shift @_;
-  $currentCode = &calculateDigit($currentCode);
-  return $currentCode;
+    sub calculateDigit {
+        my $code       = shift @_;
+        my $sum        = 0;
+        my $odd_parity = 1;
+        my $i;
+        for ( $i = length($code) - 1 ; $i >= 0 ; $i-- ) {
+            if ($odd_parity) {
+                $sum = $sum + ( 3 * substr( $code, $i, 1 ) );
+            }
+            else {
+                $sum = $sum + substr( $code, $i, 1 );
+            }
+            $odd_parity = !$odd_parity;
+        }
+        my $check_digit = 10 - ( $sum % 10 );
+        if ( $check_digit == 10 ) {
+            $check_digit = 0;
+        }
+        return $code . $check_digit;
+    }
+
+    my $currentCode = shift @_;
+    $currentCode = &calculateDigit($currentCode);
+    return $currentCode;
 }
 
 # Assigns a temporary name to the PDF file
 sub assingFilename {
-       my ($from, $to) = @_;
-       my $ip = $cgi->remote_addr();
-       my $random = int(rand(1000000));
+    my ( $from, $to ) = @_;
+    my $ip      = $cgi->remote_addr();
+    my $random  = int( rand(1000000) );
     my $timeObj = localtime();
-       my ($day, $month, $year, $hour, $min, $sec) = ($timeObj->mday,
-                                                                                                  $timeObj->mon + 1,
-                                                                                                  $timeObj->year + 1900,
-                                                                                                  $timeObj->hour,
-                                                                                                  $timeObj->min,
-                                                                                                  $timeObj->sec);
-       my $tmpFileName = $random.'-'.$ip.'-(From '.$from.' to '.$to.')-['.$day.'.'.$month.'.'.$year.']-['.$hour.':'.$min.':'.$sec.'].pdf';
-       return $tmpFileName;
+    my ( $day, $month, $year, $hour, $min, $sec ) = (
+        $timeObj->mday,
+        $timeObj->mon + 1,
+        $timeObj->year + 1900,
+        $timeObj->hour, $timeObj->min, $timeObj->sec
+    );
+    my $tmpFileName =
+        $random . '-' . $ip
+      . '-(From '
+      . $from . ' to '
+      . $to . ')-['
+      . $day . '.'
+      . $month . '.'
+      . $year . ']-['
+      . $hour . ':'
+      . $min . ':'
+      . $sec . '].pdf';
+    return $tmpFileName;
 }
+
 sub getCallnum {
-#grabs a callnumber for the specified barcode
-my ($barcode) = @_;
-my $query = "select dewey from items,biblioitems where items.biblionumber=biblioitems.biblionumber and items.barcode=?";
-my $dbh = C4::Context->dbh;
-my $sth = $dbh->prepare($query);
-$sth->execute($barcode);
-my ($callnum) = $sth->fetchrow_array();
-warn "Call number is:".$barcode;
-return $callnum;
+
+    #grabs a callnumber for the specified barcode
+    my ($barcode) = @_;
+    my $query =
+"select dewey from items,biblioitems where items.biblionumber=biblioitems.biblionumber and items.barcode=?";
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare($query);
+    $sth->execute($barcode);
+    my ($callnum) = $sth->fetchrow_array();
+    warn "Call number is:" . $barcode;
+    return $callnum;
 }
+
 # Takes inventary codes from database and if they are between
 # the interval specify by parameters, it generates the correspond barcodes
 sub barcodesGenerator {
-       my ($from, $to, $rangeType, $individualCodes,$text_under_label) = @_;
-       # Returns a database handler
-       my $dbh = C4::Context->dbh;
-       # Create the query to database
-       # Assigns a temporary filename for the pdf file
-       my $tmpFileName = &assingFilename($from, $to);
-       # warn "range type: ".$rangeType;
-       if ($rangeType eq 'continuous') {
-               # Set the temp directory for pdf´s files
-               if (!defined($ENV{'TEMP'})) {
-                       $ENV{'TEMP'} = '/tmp/';
-               }       
-               $tmpFileName = $ENV{'TEMP'}.$tmpFileName;
-               # Creates a PDF object
-               my $pdf = PDF::API2->new(-file => $tmpFileName);
-               # Set the positions where barcodes are going to be placed
-               C4::Barcodes::PrinterConfig::setPositionsForX($labelConfig{'marginLeft'}, $labelConfig{'labelWidth'}, $labelConfig{'columns'}, $labelConfig{'pageType'});
-               C4::Barcodes::PrinterConfig::setPositionsForY($labelConfig{'marginBottom'}, $labelConfig{'labelHeigth'}, $labelConfig{'rows'}, $labelConfig{'pageType'});
-               # Creates a font object
-               my $tr = $pdf->corefont('Helvetica-Bold');
-               # Barcode position
-               my ($page, $gfx, $text);
-               for (my $code=$from; $code<=$to; $code++) {
-                       # Generetase checksum
-                       my $codeC = &checksum($code);
-                       # Generate the corresponde barcode to $code
-                       # warn "Code is :-->".$codeC."<--";
-                       my $barcode = $pdf->barcode(-font => $tr,       # The font object to use
-                                                                               -type => 'ean128',      # Standard of codification
-                                                                               -code => $codeC, # Text to codify
-                                                                               -extn   => '012345',    # Barcode extension (if it is aplicable)
-                                                                               -umzn => 10,            # Top limit of the finished bar
-                                                                               -lmzn => 10,            # Bottom limit of the finished bar
-                                                                               -zone => 15,            # Bars size
-                                                                               -quzn => 0,             # Space destinated for legend
-                                                                               -ofwt => 0.01,  # Bars width
-                                                                               -fnsz => 8,             # Font size
-                                                                               -text => ''
-                                                                               );
-                       
-                       (my $x, my $y, $pdf, $page, $gfx, $text, $tr, $label) = C4::Barcodes::PrinterConfig::getLabelPosition(
-                                                                                                                                                                               $label, 
-                                                                                                                                                                               $pdf, 
-                                                                                                                                                                               $page,
-                                                                                                                                                                               $gfx,
-                                                                                                                                                                               $text,
-                                                                                                                                                                               $tr,
-                                                                                                                                                                               $pageType);     
-                       # Assigns a barcodes to $gfx
-                       $gfx->barcode($barcode, $x, $y , (72/$labelConfig{'systemDpi'}));
-                       # Assigns the additional information to the barcode (Legend)
-                       $text->translate($x - 48, $y - 22);
-                       warn "code is ".$codeC;
-                       if ($text_under_label) {
-                               $text->text($text_under_label);
-                       } else {
-                       $text->text(getCallnum($code));
-                       }
-               }
-               # Writes the objects added in $gfx to $page
-               $pdf->finishobjects($page,$gfx, $text);
-               # Save changes to the PDF
-               $pdf->saveas;
-               # Close the conection with the PDF file
-               $pdf->end;
-               # Show the PDF file
-               print $cgi->redirect("/cgi-bin/koha/barcodes/pdfViewer.pl?tmpFileName=$tmpFileName");
-       } else {
-               my $rangeCondition;
-               if ($individualCodes ne "") {
-                       $rangeCondition = "AND (I.barcode IN " . $individualCodes . ")";
-               } else {
-                       $rangeCondition =  "AND (I.barcode >= " . $from . " AND I.barcode <="  . $to . " )";
-               }
-               warn "above the query"; 
-               my $query = "SELECT CONCAT('$numbersystem',REPEAT('0',((12 - LENGTH('$numbersystem')) - LENGTH(I.barcode))), I.barcode) AS Codigo, I.dewey as dewey B.title, B.author FROM biblio B, items I WHERE (I.biblionumber = B.biblioNumber ) " .$rangeCondition. " AND (I.barcode <> 'FALTA') ORDER BY Codigo";
-               
-               # Prepare the query
-               my $sth = $dbh->prepare($query);
-               # Executes the query
-               $sth->execute;
-               if ($sth->rows) { # There are inventary codes
-                       # Set the temp directory for pdf´s files
-                       if (!defined($ENV{'TEMP'})) {
-                               $ENV{'TEMP'} = '/tmp/';
-                       }       
-                       # Assigns a temporary filename for the pdf file
-                       my $tmpFileName = &assingFilename($from, $to);
-                       $tmpFileName = $ENV{'TEMP'}.$tmpFileName;
-                       # Creates a PDF object
-                       my $pdf = PDF::API2->new(-file => $tmpFileName);
-                       # Set the positions where barcodes are going to be placed
-                       C4::Barcodes::PrinterConfig::setPositionsForX($labelConfig{'marginLeft'}, $labelConfig{'labelWidth'}, $labelConfig{'columns'}, $labelConfig{'pageType'});
-                       C4::Barcodes::PrinterConfig::setPositionsForY($labelConfig{'marginBottom'}, $labelConfig{'labelHeigth'}, $labelConfig{'rows'}, $labelConfig{'pageType'});
-                       # Creates a font object
-                       my $tr = $pdf->corefont('Helvetica-Bold');
-                       # Barcode position
-                       my ($page, $gfx, $text);
-                       while (my ($code,$dewey,$title,$author) = $sth->fetchrow_array) {
-                               # Generetase checksum
-                               $code = &checksum($code);
-                               # Generate the corresponde barcode to $code
-                               my $barcode = $pdf->barcode(-font => $tr,       # The font object to use
-                                                                                       -type => 'ean13',       # Standard of codification
-                                                                                       -code => $code, # Text to codify
-                                                                                       -extn   => '012345',    # Barcode extension (if it is aplicable)
-                                                                                       -umzn => 10,            # Top limit of the finished bar
-                                                                                       -lmzn => 10,            # Bottom limit of the finished bar
-                                                                                       -zone => 15,            # Bars size
-                                                                                       -quzn => 0,             # Space destinated for legend
-                                                                                       -ofwt => 0.01,  # Bars width
-                                                                                       -fnsz => 8,             # Font size
-                                                                                       -text => ''
-                                                                                       );
-                               
-                               (my $x, my $y, $pdf, $page, $gfx, $text, $tr, $label) = C4::Barcodes::PrinterConfig::getLabelPosition(
-                                                                                                                                                                                       $label, 
-                                                                                                                                                                                       $pdf, 
-                                                                                                                                                                                       $page,
-                                                                                                                                                                                       $gfx,
-                                                                                                                                                                                       $text,
-                                                                                                                                                                                       $tr,
-                                                                                                                                                                                       $pageType);     
-                               # Assigns a barcodes to $gfx
-                               $gfx->barcode($barcode, $x, $y , (72/$labelConfig{'systemDpi'}));
-                               # Assigns the additional information to the barcode (Legend)
-                               $text->translate($x - 48, $y - 22);
-                               if ($text_under_label) {
-                                       $text->text($text_under_label);
-                               } else {
-                                       warn "here a dewey:".$dewey;
-                                       $text->text(substr $dewey, 0, 30);
-                                       $text->translate($x - 48, $y - 29);
-                                       #$text->text(substr $author, 0, 30);
-                               }
-                       }
-                       # Writes the objects added in $gfx to $page
-                       $pdf->finishobjects($page,$gfx, $text);
-                       # Save changes to the PDF
-                       $pdf->saveas;
-                       # Close the conection with the PDF file
-                       $pdf->end;
-                       # Show the PDF file
-                       print $cgi->redirect("/cgi-bin/koha/barcodes/pdfViewer.pl?tmpFileName=$tmpFileName");
-               } else {
-                       # Rollback and shows the error legend
-                       print $cgi->redirect("/cgi-bin/koha/barcodes/barcodes.pl?error=1");
-               }
-       $sth->finish;
-       }
+    my ( $from, $to, $rangeType, $individualCodes, $text_under_label ) = @_;
+
+    # Returns a database handler
+    my $dbh = C4::Context->dbh;
+
+    # Create the query to database
+    # Assigns a temporary filename for the pdf file
+    my $tmpFileName = &assingFilename( $from, $to );
+
+    # warn "range type: ".$rangeType;
+    if ( $rangeType eq 'continuous' ) {
+
+        # Set the temp directory for pdf´s files
+        if ( !defined( $ENV{'TEMP'} ) ) {
+            $ENV{'TEMP'} = '/tmp/';
+        }
+        $tmpFileName = $ENV{'TEMP'} . $tmpFileName;
+
+        # Creates a PDF object
+        my $pdf = PDF::API2->new( -file => $tmpFileName );
+
+        # Set the positions where barcodes are going to be placed
+        C4::Barcodes::PrinterConfig::setPositionsForX(
+            $labelConfig{'marginLeft'}, $labelConfig{'labelWidth'},
+            $labelConfig{'columns'},    $labelConfig{'pageType'}
+        );
+        C4::Barcodes::PrinterConfig::setPositionsForY(
+            $labelConfig{'marginBottom'}, $labelConfig{'labelHeigth'},
+            $labelConfig{'rows'},         $labelConfig{'pageType'}
+        );
+
+        # Creates a font object
+        my $tr = $pdf->corefont('Helvetica-Bold');
+
+        # Barcode position
+        my ( $page, $gfx, $text );
+        for ( my $code = $from ; $code <= $to ; $code++ ) {
+
+            # Generetase checksum
+            my $codeC = &checksum($code);
+
+            # Generate the corresponde barcode to $code
+            # warn "Code is :-->".$codeC."<--";
+            my $barcode = $pdf->barcode(
+                -font => $tr,         # The font object to use
+                -type => 'ean128',    # Standard of codification
+                -code => $codeC,      # Text to codify
+                -extn => '012345',    # Barcode extension (if it is aplicable)
+                -umzn => 10,          # Top limit of the finished bar
+                -lmzn => 10,          # Bottom limit of the finished bar
+                -zone => 15,          # Bars size
+                -quzn => 0,           # Space destinated for legend
+                -ofwt => 0.01,        # Bars width
+                -fnsz => 8,           # Font size
+                -text => ''
+            );
+
+            ( my $x, my $y, $pdf, $page, $gfx, $text, $tr, $label ) =
+              C4::Barcodes::PrinterConfig::getLabelPosition( $label, $pdf,
+                $page, $gfx, $text, $tr, $pageType );
+
+            # Assigns a barcodes to $gfx
+            $gfx->barcode( $barcode, $x, $y,
+                ( 72 / $labelConfig{'systemDpi'} ) );
+
+            # Assigns the additional information to the barcode (Legend)
+            $text->translate( $x - 48, $y - 22 );
+
+            #warn "code is ".$codeC;
+            if ($text_under_label) {
+                $text->text($text_under_label);
+            }
+            else {
+                $text->text( getCallnum($code) );
+            }
+        }
+
+        # Writes the objects added in $gfx to $page
+        $pdf->finishobjects( $page, $gfx, $text );
+
+        # Save changes to the PDF
+        $pdf->saveas;
+
+        # Close the conection with the PDF file
+        $pdf->end;
+
+        # Show the PDF file
+        print $cgi->redirect(
+            "/cgi-bin/koha/barcodes/pdfViewer.pl?tmpFileName=$tmpFileName");
+    }
+    else {
+        my $rangeCondition;
+        if ( $individualCodes ne "" ) {
+            $rangeCondition = "AND (I.barcode IN " . $individualCodes . ")";
+        }
+        else {
+            $rangeCondition =
+              "AND (I.barcode >= " . $from . " AND I.barcode <=" . $to . " )";
+        }
+
+        my $query =
+"SELECT CONCAT('$numbersystem',REPEAT('0',((12 - LENGTH('$numbersystem')) - LENGTH(I.barcode))), I.barcode) AS Codigo, B.title, B.author FROM biblio B, items I WHERE (I.biblionumber = B.biblioNumber ) "
+          . $rangeCondition
+          . " AND (I.barcode <> 'FALTA') ORDER BY Codigo";
+
+        # Prepare the query
+        my $sth = $dbh->prepare($query);
+
+        # Executes the query
+        $sth->execute;
+        if ( $sth->rows ) {    # There are inventary codes
+                               # Set the temp directory for pdf´s files
+            if ( !defined( $ENV{'TEMP'} ) ) {
+                $ENV{'TEMP'} = '/tmp/';
+            }
+
+            # Assigns a temporary filename for the pdf file
+            my $tmpFileName = &assingFilename( $from, $to );
+            $tmpFileName = $ENV{'TEMP'} . $tmpFileName;
+
+            # Creates a PDF object
+            my $pdf = PDF::API2->new( -file => $tmpFileName );
+
+            # Set the positions where barcodes are going to be placed
+            C4::Barcodes::PrinterConfig::setPositionsForX(
+                $labelConfig{'marginLeft'}, $labelConfig{'labelWidth'},
+                $labelConfig{'columns'},    $labelConfig{'pageType'}
+            );
+            C4::Barcodes::PrinterConfig::setPositionsForY(
+                $labelConfig{'marginBottom'}, $labelConfig{'labelHeigth'},
+                $labelConfig{'rows'},         $labelConfig{'pageType'}
+            );
+
+            # Creates a font object
+            my $tr = $pdf->corefont('Helvetica-Bold');
+
+            # Barcode position
+            my ( $page, $gfx, $text );
+            while ( my ( $code, $dewey, $title, $author ) =
+                $sth->fetchrow_array )
+            {
+
+                # Generetase checksum
+                $code = &checksum($code);
+
+                # Generate the corresponde barcode to $code
+                my $barcode = $pdf->barcode(
+                    -font => $tr,       # The font object to use
+                    -type => 'ean13',   # Standard of codification
+                    -code => $code,     # Text to codify
+                    -extn => '012345',  # Barcode extension (if it is aplicable)
+                    -umzn => 10,        # Top limit of the finished bar
+                    -lmzn => 10,        # Bottom limit of the finished bar
+                    -zone => 15,        # Bars size
+                    -quzn => 0,         # Space destinated for legend
+                    -ofwt => 0.01,      # Bars width
+                    -fnsz => 8,         # Font size
+                    -text => ''
+                );
+
+                ( my $x, my $y, $pdf, $page, $gfx, $text, $tr, $label ) =
+                  C4::Barcodes::PrinterConfig::getLabelPosition( $label, $pdf,
+                    $page, $gfx, $text, $tr, $pageType );
+
+                # Assigns a barcodes to $gfx
+                $gfx->barcode( $barcode, $x, $y,
+                    ( 72 / $labelConfig{'systemDpi'} ) );
+
+                # Assigns the additional information to the barcode (Legend)
+                $text->translate( $x - 48, $y - 22 );
+                if ($text_under_label) {
+                    $text->text($text_under_label);
+                }
+                else {
+                    $text->text( substr $title, 0, 30 );
+                    $text->translate( $x - 48, $y - 29 );
+
+                    #$text->text(substr $author, 0, 30);
+                    $text->text( substr $author, 0, 30 );
+                }
+            }
+
+            # Writes the objects added in $gfx to $page
+            $pdf->finishobjects( $page, $gfx, $text );
+
+            # Save changes to the PDF
+            $pdf->saveas;
+
+            # Close the conection with the PDF file
+            $pdf->end;
+
+            # Show the PDF file
+            print $cgi->redirect(
+                "/cgi-bin/koha/barcodes/pdfViewer.pl?tmpFileName=$tmpFileName");
+        }
+        else {
+
+            # Rollback and shows the error legend
+            print $cgi->redirect("/cgi-bin/koha/barcodes/barcodes.pl?error=1");
+        }
+        $sth->finish;
+    }
 }
 
-barcodesGenerator($from, $to, $rangeType, $individualCodes,$text_under_label);
+barcodesGenerator( $from, $to, $rangeType, $individualCodes,
+    $text_under_label );