From 10d994598c4cbcae260aabe818cd0209a938d370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= 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ß 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/<>/$userenv->{firstname}/g; + $letter->{content} =~ s/<>/$userenv->{surname}/g; + $letter->{content} =~ s/<>/$userenv->{emailaddress}/g; + + # booksellers + C4::Letters::parseletter($letter, 'aqbooksellers', $booksellerid); + + # items and total + return unless $letter->{'content'} =~ m/((.*)<\/item>)/sm; + my $item_place = $1; my $item_format = $2; + my ($total_place, $total_format); + if ($letter->{'content'} =~ m/((.*)<\/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/<>/$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/<>/$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&booksellerid=' + bs + '&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) { [% ELSE %] - @@ -278,6 +277,7 @@ function submitForm(form) { [% basketgroup.basketsqty %] + Close & Send Mail
@@ -318,6 +318,7 @@ function submitForm(form) {
+ Send Mail [% 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 %] [% END %] + [% IF ( orders ) %] + + [% ELSE %] + + [% END %]
  • 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