+# Note this subroutine should be moved to Koha::Acquisition::Order
+# Will do when a DBIC decision will be taken.
+sub populate_order_with_prices {
+ my ($params) = @_;
+
+ my $order = $params->{order};
+ my $booksellerid = $params->{booksellerid};
+ return unless $booksellerid;
+
+ my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
+
+ my $receiving = $params->{receiving};
+ my $ordering = $params->{ordering};
+ my $discount = $order->{discount};
+ $discount /= 100 if $discount > 1;
+
+ if ($ordering) {
+ $order->{tax_rate_on_ordering} //= $order->{tax_rate};
+ if ( $bookseller->listincgst ) {
+ # The user entered the rrp tax included
+ $order->{rrp_tax_included} = $order->{rrp};
+
+ # rrp tax excluded = rrp tax included / ( 1 + tax rate )
+ $order->{rrp_tax_excluded} = $order->{rrp_tax_included} / ( 1 + $order->{tax_rate_on_ordering} );
+
+ # ecost tax excluded = rrp tax excluded * ( 1 - discount )
+ $order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
+
+ # ecost tax included = rrp tax included ( 1 - discount )
+ $order->{ecost_tax_included} = $order->{rrp_tax_included} * ( 1 - $discount );
+ }
+ else {
+ # The user entered the rrp tax excluded
+ $order->{rrp_tax_excluded} = $order->{rrp};
+
+ # rrp tax included = rrp tax excluded * ( 1 - tax rate )
+ $order->{rrp_tax_included} = $order->{rrp_tax_excluded} * ( 1 + $order->{tax_rate_on_ordering} );
+
+ # ecost tax excluded = rrp tax excluded * ( 1 - discount )
+ $order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
+
+ # ecost tax included = rrp tax excluded * ( 1 + tax rate ) * ( 1 - discount )
+ $order->{ecost_tax_included} =
+ $order->{rrp_tax_excluded} *
+ ( 1 + $order->{tax_rate_on_ordering} ) *
+ ( 1 - $discount );
+ }
+
+ # tax value = quantity * ecost tax excluded * tax rate
+ $order->{tax_value_on_ordering} =
+ $order->{quantity} * $order->{ecost_tax_excluded} * $order->{tax_rate_on_ordering};
+ }
+
+ if ($receiving) {
+ $order->{tax_rate_on_receiving} //= $order->{tax_rate};
+ if ( $bookseller->invoiceincgst ) {
+ # Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
+ # we need to keep the exact ecost value
+ if ( Koha::Number::Price->new( $order->{unitprice} )->round == Koha::Number::Price->new( $order->{ecost_tax_included} )->round ) {
+ $order->{unitprice} = $order->{ecost_tax_included};
+ }
+
+ # The user entered the unit price tax included
+ $order->{unitprice_tax_included} = $order->{unitprice};
+
+ # unit price tax excluded = unit price tax included / ( 1 + tax rate )
+ $order->{unitprice_tax_excluded} = $order->{unitprice_tax_included} / ( 1 + $order->{tax_rate_on_receiving} );
+ }
+ else {
+ # Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
+ # we need to keep the exact ecost value
+ if ( Koha::Number::Price->new( $order->{unitprice} )->round == Koha::Number::Price->new( $order->{ecost_tax_excluded} )->round ) {
+ $order->{unitprice} = $order->{ecost_tax_excluded};
+ }
+
+ # The user entered the unit price tax excluded
+ $order->{unitprice_tax_excluded} = $order->{unitprice};
+
+
+ # unit price tax included = unit price tax included * ( 1 + tax rate )
+ $order->{unitprice_tax_included} = $order->{unitprice_tax_excluded} * ( 1 + $order->{tax_rate_on_receiving} );
+ }
+
+ # tax value = quantity * unit price tax excluded * tax rate
+ $order->{tax_value_on_receiving} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate_on_receiving};
+ }
+
+ return $order;
+}
+
+=head3 GetOrderUsers
+
+ $order_users_ids = &GetOrderUsers($ordernumber);
+
+Returns a list of all borrowernumbers that are in order users list
+
+=cut
+
+sub GetOrderUsers {
+ my ($ordernumber) = @_;
+
+ return unless $ordernumber;
+
+ my $query = q|
+ SELECT borrowernumber
+ FROM aqorder_users
+ WHERE ordernumber = ?
+ |;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($ordernumber);
+ my $results = $sth->fetchall_arrayref( {} );
+
+ my @borrowernumbers;
+ foreach (@$results) {
+ push @borrowernumbers, $_->{'borrowernumber'};
+ }
+
+ return @borrowernumbers;
+}
+
+=head3 ModOrderUsers
+
+ my @order_users_ids = (1, 2, 3);
+ &ModOrderUsers($ordernumber, @basketusers_ids);
+
+Delete all users from order users list, and add users in C<@order_users_ids>
+to this users list.
+
+=cut
+
+sub ModOrderUsers {
+ my ( $ordernumber, @order_users_ids ) = @_;
+
+ return unless $ordernumber;
+
+ my $dbh = C4::Context->dbh;
+ my $query = q|
+ DELETE FROM aqorder_users
+ WHERE ordernumber = ?
+ |;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($ordernumber);
+
+ $query = q|
+ INSERT INTO aqorder_users (ordernumber, borrowernumber)
+ VALUES (?, ?)
+ |;
+ $sth = $dbh->prepare($query);
+ foreach my $order_user_id (@order_users_ids) {
+ $sth->execute( $ordernumber, $order_user_id );
+ }
+}
+
+sub NotifyOrderUsers {
+ my ($ordernumber) = @_;
+
+ my @borrowernumbers = GetOrderUsers($ordernumber);
+ return unless @borrowernumbers;
+
+ my $order = GetOrder( $ordernumber );
+ for my $borrowernumber (@borrowernumbers) {
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ my $library = $patron->library->unblessed;
+ my $biblio = Koha::Biblios->find( $order->{biblionumber} )->unblessed;
+ my $letter = C4::Letters::GetPreparedLetter(
+ module => 'acquisition',
+ letter_code => 'ACQ_NOTIF_ON_RECEIV',
+ branchcode => $library->{branchcode},
+ lang => $patron->lang,
+ tables => {
+ 'branches' => $library,
+ 'borrowers' => $patron->unblessed,
+ 'biblio' => $biblio,
+ 'aqorders' => $order,
+ },
+ );
+ if ( $letter ) {
+ C4::Letters::EnqueueLetter(
+ {
+ letter => $letter,
+ borrowernumber => $borrowernumber,
+ LibraryName => C4::Context->preference("LibraryName"),
+ message_transport_type => 'email',
+ }
+ ) or warn "can't enqueue letter $letter";
+ }
+ }
+}
+
+=head3 FillWithDefaultValues
+
+FillWithDefaultValues( $marc_record );
+
+This will update the record with default value defined in the ACQ framework.
+For all existing fields, if a default value exists and there are no subfield, it will be created.
+If the field does not exist, it will be created too.
+
+=cut
+
+sub FillWithDefaultValues {
+ my ($record) = @_;
+ my $tagslib = C4::Biblio::GetMarcStructure( 1, 'ACQ', { unsafe => 1 } );
+ if ($tagslib) {
+ my ($itemfield) =
+ C4::Biblio::GetMarcFromKohaField( 'items.itemnumber', '' );
+ for my $tag ( sort keys %$tagslib ) {
+ next unless $tag;
+ next if $tag == $itemfield;
+ for my $subfield ( sort keys %{ $tagslib->{$tag} } ) {
+ next if IsMarcStructureInternal($tagslib->{$tag}{$subfield});
+ my $defaultvalue = $tagslib->{$tag}{$subfield}{defaultvalue};
+ if ( defined $defaultvalue and $defaultvalue ne '' ) {
+ my @fields = $record->field($tag);
+ if (@fields) {
+ for my $field (@fields) {
+ unless ( defined $field->subfield($subfield) ) {
+ $field->add_subfields(
+ $subfield => $defaultvalue );
+ }
+ }
+ }
+ else {
+ $record->insert_fields_ordered(
+ MARC::Field->new(
+ $tag, '', '', $subfield => $defaultvalue
+ )
+ );
+ }
+ }
+ }
+ }
+ }
+}
+