X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=acqui%2Faddorder.pl;h=25fd4b3109dc00cc8566e7f937ce74214301de26;hb=28c9f9e1aa526229159480944035b24665016e9a;hp=5a5cd9d67b4d06e8649422e3b6b83f79cfe67b41;hpb=fc70c3a4bc9175c2f4f250aeb0bd40ae048df721;p=koha-ffzg.git diff --git a/acqui/addorder.pl b/acqui/addorder.pl index 5a5cd9d67b..25fd4b3109 100755 --- a/acqui/addorder.pl +++ b/acqui/addorder.pl @@ -32,9 +32,7 @@ It is called by : =over -=item neworderbiblio.pl to add an order from nothing. - -=item neworderempty.pl to add an order from an existing biblio. +=item neworderempty.pl to add an order from an existing record or from nothing. =item newordersuggestion.pl to add an order from an existing suggestion. @@ -74,7 +72,7 @@ the ISBN of the record ordered. =item C the quantity to order. -=item C +=item C the price of this order. =item C @@ -119,23 +117,35 @@ if it is an order from an existing suggestion : the id of this suggestion. =cut -use strict; -use warnings; +use Modern::Perl; use CGI qw ( -utf8 ); -use C4::Auth; # get_template_and_user -use C4::Acquisition; # ModOrder -use C4::Suggestions; # ModStatus -use C4::Biblio; # AddBiblio TransformKohaToMarc -use C4::Budgets; -use C4::Items; -use C4::Output; +use JSON qw ( to_json encode_json ); +use C4::Auth qw( get_template_and_user ); +use C4::Acquisition qw( FillWithDefaultValues ModOrderUsers ); +use C4::Suggestions qw( ModSuggestion ); +use C4::Biblio qw( + AddBiblio + GetMarcFromKohaField + TransformHtmlToXml + TransformKohaToMarc +); +use C4::Budgets qw( GetBudget GetBudgetSpent GetBudgetOrdered ); +use C4::Items qw( AddItemFromMarc ); +use C4::Output qw( output_html_with_http_headers ); +use C4::Log qw( logaction ); +use Koha::Acquisition::Currencies qw( get_active ); +use Koha::Acquisition::Orders; +use Koha::Acquisition::Baskets; +use C4::Barcodes; +use Koha::DateUtils qw( dt_from_string ); ### "-------------------- addorder.pl ----------" # FIXME: This needs to do actual error checking and possibly return user to the same form, # not just blindly call C4 functions and print a redirect. -my $input = new CGI; +my $input = CGI->new; +my $use_ACQ_framework = $input->param('use_ACQ_framework'); # Check if order total amount exceed allowed budget my $confirm_budget_exceeding = $input->param('confirm_budget_exceeding'); @@ -145,6 +155,14 @@ unless($confirm_budget_exceeding) { my $budget = GetBudget($budget_id); my $budget_spent = GetBudgetSpent($budget_id); my $budget_ordered = GetBudgetOrdered($budget_id); + + my $ordernumber = $input->param('ordernumber'); + if ( $ordernumber ) { + # modifying an existing order so remove order price from $budget_ordered + my $order = Koha::Acquisition::Orders->find($ordernumber); + $budget_ordered = $budget_ordered - ( $order->ecost_tax_included * $order->quantity ); + } + my $budget_used = $budget_spent + $budget_ordered; my $budget_remaining = $budget->{budget_amount} - $budget_used; my $budget_encumbrance = $budget->{budget_amount} * $budget->{budget_encumb} / 100; @@ -158,7 +176,6 @@ unless($confirm_budget_exceeding) { template_name => "acqui/addorder.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => {acquisition => 'order_manage'}, }); @@ -173,7 +190,7 @@ unless($confirm_budget_exceeding) { foreach (keys %$vars) { push @vars_loop, { name => $_, - values => [$input->param($_)], + values => [ $input->multi_param($_) ], }; } @@ -188,11 +205,11 @@ unless($confirm_budget_exceeding) { if( ($budget_expenditure+0) && ($budget_used + $total) > $budget_expenditure && $total <= $budget_remaining ) { - my $currency = GetCurrency; + my $currency = Koha::Acquisition::Currencies->get_active; $template->param( expenditure_exceeded => 1, expenditure => sprintf("%.2f", $budget_expenditure), - currency => ($currency) ? $currency->{'symbol'} : '', + currency => ($currency) ? $currency->symbol : '', ); } if($total > $budget_remaining){ @@ -215,77 +232,150 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( template_name => "acqui/booksellers.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => { acquisition => 'order_manage' }, - debug => 1, } ); # get CGI parameters -my $orderinfo = $input->Vars; -$orderinfo->{'list_price'} ||= 0; -$orderinfo->{'uncertainprice'} ||= 0; +my $orderinfo = { + ordernumber => scalar $input->param('ordernumber'), + basketno => scalar $input->param('basketno'), + biblionumber => scalar $input->param('biblionumber'), + invoiceid => scalar $input->param('invoiceid'), + quantity => scalar $input->param('quantity'), + budget_id => scalar $input->param('budget_id'), + currency => scalar $input->param('currency'), + listprice => scalar $input->param('listprice'), + uncertainprice => scalar $input->param('uncertainprice'), + tax_rate_on_ordering => scalar $input->param('tax_rate'), + discount => scalar $input->param('discount'), + rrp => scalar $input->param('rrp'), + replacementprice => scalar $input->param('replacementprice'), + ecost => scalar $input->param('ecost'), + unitprice => scalar $input->param('unitprice'), + order_internalnote => scalar $input->param('order_internalnote'), + order_vendornote => scalar $input->param('order_vendornote'), + sort1 => scalar $input->param('sort1'), + sort2 => scalar $input->param('sort2'), + subscriptionid => scalar $input->param('subscriptionid'), + estimated_delivery_date => scalar $input->param('estimated_delivery_date'), +}; + +$orderinfo->{uncertainprice} ||= 0; $orderinfo->{subscriptionid} ||= undef; -my $user = $input->remote_user; +my $user = $input->remote_user; +my $basketno = $$orderinfo{basketno}; +my $basket = Koha::Acquisition::Baskets->find($basketno); + +# Order related fields we're going to log +my @log_order_fields = ( + 'quantity', + 'listprice', + 'unitprice', + 'unitprice_tax_excluded', + 'unitprice_tax_included', + 'rrp', + 'replacementprice', + 'rrp_tax_excluded', + 'rrp_tax_included', + 'ecost', + 'ecost_tax_excluded', + 'ecost_tax_included', + 'tax_rate_on_ordering' +); # create, modify or delete biblio # create if $quantity>0 and $existing='no' # modify if $quantity>0 and $existing='yes' -if ( $orderinfo->{quantity} ne '0' ) { +if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) { #TODO:check to see if biblio exists unless ( $$orderinfo{biblionumber} ) { - #if it doesn't create it - my $record = TransformKohaToMarc( - { - "biblio.title" => "$$orderinfo{title}", - "biblio.author" => $$orderinfo{author} ? $$orderinfo{author} : "", - "biblio.seriestitle" => $$orderinfo{series} ? $$orderinfo{series} : "", - "biblioitems.isbn" => $$orderinfo{isbn} ? $$orderinfo{isbn} : "", - "biblioitems.ean" => $$orderinfo{ean} ? $$orderinfo{ean} : "", - "biblioitems.publishercode" => $$orderinfo{publishercode} ? $$orderinfo{publishercode} : "", - "biblioitems.publicationyear" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "", - "biblio.copyrightdate" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "", - "biblioitems.itemtype" => $$orderinfo{itemtype} ? $$orderinfo{itemtype} : "", - "biblioitems.editionstatement"=> $$orderinfo{editionstatement} ? $$orderinfo{editionstatement} : "", - }); + my $record; + if ( $use_ACQ_framework ) { + my @tags = $input->multi_param('bib_tag'); + my @subfields = $input->multi_param('bib_subfield'); + my @field_values = $input->multi_param('bib_field_value'); + my $xml = TransformHtmlToXml( \@tags, \@subfields, \@field_values ); + $record=MARC::Record::new_from_xml($xml, 'UTF-8'); + } else { + #if it doesn't create it + $record = TransformKohaToMarc( + { + "biblio.title" => $input->param('title') || '', + "biblio.author" => $input->param('author') || '', + "biblio.seriestitle" => $input->param('series') || '', + "biblioitems.isbn" => $input->param('isbn') || '', + "biblioitems.ean" => $input->param('ean') || '', + "biblioitems.publishercode" => $input->param('publishercode') || '', + "biblioitems.publicationyear" => $input->param('publicationyear') || '', + "biblio.copyrightdate" => $input->param('publicationyear') || '', + "biblioitems.itemtype" => $input->param('itemtype') || '', + "biblioitems.editionstatement"=> $input->param('editionstatement') || '', + } + ); + } C4::Acquisition::FillWithDefaultValues( $record ); # create the record in catalogue, with framework '' my ($biblionumber,$bibitemnum) = AddBiblio($record,''); - # change suggestion status if applicable - if ($$orderinfo{suggestionid}) { - ModSuggestion( {suggestionid=>$$orderinfo{suggestionid}, STATUS=>'ORDERED', biblionumber=>$biblionumber} ); - } + $orderinfo->{biblionumber}=$biblionumber; } + # change suggestion status if applicable + if ( my $suggestionid = $input->param('suggestionid') ) { + ModSuggestion( + { + suggestionid => $suggestionid, + biblionumber => $orderinfo->{biblionumber}, + STATUS => 'ORDERED', + } + ); + } + $orderinfo->{unitprice} = $orderinfo->{ecost} if not defined $orderinfo->{unitprice} or $orderinfo->{unitprice} eq ''; - # if we already have $ordernumber, then it's an ordermodif - my $order = Koha::Acquisition::Order->new($orderinfo); - if ( $orderinfo->{ordernumber} ) { - ModOrder($orderinfo); - my $order_users_ids = $input->param('users_ids'); - my @order_users = split( /:/, $order_users_ids ); + my $order; + my $log_action_name; - ModOrderUsers( $orderinfo->{ordernumber}, @order_users ); + if ( $orderinfo->{ordernumber} ) { + $order = Koha::Acquisition::Orders->find($orderinfo->{ordernumber}); + $order->set($orderinfo); + $log_action_name = 'MODIFY_ORDER'; + } else { + $order = Koha::Acquisition::Order->new($orderinfo); + $log_action_name = 'CREATE_ORDER'; } - else { # else, it's a new line - $order->insert; + $order->populate_with_prices_for_ordering(); + $order->store; + + # Log the order creation + if (C4::Context->preference("AcquisitionLog")) { + my $infos = {}; + foreach my $field(@log_order_fields) { + $infos->{$field} = $order->$field; + } + logaction( + 'ACQUISITIONS', + $log_action_name, + $order->ordernumber, + encode_json($infos) + ); } + my $order_users_ids = $input->param('users_ids'); + my @order_users = split( /:/, $order_users_ids ); + ModOrderUsers( $order->ordernumber, @order_users ); # now, add items if applicable - if (C4::Context->preference('AcqCreateItem') eq 'ordering') { - - my @tags = $input->param('tag'); - my @subfields = $input->param('subfield'); - my @field_values = $input->param('field_value'); - my @serials = $input->param('serial'); - my @itemid = $input->param('itemid'); - my @ind_tag = $input->param('ind_tag'); - my @indicator = $input->param('indicator'); + if ($basket->effective_create_items eq 'ordering') { + + my @tags = $input->multi_param('tag'); + my @subfields = $input->multi_param('subfield'); + my @field_values = $input->multi_param('field_value'); + my @serials = $input->multi_param('serial'); + my @itemid = $input->multi_param('itemid'); #Rebuilding ALL the data for items into a hash # parting them on $itemid. @@ -296,21 +386,35 @@ if ( $orderinfo->{quantity} ne '0' ) { unless ($itemhash{$itemid[$i]}){ $countdistinct++; } - push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i]; - push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i]; + push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i]; + push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i]; push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i]; - push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i]; - push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i]; } foreach my $item (keys %itemhash){ - my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'}, $itemhash{$item}->{'subfields'}, $itemhash{$item}->{'field_values'}, - $itemhash{$item}->{'ind_tag'}, - $itemhash{$item}->{'indicator'}, + undef, + undef, 'ITEM'); my $record=MARC::Record::new_from_xml($xml, 'UTF-8'); + my ($barcodefield,$barcodesubfield) = GetMarcFromKohaField('items.barcode'); + next unless ( defined $barcodefield && defined $barcodesubfield ); + my $barcode = $record->subfield($barcodefield,$barcodesubfield) || ''; + my $aBpref = C4::Context->preference('autoBarcode'); + if( $barcode eq '' && $aBpref ne 'OFF'){ + my $barcodeobj; + if ( $aBpref eq 'hbyymmincr'){ + my ($homebranchfield,$homebranchsubfield) = GetMarcFromKohaField('items.homebranch'); + my $homebranch = $record->subfield($homebranchfield,$homebranchsubfield); + $barcodeobj = C4::Barcodes->new($aBpref, $homebranch); + } else { + $barcodeobj = C4::Barcodes->new($aBpref); + } + $barcode = $barcodeobj->value(); + $record->field($barcodefield)->delete_subfield( code => $barcodesubfield); + $record->field($barcodefield)->add_subfields($barcodesubfield => $barcode); + } my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$$orderinfo{biblionumber}); $order->add_item($itemnumber); } @@ -318,9 +422,18 @@ if ( $orderinfo->{quantity} ne '0' ) { } -my $basketno=$$orderinfo{basketno}; +if (C4::Context->preference("AcquisitionLog") && $basketno) { + my $modified = Koha::Acquisition::Baskets->find( $basketno ); + logaction( + 'ACQUISITIONS', + 'MODIFY_BASKET', + $basketno, + to_json($modified->unblessed) + ); +} + my $booksellerid=$$orderinfo{booksellerid}; -if (my $import_batch_id=$$orderinfo{import_batch_id}) { +if (my $import_batch_id = $input->param('import_batch_id')) { print $input->redirect("/cgi-bin/koha/acqui/addorderiso2709.pl?import_batch_id=$import_batch_id&basketno=$basketno&booksellerid=$booksellerid"); } elsif ( defined $orderinfo->{invoiceid} ) { print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=" . $orderinfo->{invoiceid});