From e288d6a7385eaf40f4a2fc0a662e203ba8124494 Mon Sep 17 00:00:00 2001 From: Paul Poulain Date: Tue, 28 Apr 2009 22:22:46 +0200 Subject: [PATCH] neworderempty, changes * deal with import from staged file * deal with z3950 import * deal with granular permissions * deal with uncertain price * deal with create item if SysPref set to create items on ordering --- acqui/fetch_sort_dropbox.pl | 64 ++++ acqui/neworderempty.pl | 301 +++++++++++++++--- .../prog/en/modules/acqui/neworderempty.tmpl | 238 ++++++++------ 3 files changed, 466 insertions(+), 137 deletions(-) create mode 100755 acqui/fetch_sort_dropbox.pl diff --git a/acqui/fetch_sort_dropbox.pl b/acqui/fetch_sort_dropbox.pl new file mode 100755 index 0000000000..e052db85f8 --- /dev/null +++ b/acqui/fetch_sort_dropbox.pl @@ -0,0 +1,64 @@ +#!/usr/bin/perl + +# Copyright 2008-2009 BibLibre SARL +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +use strict; +use CGI; +use C4::Context; +use C4::Output; +use C4::Auth; +use C4::Budgets; + +=head1 + +fetch_sort_dropbox : + +=cut + +my $input = new CGI; + +my $budget_id = $input->param('budget_id'); +my $sort_id = $input->param('sort'); + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { template_name => "acqui/ajax.tmpl", # FIXME: REMOVE TMPL DEP? + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => {editcatalogue => 1}, + debug => 0, + } +); + +my $sort_dropbox; +my $budget = GetBudget($budget_id); + +if ( $sort_id == 1 ) { + $sort_dropbox = GetAuthvalueDropbox( 'sort1', $budget->{'sort1_authcat'}, '' ); +} elsif ( $sort_id == 2 ) { + $sort_dropbox = GetAuthvalueDropbox( 'sort2', $budget->{'sort2_authcat'}, '' ); +} + +#strip off select tags ;/ +$sort_dropbox =~ s/^\//; +$sort_dropbox =~ s/\<\/select\>$//; +chomp $sort_dropbox; + +$template->param( return => $sort_dropbox ); +output_html_with_http_headers $input, $cookie, $template->output; +1; diff --git a/acqui/neworderempty.pl b/acqui/neworderempty.pl index 3a9043c0f6..7fe321a921 100755 --- a/acqui/neworderempty.pl +++ b/acqui/neworderempty.pl @@ -56,19 +56,26 @@ the basket number for this new order. =item suggestionid if this order comes from a suggestion. +=item breedingid +the item's id in the breeding reservoir + =item close =back =cut +use warnings; use strict; use CGI; use C4::Context; use C4::Input; use C4::Auth; -use C4::Bookfund; +use C4::Budgets; +use C4::Input; +#use C4::Bookfund; + use C4::Bookseller; # GetBookSellerFromId use C4::Acquisition; use C4::Suggestions; # GetSuggestion @@ -78,9 +85,14 @@ use C4::Input; use C4::Koha; use C4::Branch; # GetBranches use C4::Members; +use C4::Search qw/FindDuplicate BiblioAddAuthorities/; + +#needed for z3950 import: +use C4::ImportBatch qw/GetImportRecordMarc/; my $input = new CGI; my $booksellerid = $input->param('booksellerid'); # FIXME: else ERROR! +my $budget_id = $input->param('budget_id'); # FIXME: else ERROR! my $title = $input->param('title'); my $author = $input->param('author'); my $copyright = $input->param('copyright'); @@ -92,8 +104,59 @@ my $purchaseorder= $input->param('purchaseordernumber'); my $suggestionid = $input->param('suggestionid'); # my $donation = $input->param('donation'); my $close = $input->param('close'); +my $uncertainprice = $input->param('uncertainprice'); my $data; -my $new; +my $new = 'no'; + +my $budget_name; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "acqui/neworderempty.tmpl", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { acquisition => 'order_manage' }, + debug => 1, + } +); + +#simple parameters reading (all in one :-) +my $params = $input->Vars; +if ( $ordnum eq '' and defined $params->{'breedingid'}){ +#we want to import from the breeding reservoir (from a z3950 search) + my ($marcrecord, $encoding) = MARCfindbreeding($params->{'breedingid'}); + die("Could not find the selected record in the reservoir, bailing") unless $marcrecord; + + my $duplicatetitle; +#look for duplicates + if (! (($biblionumber,$duplicatetitle) = FindDuplicate($marcrecord))){ + my $itemtypes = GetItemTypes(); + my $marcflavour = C4::Context->preference("marcflavour"); +# warn("$marcflavour----itemtype"."-------------marcflavour".$marcflavour."---------subfield".$marcrecord->subfield('200', 'b')); +#use the itemtype field of the UNIMARC standard. + if ( $marcflavour eq 'UNIMARC' ) { + my $itemtype = $marcrecord->subfield('200', 'b'); +#Check wether the itemtype is known + warn(grep { $itemtypes->{$_}->{itemtype} =~ /$itemtype/ } keys %$itemtypes); + if (scalar(grep { $itemtypes->{$_}->{itemtype} =~ /$itemtype/ } keys %$itemtypes) == 0) { + my @itemtypes = sort {lc($itemtypes->{$a}->{'description'}) cmp lc($itemtypes->{$b}->{'description'})} keys %$itemtypes; + $itemtype = $itemtypes[0]; +# warn(YAML->Dump(@itemtypes)); + $marcrecord->field('200')->update('b' => $itemtype); + } + } + if (C4::Context->preference("BiblioAddsAuthorities")){ + my ($countlinked,$countcreated)=BiblioAddAuthorities($marcrecord, $params->{'frameworkcode'}); + } + my $bibitemnum; + $params->{'frameworkcode'} or $params->{'frameworkcode'} = ""; + ( $biblionumber, $bibitemnum ) = AddBiblio( $marcrecord, $params->{'frameworkcode'} ); + } +} + + +my $cur = GetCurrency(); if ( $ordnum eq '' ) { # create order $new = 'yes'; @@ -112,27 +175,20 @@ if ( $ordnum eq '' ) { # create order else { #modify order $data = GetOrder($ordnum); $biblionumber = $data->{'biblionumber'}; + $budget_id = $data->{'budget_id'}; + #get basketno and supplierno. too! my $data2 = GetBasket( $data->{'basketno'} ); $basketno = $data2->{'basketno'}; $booksellerid = $data2->{'booksellerid'}; } -my ( $template, $loggedinuser, $cookie ) = get_template_and_user( - { - template_name => "acqui/neworderempty.tmpl", - query => $input, - type => "intranet", - authnotrequired => 0, - flagsrequired => { acquisition => 1 }, - debug => 1, - } -); - # get currencies (for change rates calcs if needed) my @rates = GetCurrencies(); my $count = scalar @rates; +# ## @rates + my @loop_currency = (); for ( my $i = 0 ; $i < $count ; $i++ ) { my %line; @@ -141,6 +197,9 @@ for ( my $i = 0 ; $i < $count ; $i++ ) { push @loop_currency, \%line; } + # ## @loop_currency + + # build itemtype list my $itemtypes = GetItemTypes; @@ -170,49 +229,66 @@ $template->param( branchloop => \@branchloop , itypeloop => \@itemtypesloop ); my $borrower= GetMember('borrowernumber' => $loggedinuser); my ( $flags, $homebranch )= ($borrower->{'flags'},$borrower->{'branchcode'}); -my @select_bookfund; -my %select_bookfunds; - -my @bookfund = GetBookFunds($homebranch); -my $count2 = scalar @bookfund; - -for ( my $i = 0 ; $i < $count2 ; $i++ ) { - push @select_bookfund, $bookfund[$i]->{'bookfundid'}; - $select_bookfunds{ $bookfund[$i]->{'bookfundid'} } = - $bookfund[$i]->{'bookfundname'}; +my $budget = GetBudget($budget_id); +# build budget list +my %labels; +my @values; +my $budgets = GetBudgetHierarchy('1','',$borrower->{'borrowernumber'}); +foreach my $r (@$budgets) { + $labels{"$r->{budget_id}"} = $r->{budget_name}; + next if sprintf ("%00d", $r->{budget_amount}) == 0; + push @values, $r->{budget_id}; } -my $CGIbookfund = CGI::scrolling_list( - -name => 'bookfund', - -id => 'bookfund', - -values => \@select_bookfund, - -default => ($data->{'bookfundid'} ? $data->{'bookfundid'} : $select_bookfund[0]), - -labels => \%select_bookfunds, - #-size => 1, - -multiple => 0 +# if no budget_id is passed then its an add +my $budget_dropbox = CGI::scrolling_list( + -name => 'budget_id', + -id => 'budget_id', + -values => \@values, + -size => 1, + -labels => \%labels, + -onChange => "fetchSortDropbox(this.form)", ); -my $bookfundname; -my $bookfundid; if ($close) { - $bookfundid = $data->{'bookfundid'}; - $bookfundname = $select_bookfunds{$bookfundid}; + $budget_id = $data->{'budget_id'}; + $budget_name = $budget->{'budget_name'}; + +} + + +my $CGIsort1; +if ($budget) { # its a mod .. + if ( defined $budget->{'sort1_authcat'} ) { # with custom Asort* planning values + $CGIsort1 = GetAuthvalueDropbox( 'sort1', $budget->{'sort1_authcat'}, $data->{'sort1'} ); + } +} else { + $CGIsort1 = GetAuthvalueDropbox( 'sort1', 'Asort1', '' ); } -#Build sort lists -my $CGIsort1 = buildCGIsort( "Asort1", "sort1", $data->{'sort1'} ); +# 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 = buildCGIsort( "Asort2", "sort2", $data->{'sort2'} ); +my $CGIsort2; +if ($budget) { + if ( defined $budget->{'sort2_authcat'} ) { + $CGIsort2 = GetAuthvalueDropbox( 'sort2', $budget->{'sort2_authcat'}, $data->{'sort2'} ); + } +} else { + $CGIsort2 = GetAuthvalueDropbox( 'sort2', 'Asort2', '' ); +} if ($CGIsort2) { $template->param( CGIsort2 => $CGIsort2 ); } else { $template->param( sort2 => $data->{'sort2'} ); } + + #do a biblioitems lookup on bib my @bibitems = GetBiblioItemByBiblioNumber($biblionumber); my $bibitemscount = scalar @bibitems; @@ -233,14 +309,24 @@ if ( $bibitemscount > 0 ) { $template->param( bibitemexists => "1" ); } +if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordnum) { + # prepare empty item form + my $cell = PrepareItemrecordDisplay(); + my @itemloop; + push @itemloop,$cell; + + $template->param(items => \@itemloop); +} + # fill template $template->param( close => $close, - bookfundid => $bookfundid, - bookfundname => $bookfundname + budget_id => $budget_id, + budget_name => $budget_name ) if ($close); + # ## @loop_currency, $template->param( existing => $biblionumber, ordnum => $ordnum, @@ -248,38 +334,157 @@ $template->param( booksellerid => $booksellerid, suggestionid => $suggestionid, biblionumber => $biblionumber, + uncertainprice => $data->{'uncertainprice'}, authorisedbyname => $borrower->{'firstname'} . " " . $borrower->{'surname'}, biblioitemnumber => $data->{'biblioitemnumber'}, itemtype => $data->{'itemtype'}, itemtype_desc => $itemtypes->{$data->{'itemtype'}}->{description}, + discount_2dp => sprintf( "%.2f", $bookseller->{'discount'}) , # for display discount => $bookseller->{'discount'}, listincgst => $bookseller->{'listincgst'}, - listprice => $bookseller->{'listprice'}, - gstreg => $bookseller->{'gstreg'}, - invoiceinc => $bookseller->{'invoiceincgst'}, + invoiceincgst => $bookseller->{'invoiceincgst'}, invoicedisc => $bookseller->{'invoicedisc'}, nocalc => $bookseller->{'nocalc'}, name => $bookseller->{'name'}, - currency => $bookseller->{'listprice'}, - gstrate => C4::Context->preference("gist") || 0, + cur_active_sym => $cur->{symbol}, + cur_active => $cur->{currency}, + currency => $bookseller->{'listprice'}, # eg: 'EUR' loop_currencies => \@loop_currency, orderexists => ( $new eq 'yes' ) ? 0 : 1, title => $data->{'title'}, author => $data->{'author'}, copyrightdate => $data->{'copyrightdate'}, - CGIbookfund => $CGIbookfund, + budget_dropbox => $budget_dropbox, isbn => $data->{'isbn'}, seriestitle => $data->{'seriestitle'}, quantity => $data->{'quantity'}, - listprice => $data->{'listprice'}, + quantityrec => $data->{'quantity'}, + + rrp => $data->{'rrp'}, - total => $data->{ecost}*$data->{quantity}, + list_price => sprintf("%.2f", $data->{'listprice'}), # watch the '-' + total => sprintf("%.2f", $data->{ecost}*$data->{quantity} ), invoice => $data->{'booksellerinvoicenumber'}, ecost => $data->{'ecost'}, purchaseordernumber => $data->{'purchaseordernumber'}, notes => $data->{'notes'}, publishercode => $data->{'publishercode'}, + + +# CHECKME: gst-stuff needs verifing, mason. + gstrate => $bookseller->{gstrate} || C4::Context->preference("gist"), + gstreg => $bookseller->{'gstreg'}, + # donation => $donation ); output_html_with_http_headers $input, $cookie, $template->output; + + +=item MARCfindbreeding + + $record = MARCfindbreeding($breedingid); + +Look up the import record repository for the record with +record with id $breedingid. If found, returns the decoded +MARC::Record; otherwise, -1 is returned (FIXME). +Returns as second parameter the character encoding. + +=cut + +sub MARCfindbreeding { + my ( $id ) = @_; + my ($marc, $encoding) = GetImportRecordMarc($id); + # remove the - in isbn, koha store isbn without any - + if ($marc) { + my $record = MARC::Record->new_from_usmarc($marc); + my ($isbnfield,$isbnsubfield) = GetMarcFromKohaField('biblioitems.isbn',''); + if ( $record->field($isbnfield) ) { + foreach my $field ( $record->field($isbnfield) ) { + foreach my $subfield ( $field->subfield($isbnsubfield) ) { + my $newisbn = $field->subfield($isbnsubfield); + $newisbn =~ s/-//g; + $field->update( $isbnsubfield => $newisbn ); + } + } + } + # fix the unimarc 100 coded field (with unicode information) + if (C4::Context->preference('marcflavour') eq 'UNIMARC' && $record->subfield(100,'a')) { + my $f100a=$record->subfield(100,'a'); + my $f100 = $record->field(100); + my $f100temp = $f100->as_string; + $record->delete_field($f100); + if ( length($f100temp) > 28 ) { + substr( $f100temp, 26, 2, "50" ); + $f100->update( 'a' => $f100temp ); + my $f100 = MARC::Field->new( '100', '', '', 'a' => $f100temp ); + $record->insert_fields_ordered($f100); + } + } + + if ( !defined(ref($record)) ) { + return -1; + } + else { + # normalize author : probably UNIMARC specific... + if ( C4::Context->preference("z3950NormalizeAuthor") + and C4::Context->preference("z3950AuthorAuthFields") ) + { + my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author"); + + # my $summary = C4::Context->preference("z3950authortemplate"); + my $auth_fields = + C4::Context->preference("z3950AuthorAuthFields"); + my @auth_fields = split /,/, $auth_fields; + my $field; + + if ( $record->field($tag) ) { + foreach my $tmpfield ( $record->field($tag)->subfields ) { + + # foreach my $subfieldcode ($tmpfield->subfields){ + my $subfieldcode = shift @$tmpfield; + my $subfieldvalue = shift @$tmpfield; + if ($field) { + $field->add_subfields( + "$subfieldcode" => $subfieldvalue ) + if ( $subfieldcode ne $subfield ); + } + else { + $field = + MARC::Field->new( $tag, "", "", + $subfieldcode => $subfieldvalue ) + if ( $subfieldcode ne $subfield ); + } + } + } + $record->delete_field( $record->field($tag) ); + foreach my $fieldtag (@auth_fields) { + next unless ( $record->field($fieldtag) ); + my $lastname = $record->field($fieldtag)->subfield('a'); + my $firstname = $record->field($fieldtag)->subfield('b'); + my $title = $record->field($fieldtag)->subfield('c'); + my $number = $record->field($fieldtag)->subfield('d'); + if ($title) { + +# $field->add_subfields("$subfield"=>"[ ".ucfirst($title).ucfirst($firstname)." ".$number." ]"); + $field->add_subfields( + "$subfield" => ucfirst($title) . " " + . ucfirst($firstname) . " " + . $number ); + } + else { + +# $field->add_subfields("$subfield"=>"[ ".ucfirst($firstname).", ".ucfirst($lastname)." ]"); + $field->add_subfields( + "$subfield" => ucfirst($firstname) . ", " + . ucfirst($lastname) ); + } + } + $record->insert_fields_ordered($field); + } + return $record, $encoding; + } + } + return -1; +} + diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tmpl index 34e2cb8342..2daf10b938 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tmpl @@ -1,87 +1,72 @@ Koha › Acquisitions › Shopping Basket <!-- TMPL_VAR NAME="basketno" --> › <!-- TMPL_IF name="ordnum" -->Modify order details (line #<!-- TMPL_VAR NAME="ordnum" -->)<!-- TMPL_ELSE -->New order<!-- /TMPL_IF --> + + + + +
" > +
- +
- +

Modify order details (line #) @@ -92,6 +77,7 @@ if (quantity ==0) {

+
Basket Details
  • Basket number:
  • Managed by:
  • @@ -100,9 +86,13 @@ if (quantity ==0) {
  • Invoice number:
  • Closed on:
+
-
+ + + +
Catalog details @@ -118,6 +108,11 @@ if (quantity ==0) { " /> " /> " /> + " /> + + + " /> + " /> " value="" /> @@ -125,12 +120,14 @@ if (quantity ==0) {
  1. Title - " /> + " /> - " /> + " />
  2. + +
  3. Author: @@ -188,20 +185,48 @@ if (quantity ==0) { " /> -
  4. -
  5. - -
+ +
+ Item + + +
+
+
  1. +
    "> + + + + + " /> + " /> + " /> + " /> + + ')">+ + + +
  2. + +
+ ')">+ + ')">- +
+
+ + + " /> + " /> + " /> + " /> + + " /> + +
+
Accounting Details
    @@ -211,34 +236,53 @@ if (quantity ==0) { " /> - " onchange="update(this.form);" /> + + + + " onchange="calcNeworderTotal(this.form);" /> + + + + +
  1. - Fund: - " /> + Budget: + " /> - - + +
  2. +
  3. Vendor price: - " /> + " /> - " onchange="update(this.form)" /> + " onchange="calcNeworderTotal(this.form)" /> (entered as ) +
  4. +
  5. + + + + + + +
  6. + Replacement cost: " /> - - " /> + + " /> (adjusted for )
  7. @@ -249,6 +293,8 @@ if (quantity ==0) { " /> + (adjusted for % discount) +
  8. @@ -261,13 +307,14 @@ if (quantity ==0) {
  9. +
  10. " readonly="readonly" /> - " /> + " /> (budgeted cost * quantity)
  11. @@ -281,7 +328,7 @@ if (quantity ==0) {
  12. - " /> + " />
  13. @@ -291,25 +338,37 @@ if (quantity ==0) {
  14. + + +
  15. The 2 following fields are available for your own usage. They can be useful for statistical purposes
    + + - + " />
  16. + +
  17. + + - " /> -
+ + + + +
- &basketno=">Cancel">Cancel + &basketno=">Cancel">Cancel
@@ -318,4 +377,5 @@ if (quantity ==0) {
+
-- 2.39.5