From 3cf6d99948e81a5037bd956a1823e7485a65bd91 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Wed, 18 Dec 2019 17:24:17 +0100 Subject: [PATCH] Bug 24163: Allow to define CSV profile for late orders export MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This new enhancement adds the ability to create a CSV profile for the late orders export. Prior to this, the CSV profile was hardcoded in a template and not editable (unless you modify the .tt file of course). The main difficulty of the request was to make the multiple claims dates accessible from the CSV profile. So far we only accept columns from the database. However we would like to use the Koha::Acquisition::Order object to make things easier (it had a ->claims method to access the different claims). To acchieve this, we are going to accept the TT syntax for that CSV profile. It means that only CSV profiles created for 'late_orders' will have the capability to use the TT syntax (can be extended later of course if needed). The alternative was to use specific placeholders, like %claims_count%, %claimed_date%, but it sounded more powerful and flexible to allow the TT syntax instead. Note that the former export (template based) still exists and is the default option. Test plan: 0. Apply the patches and execute the update database entry 1. Create some orders, close the basket 2. Claim some of the orders 3. Note the new button at the bottom of the table that have several entries. => The first entry will generate a CSV file using the previous method => The second entry will generate it using the new CSV profile, note that the number of claims as well as the different claims date are displayed. 4. Bonus point: Edit the CSV profile (Home › Tools › CSV export profiles) that is named "Late orders (csv profile)", or create a new one, and modify it. Export the late orders using this CSV profile and confirm that the generated CSV file is the one you expect. Sponsored-by: Institute of Technology Tralee Signed-off-by: David Nind Signed-off-by: Angela O'Connor Desmond Signed-off-by: Katrin Fischer Signed-off-by: Martin Renvoize --- acqui/lateorders-export.pl | 91 ++++++++++++------- acqui/lateorders.pl | 2 + .../prog/en/modules/acqui/lateorders.tt | 23 ++++- .../prog/en/modules/tools/csv-profiles.tt | 8 +- 4 files changed, 82 insertions(+), 42 deletions(-) diff --git a/acqui/lateorders-export.pl b/acqui/lateorders-export.pl index eb04ba7635..31e21a8e75 100755 --- a/acqui/lateorders-export.pl +++ b/acqui/lateorders-export.pl @@ -33,40 +33,61 @@ my ($template, $loggedinuser, $cookie) = get_template_and_user({ }); my @ordernumbers = $input->multi_param('ordernumber'); -my @orders; -for my $ordernumber ( @ordernumbers ) { - my $order = GetOrder $ordernumber; - my $order_object = Koha::Acquisition::Orders->find($ordernumber); - my $claims = $order_object->claims; - push @orders, { - orderdate => $order->{orderdate}, - latesince => $order->{latesince}, - estimateddeliverydate => $order->{estimateddeliverydate}, - supplier => $order->{supplier}, - supplierid => $order->{supplierid}, - title => $order->{title}, - author => $order->{author}, - publisher => $order->{publisher}, - unitpricesupplier => $order->{unitpricesupplier}, - quantity_to_receive => $order->{quantity_to_receive}, - subtotal => $order->{subtotal}, - budget => $order->{budget}, - basketname => $order->{basketname}, - basketno => $order->{basketno}, - claims_count => $claims->count, - claimed_date => $claims->count ? $claims->last->claimed_on : undef, - internalnote => $order->{order_internalnote}, - vendornote => $order->{order_vendornote}, - isbn => $order->{isbn}, - } - ; -} +my $csv_profile_id = $input->param('csv_profile'); + +unless ( $csv_profile_id ) { + my @orders; + for my $ordernumber ( @ordernumbers ) { + my $order = GetOrder $ordernumber; + my $order_object = Koha::Acquisition::Orders->find($ordernumber); + my $claims = $order_object->claims; + push @orders, { + orderdate => $order->{orderdate}, + latesince => $order->{latesince}, + estimateddeliverydate => $order->{estimateddeliverydate}, + supplier => $order->{supplier}, + supplierid => $order->{supplierid}, + title => $order->{title}, + author => $order->{author}, + publisher => $order->{publisher}, + unitpricesupplier => $order->{unitpricesupplier}, + quantity_to_receive => $order->{quantity_to_receive}, + subtotal => $order->{subtotal}, + budget => $order->{budget}, + basketname => $order->{basketname}, + basketno => $order->{basketno}, + claims_count => $claims->count, + claimed_date => $claims->count ? $claims->last->claimed_on : undef, + internalnote => $order->{order_internalnote}, + vendornote => $order->{order_vendornote}, + isbn => $order->{isbn}, + } + ; + } + + # We want to export using the default profile, using the template acqui/csv/lateorders.tt + print $input->header( + -type => 'text/csv', + -attachment => 'lateorders.csv', + ); + $template->param( orders => \@orders ); + for my $line ( split '\n', $template->output ) { + print "$line\n" unless $line =~ m|^\s*$|; + } + exit; +} else { + my $csv_profile = Koha::CsvProfiles->find($csv_profile_id); + my $content = '[% SET separator = "'.$csv_profile->csv_separator.'" ~%]' . $csv_profile->content; + + my $csv = C4::Letters::_process_tt({ + content => $content, + loops => { aqorders => \@ordernumbers }, + }); -print $input->header( - -type => 'text/csv', - -attachment => 'lateorders.csv', -); -$template->param( orders => \@orders ); -for my $line ( split '\n', $template->output ) { - print "$line\n" unless $line =~ m|^\s*$|; + print $input->header( + -type => 'text/csv', + -attachment => 'lateorders.csv', + ); + print $csv; + exit; } diff --git a/acqui/lateorders.pl b/acqui/lateorders.pl index 1367e175a3..66ac704405 100755 --- a/acqui/lateorders.pl +++ b/acqui/lateorders.pl @@ -54,6 +54,7 @@ use C4::Acquisition; use C4::Letters; use Koha::DateUtils; use Koha::Acquisition::Orders; +use Koha::CsvProfiles; my $input = new CGI; my ($template, $loggedinuser, $cookie) = get_template_and_user( @@ -172,5 +173,6 @@ $template->param( estimateddeliverydatefrom => $estimateddeliverydatefrom, estimateddeliverydateto => $estimateddeliverydateto, intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"), + csv_profiles => [ Koha::CsvProfiles->search({ type => 'sql', used_for => 'late_orders' }) ], ); output_html_with_http_headers $input, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/lateorders.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/lateorders.tt index a3f2f0a462..60e3168b96 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/lateorders.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/lateorders.tt @@ -182,8 +182,20 @@

- - +

+ Export as CSV + + +
+ +

[% ELSE %]

There are no late orders.

@@ -293,7 +305,7 @@ $('#CheckNone').click(function(){ $(late_orderst.fnGetNodes()).find("td").unCheckCheckboxes();}); // Generates a dynamic link for exporting the selection's data as CSV - $("#ExportSelected").click(function() { + $("#exportbutton, #export-csv-menu a").click(function() { var all_nodes = $(late_orderst.fnGetNodes()); var selected = $(all_nodes).find("input[name='ordernumber']:checked"); @@ -302,11 +314,14 @@ return false; } + var url = $('#exportbutton').attr('href') + '?'; // Building the url from currently checked boxes - var url = '/cgi-bin/koha/acqui/lateorders-export.pl?op=export'; for (var i = 0; i < selected.length; i++) { url += '&ordernumber=' + selected[i].value; } + if($(this).attr("data-value")) { + url += '&csv_profile=' + $(this).attr("data-value"); + } // And redirecting to the CSV page location.href = url; return false; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/csv-profiles.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/csv-profiles.tt index 8a1bea429d..6365ede514 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/csv-profiles.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/csv-profiles.tt @@ -92,6 +92,7 @@ [% BLOCK used_for_description %] [% IF used_for_code == 'export_records' %] Export records [% ELSIF used_for_code == 'late_issues' %] Late serial issues claims + [% ELSIF used_for_code == 'late_orders' %] Export late orders [% ELSIF used_for_code == 'export_basket' %] Basket export in acquisition [% ELSIF used_for_code == 'export_lost_items' %] Export lost items in report [% ELSE %] Unknown usage @@ -134,7 +135,7 @@
  • You have to define which fields you want to export, separated by pipes.

    You can also use your own headers (instead of the ones from Koha) by prefixing the field name with an header, followed by the equal sign.

    Example: Name=subscription.name|Title=subscription.title|Issue number=serial.serialseq

    For late issues claims you can use data from following tables: serial, subscription, biblio, biblioitems and aqbookseller.

    For basket exports you can use data from following tables: biblio, biblioitems, aqorders, aqbudgets and aqbasket.

    +

    For late orders exports you must provide a Template Toolkit syntax that will generate the whole CSV file..

  • @@ -263,7 +265,7 @@ [% csv_profile.export_format_id | html %] [% csv_profile.profile | html %] [% csv_profile.description | html %] - [% csv_profile.content | html %] + [% csv_profile.content | html | html_line_break %] [% csv_profile.csv_separator | html %] [% PROCESS type_description type_code = csv_profile.type %] [% PROCESS used_for_description used_for_code = csv_profile.used_for %] -- 2.39.5