From 10d994598c4cbcae260aabe818cd0209a938d370 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Edgar=20Fu=C3=9F?= <ef@math.uni-bonn.de>
Date: Mon, 21 Oct 2013 20:08:11 +1200
Subject: [PATCH] Bug 5260 : Send basketgroup by mail to the bookseller

2 Patchs originally written by Edgar Fuß <ef@math.uni-bonn.de> in 2011
Merged, rebased and ceaned-up by Mathieu Saby on 21st oct 2013

Do not test for the moment


---
 acqui/basketgroup.pl                               |  181 +++++++++++++++++++-
 koha-tmpl/intranet-tmpl/prog/en/js/acq.js          |    8 +
 .../prog/en/modules/acqui/basketgroup.tt           |    3 +-
 .../intranet-tmpl/prog/en/modules/tools/letter.tt  |    5 +
 tools/letter.pl                                    |   33 ++++
 5 files changed, 225 insertions(+), 5 deletions(-)

diff --git a/acqui/basketgroup.pl b/acqui/basketgroup.pl
index 6fe4db2..7ffff0b 100755
--- a/acqui/basketgroup.pl
+++ b/acqui/basketgroup.pl
@@ -293,6 +293,171 @@ sub printbasketgrouppdf{
 
 }
 
+sub order_mail {
+#use Data::Dumper;
+    my ($booksellerid, $mail_orders) = @_;
+#print "order_mail\n";
+#print "booksellerid: $booksellerid\n", "mail_orders: ", Dumper($mail_orders);
+    my $mail_order_total = shift @$mail_orders;
+
+    my $bookseller = GetBookSellerFromId($booksellerid);
+
+    my $letter = C4::Letters::getletter('orders', 'ORDERMAIL') || return;
+#print "letter: ",  Dumper(\$letter);
+
+    eval "use Mail::Sendmail";
+    eval "use C4::Log";
+    eval "use Carp";
+    eval "use Encode";
+
+    # branch info
+    my $userenv = C4::Context->userenv;
+    C4::Letters::parseletter($letter, 'branches', $userenv->{branch});
+
+    # librarian name
+    $letter->{content} =~ s/<<LibrarianFirstname>>/$userenv->{firstname}/g;
+    $letter->{content} =~ s/<<LibrarianSurname>>/$userenv->{surname}/g;
+    $letter->{content} =~ s/<<LibrarianEmailaddress>>/$userenv->{emailaddress}/g;
+
+    # booksellers
+    C4::Letters::parseletter($letter, 'aqbooksellers', $booksellerid);
+
+    # items and total
+    return unless $letter->{'content'} =~ m/(<item>(.*)<\/item>)/sm;
+    my $item_place = $1; my $item_format = $2;
+    my ($total_place, $total_format);
+    if ($letter->{'content'} =~ m/(<total>(.*)<\/total>)/sm) {
+        $total_place = $1; $total_format = $2;
+    }
+
+    my @items;
+    foreach my $mail_order (@$mail_orders) {
+        my $item = $item_format;
+        while (my ($key, $value) = each %$mail_order) {
+#print "$key: $value\n";
+            $item =~ s/<<orders.$key>>/$value/g;
+        }
+        push @items, $item;
+    }
+#print "items: ", Dumper(@items);
+    $letter->{'content'} =~ s/\Q$item_place\E/join "\n",@items/e;
+    if ($total_format) {
+#print "total_place: $total_place\n";
+#print "total_format: $total_format\n";
+        my $total = $total_format;
+        while (my ($key, $value) = each %$mail_order_total) {
+            $total =~ s/<<orders.total.$key>>/$value/g;
+        }
+#print "total: $total\n";
+        $letter->{'content'} =~ s/\Q$total_place\E/$total/;
+    }
+    my %mail = (
+        To => $bookseller->{bookselleremail} ||
+            $bookseller->{contemail} ||
+            $userenv->{emailaddress},
+        From => $userenv->{emailaddress},
+        Subject => $letter->{title},
+        Message => Encode::encode("UTF-8", $letter->{content}),
+        'Content-Type' => 'text/plain; charset="utf8"',
+    );
+#print "mail: ", Dumper(\%mail);
+    sendmail(%mail) or carp $Mail::Sendmail::error;
+    logaction(
+        "ORDER",
+        "Send email order",
+        undef,
+        "To=%mail{To}\nSubject=%mail{Subject}\nMessage=%mail{Message}"
+    ) if C4::Context->preference("LetterLog");
+}
+
+sub mailbasketgroup {
+    my ($basketgroupid) = @_;
+
+    eval "use C4::Branch";
+    eval "use C4::Biblio";
+    eval "use C4::Koha";
+    eval "use Number::Format qw(format_number format_price)";
+
+    my $num = FormatNumber; # C4::Output
+
+    my $itemtypes = GetItemTypes();
+
+    my $basketgroup = GetBasketgroup($basketgroupid);
+    my $booksellerid = $basketgroup->{booksellerid};
+    my $bookseller = GetBookSellerFromId($booksellerid);
+    my $baskets = GetBasketsByBasketgroup($basketgroupid);
+
+    my $gstrate = $bookseller->{gstrate} || C4::Context->preference("gist") || 0;
+    my $discount = $bookseller->{'discount'} / 100;
+
+    my $total_ecost;    # Total, its value will be assigned to $total_ecost_gsti or $total_ecost_gste depending of $bookseller->{'listincgst'}
+    my $total_ecost_gsti;   # Total, GST included
+    my $total_ecost_gste;   # Total, GST excluded
+    my $total_quantity; # Total quantity
+
+    my @mail_orders;
+    for my $basket (@$baskets) {
+        my $basketno = $basket->{basketno};
+        my @orders = &GetOrders($basketno);
+        for my $order (@orders) {
+            my %mail_order;
+
+            my $quantity = $order->{quantity} || 0;
+            next if $quantity <= 0;
+            my $ecost = $order->{ecost} || 0;
+
+            for (qw(quantity quantityreceived author title volume seriestitle isbn publishercode)) {
+                $mail_order{$_} = $order->{$_} if defined $order->{$_};
+            }
+            for (qw(listprice ecost)) {
+                $mail_order{$_} = $num->format_price($order->{$_}) if defined $order->{$_};
+            }
+            my $full_title = $order->{title};
+            $full_title .= (" " . $order->{seriestitle}) if $order->{seriestitle};
+            $full_title .= (" " . $order->{volume}) if $order->{volume};
+            $mail_order{full_title} = $full_title;
+            if ($order->{biblionumber}) {
+                my $bibliodata = GetBiblioData($order->{biblionumber});
+                if ($bibliodata->{itemtype}) {
+                    $mail_order{itemtype} = $itemtypes->{$bibliodata->{itemtype}}->{description};
+                }
+            }
+
+            my $quantity_ecost = $quantity * $ecost;
+            $mail_order{quantity_ecost} = $num->format_price($quantity_ecost);
+            $mail_order{basketno} = $basketno;
+            $total_ecost += $quantity_ecost;
+            $total_quantity += $quantity;
+            push @mail_orders, \%mail_order;
+        }
+    }
+
+    my %total;
+    $total{quantity} = $total_quantity;
+    $total{gstrate} = $num->format_number($gstrate);
+    $total{currency} = $bookseller->{listprice};
+    $total{discount} = $num->format_number($bookseller->{discount});
+
+    my $total_gist;
+
+    if ($bookseller->{listincgst}) { # prices already includes GST
+        $total_ecost_gsti = $total_ecost;
+        $total_ecost_gste = $total_ecost_gsti / ($gstrate + 1);
+        $total_gist       = $total_ecost_gsti - $total_ecost_gste;
+    } else { # prices does not include GST
+        $total_ecost_gste = $total_ecost;
+        $total_gist = $total_ecost_gste * $gstrate;
+        $total_ecost_gsti = $total_ecost_gste + $total_gist;
+    }
+    $total{ecost_gste} = $num->format_price($total_ecost_gste);
+    $total{ecost_gsti} = $num->format_price($total_ecost_gsti);
+    $total{gist} = $num->format_number($total_gist);
+
+    unshift @mail_orders, \%total;
+
+    order_mail($booksellerid, \@mail_orders);
+}
+
 my $op = $input->param('op') || 'display';
 my $booksellerid = $input->param('booksellerid');
 $template->param(booksellerid => $booksellerid);
@@ -409,6 +574,14 @@ if ( $op eq "add" ) {
     
     printbasketgrouppdf($basketgroupid);
     exit;
+} elsif ( $op eq 'closeandmail') {
+    my $basketgroupid = $input->param('basketgroupid');
+
+    CloseBasketgroup($basketgroupid);
+
+    mailbasketgroup($basketgroupid);
+
+    print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
 }elsif ($op eq 'print'){
     my $basketgroupid = $input->param('basketgroupid');
     
@@ -422,19 +595,19 @@ if ( $op eq "add" ) {
     );
     print GetBasketGroupAsCSV( $basketgroupid, $input );
     exit;
+}elsif ($op eq 'mail'){
+    my $basketgroupid = $input->param('basketgroupid');
+    mailbasketgroup($basketgroupid);
+    print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
 }elsif( $op eq "delete"){
     my $basketgroupid = $input->param('basketgroupid');
     DelBasketgroup($basketgroupid);
     print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
-    
 }elsif ( $op eq 'reopen'){
     my $basketgroupid   = $input->param('basketgroupid');
     my $booksellerid    = $input->param('booksellerid');
-    
     ReOpenBasketgroup($basketgroupid);
-        
     print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid . '#closed');
-    
 } elsif ( $op eq 'attachbasket') {
     
     # Getting parameters
diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js
index 3fde6f1..d3e758e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js
+++ b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js
@@ -382,6 +382,14 @@ function closeandprint(bg){
 	}
 }
 
+function closeandmail(bs, bg){
+    if(document.location = '/cgi-bin/koha/acqui/basketgroup.pl?op=closeandmail&amp;booksellerid=' + bs + '&amp;basketgroupid=' + bg ){
+        setTimeout("window.location.reload();",3000);
+    }else{
+        alert('Error downloading the file');
+    }
+}
+
 //function that lets the user unclose a basketgroup as long as he hasn't submitted the changes to the page.
 function unclosegroup(bgid){
     var div = document.getElementById('basketgroup-'+bgid+'-closed').parentNode;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt
index b6cdc52..4613cc7 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt
@@ -237,7 +237,6 @@ function submitForm(form) {
 			</div> 
 		</div> 	 
 [% ELSE %]
-
     <div id="toolbar" class="btn-toolbar">
         <div class="btn-group"><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&amp;booksellerid=[% booksellerid %]" class="btn btn-small" id="newbasketgroup"><i class="icon-plus"></i> New basket group</a></div>
     </div>
@@ -278,6 +277,7 @@ function submitForm(form) {
                                     <td>[% basketgroup.basketsqty %]</td>
 							<td>
 								<input type="button" onclick="closeandprint([% basketgroup.id %])" value="Close and print" />
+                                <a href="/cgi-bin/koha/acqui/basketgroup.pl?op=closeandmail&amp;booksellerid=[% basketgroup.booksellerid %]&amp;basketgroupid=[% basketgroup.id %]" class="yui-button yui-link-button">Close & Send Mail</a>
 								<form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="add" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Edit" /></form>
 								<form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="delete" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Delete" /></form>
 							</td>
@@ -318,6 +318,7 @@ function submitForm(form) {
 							<form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="reopen" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Reopen" /></form>
 							<form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="print" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Print" /></form>
                                                         <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="export" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Export as CSV" /></form>
+                            <a href="/cgi-bin/koha/acqui/basketgroup.pl?op=mail&amp;booksellerid=[% basketgroup.booksellerid %]&amp;basketgroupid=[% basketgroup.id %]" class="yui-button yui-link-button">Send Mail</a>
                     </td>
 				</tr>
 				[% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt
index 52e2b83..3f81aca 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt
@@ -304,6 +304,11 @@ $(document).ready(function() {
                                     [% ELSE %]
                                     <option value="suggestions">Suggestions</option>
                                     [% END %]
+                                    [% IF ( orders ) %]
+                                    <option value="orders" selected="selected">Orders</option>
+                                    [% ELSE %]
+                                    <option value="orders">Orders</option>
+                                    [% END %]
 				</select>
 			</li>
 			<li>
diff --git a/tools/letter.pl b/tools/letter.pl
index 7582e66..d3df297 100755
--- a/tools/letter.pl
+++ b/tools/letter.pl
@@ -172,6 +172,29 @@ sub add_form {
     }
 
     my $field_selection;
+    if ( $module eq "suggestions" ) {
+        push @SQLfieldname, column_picks('borrowers'),
+                            column_picks('suggestions'),
+                            column_picks('aqbooksellers'),
+                            column_picks('biblio'),
+                            column_picks('items');
+    }
+    elsif ( $module eq "reserves" ) {
+        push @SQLfieldname, column_picks('borrowers'),
+                            column_picks('reserves'),
+                            column_picks('biblio'),
+                            column_picks('items');
+    }
+    elsif ( $module eq "orders" ) {
+        push @SQLfieldname, column_picks('aqbooksellers'),
+                            column_picks('aqorders'),
+                            column_picks('biblio'),
+                            column_picks('items');
+    }
+    elsif ( index( $module, "acquisition" ) > 0 ) {	# FIXME: imprecise comparison
+        push @SQLfieldname, column_picks('aqbooksellers'), column_picks('aqorders');
+        # add issues specific tables
+    }
     push @{$field_selection}, add_fields('branches');
     if ($module eq 'reserves') {
         push @{$field_selection}, add_fields('borrowers', 'reserves', 'biblio', 'items');
@@ -179,6 +202,16 @@ sub add_form {
     elsif ($module eq 'claimacquisition') {
         push @{$field_selection}, add_fields('aqbooksellers', 'aqorders', 'biblio', 'biblioitems');
     }
+    elsif ($module eq 'orders') {
+        push @{$field_selection}, add_fields('aqbooksellers', 'aqorders', 'biblio', 'items');
+        push @{$field_selection}, { value => q{}, text => '---ORDER ITEMS---' };
+        push @{$field_selection}, { value => "orders.$_", text => "orders.$_" }
+        foreach (qw/listprice quantity ecost quantityreceived author title volume seriestitle isbn publishercode/);
+        push @{$field_selection}, { value => "orders.$_", text => "orders.$_" }
+        foreach (qw/full_title itemtype quantity_ecost basketno/);
+        push @{$field_selection}, { value => "orders.total.$_", text => "orders.total.$_" }
+        foreach (qw/quantity gstrate currency discount ecost_gste ecost_gsti gstrate/);
+    }
     elsif ($module eq 'claimissues') {
         push @{$field_selection}, add_fields('aqbooksellers', 'serial', 'subscription');
         push @{$field_selection},
-- 
1.7.9.5