use Carp qw( croak );
use Koha::Acquisition::Baskets;
+use Koha::Acquisition::Funds;
+use Koha::Acquisition::Invoices;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
+use Koha::Biblios;
+use Koha::Items;
+use Koha::Subscriptions;
use base qw(Koha::Object);
=head1 API
-=head2 Class Methods
+=head2 Class methods
=head3 new
unless $self->$key;
}
+ if (not defined $self->{created_by}) {
+ my $userenv = C4::Context->userenv;
+ if ($userenv) {
+ $self->created_by($userenv->{number});
+ }
+ }
+
$self->quantityreceived(0) unless $self->quantityreceived;
- $self->entrydate(output_pref( { dt => dt_from_string, dateformat => 'iso' } )) unless $self->entrydate;
+ $self->entrydate(dt_from_string) unless $self->entrydate;
$self->ordernumber(undef) unless $self->ordernumber;
$self = $self->SUPER::store( $self );
$rs->create({ ordernumber => $self->ordernumber, itemnumber => $itemnumber });
}
+=head3 basket
+
+ my $basket = Koha::Acquisition::Orders->find( $id )->basket;
+
+Returns the basket associated to the order.
+
+=cut
+
sub basket {
my ( $self ) = @_;
- return Koha::Acquisition::Baskets->find( $self->{basketno} );
+ my $basket_rs = $self->_result->basketno;
+ return Koha::Acquisition::Basket->_new_from_dbic( $basket_rs );
+}
+
+=head3 fund
+
+ my $fund = $order->fund
+
+Returns the fund (aqbudgets) associated to the order.
+
+=cut
+
+sub fund {
+ my ( $self ) = @_;
+ my $fund_rs = $self->_result->budget;
+ return Koha::Acquisition::Fund->_new_from_dbic( $fund_rs );
+}
+
+=head3 invoice
+
+ my $invoice = $order->invoice
+
+Returns the invoice associated to the order.
+
+=cut
+
+sub invoice {
+ my ( $self ) = @_;
+ my $invoice_rs = $self->_result->invoiceid;
+ return unless $invoice_rs;
+ return Koha::Acquisition::Invoice->_new_from_dbic( $invoice_rs );
+}
+
+=head3 subscription
+
+ my $subscription = $order->subscription
+
+Returns the subscription associated to the order.
+
+=cut
+
+sub subscription {
+ my ( $self ) = @_;
+ my $subscription_rs = $self->_result->subscriptionid;
+ return unless $subscription_rs;
+ return Koha::Subscription->_new_from_dbic( $subscription_rs );
+}
+
+=head3 items
+
+ my $items = $order->items
+
+Returns the items associated to the order.
+
+=cut
+
+sub items {
+ my ( $self ) = @_;
+ # aqorders_items is not a join table
+ # There is no FK on items (may have been deleted)
+ my $items_rs = $self->_result->aqorders_items;
+ my @itemnumbers = $items_rs->get_column( 'itemnumber' )->all;
+ return Koha::Items->search({ itemnumber => \@itemnumbers });
}
+=head3 biblio
+
+ my $biblio = $order->biblio
+
+Returns the bibliographic record associated to the order
+
+=cut
+
+sub biblio {
+ my ( $self ) = @_;
+ my $biblio_rs= $self->_result->biblionumber;
+ return Koha::Biblio->_new_from_dbic( $biblio_rs );
+}
+
+=head3 duplicate_to
+
+ my $duplicated_order = $order->duplicate_to($basket, [$default_values]);
+
+Duplicate an existing order and attach it to a basket. $default_values can be specified as a hashref
+that contain default values for the different order's attributes.
+Items will be duplicated as well but barcodes will be set to null.
+
+=cut
+
+sub duplicate_to {
+ my ( $self, $basket, $default_values ) = @_;
+ my $new_order;
+ $default_values //= {};
+ Koha::Database->schema->txn_do(
+ sub {
+ my $order_info = $self->unblessed;
+ undef $order_info->{ordernumber};
+ for my $field (
+ qw(
+ ordernumber
+ received_on
+ datereceived
+ invoiceid
+ datecancellationprinted
+ cancellationreason
+ purchaseordernumber
+ claims_count
+ claimed_date
+ parent_ordernumber
+ )
+ )
+ {
+ undef $order_info->{$field};
+ }
+ $order_info->{placed_on} = dt_from_string;
+ $order_info->{entrydate} = dt_from_string;
+ $order_info->{orderstatus} = 'new';
+ $order_info->{quantityreceived} = 0;
+ while ( my ( $field, $value ) = each %$default_values ) {
+ $order_info->{$field} = $value;
+ }
+
+ my $userenv = C4::Context->userenv;
+ $order_info->{created_by} = $userenv->{number};
+ $order_info->{basketno} = $basket->basketno;
+
+ $new_order = Koha::Acquisition::Order->new($order_info)->store;
+
+ if ( ! $self->subscriptionid && $self->basket->effective_create_items eq 'ordering') { # Do copy items if not a subscription order AND if items are created on ordering
+ my $items = $self->items;
+ while ( my ($item) = $items->next ) {
+ my $item_info = $item->unblessed;
+ undef $item_info->{itemnumber};
+ undef $item_info->{barcode};
+ my $new_item = Koha::Item->new($item_info)->store;
+ $new_order->add_item( $new_item->itemnumber );
+ }
+ }
+ }
+ );
+ return $new_order;
+}
+
+
=head2 Internal methods
=head3 _type