X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FAcquisition.pm;h=f6f58058aac0a3472b8ec9e182c93beea4ef66ae;hb=6fd9b3febeebf95bd0590269bd33739f5cbed7de;hp=e881a166a312946d65d83933fdc3f45c5f6efbff;hpb=a598b100613a37dc2710090cb381dce56eae2f26;p=koha_fer diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index e881a166a3..f6f58058aa 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -29,6 +29,8 @@ use C4::Suggestions; use C4::Biblio; use C4::Debug; use C4::SQLHelper qw(InsertInTable); +use C4::Bookseller qw(GetBookSellerFromId); +use C4::Templates qw(gettemplate); use Time::localtime; use HTML::Entities; @@ -37,12 +39,12 @@ use vars qw($VERSION @ISA @EXPORT); BEGIN { # set the version for version checking - $VERSION = 3.01; + $VERSION = 3.07.00.049; require Exporter; @ISA = qw(Exporter); @EXPORT = qw( &GetBasket &NewBasket &CloseBasket &DelBasket &ModBasket - &GetBasketAsCSV + &GetBasketAsCSV &GetBasketGroupAsCSV &GetBasketsByBookseller &GetBasketsByBasketgroup &GetBasketsInfosByBookseller @@ -57,7 +59,7 @@ BEGIN { &ModReceiveOrder &ModOrderBiblioitemNumber &GetCancelledOrders - &NewOrderItem &ModOrderItem + &NewOrderItem &ModOrderItem &ModItemOrder &GetParcels &GetParcel &GetContracts &GetContract @@ -193,7 +195,7 @@ sub NewBasket { $dbh->do($query); #find & return basketno MYSQL dependant, but $dbh->last_insert_id always returns null :-( my $basket = $dbh->{'mysql_insertid'}; - ModBasketHeader($basket, $basketname || '', $basketnote || '', $basketbooksellernote || '', $basketcontractnumber || undef); + ModBasketHeader($basket, $basketname || '', $basketnote || '', $basketbooksellernote || '', $basketcontractnumber || undef, $booksellerid); return $basket; } @@ -227,54 +229,127 @@ sub CloseBasket { Export a basket as CSV +$cgi parameter is needed for column name translation + =cut sub GetBasketAsCSV { - my ($basketno) = @_; + my ($basketno, $cgi) = @_; my $basket = GetBasket($basketno); my @orders = GetOrders($basketno); my $contract = GetContract($basket->{'contractnumber'}); - my $csv = Text::CSV->new(); - my $output; - # TODO: Translate headers - my @headers = qw(contractname ordernumber entrydate isbn author title publishercode collectiontitle notes quantity rrp); - - $csv->combine(@headers); - $output = $csv->string() . "\n"; + my $template = C4::Templates::gettemplate("acqui/csv/basket.tmpl", "intranet", $cgi); my @rows; foreach my $order (@orders) { - my @cols; - # newlines are not valid characters for Text::CSV combine() - $order->{'notes'} =~ s/[\r\n]+//g; - push(@cols, - $contract->{'contractname'}, - $order->{'ordernumber'}, - $order->{'entrydate'}, - $order->{'isbn'}, - $order->{'author'}, - $order->{'title'}, - $order->{'publishercode'}, - $order->{'collectiontitle'}, - $order->{'notes'}, - $order->{'quantity'}, - $order->{'rrp'}, - ); - push (@rows, \@cols); + my $bd = GetBiblioData( $order->{'biblionumber'} ); + my $row = { + contractname => $contract->{'contractname'}, + ordernumber => $order->{'ordernumber'}, + entrydate => $order->{'entrydate'}, + isbn => $order->{'isbn'}, + author => $bd->{'author'}, + title => $bd->{'title'}, + publicationyear => $bd->{'publicationyear'}, + publishercode => $bd->{'publishercode'}, + collectiontitle => $bd->{'collectiontitle'}, + notes => $order->{'notes'}, + quantity => $order->{'quantity'}, + rrp => $order->{'rrp'}, + deliveryplace => $basket->{'deliveryplace'}, + billingplace => $basket->{'billingplace'} + }; + foreach(qw( + contractname author title publishercode collectiontitle notes + deliveryplace billingplace + ) ) { + # Double the quotes to not be interpreted as a field end + $row->{$_} =~ s/"/""/g if $row->{$_}; + } + push @rows, $row; } - foreach my $row (@rows) { - $csv->combine(@$row); - $output .= $csv->string() . "\n"; + @rows = sort { + if(defined $a->{publishercode} and defined $b->{publishercode}) { + $a->{publishercode} cmp $b->{publishercode}; + } + } @rows; - } - - return $output; + $template->param(rows => \@rows); + return $template->output; } +=head3 GetBasketGroupAsCSV + +=over 4 + +&GetBasketGroupAsCSV($basketgroupid); + +Export a basket group as CSV + +$cgi parameter is needed for column name translation + +=back + +=cut + +sub GetBasketGroupAsCSV { + my ($basketgroupid, $cgi) = @_; + my $baskets = GetBasketsByBasketgroup($basketgroupid); + + my $template = C4::Templates::gettemplate('acqui/csv/basketgroup.tmpl', 'intranet', $cgi); + + my @rows; + for my $basket (@$baskets) { + my @orders = GetOrders( $$basket{basketno} ); + my $contract = GetContract( $$basket{contractnumber} ); + my $bookseller = GetBookSellerFromId( $$basket{booksellerid} ); + + foreach my $order (@orders) { + my $bd = GetBiblioData( $order->{'biblionumber'} ); + my $row = { + clientnumber => $bookseller->{accountnumber}, + basketname => $basket->{basketname}, + ordernumber => $order->{ordernumber}, + author => $bd->{author}, + title => $bd->{title}, + publishercode => $bd->{publishercode}, + publicationyear => $bd->{publicationyear}, + collectiontitle => $bd->{collectiontitle}, + isbn => $order->{isbn}, + quantity => $order->{quantity}, + rrp => $order->{rrp}, + discount => $bookseller->{discount}, + ecost => $order->{ecost}, + notes => $order->{notes}, + entrydate => $order->{entrydate}, + booksellername => $bookseller->{name}, + bookselleraddress => $bookseller->{address1}, + booksellerpostal => $bookseller->{postal}, + contractnumber => $contract->{contractnumber}, + contractname => $contract->{contractname}, + }; + foreach(qw( + basketname author title publishercode collectiontitle notes + booksellername bookselleraddress booksellerpostal contractname + basketgroupdeliveryplace basketgroupbillingplace + basketdeliveryplace basketbillingplace + ) ) { + # Double the quotes to not be interpreted as a field end + $row->{$_} =~ s/"/""/g if $row->{$_}; + } + push @rows, $row; + } + } + $template->param(rows => \@rows); + + return $template->output; + +} + =head3 CloseBasketgroup &CloseBasketgroup($basketgroupno); @@ -385,7 +460,7 @@ sub ModBasket { =head3 ModBasketHeader - &ModBasketHeader($basketno, $basketname, $note, $booksellernote, $contractnumber); + &ModBasketHeader($basketno, $basketname, $note, $booksellernote, $contractnumber, $booksellerid); Modifies a basket's header. @@ -401,16 +476,20 @@ Modifies a basket's header. =item C<$contractnumber> is the "contractnumber" (foreign) key in the "aqbasket" table. +=item C<$booksellerid> is the id (foreign) key in the "aqbooksellers" table for the vendor. + =back =cut sub ModBasketHeader { - my ($basketno, $basketname, $note, $booksellernote, $contractnumber) = @_; - my $query = "UPDATE aqbasket SET basketname=?, note=?, booksellernote=? WHERE basketno=?"; + my ($basketno, $basketname, $note, $booksellernote, $contractnumber, $booksellerid) = @_; + + my $query = "UPDATE aqbasket SET basketname=?, note=?, booksellernote=?, booksellerid=? WHERE basketno=?"; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare($query); - $sth->execute($basketname,$note,$booksellernote,$basketno); + $sth->execute($basketname,$note,$booksellernote,$booksellerid,$basketno); + if ( $contractnumber ) { my $query2 ="UPDATE aqbasket SET contractnumber=? WHERE basketno=?"; my $sth2 = $dbh->prepare($query2); @@ -486,7 +565,12 @@ sub GetBasketsInfosByBookseller { SELECT aqbasket.*, SUM(aqorders.quantity) AS total_items, COUNT(DISTINCT aqorders.biblionumber) AS total_biblios, - SUM(IF(aqorders.datereceived IS NULL, aqorders.quantity, 0)) AS expected_items + SUM( + IF(aqorders.datereceived IS NULL + AND aqorders.datecancellationprinted IS NULL + , aqorders.quantity + , 0) + ) AS expected_items FROM aqbasket LEFT JOIN aqorders ON aqorders.basketno = aqbasket.basketno WHERE booksellerid = ? @@ -510,8 +594,11 @@ Returns a reference to all baskets that belong to basketgroup $basketgroupid. sub GetBasketsByBasketgroup { my $basketgroupid = shift; - my $query = "SELECT * FROM aqbasket - LEFT JOIN aqcontract USING(contractnumber) WHERE basketgroupid=?"; + my $query = qq{ + SELECT *, aqbasket.booksellerid as booksellerid + FROM aqbasket + LEFT JOIN aqcontract USING(contractnumber) WHERE basketgroupid=? + }; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare($query); $sth->execute($basketgroupid); @@ -1053,6 +1140,29 @@ sub ModOrderItem { return 0; } +=head3 ModItemOrder + + ModItemOrder($itemnumber, $ordernumber); + +Modifies the ordernumber of an item in aqorders_items. + +=cut + +sub ModItemOrder { + my ($itemnumber, $ordernumber) = @_; + + return unless ($itemnumber and $ordernumber); + + my $dbh = C4::Context->dbh; + my $query = qq{ + UPDATE aqorders_items + SET ordernumber = ? + WHERE itemnumber = ? + }; + my $sth = $dbh->prepare($query); + return $sth->execute($ordernumber, $itemnumber); +} + #------------------------------------------------------------# @@ -1138,7 +1248,7 @@ C<$ordernumber>. sub ModReceiveOrder { my ( $biblionumber, $ordernumber, $quantrec, $user, $cost, - $invoiceno, $freight, $rrp, $budget_id, $datereceived + $invoiceno, $freight, $rrp, $budget_id, $datereceived, $received_items ) = @_; my $dbh = C4::Context->dbh; @@ -1181,7 +1291,19 @@ sub ModReceiveOrder { $order->{'quantity'} -= $quantrec; $order->{'quantityreceived'} = 0; my $newOrder = NewOrder($order); -} else { + # Change ordernumber in aqorders_items for items not received + my @orderitems = GetItemnumbersFromOrder( $order->{'ordernumber'} ); + my $count = scalar @orderitems; + + for (my $i=0; $i<$count; $i++){ + foreach (@$received_items){ + splice (@orderitems, $i, 1) if ($orderitems[$i] == $_); + } + } + foreach (@orderitems) { + ModItemOrder($_, $newOrder); + } + } else { $sth=$dbh->prepare("update aqorders set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?, unitprice=?,freight=?,rrp=? @@ -1229,7 +1351,7 @@ C<@results> is an array of references-to-hash with the following keys: sub SearchOrder { #### -------- SearchOrder------------------------------- - my ($ordernumber, $search, $supplierid, $basket) = @_; + my ( $ordernumber, $search, $ean, $supplierid, $basket ) = @_; my $dbh = C4::Context->dbh; my @args = (); @@ -1249,7 +1371,11 @@ sub SearchOrder { $query .= " AND (biblio.title like ? OR biblio.author LIKE ? OR biblioitems.isbn like ?)"; push @args, ("%$search%","%$search%","%$search%"); } - if($supplierid){ + if ($ean) { + $query .= " AND biblioitems.ean = ?"; + push @args, $ean; + } + if ($supplierid) { $query .= "AND aqbasket.booksellerid = ?"; push @args, $supplierid; } @@ -1629,12 +1755,12 @@ sub GetHistory { my $title = $params{title}; my $author = $params{author}; my $isbn = $params{isbn}; + my $ean = $params{ean}; my $name = $params{name}; my $from_placed_on = $params{from_placed_on}; my $to_placed_on = $params{to_placed_on}; my $basket = $params{basket}; my $booksellerinvoicenumber = $params{booksellerinvoicenumber}; - my @order_loop; my $total_qty = 0; my $total_qtyreceived = 0; @@ -1646,12 +1772,13 @@ sub GetHistory { biblio.title, biblio.author, biblioitems.isbn, + biblioitems.ean, aqorders.basketno, - aqbasket.basketname, - aqbasket.basketgroupid, - aqbasketgroups.name as groupname, + aqbasket.basketname, + aqbasket.basketgroupid, + aqbasketgroups.name as groupname, aqbooksellers.name, - aqbasket.creationdate, + aqbasket.creationdate, aqorders.datereceived, aqorders.quantity, aqorders.quantityreceived, @@ -1662,7 +1789,7 @@ sub GetHistory { aqorders.biblionumber FROM aqorders LEFT JOIN aqbasket ON aqorders.basketno=aqbasket.basketno - LEFT JOIN aqbasketgroups ON aqbasket.basketgroupid=aqbasketgroups.id + LEFT JOIN aqbasketgroups ON aqbasket.basketgroupid=aqbasketgroups.id LEFT JOIN aqbooksellers ON aqbasket.booksellerid=aqbooksellers.id LEFT JOIN biblioitems ON biblioitems.biblionumber=aqorders.biblionumber LEFT JOIN biblio ON biblio.biblionumber=aqorders.biblionumber"; @@ -1689,7 +1816,10 @@ sub GetHistory { $query .= " AND biblioitems.isbn LIKE ? "; push @query_params, "%$isbn%"; } - + if ( defined $ean and $ean ) { + $query .= " AND biblioitems.ean = ? "; + push @query_params, "$ean"; + } if ( $name ) { $query .= " AND aqbooksellers.name LIKE ? "; push @query_params, "%$name%";