X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=acqui%2Faddorder.pl;h=d0ac3cbe2fb30e558a013c5dd1d2f95ef22f1365;hb=7d31f77ae6d1f136c58e55fa06139ac366fc6b85;hp=16fc89c1ebb07b6ccacbcc3eb95491d3e02c626f;hpb=cc37c04bf3cd7afb61e53cffd58c079fa43af4f2;p=koha-ffzg.git diff --git a/acqui/addorder.pl b/acqui/addorder.pl index 16fc89c1eb..d0ac3cbe2f 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 @@ -121,23 +119,33 @@ if it is an order from an existing suggestion : the id of this suggestion. 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 Koha::Acquisition::Currencies; +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'); @@ -147,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; @@ -160,7 +176,6 @@ unless($confirm_budget_exceeding) { template_name => "acqui/addorder.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => {acquisition => 'order_manage'}, }); @@ -217,76 +232,141 @@ 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'), +}; + +$orderinfo->{uncertainprice} ||= 0; $orderinfo->{subscriptionid} ||= undef; 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 ( $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 ''; + $orderinfo->{estimated_delivery_date} = $orderinfo->{estimated_delivery_date} ? dt_from_string($orderinfo->{estimated_delivery_date}) : undef; - $orderinfo = C4::Acquisition::populate_order_with_prices( - { - order => $orderinfo, - booksellerid => $orderinfo->{booksellerid}, - ordering => 1, - } - ); + my $order; + my $log_action_name; - # 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 ); - - ModOrderUsers( $orderinfo->{ordernumber}, @order_users ); + $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->store; + $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 ($basket->effective_create_items eq 'ordering') { @@ -296,8 +376,6 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) { my @field_values = $input->multi_param('field_value'); my @serials = $input->multi_param('serial'); my @itemid = $input->multi_param('itemid'); - my @ind_tag = $input->multi_param('ind_tag'); - my @indicator = $input->multi_param('indicator'); #Rebuilding ALL the data for items into a hash # parting them on $itemid. @@ -308,18 +386,16 @@ if ( $basket->{is_standing} || $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}->{'indicator'}, - $itemhash{$item}->{'ind_tag'}, + undef, + undef, 'ITEM'); my $record=MARC::Record::new_from_xml($xml, 'UTF-8'); my ($barcodefield,$barcodesubfield) = GetMarcFromKohaField('items.barcode'); @@ -346,8 +422,18 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) { } +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});