Projekt

Allgemein

Profil

Herunterladen (5,27 KB) Statistiken
| Zweig: | Markierung: | Revision:
82515b2d Sven Schöling
package SL::DB::OrderItem;

use strict;

ba0fb69c Sven Schöling
use List::Util qw(sum);

82515b2d Sven Schöling
use SL::DB::MetaSetup::OrderItem;
ef2b5e94 Moritz Bunkus
use SL::DB::Manager::OrderItem;
3b7bda40 Jan Büren
use SL::DB::DeliveryOrderItemsStock;
3954d14b Bernd Bleßmann
use SL::DB::Helper::ActsAsList;
ca808f20 Geoffrey Richardson
use SL::DB::Helper::LinkedRecords;
1904d8c6 Sven Schöling
use SL::DB::Helper::RecordItem;
e1bf173b Sven Schöling
use SL::DB::Helper::CustomVariables (
sub_module => 'orderitems',
cvars_alias => 1,
overloads => {
5a7ae14c Sven Schöling
parts_id => {
class => 'SL::DB::Part',
module => 'IC',
}
e1bf173b Sven Schöling
},
);
82515b2d Sven Schöling
__PACKAGE__->meta->initialize;

3954d14b Bernd Bleßmann
__PACKAGE__->configure_acts_as_list(group_by => [qw(trans_id)]);

82515b2d Sven Schöling
sub is_price_update_available {
my $self = shift;
return $self->origprice > $self->part->sellprice;
}

ba0fb69c Sven Schöling
sub shipped_qty {
my ($self) = @_;

0ff17226 Sven Schöling
my $d_orders = $self->order->linked_records(direction => 'to', to => 'SL::DB::DeliveryOrder', with_objects => [ 'orderitems' ]);
ba0fb69c Sven Schöling
my @doi = grep { $_->parts_id == $self->parts_id } map { $_->orderitems } @$d_orders;

return sum(map { AM->convert_unit($_->unit => $self->unit) * $_->qty } @doi);
}

8a3f13c3 Geoffrey Richardson
sub linked_delivery_order_items {
my ($self) = @_;

return $self->linked_records(direction => 'to', to => 'SL::DB::DeliveryOrderItem');
}

sub delivered_qty {
# checks for delivery_order_stock_id entries, which have been converted to inventory entries
# uses several rose relationships
# doesn't differentiate between sales and orders

my ($self) = @_;
my $delivered_qty = 0;
foreach my $doi ( @{$self->linked_delivery_order_items} ) {
next unless scalar @{$doi->delivery_order_stock_entries};
$delivered_qty += sum map { $_->inventory ? $_->qty : 0 } @{$doi->delivery_order_stock_entries};
};
return $delivered_qty;
};

sub delivered_qty_sql {
# checks for delivery_order_stock_id entries, which have been converted to inventory entries
my ($self) = @_;

my $query = <<SQL;
SELECT (sum(i.qty) * CASE WHEN oe.customer_id IS NULL THEN 1 ELSE -1 END) AS delivered
FROM orderitems oi
INNER JOIN record_links rl ON ( oi.id = rl.FROM_id
and rl.FROM_table = 'orderitems'
and rl.to_table::text = 'delivery_order_items'::text
)
INNER JOIN delivery_order_items doi ON (doi.id =rl.to_id)
INNER JOIN delivery_order_items_stock dois ON (dois.delivery_order_item_id = doi.id)
INNER JOIN inventory i ON (dois.id = i.delivery_order_items_stock_id)
INNER JOIN oe ON (oe.id = oi.trans_id)
WHERE oi.id = ?
GROUP BY oi.id, oe.id
SQL
my ($delivered_qty) = selectfirst_array_query($::form, $self->db->dbh, $query, $self->id);

return $delivered_qty;
};

sub delivered_qty_sql_multi {
# checks for delivery_order_stock_id entries, which have been converted to inventory entries
my ($self) = @_;

my $query = <<SQL;
SELECT sum(dois.qty) from delivery_order_items_stock dois
LEFT OUTER JOIN inventory i ON (dois.id = i.delivery_order_items_stock_id)
WHERE
dois.delivery_order_item_id in (
SELECT
to_id
FROM
record_links
WHERE
(
from_id = in AND
from_table = 'orderitems' AND
to_table = 'delivery_order_items'
)
)
SQL
my ($delivered_qty) = selectfirst_array_query($::form, $self->db->dbh, $query, $self->id);

return $delivered_qty;
};

073ee541 Geoffrey Richardson
sub record { goto &order }

82515b2d Sven Schöling
1;
7317b8d9 Jan Büren
31347b09 Jan Büren
__END__

=pod

=head1 NAME

SL::DB::OrderItems: Rose model for orderitems

=head1 FUNCTIONS

=over 4

=item C<shipped_qty>

8a3f13c3 Geoffrey Richardson
=item C<shipped_qty>

31347b09 Jan Büren
returns the number of orderitems which are already linked to Delivery Orders.
The linked key is parts_id and not orderitems (id) -> delivery_order_items (id).
Therefore this function is not safe for identical parts_id.
Sample call:
C<$::form-E<gt>format_amount(\%::myconfig, $_[0]-E<gt>shipped_qty);>

8a3f13c3 Geoffrey Richardson
=item C<delivered_qty>

Returns the amount of this orderitem that has been delivered, meaning it
appears in a delivery order AND has been transferred. The delivery order items
are found by direct record_links from orderitems to delivery order items.
Delivery order items that were added manually and not via the record workflow
will therefore not be calculated correctly.

Orders that were created before the individual items were linked (this feature
was added in kivitendo 3.2.0) will therefore return incorrect results.

=item C<delivered_qty_sql>

Does the same as delivered_qty, but via sql.



=item C<delivered_qty_sql>

Returns the amount of the orderitem that has actually been shipped, not just where delivery_order_items exist (how delivered_qty works).

Doesn't deal with different units yet.

31347b09 Jan Büren
=back

=head1 TODO

Older versions of OrderItem.pm had more functions which where used for calculating the
qty for the different states of the Delivery Order.
For example to get the qty in already marked as delivered Delivery Orders:

C<delivered_qty>

return $self-E<gt>_delivered_qty;

sub _delivered_qty {
(..)
my @d_orders_delivered = grep { $_-E<gt>delivered } @$d_orders;
my @doi_delivered = grep { $_-E<gt>parts_id == $self-E<gt>parts_id } map { $_-E<gt>orderitems } @d_orders_delivered;
}

In general the function C<shipped_qty> and all (project) related functions should be marked deprecate,
because of the better linked item to item data in the record_links table.

8a3f13c3 Geoffrey Richardson
=head1 AUTHORS

G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt>
31347b09 Jan Büren
8a3f13c3 Geoffrey Richardson
=cut
31347b09 Jan Büren