use SL::DB::Unit;
use SL::WH;
use SL::Locale::String qw(t8);
-use SL::ClientJS;
use SL::Presenter;
use SL::DBUtils;
use SL::Helper::Flash;
+use English qw(-no_match_vars);
+
use Rose::Object::MakeMethods::Generic (
- 'scalar --get_set_init' => [ qw(warehouses units js p) ],
+ 'scalar --get_set_init' => [ qw(warehouses units p) ],
'scalar' => [ qw(warehouse bin unit part) ],
);
sub action_stock {
my ($self) = @_;
- # do stock
- WH->transfer({
- parts => $self->part,
- dst_bin => $self->bin,
- dst_wh => $self->warehouse,
- qty => $::form->format_amount(\%::myconfig, $::form->{qty}),
- unit => $self->unit,
- transfer_type => 'stock',
- chargenumber => $::form->{chargenumber},
- ean => $::form->{ean},
- comment => $::form->{comment},
- });
-
- if ($::form->{write_default_bin}) {
- $self->part->bin($self->bin);
- $self->part->warehouse($self->warehouse);
- $self->part->save;
+ my $transfer_error;
+ my $qty = $::form->parse_amount(\%::myconfig, $::form->{qty});
+ if (!$qty) {
+ $transfer_error = t8('Cannot stock without amount');
+ } elsif ($qty < 0) {
+ $transfer_error = t8('Cannot stock negative amounts');
+ } else {
+ # do stock
+ $::form->throw_on_error(sub {
+ eval {
+ WH->transfer({
+ parts => $self->part,
+ dst_bin => $self->bin,
+ dst_wh => $self->warehouse,
+ qty => $qty,
+ unit => $self->unit,
+ transfer_type => 'stock',
+ chargenumber => $::form->{chargenumber},
+ bestbefore => $::form->{bestbefore},
+ ean => $::form->{ean},
+ comment => $::form->{comment},
+ });
+ 1;
+ } or do { $transfer_error = $EVAL_ERROR->getMessage; }
+ });
+
+ if (!$transfer_error) {
+ if ($::form->{write_default_bin}) {
+ $self->part->load; # onhand is calculated in between. don't mess that up
+ $self->part->bin($self->bin);
+ $self->part->warehouse($self->warehouse);
+ $self->part->save;
+ }
+
+ flash_later('info', t8('Transfer successful'));
+ }
}
- flash_later('info', t8('Transfer successful'));
+ my %additional_redirect_params = ();
+ if ($transfer_error) {
+ flash_later('error', $transfer_error);
+ $additional_redirect_params{$_} = $::form->{$_} for qw(qty chargenumber bestbefore ean comment);
+ $additional_redirect_params{qty} = $qty;
+ }
# redirect
$self->redirect_to(
bin_id => $self->bin->id,
warehouse_id => $self->warehouse->id,
unit_id => $self->unit->id,
+ %additional_redirect_params,
);
}
->replaceWith('#bin_id', $self->build_bin_select)
->replaceWith('#unit_id', $self->build_unit_select)
->focus('#warehouse_id')
- ->render($self);
+ ->render;
}
sub action_warehouse_changed {
$self->js
->replaceWith('#bin_id', $self->build_bin_select)
->focus('#bin_id')
- ->render($self);
+ ->render;
}
sub action_mini_stock {
$self->js
->html('#stock', $self->render('inventory/_stock', { output => 0 }))
- ->render($self);
+ ->render;
}
#================================================================
}
sub init_warehouses {
- SL::DB::Manager::Warehouse->get_all;
+ SL::DB::Manager::Warehouse->get_all(query => [ or => [ invalid => 0, invalid => undef ]]);
}
sub init_units {
SL::DB::Manager::Unit->get_all;
}
-sub init_js {
- SL::ClientJS->new;
-}
-
sub init_p {
SL::Presenter->get;
}
sub sanitize_target {
my ($self) = @_;
- $self->warehouse(SL::DB::Manager::Warehouse->get_first) if !$self->warehouse || !$self->warehouse->id;
- $self->bin ($self->warehouse->bins->[0]) if !$self->bin || !$self->bin->id;
+ $self->warehouse($self->warehouses->[0]) if !$self->warehouse || !$self->warehouse->id;
+ $self->bin ($self->warehouse->bins->[0]) if !$self->bin || !$self->bin->id;
}
sub load_part_from_form {
my $msg = t8('No warehouse has been created yet or the quantity of the bins is not configured yet.') . ' ';
- if ($::auth->check_right($::form->{login}, 'config')) { # TODO wut?
+ if ($::auth->check_right($::myconfig{login}, 'config')) { # TODO wut?
$msg .= t8('You can create warehouses and bins via the menu "System -> Warehouses".');
} else {
$msg .= t8('Please ask your administrator to create warehouses and bins.');