use Rose::Object::MakeMethods::Generic (
'scalar' => [ qw(objects objects_or_ids shipped_qty keep_matches) ],
- 'scalar --get_set_init' => [ qw(oe_ids dbh require_stock_out fill_up item_identity_fields oi2oe oi_qty delivered matches) ],
+ 'scalar --get_set_init' => [ qw(oe_ids dbh require_stock_out fill_up item_identity_fields oi2oe oi_qty delivered matches
+ services_deliverable) ],
);
my $no_stock_item_links_query = <<'';
$obj->{shipped_qty} = $shipped_qty->{$obj->id} //= 0;
$obj->{delivered} = $shipped_qty->{$obj->id} == $obj->qty;
} elsif ('SL::DB::Order' eq ref $obj) {
- if (defined $obj->{orderitems}) {
- $self->write_to($obj->{orderitems});
- $obj->{delivered} = all { $_->{delivered} } grep { !$_->{optional} || $_->{optional} == 0 } @{ $obj->{orderitems} };
+ # load all orderitems unless not already loaded
+ $obj->orderitems unless (defined $obj->{orderitems});
+ $self->write_to($obj->{orderitems});
+ if ($self->services_deliverable) {
+ $obj->{delivered} = all { $_->{delivered} } grep { !$_->{optional} } @{ $obj->{orderitems} };
} else {
- # don't force a load on items. just compute by oe_id directly
- $obj->{delivered} = $self->delivered->{$obj->id};
+ $obj->{delivered} = all { $_->{delivered} } grep { !$_->{optional} && !$_->part->is_service } @{ $obj->{orderitems} };
}
} else {
die "unknown reference '@{[ ref $obj ]}' for @{[ __PACKAGE__ ]}::write_to";
$self->shipped_qty({});
}
+# some of the invocations never need to load all orderitems to copute their answers
+# delivered however needs oi_qty to be set for each orderitem to decide whether
+# delivered should be set or not.
+sub ensure_all_orderitems_for_orders {
+ my ($self) = @_;
+
+ return if $self->fill_up;
+
+ my $oi_query = sprintf $fill_up_oi_query, join (', ', ('?')x@{ $self->oe_ids });
+ my $oi = selectall_hashref_query($::form, $self->dbh, $oi_query, @{ $self->oe_ids });
+ for (@$oi) {
+ $self->{oi_qty}{ $_->{id} } //= $_->{qty};
+ $self->{oi2oe}{ $_->{id} } //= $_->{trans_id};
+ }
+}
+
sub available_item_identity_fields {
map { [ $_ => $item_identity_fields{$_} ] } @known_item_identity_fields;
}
sub init_matches { [] }
sub init_delivered {
my ($self) = @_;
+
+ # is needed in odyn
+ # $self->ensure_all_orderitems_for_orders;
+
my $d = { };
for (keys %{ $self->oi_qty }) {
my $oe_id = $self->oi2oe->{$_};
sub init_item_identity_fields { [ grep $item_identity_fields{$_}, @{ $::instance_conf->get_shipped_qty_item_identity_fields } ] }
sub init_fill_up { $::instance_conf->get_shipped_qty_fill_up }
+sub init_services_deliverable {
+ my ($self) = @_;
+ if ($::form->{type} =~ m/^sales_/) {
+ $::instance_conf->get_sales_delivery_order_check_service;
+ } elsif ($::form->{type} =~ m/^purchase_/) {
+ $::instance_conf->get_purchase_delivery_order_check_service;
+ } else {
+ croak "wrong call, no customer or vendor object referenced";
+ }
+}
+
1;
__END__
=item C<new PARAMS>
-Creates a new helper object. PARAMS may include:
+Creates a new helper object, $::form->{type} is mandatory.
+
+PARAMS may include:
=over 4
See C<matches> for the returned format.
+
=back
=item C<calculate OBJECTS>