Bug 15685: Allow creation of items (AcqCreateItem) to be customizable per-basket

This adds a new basket attribute (create_items) that can optionally be
set to override AcqCreateItem.

The following have been modified to reflect this (with the value of
create_items that causes them to behave differently in parentheses):
  * Cancelling receipt of an order (receiving)
  * Creating an order by hand or from MARC (ordering)
  * Receiving an order (receiving)
  * Showing orders with uncertain price (ordering)
  * Showing orders (receiving)
  * Showing acquisition details in the OPAC (ordering)

Test plan:
  1) Create baskets with "Create items when:" set to ordering,
     receiving, cataloging and unset.
  2) Test each of the above for each of these baskets, verifying that
     the basket-specific attribute overrides AcqCreateItem if set and
     falls back to the syspref otherwise.

NOTE: A check of AcqCreateItem in opac-detail.tt was removed because it
was redundant; the code path in question cannot be triggered unless
create_items/AcqCreateItems is set to the correct value anyway.

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Barbara Fondren <bfondren@roundrocktexas.gov>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Jesse Weaver 2016-01-28 15:01:24 -07:00 committed by Jonathan Druart
parent 4869f1b6ec
commit b29493265b
21 changed files with 97 additions and 31 deletions

View File

@ -190,7 +190,7 @@ sub GetBasket {
=head3 NewBasket
$basket = &NewBasket( $booksellerid, $authorizedby, $basketname,
$basketnote, $basketbooksellernote, $basketcontractnumber, $deliveryplace, $billingplace, $is_standing );
$basketnote, $basketbooksellernote, $basketcontractnumber, $deliveryplace, $billingplace, $is_standing, $create_items );
Create a new basket in aqbasket table
@ -209,7 +209,7 @@ The other parameters are optional, see ModBasketHeader for more info on them.
sub NewBasket {
my ( $booksellerid, $authorisedby, $basketname, $basketnote,
$basketbooksellernote, $basketcontractnumber, $deliveryplace,
$billingplace, $is_standing ) = @_;
$billingplace, $is_standing, $create_items ) = @_;
my $dbh = C4::Context->dbh;
my $query =
'INSERT INTO aqbasket (creationdate,booksellerid,authorisedby) '
@ -221,7 +221,7 @@ sub NewBasket {
$basketnote ||= q{};
$basketbooksellernote ||= q{};
ModBasketHeader( $basket, $basketname, $basketnote, $basketbooksellernote,
$basketcontractnumber, $booksellerid, $deliveryplace, $billingplace, $is_standing );
$basketcontractnumber, $booksellerid, $deliveryplace, $billingplace, $is_standing, $create_items );
return $basket;
}
@ -598,21 +598,24 @@ Modifies a basket's header.
=item C<$is_standing> is the "is_standing" field in the aqbasket table.
=item C<$create_items> should be set to 'ordering', 'receiving' or 'cataloguing' (or undef, in which
case the AcqCreateItem syspref takes precedence).
=back
=cut
sub ModBasketHeader {
my ($basketno, $basketname, $note, $booksellernote, $contractnumber, $booksellerid, $deliveryplace, $billingplace, $is_standing) = @_;
my ($basketno, $basketname, $note, $booksellernote, $contractnumber, $booksellerid, $deliveryplace, $billingplace, $is_standing, $create_items) = @_;
my $query = qq{
UPDATE aqbasket
SET basketname=?, note=?, booksellernote=?, booksellerid=?, deliveryplace=?, billingplace=?, is_standing=?
SET basketname=?, note=?, booksellernote=?, booksellerid=?, deliveryplace=?, billingplace=?, is_standing=?, create_items=?
WHERE basketno=?
};
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare($query);
$sth->execute($basketname, $note, $booksellernote, $booksellerid, $deliveryplace, $billingplace, $is_standing, $basketno);
$sth->execute($basketname, $note, $booksellernote, $booksellerid, $deliveryplace, $billingplace, $is_standing, $create_items || undef, $basketno);
if ( $contractnumber ) {
my $query2 ="UPDATE aqbasket SET contractnumber=? WHERE basketno=?";
@ -1587,6 +1590,7 @@ sub CancelReceipt {
my $parent_ordernumber = $order->{'parent_ordernumber'};
my @itemnumbers = GetItemnumbersFromOrder( $ordernumber );
my $basket = Koha::Acquisition::Order->find( $order->{ordernumber} )->basket;
if($parent_ordernumber == $ordernumber || not $parent_ordernumber) {
# The order line has no parent, just mark it as not received
@ -1647,7 +1651,7 @@ sub CancelReceipt {
WHERE ordernumber = ?
|, undef, $parent_ordernumber);
_cancel_items_receipt( $ordernumber, $parent_ordernumber );
_cancel_items_receipt( $basket->effective_create_items, $ordernumber, $parent_ordernumber );
# Delete order line
$query = qq{
DELETE FROM aqorders
@ -1658,7 +1662,7 @@ sub CancelReceipt {
}
if(C4::Context->preference('AcqCreateItem') eq 'ordering') {
if( $basket->effective_create_items eq 'ordering' ) {
my @affects = split q{\|}, C4::Context->preference("AcqItemSetSubfieldsWhenReceiptIsCancelled");
if ( @affects ) {
for my $in ( @itemnumbers ) {
@ -1681,11 +1685,11 @@ sub CancelReceipt {
}
sub _cancel_items_receipt {
my ( $ordernumber, $parent_ordernumber ) = @_;
my ( $effective_create_items, $ordernumber, $parent_ordernumber ) = @_;
$parent_ordernumber ||= $ordernumber;
my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
if(C4::Context->preference('AcqCreateItem') eq 'receiving') {
if ( $effective_create_items eq 'receiving' ) {
# Remove items that were created at receipt
my $query = qq{
DELETE FROM items, aqorders_items

View File

@ -45,6 +45,19 @@ sub bookseller {
return Koha::Acquisition::Bookseller->_new_from_dbic( $bookseller_rs );
}
=head3 effective_create_items
Returns C<create_items> for this basket, falling back to C<AcqCreateItem> if unset.
=cut
sub effective_create_items {
my ( $self ) = @_;
return $self->create_items || C4::Context->preference('AcqCreateItem');
}
=head3 type
=cut

View File

@ -19,6 +19,7 @@ use Modern::Perl;
use Carp qw( croak );
use Koha::Acquisition::Baskets;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
@ -98,9 +99,14 @@ sub add_item {
$rs->create({ ordernumber => $self->ordernumber, itemnumber => $itemnumber });
}
sub basket {
my ( $self ) = @_;
return Koha::Acquisition::Baskets->find( $self->{basketno} );
}
=head2 Internal methods
=head3 _type (internal)
=head3 _type
=cut

View File

@ -234,6 +234,8 @@ my $basketno=$$orderinfo{basketno};
my $basket = GetBasket($basketno);
my $user = $input->remote_user;
my $basketno=$$orderinfo{basketno};
my $basket = Koha::Acquisition::Baskets->find( $basketno );
# create, modify or delete biblio
# create if $quantity>0 and $existing='no'
@ -291,7 +293,7 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) {
}
# now, add items if applicable
if (C4::Context->preference('AcqCreateItem') eq 'ordering') {
if ($basket->effective_create_items eq 'ordering') {
my @tags = $input->multi_param('tag');
my @subfields = $input->multi_param('subfield');

View File

@ -44,6 +44,7 @@ use C4::Members;
use Koha::Number::Price;
use Koha::Libraries;
use Koha::Acquisition::Baskets;
use Koha::Acquisition::Currencies;
use Koha::Acquisition::Orders;
use Koha::Acquisition::Booksellers;
@ -78,6 +79,7 @@ if ($cgiparams->{'import_batch_id'} && $op eq ""){
if (! $cgiparams->{'basketno'}){
die "Basketnumber required to order from iso2709 file import";
}
my $basket = Koha::Acquisition::Baskets->find( $cgiparams->{basketno} );
#
# 1st step = choose the file to import into acquisition
@ -102,7 +104,7 @@ if ($op eq ""){
);
import_biblios_list($template, $cgiparams->{'import_batch_id'});
my $basket = GetBasket($cgiparams->{basketno});
if ( C4::Context->preference('AcqCreateItem') eq 'ordering' && !$basket->{is_standing} ) {
if ( $basket->effective_create_items eq 'ordering' && !$basket->{is_standing} ) {
# prepare empty item form
my $cell = PrepareItemrecordDisplay( '', '', '', 'ACQ' );
@ -381,7 +383,7 @@ if ($op eq ""){
# parse the item sent by the form, and create an item just for the import_record_id we are dealing with
# this is not optimised, but it's working !
my $basket = GetBasket($cgiparams->{basketno});
if ( C4::Context->preference('AcqCreateItem') eq 'ordering' && !$basket->{is_standing} ) {
if ( $basket->effective_create_items eq 'ordering' && !$basket->{is_standing} ) {
my @tags = $input->multi_param('tag');
my @subfields = $input->multi_param('subfield');
my @field_values = $input->multi_param('field_value');

View File

@ -390,6 +390,7 @@ if ( $op eq 'list' ) {
}
$template->param(
basket => $basket,
basketno => $basketno,
basket => $basket,
basketname => $basket->{'basketname'},

View File

@ -145,6 +145,7 @@ if ( $op eq 'add_form' ) {
scalar $input->param('deliveryplace'),
scalar $input->param('billingplace'),
scalar $input->param('is_standing') ? 1 : undef,
scalar $input->param('create_items')
);
} else { #New basket
$basketno = NewBasket(
@ -157,6 +158,7 @@ if ( $op eq 'add_form' ) {
scalar $input->param('deliveryplace'),
scalar $input->param('billingplace'),
scalar $input->param('is_standing') ? 1 : undef,
scalar $input->param('create_items')
);
}
print $input->redirect('basket.pl?basketno='.$basketno);

View File

@ -60,12 +60,13 @@ my $order = GetOrder($ordernumber);
my $new_ordernumber = $ordernumber;
$unitprice = Koha::Number::Price->new( $unitprice )->unformat();
my $basket = Koha::Acquisition::Orders->find( $ordernumber )->basket;
#need old receivedate if we update the order, parcel.pl only shows the right parcel this way FIXME
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
if ($quantityrec > $origquantityrec ) {
my @received_items = ();
if(C4::Context->preference('AcqCreateItem') eq 'ordering') {
@received_items = $input->multi_param('items_to_receive');
if ($basket->effective_create_items eq 'ordering') {
@received_items = $input->param('items_to_receive');
my @affects = split q{\|}, C4::Context->preference("AcqItemSetSubfieldsWhenReceived");
if ( @affects ) {
my $frameworkcode = GetFrameworkCode($biblionumber);
@ -111,7 +112,7 @@ if ($quantityrec > $origquantityrec ) {
}
# now, add items if applicable
if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
if ($basket->effective_create_items eq 'receiving') {
my @tags = $input->multi_param('tag');
my @subfields = $input->multi_param('subfield');

View File

@ -130,6 +130,7 @@ if(!$basketno) {
}
our $basket = GetBasket($basketno);
my $basketobj = Koha::Acquisition::Baskets->find( $basketno );
$booksellerid = $basket->{booksellerid} unless $booksellerid;
my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
@ -243,7 +244,7 @@ if ($close) {
$template->param( sort1 => $data->{'sort1'} );
$template->param( sort2 => $data->{'sort2'} );
if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordernumber) {
if ($basketobj->effective_create_items eq 'ordering' && !$ordernumber) {
# Check if ACQ framework exists
my $marc = GetMarcStructure(1, 'ACQ', { unsafe => 1 } );
unless($marc) {
@ -358,7 +359,7 @@ $template->param(
barcode_subfield => $barcode_subfield,
import_batch_id => $import_batch_id,
subscriptionid => $subscriptionid,
acqcreate => C4::Context->preference("AcqCreateItem") eq "ordering" ? 1 : "",
acqcreate => $basketobj->effective_create_items eq "ordering" ? 1 : "",
users_ids => join(':', @order_user_ids),
users => \@order_users,
(uc(C4::Context->preference("marcflavour"))) => 1

View File

@ -111,6 +111,7 @@ unless ( $results and @$results) {
# prepare the form for receiving
my $order = $results->[0];
my $basket = Koha::Acquisition::Order->fetch({ordernumber => $ordernumber})->basket;
# Check if ACQ framework exists
my $acq_fw = GetMarcStructure( 1, 'ACQ', { unsafe => 1 } );
@ -118,7 +119,7 @@ unless($acq_fw) {
$template->param('NoACQframework' => 1);
}
my $AcqCreateItem = C4::Context->preference('AcqCreateItem');
my $AcqCreateItem = $basket->effective_create_items;
if ($AcqCreateItem eq 'receiving') {
$template->param(
AcqCreateItemReceiving => 1,

View File

@ -66,6 +66,7 @@ use CGI qw ( -utf8 );
use C4::Output;
use C4::Suggestions;
use Koha::Acquisition::Baskets;
use Koha::Acquisition::Bookseller;
use Koha::Biblios;
use Koha::DateUtils;
@ -264,6 +265,7 @@ unless( defined $invoice->{closedate} ) {
$line{left_holds_on_order} = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
$line{holds} = $holds_count;
$line{holds_on_order} = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order};
$line{basket} = Koha::Acquisition::Baskets->find( $line{basketno} );
my $budget_name = GetBudgetName( $line{budget_id} );
$line{budget_name} = $budget_name;

View File

@ -54,6 +54,7 @@ use C4::Acquisition qw/SearchOrders GetOrder ModOrder/;
use C4::Biblio qw/GetBiblioData/;
use Koha::Acquisition::Booksellers;
use Koha::Acquisition::Baskets;
my $input=new CGI;
@ -72,6 +73,8 @@ my $op = $input->param('op');
my $owner = $input->param('owner') || 0 ; # flag to see only "my" orders, or everyone orders
my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
$template->param( basket => Koha::Acquisition::Baskets->find($basketno) );
#show all orders that have uncertain price for the bookseller
my $pendingorders = SearchOrders({
booksellerid => $booksellerid,

View File

@ -0,0 +1 @@
ALTER TABLE aqbasket ADD COLUMN create_items ENUM('ordering', 'receiving', 'cataloguing') DEFAULT NULL;

View File

@ -2992,6 +2992,7 @@ CREATE TABLE `aqbasket` ( -- stores data about baskets in acquisitions
`basketgroupid` int(11), -- links this basket to its group (aqbasketgroups.id)
`deliveryplace` varchar(10) default NULL, -- basket delivery place
`billingplace` varchar(10) default NULL, -- basket billing place
create_items ENUM('ordering', 'receiving', 'cataloguing') default NULL; -- when items should be created for orders in this basket
branch varchar(10) default NULL, -- basket branch
is_standing TINYINT(1) NOT NULL DEFAULT 0, -- orders in this basket are standing
PRIMARY KEY (`basketno`),

View File

@ -423,9 +423,18 @@
[% IF ( creationdate ) %]<li><span class="label">Opened on:</span> [% creationdate | $KohaDates %]</li>[% END %]
[% IF ( closedate ) %]<li><span class="label">Closed on:</span> [% closedate | $KohaDates %]</li>[% END %]
[% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates %]</li>[% END %]
[% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates %]</li>[% END %]
<li><span class="label">Orders are standing:</span> [% IF is_standing %]Yes[% ELSE %]No[% END %]</li>
[% IF basket.create_items %]
<li>
<span class="label">Create items when:</span>
[% SWITCH basket.create_items %]
[% CASE 'receiving' %]Receiving items
[% CASE 'cataloguing' %]Cataloguing items
[% CASE %]Placing orders
[% END %]
</li>
[% END %]
</ol>
</div>

View File

@ -1,4 +1,5 @@
[% USE Branches %]
[% USE Koha %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Acquisitions &rsaquo;
[% IF ( add_form ) %]
@ -42,7 +43,7 @@
[% IF ( basketno ) %]
<li>
<input type="hidden" name="basketno" value="[% basketno %]" />
<input type="hidden" name="is_an_edit" value="1" />
<input type="hidden" name="rs_an_edit" value="1" />
</li>
[% END %]
<li>
@ -107,6 +108,21 @@
[% END %]
<div class="hint">Standing orders do not close when received.</div>
</li>
[% UNLESS basketno %]
<li>
<label for="create_items">Create items when:</label>
<select name="create_items" id="create_items">
[% SWITCH Koha.Preference('AcqCreateItem') %]
[% CASE 'receiving' %]<option value="">use default (receiving an order).</option>
[% CASE 'cataloguing' %]<option value="">use default (cataloging the record).</option>
[% CASE %]<option value="">use default (placing an order).</option>
[% END %]
<option value="ordering">placing an order.</option>
<option value="receiving">receiving an order.</option>
<option value="cataloguing">cataloging the record.</option>
</select>
</li>
[% END %]
</ol>
</fieldset>
<fieldset class="action">

View File

@ -441,7 +441,7 @@
<td>[% order.unitprice | $Price %]</td>
<td>[% order.total | $Price %]</td>
<td>
[% IF loop_receive.cannot_cancel or ( Koha.Preference("AcqCreateItem") == "receiving" and loop_receive.holds > 0 ) %]
[% IF loop_receive.cannot_cancel or ( order.basket.effective_create_items == "receiving" and loop_receive.holds > 0 ) %]
[% IF loop_receive.cannot_cancel %]
[% span_title = BLOCK %]
Cannot cancel receipt of this order line because it

View File

@ -133,7 +133,7 @@ var MSG_INVALIDPRICE = _("ERROR: Price is not a valid number, please check the p
<input class="check_uncertain" data-ordernumber="[% uncertainpriceorder.ordernumber %]" type="text" size="10" name="price[% uncertainpriceorder.ordernumber %]" value="[% uncertainpriceorder.listprice %]" />
</td>
<td>
[% IF Koha.Preference('AcqCreateItem') == 'ordering' %]
[% IF basket.effective_create_items == 'ordering' %]
[% uncertainpriceorder.quantity %]
<input type="hidden" name="qty[% uncertainpriceorder.ordernumber %]" value="[% uncertainpriceorder.quantity %]" />
[% ELSE %]

View File

@ -8,6 +8,7 @@ Acquisitions:
ordering: placing an order.
receiving: receiving an order.
cataloguing: cataloging the record.
- This is only the default behavior, and can be changed per-basket.
-
- "The following <a href='http://schema.koha-community.org/__VERSION__/tables/items.html' target='blank'>database columns</a> should be unique in an item:"
- pref: UniqueItemFields

View File

@ -654,7 +654,7 @@
<p>This record has many physical items ([% items_count %]). <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber | html %]&amp;viewallitems=1">Click here to view them all.</a></p>
[% ELSIF ( itemloop.size ) %]
[% INCLUDE items_table items=itemloop tab="holdings" %]
[% IF Koha.Preference('OPACAcquisitionDetails') and Koha.Preference('AcqCreateItem') != 'ordering' and acquisition_details.total_quantity > 0 %]
[% IF Koha.Preference('OPACAcquisitionDetails') and acquisition_details.total_quantity > 0 %]
[% IF acquisition_details.total_quantity == 1 %]
<span>1 item is on order.</span>
[% ELSE %]
@ -681,7 +681,7 @@
<div id="alternateholdings"><span class="holdings_label">Holdings:</span> [% ALTERNATEHOLDING.holding %]</div>
[% END %]
[% ELSE %]
[% IF Koha.Preference('OPACAcquisitionDetails') and Koha.Preference('AcqCreateItem') != 'ordering' and acquisition_details.total_quantity > 0 %]
[% IF Koha.Preference('OPACAcquisitionDetails') and acquisition_details.total_quantity > 0 %]
[% IF acquisition_details.total_quantity == 1 %]
<span>1 item is on order.</span>
[% ELSE %]

View File

@ -54,6 +54,7 @@ use Koha::RecordProcessor;
use Koha::AuthorisedValues;
use Koha::Biblios;
use Koha::ItemTypes;
use Koha::Acquisition::Order;
use Koha::Virtualshelves;
use Koha::Patrons;
use Koha::Ratings;
@ -639,7 +640,8 @@ if ( C4::Context->preference('OPACAcquisitionDetails' ) ) {
});
my $total_quantity = 0;
for my $order ( @$orders ) {
if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
my $basket = Koha::Acquisition::Order->find( $order->{ordernumber} )->basket;
if ( $basket->effective_create_items eq 'ordering' ) {
for my $itemnumber ( C4::Acquisition::GetItemnumbersFromOrder( $order->{ordernumber} ) ) {
push @itemnumbers_on_order, $itemnumber;
}
@ -700,9 +702,7 @@ if ( not $viewallitems and @items > $max_items_to_display ) {
$itm->{transfertto} = $transfertto;
}
if ( C4::Context->preference('OPACAcquisitionDetails')
and C4::Context->preference('AcqCreateItem') eq 'ordering' )
{
if ( C4::Context->preference('OPACAcquisitionDetails') ) {
$itm->{on_order} = 1
if grep /^$itm->{itemnumber}$/, @itemnumbers_on_order;
}