# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-use strict;
-use warnings;
+use Modern::Perl;
use CGI;
use Carp;
use Number::Format qw(:all);
+use YAML qw/Load/;
use C4::Context;
use C4::Auth;
use C4::Members;
my $input = new CGI;
-my ($template, $loggedinuser, $cookie) = get_template_and_user({
- template_name => "acqui/addorderiso2709.tmpl",
- query => $input,
- type => "intranet",
- authnotrequired => 0,
- flagsrequired => { acquisition => 'order_manage' },
- debug => 1,
- });
+my ($template, $loggedinuser, $cookie, $userflags) = get_template_and_user({
+ template_name => "acqui/addorderiso2709.tmpl",
+ query => $input,
+ type => "intranet",
+ authnotrequired => 0,
+ flagsrequired => { acquisition => 'order_manage' },
+ debug => 1,
+});
+
my $cgiparams = $input->Vars;
-my $op = $cgiparams->{'op'};
+my $op = $cgiparams->{'op'} || '';
my $booksellerid = $input->param('booksellerid');
my $bookseller = GetBookSellerFromId($booksellerid);
my $data;
booksellerid => $booksellerid,
booksellername => $bookseller->{name},
);
-my $ordernumber;
if ($cgiparams->{'import_batch_id'} && $op eq ""){
$op = "batch_details";
loop_currencies => \@loop_currency,
);
import_biblios_list($template, $cgiparams->{'import_batch_id'});
- if ( C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordernumber ) {
+ if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
# prepare empty item form
my $cell = PrepareItemrecordDisplay( '', '', '', 'ACQ' );
# retrieve the file you want to import
my $import_batch_id = $cgiparams->{'import_batch_id'};
- my $biblios = GetImportBibliosRange($import_batch_id);
+ my $biblios = GetImportRecordsRange($import_batch_id);
+ my @import_record_id_selected = $input->param("import_record_id");
+ my @quantities = $input->param('quantity');
+ my @prices = $input->param('price');
+ my @budgets_id = $input->param('budget_id');
+ my @discount = $input->param('discount');
+ my @sort1 = $input->param('sort1');
+ my @sort2 = $input->param('sort2');
+ my $cur = GetCurrency();
for my $biblio (@$biblios){
- # 1st insert the biblio, or find it through matcher
+ # Check if this import_record_id was selected
+ next if not grep { $_ eq $$biblio{import_record_id} } @import_record_id_selected;
my ( $marcblob, $encoding ) = GetImportRecordMarc( $biblio->{'import_record_id'} );
my $marcrecord = MARC::Record->new_from_usmarc($marcblob) || die "couldn't translate marc information";
my $match = GetImportRecordMatches( $biblio->{'import_record_id'}, 1 );
my $biblionumber=$#$match > -1?$match->[0]->{'biblionumber'}:0;
+ my $c_quantity = shift( @quantities ) || GetMarcQuantity($marcrecord, C4::Context->preference('marcflavour') ) || 1;
+ my $c_budget_id = shift( @budgets_id ) || $input->param('all_budget_id') || $budget_id;
+ my $c_discount = shift ( @discount);
+ $c_discount = $c_discount / 100 if $c_discount > 1;
+ my $c_sort1 = shift( @sort1 ) || $input->param('all_sort1') || '';
+ my $c_sort2 = shift( @sort2 ) || $input->param('all_sort2') || '';
+ # 1st insert the biblio, or find it through matcher
unless ( $biblionumber ) {
# add the biblio
my $bibitemnum;
# remove ISBN -
- my ( $isbnfield, $isbnsubfield ) = GetMarcFromKohaField( 'biblioitems.isbn', '' );
+ my ( $isbnfield, $isbnsubfield ) = GetMarcFromKohaField( 'biblioitems.isbn', '' );
if ( $marcrecord->field($isbnfield) ) {
foreach my $field ( $marcrecord->field($isbnfield) ) {
foreach my $subfield ( $field->subfield($isbnsubfield) ) {
SetImportRecordStatus( $biblio->{'import_record_id'}, 'imported' );
}
# 3rd add order
- my $patron = C4::Members->GetMember( borrowernumber => $loggedinuser );
+ my $patron = C4::Members::GetMember( borrowernumber => $loggedinuser );
my $branch = C4::Branch->GetBranchDetail( $patron->{branchcode} );
- my ($invoice);
# get quantity in the MARC record (1 if none)
my $quantity = GetMarcQuantity($marcrecord, C4::Context->preference('marcflavour')) || 1;
my %orderinfo = (
- "biblionumber", $biblionumber, "basketno", $cgiparams->{'basketno'},
- "quantity", $quantity, "branchcode", $branch,
- "booksellerinvoicenumber", $invoice,
- "budget_id", $budget_id, "uncertainprice", 1,
- "sort1", $cgiparams->{'sort1'},"sort2", $cgiparams->{'sort2'},
- "notes", $cgiparams->{'notes'}, "budget_id", $cgiparams->{'budget_id'},
- "currency",$cgiparams->{'currency'},
+ biblionumber => $biblionumber,
+ basketno => $cgiparams->{'basketno'},
+ quantity => $c_quantity,
+ branchcode => $patron->{branchcode},
+ budget_id => $c_budget_id,
+ uncertainprice => 1,
+ sort1 => $c_sort1,
+ sort2 => $c_sort2,
+ order_internalnote => $cgiparams->{'all_order_internalnote'},
+ order_vendornote => $cgiparams->{'all_order_vendornote'},
+ currency => $cgiparams->{'all_currency'},
);
# get the price if there is one.
- # filter by storing only the 1st number
- # we suppose the currency is correct, as we have no possibilities to get it.
- my $price= GetMarcPrice($marcrecord, C4::Context->preference('marcflavour'));
+ my $price= shift( @prices ) || GetMarcPrice($marcrecord, C4::Context->preference('marcflavour'));
if ($price){
+ # in France, the cents separator is the , but sometimes, ppl use a .
+ # in this case, the price will be x100 when unformatted ! Replace the . by a , to get a proper price calculation
+ $price =~ s/\./,/ if C4::Context->preference("CurrencyFormat") eq "FR";
$price = $num->unformat_number($price);
- }
- if ($price){
- $orderinfo{'listprice'} = $price;
- eval {
- require C4::Acquisition;
- import C4::Acquisition qw/GetBasket/;
- };
- if ($@){
- croak $@;
- }
- eval {
- require C4::Bookseller;
- import C4::Bookseller qw/GetBookSellerFromId/;
- };
- if ($@){
- croak $@;
- }
- my $basket = GetBasket( $orderinfo{basketno} );
- my $bookseller = GetBookSellerFromId( $basket->{booksellerid} );
- my $gst = $bookseller->{gstrate} || C4::Context->preference("gist") || 0;
- $orderinfo{'unitprice'} = $orderinfo{listprice} - ( $orderinfo{listprice} * ( $bookseller->{discount} / 100 ) );
- $orderinfo{'ecost'} = $orderinfo{unitprice};
+ $orderinfo{gstrate} = $bookseller->{gstrate};
+ my $c = $c_discount ? $c_discount : $bookseller->{discount} / 100;
+ if ( $bookseller->{listincgst} ) {
+ if ( $c_discount ) {
+ $orderinfo{ecost} = $price;
+ $orderinfo{rrp} = $orderinfo{ecost} / ( 1 - $c );
+ } else {
+ $orderinfo{ecost} = $price * ( 1 - $c );
+ $orderinfo{rrp} = $price;
+ }
+ } else {
+ if ( $c_discount ) {
+ $orderinfo{ecost} = $price / ( 1 + $orderinfo{gstrate} );
+ $orderinfo{rrp} = $orderinfo{ecost} / ( 1 - $c );
+ } else {
+ $orderinfo{rrp} = $price / ( 1 + $orderinfo{gstrate} );
+ $orderinfo{ecost} = $orderinfo{rrp} * ( 1 - $c );
+ }
+ }
+ $orderinfo{listprice} = $orderinfo{rrp} / $cur->{rate};
+ $orderinfo{unitprice} = $orderinfo{ecost};
+ $orderinfo{total} = $orderinfo{ecost} * $c_quantity;
} else {
- $orderinfo{'listprice'} = 0;
+ $orderinfo{listprice} = 0;
}
- $orderinfo{'rrp'} = $orderinfo{'listprice'};
# remove uncertainprice flag if we have found a price in the MARC record
$orderinfo{uncertainprice} = 0 if $orderinfo{listprice};
- my $basketno;
- ( $basketno, $ordernumber ) = NewOrder( \%orderinfo );
+ my ( $basketno, $ordernumber ) = NewOrder( \%orderinfo );
# 4th, add items if applicable
# parse the item sent by the form, and create an item just for the import_record_id we are dealing with
push @{ $item->{indicator} }, $indicator[0];
my $xml = TransformHtmlToXml( \@tags, \@subfields, \@field_values, \@ind_tag, \@indicator );
my $record = MARC::Record::new_from_xml( $xml, 'UTF-8' );
- for (my $qtyloop=1;$qtyloop <=$quantity;$qtyloop++) {
+ for (my $qtyloop=1;$qtyloop <= $c_quantity;$qtyloop++) {
my ( $biblionumber, $bibitemnum, $itemnumber ) = AddItemFromMarc( $record, $biblionumber );
NewOrderItem( $itemnumber, $ordernumber );
}
# build budget list
my $budget_loop = [];
-$budgets = GetBudgetHierarchy( q{}, $borrower->{branchcode}, $borrower->{borrowernumber} );
-foreach my $r ( @{$budgets} ) {
+my $budgets_hierarchy = GetBudgetHierarchy;
+foreach my $r ( @{$budgets_hierarchy} ) {
+ next unless (CanUserUseBudget($borrower, $r, $userflags));
if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
next;
}
push @{$budget_loop},
{ b_id => $r->{budget_id},
b_txt => $r->{budget_name},
+ b_sort1_authcat => $r->{'sort1_authcat'},
+ b_sort2_authcat => $r->{'sort2_authcat'},
+ b_active => $r->{budget_period_active},
b_sel => ( $r->{budget_id} == $budget_id ) ? 1 : 0,
};
}
-$template->param( budget_loop => $budget_loop,);
-
-my $CGIsort1;
-if ($budget) { # its a mod ..
- if ( defined $budget->{'sort1_authcat'} ) { # with custom Asort* planning values
- $CGIsort1 = GetAuthvalueDropbox( $budget->{'sort1_authcat'}, $data->{'sort1'} );
- }
-} elsif ( scalar(@$budgets) ) {
- $CGIsort1 = GetAuthvalueDropbox( @$budgets[0]->{'sort1_authcat'}, '' );
-} else {
- $CGIsort1 = GetAuthvalueDropbox( '', '' );
-}
-
-# if CGIsort is successfully fetched, the use it
-# else - failback to plain input-field
-if ($CGIsort1) {
- $template->param( CGIsort1 => $CGIsort1 );
-} else {
- $template->param( sort1 => $data->{'sort1'} );
-}
-my $CGIsort2;
-if ($budget) {
- if ( defined $budget->{'sort2_authcat'} ) {
- $CGIsort2 = GetAuthvalueDropbox( $budget->{'sort2_authcat'}, $data->{'sort2'} );
- }
-} elsif ( scalar(@$budgets) ) {
- $CGIsort2 = GetAuthvalueDropbox( @$budgets[0]->{sort2_authcat}, '' );
-} else {
- $CGIsort2 = GetAuthvalueDropbox( '', '' );
-}
+@{$budget_loop} =
+ sort { uc( $a->{b_txt}) cmp uc( $b->{b_txt}) } @{$budget_loop};
-if ($CGIsort2) {
- $template->param( CGIsort2 => $CGIsort2 );
-} else {
- $template->param( sort2 => $data->{'sort2'} );
-}
+$template->param( budget_loop => $budget_loop,);
output_html_with_http_headers $input, $cookie, $template->output;
my @list = ();
foreach my $batch (@$batches) {
- if ($batch->{'import_status'} eq "staged") {
+ if ( $batch->{'import_status'} =~ /^staged$|^reverted$/ ) {
# check if there is at least 1 line still staged
- my $stagedList=GetImportBibliosRange($batch->{'import_batch_id'}, undef, undef, 'staged');
+ my $stagedList=GetImportRecordsRange($batch->{'import_batch_id'}, undef, undef, $batch->{import_status}, { order_by_direction => 'ASC' });
if (scalar @$stagedList) {
- my ($staged_date, $staged_hour) = split (/ /, $batch->{'upload_timestamp'});
push @list, {
import_batch_id => $batch->{'import_batch_id'},
- num_biblios => $batch->{'num_biblios'},
+ num_records => $batch->{'num_records'},
num_items => $batch->{'num_items'},
- staged_date => $staged_date,
- staged_hour => $staged_hour,
+ staged_date => $batch->{'upload_timestamp'},
import_status => $batch->{'import_status'},
file_name => $batch->{'file_name'},
comments => $batch->{'comments'},
sub import_biblios_list {
my ($template, $import_batch_id) = @_;
my $batch = GetImportBatch($import_batch_id,'staged');
- my $biblios = GetImportBibliosRange($import_batch_id,'','','staged');
+ return () unless $batch and $batch->{import_status} =~ /^staged$|^reverted$/;
+ my $biblios = GetImportRecordsRange($import_batch_id,'','',$batch->{import_status});
my @list = ();
foreach my $biblio (@$biblios) {
record_sequence => $biblio->{'record_sequence'},
overlay_status => $biblio->{'overlay_status'},
match_biblionumber => $#$match > -1 ? $match->[0]->{'biblionumber'} : 0,
- match_citation => $#$match > -1 ? $match->[0]->{'title'} . ' ' . $match->[0]->{'author'} : '',
+ match_citation => $#$match > -1 ? $match->[0]->{'title'} || '' . ' ' . $match->[0]->{'author'} || '': '',
match_score => $#$match > -1 ? $match->[0]->{'score'} : 0,
);
+ my ( $marcblob, $encoding ) = GetImportRecordMarc( $biblio->{'import_record_id'} );
+ my $marcrecord = MARC::Record->new_from_usmarc($marcblob) || die "couldn't translate marc information";
+ my $infos = get_infos_syspref($marcrecord, ['price', 'quantity', 'budget_code', 'discount', 'sort1', 'sort2']);
+ my $price = $infos->{price};
+ my $quantity = $infos->{quantity};
+ my $budget_code = $infos->{budget_code};
+ my $discount = $infos->{discount};
+ my $sort1 = $infos->{sort1};
+ my $sort2 = $infos->{sort2};
+ my $budget_id;
+ if($budget_code) {
+ my $biblio_budget = GetBudgetByCode($budget_code);
+ if($biblio_budget) {
+ $budget_id = $biblio_budget->{budget_id};
+ }
+ }
+ $cellrecord{price} = $price || '';
+ $cellrecord{quantity} = $quantity || '';
+ $cellrecord{budget_id} = $budget_id || '';
+ $cellrecord{discount} = $discount || '';
+ $cellrecord{sort1} = $sort1 || '';
+ $cellrecord{sort2} = $sort2 || '';
+
push @list, \%cellrecord;
}
- my $num_biblios = $batch->{'num_biblios'};
+ my $num_records = $batch->{'num_records'};
my $overlay_action = GetImportBatchOverlayAction($import_batch_id);
my $nomatch_action = GetImportBatchNoMatchAction($import_batch_id);
my $item_action = GetImportBatchItemAction($import_batch_id);
$template->param(biblio_list => \@list,
- num_results => $num_biblios,
+ num_results => $num_records,
import_batch_id => $import_batch_id,
"overlay_action_${overlay_action}" => 1,
overlay_action => $overlay_action,
comments => $batch->{'comments'},
import_status => $batch->{'import_status'},
upload_timestamp => $batch->{'upload_timestamp'},
- num_biblios => $batch->{'num_biblios'},
- num_items => $batch->{'num_biblios'});
- if ($batch->{'num_biblios'} > 0) {
+ num_records => $batch->{'num_records'},
+ num_items => $batch->{'num_items'});
+ if ($batch->{'num_records'} > 0) {
if ($batch->{'import_status'} eq 'staged' or $batch->{'import_status'} eq 'reverted') {
$template->param(can_commit => 1);
}
'current_matcher_description' => $matcher->description());
}
}
- add_matcher_list($batch->{'matcher_id'});
+ add_matcher_list($batch->{'matcher_id'}, $template);
}
sub add_matcher_list {
- my $current_matcher_id = shift;
+ my ($current_matcher_id, $template) = @_;
my @matchers = C4::Matcher::GetMatcherList();
if (defined $current_matcher_id) {
for (my $i = 0; $i <= $#matchers; $i++) {
}
$template->param(available_matchers => \@matchers);
}
+
+sub get_infos_syspref {
+ my ($record, $field_list) = @_;
+ my $syspref = C4::Context->preference('MarcFieldsToOrder');
+ $syspref = "$syspref\n\n"; # YAML is anal on ending \n. Surplus does not hurt
+ my $yaml = eval {
+ YAML::Load($syspref);
+ };
+ if ( $@ ) {
+ warn "Unable to parse MarcFieldsToOrder syspref : $@";
+ return ();
+ }
+ my $r;
+ for my $field_name ( @$field_list ) {
+ next unless exists $yaml->{$field_name};
+ my @fields = split /\|/, $yaml->{$field_name};
+ for my $field ( @fields ) {
+ my ( $f, $sf ) = split /\$/, $field;
+ next unless $f and $sf;
+ if ( my $v = $record->subfield( $f, $sf ) ) {
+ $r->{$field_name} = $v;
+ }
+ last if $yaml->{$field};
+ }
+ }
+ return $r;
+}